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