1/* 2 * Copyright (C) 2012 Samsung Electronics. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 14 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 22 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "ewk_storage_manager.h" 28 29#include "WKAPICast.h" 30#include "WKArray.h" 31#include "WKSecurityOrigin.h" 32#include "WKString.h" 33#include "ewk_security_origin_private.h" 34#include "ewk_storage_manager_private.h" 35 36using namespace WebKit; 37 38EwkStorageManager::EwkStorageManager(WKKeyValueStorageManagerRef storageManager) 39 : m_storageManager(storageManager) 40{ 41 ASSERT(storageManager); 42} 43 44void EwkStorageManager::getStorageOrigins(void* context, WKKeyValueStorageManagerGetKeyValueStorageOriginsFunction callback) const 45{ 46 WKKeyValueStorageManagerGetKeyValueStorageOrigins(m_storageManager.get(), context, callback); 47} 48 49Eina_List* EwkStorageManager::createOriginList(WKArrayRef origins) const 50{ 51 Eina_List* originList = 0; 52 const size_t length = WKArrayGetSize(origins); 53 54 for (size_t i = 0; i < length; ++i) { 55 WKSecurityOriginRef wkOriginRef = static_cast<WKSecurityOriginRef>(WKArrayGetItemAtIndex(origins, i)); 56 RefPtr<EwkSecurityOrigin> origin = m_wrapperCache.get(wkOriginRef); 57 if (!origin) { 58 origin = EwkSecurityOrigin::create(wkOriginRef); 59 m_wrapperCache.set(wkOriginRef, origin); 60 } 61 originList = eina_list_append(originList, origin.release().leakRef()); 62 } 63 64 return originList; 65} 66 67struct EwkStorageOriginsAsyncData { 68 const Ewk_Storage_Manager* manager; 69 Ewk_Storage_Origins_Async_Get_Cb callback; 70 void* userData; 71 72 EwkStorageOriginsAsyncData(const Ewk_Storage_Manager* manager, Ewk_Storage_Origins_Async_Get_Cb callback, void* userData) 73 : manager(manager) 74 , callback(callback) 75 , userData(userData) 76 { } 77}; 78 79static void getStorageOriginsCallback(WKArrayRef origins, WKErrorRef, void* context) 80{ 81 Eina_List* originList = 0; 82 auto webStorageContext = std::unique_ptr<EwkStorageOriginsAsyncData>(static_cast<EwkStorageOriginsAsyncData*>(context)); 83 84 originList = webStorageContext->manager->createOriginList(origins); 85 86 webStorageContext->callback(originList, webStorageContext->userData); 87} 88 89Eina_Bool ewk_storage_manager_origins_async_get(const Ewk_Storage_Manager* ewkStorageManager, Ewk_Storage_Origins_Async_Get_Cb callback, void* userData) 90{ 91 EINA_SAFETY_ON_NULL_RETURN_VAL(ewkStorageManager, false); 92 EINA_SAFETY_ON_NULL_RETURN_VAL(callback, false); 93 94 EwkStorageOriginsAsyncData* context = new EwkStorageOriginsAsyncData(ewkStorageManager, callback, userData); 95 ewkStorageManager->getStorageOrigins(context, getStorageOriginsCallback); 96 97 return true; 98} 99 100Eina_Bool ewk_storage_manager_entries_clear(Ewk_Storage_Manager* ewkStorageManager) 101{ 102 EINA_SAFETY_ON_NULL_RETURN_VAL(ewkStorageManager, false); 103 104 WKKeyValueStorageManagerDeleteAllEntries(ewkStorageManager->wkStorageManager().get()); 105 106 return true; 107} 108 109Eina_Bool ewk_storage_manager_entries_for_origin_del(Ewk_Storage_Manager* ewkStorageManager, Ewk_Security_Origin* origin) 110{ 111 EINA_SAFETY_ON_NULL_RETURN_VAL(ewkStorageManager, false); 112 EWK_OBJ_GET_IMPL_OR_RETURN(EwkSecurityOrigin, origin, impl, false); 113 114 WKKeyValueStorageManagerDeleteEntriesForOrigin(ewkStorageManager->wkStorageManager().get(), impl->wkSecurityOrigin()); 115 116 return true; 117} 118