/* * Copyright (C) 2012 Intel Corporation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "ewk_cookie_manager.h" #include "WKAPICast.h" #include "WKArray.h" #include "WKString.h" #include "WebCookieManagerProxy.h" #include "ewk_cookie_manager_private.h" #include "ewk_error_private.h" #include "ewk_private.h" #include #include #include using namespace WebKit; Ewk_Cookie_Manager::Ewk_Cookie_Manager(WKCookieManagerRef cookieManagerRef) : m_wkCookieManager(cookieManagerRef) { WKCookieManagerClient wkCookieManagerClient = { kWKCookieManagerClientCurrentVersion, this, // clientInfo cookiesDidChange }; WKCookieManagerSetClient(m_wkCookieManager.get(), &wkCookieManagerClient); } Ewk_Cookie_Manager::~Ewk_Cookie_Manager() { if (isWatchingForChanges()) WKCookieManagerStopObservingCookieChanges(m_wkCookieManager.get()); } void Ewk_Cookie_Manager::setPersistentStorage(const String& filename, SoupCookiePersistentStorageType storage) { bool isWatchingChanges = isWatchingForChanges(); if (isWatchingChanges) WKCookieManagerStopObservingCookieChanges(m_wkCookieManager.get()); toImpl(m_wkCookieManager.get())->setCookiePersistentStorage(filename, storage); if (isWatchingChanges) WKCookieManagerStartObservingCookieChanges(m_wkCookieManager.get()); } void Ewk_Cookie_Manager::setHTTPAcceptPolicy(WKHTTPCookieAcceptPolicy policy) { WKCookieManagerSetHTTPCookieAcceptPolicy(m_wkCookieManager.get(), policy); } void Ewk_Cookie_Manager::clearHostnameCookies(const String& hostname) { toImpl(m_wkCookieManager.get())->deleteCookiesForHostname(hostname); } void Ewk_Cookie_Manager::clearAllCookies() { WKCookieManagerDeleteAllCookies(m_wkCookieManager.get()); } void Ewk_Cookie_Manager::watchChanges(const Cookie_Change_Handler& changeHandler) { m_changeHandler = changeHandler; if (changeHandler.callback) WKCookieManagerStartObservingCookieChanges(m_wkCookieManager.get()); else WKCookieManagerStopObservingCookieChanges(m_wkCookieManager.get()); } bool Ewk_Cookie_Manager::isWatchingForChanges() const { return static_cast(m_changeHandler.callback); } void Ewk_Cookie_Manager::getHostNamesWithCookies(WKCookieManagerGetCookieHostnamesFunction callback, void* userData) const { WKCookieManagerGetHostnamesWithCookies(m_wkCookieManager.get(), userData, callback); } void Ewk_Cookie_Manager::getHTTPAcceptPolicy(WKCookieManagerGetHTTPCookieAcceptPolicyFunction callback, void* userData) const { WKCookieManagerGetHTTPCookieAcceptPolicy(m_wkCookieManager.get(), userData, callback); } void Ewk_Cookie_Manager::cookiesDidChange(WKCookieManagerRef, const void* clientInfo) { Ewk_Cookie_Manager* manager = static_cast(const_cast(clientInfo)); if (!manager->isWatchingForChanges()) return; manager->m_changeHandler.callback(manager->m_changeHandler.userData); } // Ewk_Cookie_Persistent_Storage enum validation. COMPILE_ASSERT_MATCHING_ENUM(EWK_COOKIE_PERSISTENT_STORAGE_TEXT, SoupCookiePersistentStorageText); COMPILE_ASSERT_MATCHING_ENUM(EWK_COOKIE_PERSISTENT_STORAGE_SQLITE, SoupCookiePersistentStorageSQLite); void ewk_cookie_manager_persistent_storage_set(Ewk_Cookie_Manager* manager, const char* filename, Ewk_Cookie_Persistent_Storage storage) { EINA_SAFETY_ON_NULL_RETURN(manager); EINA_SAFETY_ON_NULL_RETURN(filename); manager->setPersistentStorage(String::fromUTF8(filename), static_cast(storage)); } // Ewk_Cookie_Accept_Policy enum validation. COMPILE_ASSERT_MATCHING_ENUM(EWK_COOKIE_ACCEPT_POLICY_ALWAYS, kWKHTTPCookieAcceptPolicyAlways); COMPILE_ASSERT_MATCHING_ENUM(EWK_COOKIE_ACCEPT_POLICY_NEVER, kWKHTTPCookieAcceptPolicyNever); COMPILE_ASSERT_MATCHING_ENUM(EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY, kWKHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain); void ewk_cookie_manager_accept_policy_set(Ewk_Cookie_Manager* manager, Ewk_Cookie_Accept_Policy policy) { EINA_SAFETY_ON_NULL_RETURN(manager); manager->setHTTPAcceptPolicy(static_cast(policy)); } struct Get_Policy_Async_Data { Ewk_Cookie_Manager_Async_Policy_Get_Cb callback; void* userData; Get_Policy_Async_Data(Ewk_Cookie_Manager_Async_Policy_Get_Cb callback, void* userData) : callback(callback) , userData(userData) { } }; static void getAcceptPolicyCallback(WKHTTPCookieAcceptPolicy policy, WKErrorRef wkError, void* data) { Get_Policy_Async_Data* callbackData = static_cast(data); OwnPtr ewkError = Ewk_Error::create(wkError); callbackData->callback(static_cast(policy), ewkError.get(), callbackData->userData); delete callbackData; } void ewk_cookie_manager_async_accept_policy_get(const Ewk_Cookie_Manager* manager, Ewk_Cookie_Manager_Async_Policy_Get_Cb callback, void* data) { EINA_SAFETY_ON_NULL_RETURN(manager); EINA_SAFETY_ON_NULL_RETURN(callback); Get_Policy_Async_Data* callbackData = new Get_Policy_Async_Data(callback, data); manager->getHTTPAcceptPolicy(getAcceptPolicyCallback, callbackData); } struct Get_Hostnames_Async_Data { Ewk_Cookie_Manager_Async_Hostnames_Get_Cb callback; void* userData; Get_Hostnames_Async_Data(Ewk_Cookie_Manager_Async_Hostnames_Get_Cb callback, void* userData) : callback(callback) , userData(userData) { } }; static void getHostnamesWithCookiesCallback(WKArrayRef wkHostnames, WKErrorRef wkError, void* context) { Eina_List* hostnames = 0; Get_Hostnames_Async_Data* callbackData = static_cast(context); OwnPtr ewkError = Ewk_Error::create(wkError); const size_t hostnameCount = WKArrayGetSize(wkHostnames); for (size_t i = 0; i < hostnameCount; ++i) { WKStringRef wkHostname = static_cast(WKArrayGetItemAtIndex(wkHostnames, i)); String hostname = toImpl(wkHostname)->string(); if (hostname.isEmpty()) continue; hostnames = eina_list_append(hostnames, eina_stringshare_add(hostname.utf8().data())); } callbackData->callback(hostnames, ewkError.get(), callbackData->userData); void* item; EINA_LIST_FREE(hostnames, item) eina_stringshare_del(static_cast(item)); delete callbackData; } void ewk_cookie_manager_async_hostnames_with_cookies_get(const Ewk_Cookie_Manager* manager, Ewk_Cookie_Manager_Async_Hostnames_Get_Cb callback, void* data) { EINA_SAFETY_ON_NULL_RETURN(manager); EINA_SAFETY_ON_NULL_RETURN(callback); Get_Hostnames_Async_Data* callbackData = new Get_Hostnames_Async_Data(callback, data); manager->getHostNamesWithCookies(getHostnamesWithCookiesCallback, callbackData); } void ewk_cookie_manager_hostname_cookies_clear(Ewk_Cookie_Manager* manager, const char* hostname) { EINA_SAFETY_ON_NULL_RETURN(manager); EINA_SAFETY_ON_NULL_RETURN(hostname); manager->clearHostnameCookies(String::fromUTF8(hostname)); } void ewk_cookie_manager_cookies_clear(Ewk_Cookie_Manager* manager) { EINA_SAFETY_ON_NULL_RETURN(manager); manager->clearAllCookies(); } void ewk_cookie_manager_changes_watch(Ewk_Cookie_Manager* manager, Ewk_Cookie_Manager_Changes_Watch_Cb callback, void* data) { EINA_SAFETY_ON_NULL_RETURN(manager); manager->watchChanges(Cookie_Change_Handler(callback, data)); }