18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 27e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "CookieStorageCFNet.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29cad810f21b803229eb11403f9209855525a25d57Steve Block#if USE(CFNETWORK) 30cad810f21b803229eb11403f9209855525a25d57Steve Block 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "LoaderRunLoopCF.h" 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "ResourceHandle.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CFNetwork/CFHTTPCookiesPriv.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebKitSystemInterface/WebKitSystemInterface.h> 35e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <wtf/MainThread.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RetainPtr.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(PLATFORM_STRATEGIES) 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "CookiesStrategy.h" 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "PlatformStrategies.h" 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 452bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic RetainPtr<CFHTTPCookieStorageRef>& privateCookieStorage() 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch DEFINE_STATIC_LOCAL(RetainPtr<CFHTTPCookieStorageRef>, cookieStorage, ()); 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return cookieStorage; 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFHTTPCookieStorageRef currentCookieStorage() 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 53e14391e94c850b8bd03680c23b38978db68687a8John Reck ASSERT(isMainThread()); 54e14391e94c850b8bd03680c23b38978db68687a8John Reck 552bde8e466a4451c7319e3a072d118917957d6554Steve Block if (CFHTTPCookieStorageRef cookieStorage = privateCookieStorage().get()) 562bde8e466a4451c7319e3a072d118917957d6554Steve Block return cookieStorage; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return wkGetDefaultHTTPCookieStorage(); 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 602bde8e466a4451c7319e3a072d118917957d6554Steve BlockCFHTTPCookieStorageRef privateBrowsingCookieStorage() 612bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 622bde8e466a4451c7319e3a072d118917957d6554Steve Block return privateCookieStorage().get(); 632bde8e466a4451c7319e3a072d118917957d6554Steve Block} 642bde8e466a4451c7319e3a072d118917957d6554Steve Block 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setCurrentCookieStorage(CFHTTPCookieStorageRef cookieStorage) 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 67e14391e94c850b8bd03680c23b38978db68687a8John Reck ASSERT(isMainThread()); 68e14391e94c850b8bd03680c23b38978db68687a8John Reck 692bde8e466a4451c7319e3a072d118917957d6554Steve Block privateCookieStorage().adoptCF(cookieStorage); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 72e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid setCookieStoragePrivateBrowsingEnabled(bool enabled) 73e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 74e14391e94c850b8bd03680c23b38978db68687a8John Reck ASSERT(isMainThread()); 75e14391e94c850b8bd03680c23b38978db68687a8John Reck 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!enabled) { 772bde8e466a4451c7319e3a072d118917957d6554Steve Block privateCookieStorage() = nullptr; 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS) 822bde8e466a4451c7319e3a072d118917957d6554Steve Block if (CFURLStorageSessionRef privateStorageSession = ResourceHandle::privateBrowsingStorageSession()) 832bde8e466a4451c7319e3a072d118917957d6554Steve Block privateCookieStorage().adoptCF(wkCopyHTTPCookieStorage(privateStorageSession)); 842bde8e466a4451c7319e3a072d118917957d6554Steve Block else 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 862bde8e466a4451c7319e3a072d118917957d6554Steve Block privateCookieStorage().adoptCF(wkCreateInMemoryHTTPCookieStorage()); 872bde8e466a4451c7319e3a072d118917957d6554Steve Block} 882bde8e466a4451c7319e3a072d118917957d6554Steve Block 892bde8e466a4451c7319e3a072d118917957d6554Steve BlockCFHTTPCookieStorageRef defaultCookieStorage() 902bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 912bde8e466a4451c7319e3a072d118917957d6554Steve Block return wkGetDefaultHTTPCookieStorage(); 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void notifyCookiesChangedOnMainThread(void* context) 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(isMainThread()); 9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(PLATFORM_STRATEGIES) 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch platformStrategies()->cookiesStrategy()->notifyCookiesChanged(); 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void notifyCookiesChanged(CFHTTPCookieStorageRef inStorage, void *context) 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch callOnMainThread(notifyCookiesChangedOnMainThread, 0); 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline CFRunLoopRef cookieStorageObserverRunLoop() 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // We're using the loader run loop because we need a CFRunLoop to 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // call the CFNetwork cookie storage APIs with. Re-using the loader 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // run loop is less overhead than starting a new thread to just listen 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // for changes in cookies. 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // FIXME: The loaderRunLoop function name should be a little more generic. 11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return loaderRunLoop(); 11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid startObservingCookieChanges() 12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(isMainThread()); 12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFRunLoopRef runLoop = cookieStorageObserverRunLoop(); 12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(runLoop); 12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFHTTPCookieStorageRef cookieStorage = currentCookieStorage(); 12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(cookieStorage); 12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 12981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFHTTPCookieStorageScheduleWithRunLoop(cookieStorage, runLoop, kCFRunLoopCommonModes); 13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFHTTPCookieStorageAddObserver(cookieStorage, runLoop, kCFRunLoopDefaultMode, notifyCookiesChanged, 0); 13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid stopObservingCookieChanges() 13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(isMainThread()); 13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 13781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFRunLoopRef runLoop = cookieStorageObserverRunLoop(); 13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(runLoop); 13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFHTTPCookieStorageRef cookieStorage = currentCookieStorage(); 14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(cookieStorage); 14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFHTTPCookieStorageRemoveObserver(cookieStorage, runLoop, kCFRunLoopDefaultMode, notifyCookiesChanged, 0); 14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CFHTTPCookieStorageUnscheduleFromRunLoop(cookieStorage, runLoop, kCFRunLoopCommonModes); 145e14391e94c850b8bd03680c23b38978db68687a8John Reck} 146e14391e94c850b8bd03680c23b38978db68687a8John Reck 147cad810f21b803229eb11403f9209855525a25d57Steve Block} // namespace WebCore 148cad810f21b803229eb11403f9209855525a25d57Steve Block 149cad810f21b803229eb11403f9209855525a25d57Steve Block#endif // USE(CFNETWORK) 150