18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 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" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandleInternal.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "BlobRegistry.h" 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "DNS.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandleClient.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Timer.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm> 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/text/CString.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool shouldForceContentSniffing; 415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 42967717af5423377c967781471ee106e2bb4e11c8Ben MurdochResourceHandle::ResourceHandle(const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff) 43967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch : d(new ResourceHandleInternal(this, request, client, defersLoading, shouldContentSniff && shouldContentSniffURL(request.url()))) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 45967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!request.url().isValid()) { 46967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch scheduleFailure(InvalidURLFailure); 47967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 48967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 49967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 50967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!portAllowed(request.url())) { 51967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch scheduleFailure(BlockedFailure); 52967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 53967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5668513a70bcd92384395513322f1b801e7bf9c729Steve BlockPassRefPtr<ResourceHandle> ResourceHandle::create(NetworkingContext* context, const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff) 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 58e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(BLOB) 59e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block if (request.url().protocolIs("blob")) { 60e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block PassRefPtr<ResourceHandle> handle = blobRegistry().createResourceHandle(request, client); 61e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block if (handle) 62e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return handle; 63e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block } 64e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif 65e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RefPtr<ResourceHandle> newHandle(adoptRef(new ResourceHandle(request, client, defersLoading, shouldContentSniff))); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 68967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (newHandle->d->m_scheduledFailureType != NoFailure) 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return newHandle.release(); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7168513a70bcd92384395513322f1b801e7bf9c729Steve Block if (newHandle->start(context)) 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return newHandle.release(); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceHandle::scheduleFailure(FailureType type) 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen d->m_scheduledFailureType = type; 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->m_failureTimer.startOneShot(0); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceHandle::fireFailure(Timer<ResourceHandle>*) 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!client()) 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen switch (d->m_scheduledFailureType) { 8906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen case NoFailure: 9006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT_NOT_REACHED(); 9106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BlockedFailure: 9306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen d->m_scheduledFailureType = NoFailure; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project client()->wasBlocked(this); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case InvalidURLFailure: 9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen d->m_scheduledFailureType = NoFailure; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project client()->cannotShowURL(this); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceHandleClient* ResourceHandle::client() const 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return d->m_client; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceHandle::setClient(ResourceHandleClient* client) 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->m_client = client; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 115967717af5423377c967781471ee106e2bb4e11c8Ben MurdochResourceRequest& ResourceHandle::firstRequest() 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 117967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return d->m_firstRequest; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst String& ResourceHandle::lastHTTPMethod() const 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return d->m_lastHTTPMethod; 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 125967717af5423377c967781471ee106e2bb4e11c8Ben Murdochbool ResourceHandle::hasAuthenticationChallenge() const 126967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 127967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return !d->m_currentWebChallenge.isNull(); 128967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 129967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ResourceHandle::clearAuthentication() 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->m_currentMacChallenge = nil; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->m_currentWebChallenge.nullify(); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ResourceHandle::shouldContentSniff() const 1395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return d->m_shouldContentSniff; 1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ResourceHandle::shouldContentSniffURL(const KURL& url) 1445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(MAC) 1465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (shouldForceContentSniffing) 1475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 1485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 1495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // We shouldn't content sniff file URLs as their MIME type should be established via their extension. 1505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return !url.protocolIs("file"); 1515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ResourceHandle::forceContentSniffing() 1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian shouldForceContentSniffing = true; 1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 15806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid ResourceHandle::setDefersLoading(bool defers) 15906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 16006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen LOG(Network, "Handle %p setDefersLoading(%s)", this, defers ? "true" : "false"); 16106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 16206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(d->m_defersLoading != defers); // Deferring is not counted, so calling setDefersLoading() repeatedly is likely to be in error. 16306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen d->m_defersLoading = defers; 16406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 16506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (defers) { 16606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(d->m_failureTimer.isActive() == (d->m_scheduledFailureType != NoFailure)); 16706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (d->m_failureTimer.isActive()) 16806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen d->m_failureTimer.stop(); 16906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } else if (d->m_scheduledFailureType != NoFailure) { 17006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(!d->m_failureTimer.isActive()); 17106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen d->m_failureTimer.startOneShot(0); 17206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 17306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 17406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen platformSetDefersLoading(defers); 17506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if !USE(SOUP) 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ResourceHandle::prepareForURL(const KURL& url) 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return prefetchDNS(url.host()); 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid ResourceHandle::cacheMetadata(const ResourceResponse&, const Vector<char>&) 1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Optionally implemented by platform. 1876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS) 19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic RetainPtr<CFURLStorageSessionRef>& privateStorageSession() 19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch DEFINE_STATIC_LOCAL(RetainPtr<CFURLStorageSessionRef>, storageSession, ()); 19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return storageSession; 19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 19781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic String& privateBrowsingStorageSessionIdentifierBase() 19881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch DEFINE_STATIC_LOCAL(String, base, ()); 20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return base; 20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ResourceHandle::setPrivateBrowsingEnabled(bool enabled) 20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 20581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!enabled) { 20681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch privateStorageSession() = nullptr; 20781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 20881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 20981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 21081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (privateStorageSession()) 21181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 21381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String base = privateBrowsingStorageSessionIdentifierBase().isNull() ? privateBrowsingStorageSessionIdentifierDefaultBase() : privateBrowsingStorageSessionIdentifierBase(); 21481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RetainPtr<CFStringRef> cfIdentifier(AdoptCF, String::format("%s.PrivateBrowsing", base.utf8().data()).createCFString()); 21581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 21681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch privateStorageSession() = createPrivateBrowsingStorageSession(cfIdentifier.get()); 21781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochCFURLStorageSessionRef ResourceHandle::privateBrowsingStorageSession() 22081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 22181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return privateStorageSession().get(); 22281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 22381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 22481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ResourceHandle::setPrivateBrowsingStorageSessionIdentifierBase(const String& identifier) 22581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 22681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch privateBrowsingStorageSessionIdentifierBase() = identifier; 22781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 22881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 22981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif // USE(CFURLSTORAGESESSIONS) 23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 232