15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
25e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/Resource.h"
26e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/FetchInitiatorTypeNames.h"
288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fetch/CachedMetadata.h"
298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fetch/CrossOriginAccessControl.h"
30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/MemoryCache.h"
31e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceClient.h"
32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceClientWalker.h"
33e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h"
34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceLoader.h"
35e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourcePtr.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Logging.h"
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/SharedBuffer.h"
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/TraceEvent.h"
4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURL.h"
4183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "public/platform/Platform.h"
42521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/CurrentTime.h"
43521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/MathExtras.h"
44521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/RefCountedLeakCounter.h"
45521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/StdLibExtras.h"
46521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/Vector.h"
47521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/text/CString.h"
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// These response headers are not copied from a revalidated response to the
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// cached response headers. For compatibility, this list is based on Chromium's
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// net/http/http_response_headers.cc.
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const char* const headersToIgnoreAfterRevalidation[] = {
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "allow",
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "connection",
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "etag",
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "expires",
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "keep-alive",
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "last-modified"
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "proxy-authenticate",
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "proxy-connection",
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "trailer",
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "transfer-encoding",
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "upgrade",
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "www-authenticate",
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "x-frame-options",
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "x-xss-protection",
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Some header prefixes mean "Don't copy this header from a 304 response.".
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Rather than listing all the relevant headers, we can consolidate them into
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// this list, also grabbed from Chromium's net/http/http_response_headers.cc.
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const char* const headerPrefixesToIgnoreAfterRevalidation[] = {
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "content-",
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "x-content-",
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    "x-webkit-"
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static inline bool shouldUpdateHeaderAfterRevalidation(const AtomicString& header)
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < WTF_ARRAY_LENGTH(headersToIgnoreAfterRevalidation); i++) {
858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (equalIgnoringCase(header, headersToIgnoreAfterRevalidation[i]))
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return false;
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < WTF_ARRAY_LENGTH(headerPrefixesToIgnoreAfterRevalidation); i++) {
898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (header.startsWith(headerPrefixesToIgnoreAfterRevalidation[i], false))
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return false;
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
95fff8884795cb540f87cf6e6d67b629519b00eb8bBen MurdochDEFINE_DEBUG_ONLY_GLOBAL(RefCountedLeakCounter, cachedResourceLeakCounter, ("Resource"));
96e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Resource::s_instanceCount = 0;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98fff8884795cb540f87cf6e6d67b629519b00eb8bBen MurdochResource::Resource(const ResourceRequest& request, Type type)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_resourceRequest(request)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_responseTimestamp(currentTime())
101fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    , m_cancelTimer(this, &Resource::cancelTimerFired)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_loadFinishTime(0)
1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_identifier(0)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_encodedSize(0)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_decodedSize(0)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_handleCount(0)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_preloadCount(0)
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_protectorCount(0)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_preloadResult(PreloadNotReferenced)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_requestedFromNetworkingLayer(false)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_loading(false)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_switchingClientsToRevalidatedResource(false)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_type(type)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_status(Pending)
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_wasPurged(false)
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_needsSynchronousCacheHit(false)
11707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_deleted(false)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    , m_resourceToRevalidate(nullptr)
121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    , m_proxyResource(nullptr)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_type == unsigned(type)); // m_type is a bitfield, so this tests careless updates of the enum.
124e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ++s_instanceCount;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cachedResourceLeakCounter.increment();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    memoryCache()->registerLiveResource(*this);
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_resourceRequest.url().hasFragmentIdentifier())
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    KURL urlForCache = MemoryCache::removeFragmentIdentifierIfNeeded(m_resourceRequest.url());
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (urlForCache.hasFragmentIdentifier())
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_fragmentIdentifierForRequest = m_resourceRequest.url().fragmentIdentifier();
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_resourceRequest.setURL(urlForCache);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139fff8884795cb540f87cf6e6d67b629519b00eb8bBen MurdochResource::~Resource()
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_resourceToRevalidate); // Should be true because canDelete() checks this.
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(canDelete());
14307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RELEASE_ASSERT(!memoryCache()->contains(this));
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RELEASE_ASSERT(!ResourceCallback::callbackHandler()->isScheduled(this));
14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(url().isNull() || memoryCache()->resourceForURL(KURL(ParsedURLString, url())) != this);
14607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    assertAlive();
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deleted = true;
15007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#endif
15107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#ifndef NDEBUG
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cachedResourceLeakCounter.decrement();
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
154e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    --s_instanceCount;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid Resource::dispose()
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void Resource::trace(Visitor* visitor)
162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
163c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_loader);
164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_resourceToRevalidate);
165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_proxyResource);
166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
168fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::failBeforeStarting()
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
170a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    WTF_LOG(ResourceLoading, "Cannot start loading '%s'", url().string().latin1().data());
171fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    error(Resource::LoadError);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
174fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1763464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    if (!fetcher->frame()) {
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        failBeforeStarting();
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_options = options;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_loading = true;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!accept().isEmpty())
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_resourceRequest.setHTTPAccept(accept());
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: It's unfortunate that the cache layer and below get to know anything about fragment identifiers.
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // We should look into removing the expectation of that knowledge from the platform network stacks.
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceRequest request(m_resourceRequest);
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_fragmentIdentifierForRequest.isNull()) {
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        KURL url = request.url();
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        url.setFragmentIdentifier(m_fragmentIdentifierForRequest);
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        request.setURL(url);
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_fragmentIdentifierForRequest = String();
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_status = Pending;
1971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_loader) {
1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        RELEASE_ASSERT(m_options.synchronousPolicy == RequestSynchronously);
1991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_loader->changeToSynchronous();
2001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return;
2011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
20206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    m_loader = ResourceLoader::create(fetcher, this, request, options);
20306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    m_loader->start();
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
206fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::checkNotify()
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isLoading())
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
211fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourceClientWalker<ResourceClient> w(m_clients);
212fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    while (ResourceClient* c = w.next())
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        c->notifyFinished(this);
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
216fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::appendData(const char* data, int length)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
218197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "Resource::appendData");
21993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!m_resourceToRevalidate);
22093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!errorOccurred());
22153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_options.dataBufferingPolicy == DoNotBufferData)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_data)
22453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_data->append(data, length);
22553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    else
226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_data = SharedBuffer::createPurgeable(data, length);
22753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    setEncodedSize(m_data->size());
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void Resource::setResourceBuffer(PassRefPtr<SharedBuffer> resourceBuffer)
23106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
23206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    ASSERT(!m_resourceToRevalidate);
23306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    ASSERT(!errorOccurred());
23406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    ASSERT(m_options.dataBufferingPolicy == BufferData);
23506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    m_data = resourceBuffer;
23606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    setEncodedSize(m_data->size());
23706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
23806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void Resource::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy)
24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_options.dataBufferingPolicy = dataBufferingPolicy;
24209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_data.clear();
24309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setEncodedSize(0);
24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
246fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::error(Resource::Status status)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (m_resourceToRevalidate)
24993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        revalidationFailed();
25093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
251591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!m_error.isNull() && (m_error.isCancellation() || !isPreloaded()))
252591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        memoryCache()->remove(this);
253591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setStatus(status);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(errorOccurred());
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_data.clear();
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setLoading(false);
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    checkNotify();
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
262fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::finishOnePart()
26353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
26453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    setLoading(false);
26553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    checkNotify();
26653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
26753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
268fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::finish(double finishTime)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!m_resourceToRevalidate);
27193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!errorOccurred());
27293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_loadFinishTime = finishTime;
27353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    finishOnePart();
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!errorOccurred())
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_status = Cached;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
278fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool Resource::passesAccessControlCheck(SecurityOrigin* securityOrigin)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    String ignoredErrorDescription;
28153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return passesAccessControlCheck(securityOrigin, ignoredErrorDescription);
28253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
28353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
284fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool Resource::passesAccessControlCheck(SecurityOrigin* securityOrigin, String& errorDescription)
28553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return blink::passesAccessControlCheck(m_response, resourceRequest().allowStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials, securityOrigin, errorDescription);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static double currentAge(const ResourceResponse& response, double responseTimestamp)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // RFC2616 13.2.3
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No compensation for latency as that is not terribly important in practice
29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double dateValue = response.date();
29409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double apparentAge = std::isfinite(dateValue) ? std::max(0., responseTimestamp - dateValue) : 0;
29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double ageValue = response.age();
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double correctedReceivedAge = std::isfinite(ageValue) ? std::max(apparentAge, ageValue) : apparentAge;
29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double residentTime = currentTime() - responseTimestamp;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return correctedReceivedAge + residentTime;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic double freshnessLifetime(ResourceResponse& response, double responseTimestamp)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#if !OS(ANDROID)
3049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // On desktop, local files should be reloaded in case they change.
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (response.url().isLocalFile())
3069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return 0;
3079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif
3089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Cache other non-http / non-filesystem resources liberally.
31009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!response.url().protocolIsInHTTPFamily()
31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        && !response.url().protocolIs("filesystem"))
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return std::numeric_limits<double>::max();
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // RFC2616 13.2.4
31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double maxAgeValue = response.cacheControlMaxAge();
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (std::isfinite(maxAgeValue))
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return maxAgeValue;
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double expiresValue = response.expires();
31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double dateValue = response.date();
32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double creationTime = std::isfinite(dateValue) ? dateValue : responseTimestamp;
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (std::isfinite(expiresValue))
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return expiresValue - creationTime;
32309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double lastModifiedValue = response.lastModified();
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (std::isfinite(lastModifiedValue))
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (creationTime - lastModifiedValue) * 0.1;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If no cache headers are present, the specification leaves the decision to the UA. Other browsers seem to opt for 0.
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic bool canUseResponse(ResourceResponse& response, double responseTimestamp)
33109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
33209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (response.isNull())
33309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
33409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
33509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Why isn't must-revalidate considered a reason we can't use the response?
33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (response.cacheControlContainsNoCache() || response.cacheControlContainsNoStore())
33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (response.httpStatusCode() == 303)  {
34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Must not be cached.
34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
34309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (response.httpStatusCode() == 302 || response.httpStatusCode() == 307) {
34510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // Default to not cacheable unless explicitly allowed.
34610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        bool hasMaxAge = std::isfinite(response.cacheControlMaxAge());
34710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        bool hasExpires = std::isfinite(response.expires());
34810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // TODO: consider catching Cache-Control "private" and "public" here.
34910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (!hasMaxAge && !hasExpires)
35010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            return false;
35109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
35209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return currentAge(response, responseTimestamp) <= freshnessLifetime(response, responseTimestamp);
35409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)const ResourceRequest& Resource::lastResourceRequest() const
35707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
35807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!m_redirectChain.size())
35907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_resourceRequest;
36007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return m_redirectChain.last().m_request;
36107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
36207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
36309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void Resource::willSendRequest(ResourceRequest& request, const ResourceResponse& response)
36409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_redirectChain.append(RedirectPair(request, response));
36609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_requestedFromNetworkingLayer = true;
36709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Resource::unlock()
37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_data)
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_data->isLocked())
375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
37707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!memoryCache()->contains(this) || hasClients() || m_handleCount > 1 || m_proxyResource || m_resourceToRevalidate || !m_loadFinishTime || !isSafeToUnlock())
37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
37909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_data->unlock();
38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return true;
38209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
384f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liubool Resource::hasRightHandleCountApartFromCache(unsigned targetCount) const
385f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
386f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return m_handleCount == targetCount + (memoryCache()->contains(this) ? 1 : 0);
387f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
388f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
389fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::responseReceived(const ResourceResponse& response)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setResponse(response);
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_responseTimestamp = currentTime();
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String encoding = response.textEncodingName();
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!encoding.isNull())
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setEncoding(encoding);
39693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
39793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!m_resourceToRevalidate)
39893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
39993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (response.httpStatusCode() == 304)
40093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        revalidationSucceeded(response);
40193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
40293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        revalidationFailed();
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::setSerializedCachedMetadata(const char* data, size_t size)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We only expect to receive cached metadata from the platform once.
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this triggers, it indicates an efficiency problem which is most
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // likely unexpected in code designed to improve performance.
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_cachedMetadata);
41193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!m_resourceToRevalidate);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cachedMetadata = CachedMetadata::deserialize(data, size);
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid Resource::setCachedMetadata(unsigned dataTypeID, const char* data, size_t size, MetadataCacheType cacheType)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Currently, only one type of cached metadata per resource is supported.
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the need arises for multiple types of metadata per resource this could
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // be enhanced to store types of metadata in a map.
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_cachedMetadata);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size);
4247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (cacheType == SendToPlatform) {
4267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const Vector<char>& serializedData = m_cachedMetadata->serialize();
4277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        blink::Platform::current()->cacheMetadata(m_response.url(), m_response.responseTime(), serializedData.data(), serializedData.size());
4287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
431c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void Resource::clearCachedMetadata()
432c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
433c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_cachedMetadata.clear();
434c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
435c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
436f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liubool Resource::canDelete() const
437f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
438f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return !hasClients() && !m_loader && !m_preloadCount && hasRightHandleCountApartFromCache(0)
439f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        && !m_protectorCount && !m_resourceToRevalidate && !m_proxyResource;
440f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
441f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
442f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liubool Resource::hasOneHandle() const
443f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
444f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return hasRightHandleCountApartFromCache(1);
445f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
446f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
447fff8884795cb540f87cf6e6d67b629519b00eb8bBen MurdochCachedMetadata* Resource::cachedMetadata(unsigned dataTypeID) const
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID)
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_cachedMetadata.get();
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
454fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::clearLoader()
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_loader = nullptr;
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
459fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::addClient(ResourceClient* client)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (addClientToSet(client))
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        didAddClient(client);
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::didAddClient(ResourceClient* c)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isLoading() && !stillNeedsLoad())
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        c->notifyFinished(this);
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
471e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)static bool shouldSendCachedDataSynchronouslyForType(Resource::Type type)
472e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
473e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Some resources types default to return data synchronously.
474e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // For most of these, it's because there are layout tests that
475e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // expect data to return synchronously in case of cache hit. In
476e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // the case of fonts, there was a performance regression.
477e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // FIXME: Get to the point where we don't need to special-case sync/async
478e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // behavior for different resource types.
479e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (type == Resource::Image)
480e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
481e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (type == Resource::CSSStyleSheet)
482e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
483e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (type == Resource::Script)
484e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
485e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (type == Resource::Font)
486e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
487e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return false;
488e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
489e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
490fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool Resource::addClientToSet(ResourceClient* client)
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!isPurgeable());
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_preloadResult == PreloadNotReferenced) {
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isLoaded())
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_preloadResult = PreloadReferencedWhileComplete;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (m_requestedFromNetworkingLayer)
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_preloadResult = PreloadReferencedWhileLoading;
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_preloadResult = PreloadReferenced;
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
502a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!hasClients())
503a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        memoryCache()->makeLive(this);
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // If we have existing data to send to the new client and the resource type supprts it, send it asynchronously.
50609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_response.isNull() && !m_proxyResource && !shouldSendCachedDataSynchronouslyForType(type()) && !m_needsSynchronousCacheHit) {
507e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_clientsAwaitingCallback.add(client);
508e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        ResourceCallback::callbackHandler()->schedule(this);
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_clients.add(client);
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
516fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::removeClient(ResourceClient* client)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
518e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (m_clientsAwaitingCallback.contains(client)) {
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_clients.contains(client));
520e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_clientsAwaitingCallback.remove(client);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
52210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        ASSERT(m_clients.contains(client));
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_clients.remove(client);
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        didRemoveClient(client);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_clientsAwaitingCallback.isEmpty())
52810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        ResourceCallback::callbackHandler()->cancel(this);
52910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool deleted = deleteIfPossible();
531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!deleted && !hasClients()) {
532a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        memoryCache()->makeDead(this);
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!m_switchingClientsToRevalidatedResource)
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            allClientsRemoved();
535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // RFC2616 14.9.2:
537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // "no-store: ... MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible"
538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // "... History buffers MAY store such responses as part of their normal operation."
539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // We allow non-secure content to be reused in history, but we do not allow secure content to be reused.
5406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (hasCacheControlNoStoreHeader() && url().protocolIs("https")) {
541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            memoryCache()->remove(this);
542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            memoryCache()->prune();
543fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        } else {
544e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            memoryCache()->prune(this);
545fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        }
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This object may be dead here.
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
550fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::allClientsRemoved()
5515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
552591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!m_loader)
553591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
5543c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (m_type == MainResource || m_type == Raw)
5555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        cancelTimerFired(&m_cancelTimer);
5565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    else if (!m_cancelTimer.isActive())
557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_cancelTimer.startOneShot(0, FROM_HERE);
558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unlock();
5605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
5615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
562fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::cancelTimerFired(Timer<Resource>* timer)
5635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
5645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT_UNUSED(timer, timer == &m_cancelTimer);
5655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (hasClients() || !m_loader)
5665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
567fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    ResourcePtr<Resource> protect(this);
5685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_loader->cancelIfNotFinishing();
569591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (m_status != Cached)
570591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        memoryCache()->remove(this);
5715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
5725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
573fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool Resource::deleteIfPossible()
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
57507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (canDelete() && !memoryCache()->contains(this)) {
576fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        InspectorInstrumentation::willDestroyResource(this);
577197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        dispose();
578c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        memoryCache()->unregisterLiveResource(*this);
579c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if !ENABLE(OILPAN)
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this;
581c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid Resource::setDecodedSize(size_t decodedSize)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
58907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (decodedSize == m_decodedSize)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
59107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    size_t oldSize = size();
59207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_decodedSize = decodedSize;
593a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    memoryCache()->update(this, oldSize, size());
594a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    memoryCache()->updateDecodedResource(this, UpdateForPropertyChange);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid Resource::setEncodedSize(size_t encodedSize)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
59907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (encodedSize == m_encodedSize)
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
60107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    size_t oldSize = size();
60207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_encodedSize = encodedSize;
603a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    memoryCache()->update(this, oldSize, size());
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
606a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid Resource::didAccessDecodedData()
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
608a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    memoryCache()->updateDecodedResource(this, UpdateForAccess);
609a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    memoryCache()->prune();
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
61102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
612e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void Resource::finishPendingClients()
613e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
6146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // We're going to notify clients one by one. It is simple if the client does nothing.
6156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // However there are a couple other things that can happen.
6166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    //
6176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // 1. Clients can be added during the loop. Make sure they are not processed.
6186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // 2. Clients can be removed during the loop. Make sure they are always available to be
6196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    //    removed. Also don't call removed clients or add them back.
6206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
6216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // Handle case (1) by saving a list of clients to notify. A separate list also ensure
6226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // a client is either in m_clients or m_clientsAwaitingCallback.
6236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    Vector<ResourceClient*> clientsToNotify;
6246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    copyToVector(m_clientsAwaitingCallback, clientsToNotify);
6256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
6266f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    for (size_t i = 0; i < clientsToNotify.size(); ++i) {
6276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        ResourceClient* client = clientsToNotify[i];
6286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
6296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        // Handle case (2) to skip removed clients.
6306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!m_clientsAwaitingCallback.remove(client))
6316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            continue;
632e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_clients.add(client);
633e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        didAddClient(client);
634e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
6356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
63610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // It is still possible for the above loop to finish a new client synchronously.
63710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // If there's no client waiting we should deschedule.
6386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    bool scheduled = ResourceCallback::callbackHandler()->isScheduled(this);
63910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (scheduled && m_clientsAwaitingCallback.isEmpty())
64010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        ResourceCallback::callbackHandler()->cancel(this);
6416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
6426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // Prevent the case when there are clients waiting but no callback scheduled.
6436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    ASSERT(m_clientsAwaitingCallback.isEmpty() || scheduled);
644e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
645e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
64609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void Resource::prune()
64709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
64809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    destroyDecodedDataIfPossible();
64909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unlock();
65009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
65109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
652fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::setResourceToRevalidate(Resource* resource)
65302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(resource);
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_resourceToRevalidate);
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(resource != this);
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_handlesToRevalidate.isEmpty());
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(resource->type() == type());
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
660a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    WTF_LOG(ResourceLoading, "Resource %p setResourceToRevalidate %p", this, resource);
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The following assert should be investigated whenever it occurs. Although it should never fire, it currently does in rare circumstances.
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // https://bugs.webkit.org/show_bug.cgi?id=28604.
664fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    // So the code needs to be robust to this assert failing thus the "if (m_resourceToRevalidate->m_proxyResource == this)" in Resource::clearResourceToRevalidate.
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!resource->m_proxyResource);
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->m_proxyResource = this;
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_resourceToRevalidate = resource;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
671fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::clearResourceToRevalidate()
67202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_resourceToRevalidate);
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_switchingClientsToRevalidatedResource)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A resource may start revalidation before this method has been called, so check that this resource is still the proxy resource before clearing it out.
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_resourceToRevalidate->m_proxyResource == this) {
679c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_resourceToRevalidate->m_proxyResource = nullptr;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_resourceToRevalidate->deleteIfPossible();
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_handlesToRevalidate.clear();
683c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_resourceToRevalidate = nullptr;
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    deleteIfPossible();
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
68602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
687fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::switchClientsToRevalidatedResource()
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_resourceToRevalidate);
69007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(memoryCache()->contains(m_resourceToRevalidate));
69107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!memoryCache()->contains(this));
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
693c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WTF_LOG(ResourceLoading, "Resource %p switchClientsToRevalidatedResource %p", this, m_resourceToRevalidate.get());
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_resourceToRevalidate->m_identifier = m_identifier;
6965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_switchingClientsToRevalidatedResource = true;
698fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    HashSet<ResourcePtrBase*>::iterator end = m_handlesToRevalidate.end();
699fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    for (HashSet<ResourcePtrBase*>::iterator it = m_handlesToRevalidate.begin(); it != end; ++it) {
700fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        ResourcePtrBase* handle = *it;
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        handle->m_resource = m_resourceToRevalidate;
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_resourceToRevalidate->registerHandle(handle);
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        --m_handleCount;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_handleCount);
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_handlesToRevalidate.clear();
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
708fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    Vector<ResourceClient*> clientsToMove;
709fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    HashCountedSet<ResourceClient*>::iterator end2 = m_clients.end();
710fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    for (HashCountedSet<ResourceClient*>::iterator it = m_clients.begin(); it != end2; ++it) {
711fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        ResourceClient* client = it->key;
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned count = it->value;
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (count) {
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            clientsToMove.append(client);
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            --count;
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned moveCount = clientsToMove.size();
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned n = 0; n < moveCount; ++n)
721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeClient(clientsToMove[n]);
722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_clients.isEmpty());
723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (unsigned n = 0; n < moveCount; ++n)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_resourceToRevalidate->addClientToSet(clientsToMove[n]);
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned n = 0; n < moveCount; ++n) {
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Calling didAddClient may do anything, including trying to cancel revalidation.
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Assert that it didn't succeed.
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_resourceToRevalidate);
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Calling didAddClient for a client may end up removing another client. In that case it won't be in the set anymore.
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_resourceToRevalidate->m_clients.contains(clientsToMove[n]))
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_resourceToRevalidate->didAddClient(clientsToMove[n]);
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_switchingClientsToRevalidatedResource = false;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
737fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::updateResponseAfterRevalidation(const ResourceResponse& validatingResponse)
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_responseTimestamp = currentTime();
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // RFC2616 10.3.5
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Update cached headers from the 304 response
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HTTPHeaderMap& newHeaders = validatingResponse.httpHeaderFields();
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTTPHeaderMap::const_iterator end = newHeaders.end();
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HTTPHeaderMap::const_iterator it = newHeaders.begin(); it != end; ++it) {
746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Entity headers should not be sent by servers when generating a 304
747926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // response; misconfigured servers send them anyway. We shouldn't allow
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // such headers to update the original request. We'll base this on the
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // list defined by RFC2616 7.1, with a few additions for extension headers
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // we care about.
751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!shouldUpdateHeaderAfterRevalidation(it->key))
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_response.setHTTPHeaderField(it->key, it->value);
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
757fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::revalidationSucceeded(const ResourceResponse& response)
75893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
75993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(m_resourceToRevalidate);
76007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!memoryCache()->contains(m_resourceToRevalidate));
76193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(m_resourceToRevalidate->isLoaded());
76293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
76393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Calling evict() can potentially delete revalidatingResource, which we use
76493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // below. This mustn't be the case since revalidation means it is loaded
76593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // and so canDelete() is false.
76693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!canDelete());
76793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
76893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_resourceToRevalidate->updateResponseAfterRevalidation(response);
769e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    memoryCache()->replace(m_resourceToRevalidate, this);
77093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
77193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    switchClientsToRevalidatedResource();
77207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    assertAlive();
77393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // clearResourceToRevalidate deletes this.
77493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    clearResourceToRevalidate();
77593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
77693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
777fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::revalidationFailed()
77893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
77993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(WTF::isMainThread());
780a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    WTF_LOG(ResourceLoading, "Revalidation failed for %p", this);
78193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(resourceToRevalidate());
78293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    clearResourceToRevalidate();
78393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
78493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
785fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::registerHandle(ResourcePtrBase* h)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
78707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    assertAlive();
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ++m_handleCount;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_resourceToRevalidate)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_handlesToRevalidate.add(h);
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
793fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::unregisterHandle(ResourcePtrBase* h)
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
79507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    assertAlive();
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_handleCount > 0);
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    --m_handleCount;
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_resourceToRevalidate)
800fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        m_handlesToRevalidate.remove(h);
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_handleCount) {
803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (deleteIfPossible())
804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
805d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        unlock();
80607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    } else if (m_handleCount == 1 && memoryCache()->contains(this)) {
807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        unlock();
808f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (!hasClients())
809f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            memoryCache()->prune(this);
810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8136f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool Resource::canReuseRedirectChain()
81409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
81509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (size_t i = 0; i < m_redirectChain.size(); ++i) {
81609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!canUseResponse(m_redirectChain[i].m_redirectResponse, m_responseTimestamp))
81709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return false;
8186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (m_redirectChain[i].m_request.cacheControlContainsNoCache() || m_redirectChain[i].m_request.cacheControlContainsNoStore())
8196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return false;
82009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
82109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return true;
82209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
82309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool Resource::hasCacheControlNoStoreHeader()
8256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
8266f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return m_response.cacheControlContainsNoStore() || m_resourceRequest.cacheControlContainsNoStore();
8276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
8286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
8296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool Resource::mustRevalidateDueToCacheHeaders()
83009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
8316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return !canUseResponse(m_response, m_responseTimestamp) || m_resourceRequest.cacheControlContainsNoCache() || m_resourceRequest.cacheControlContainsNoStore();
83209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
83309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool Resource::canUseCacheValidator()
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_loading || errorOccurred())
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (hasCacheControlNoStoreHeader())
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return m_response.hasCacheValidatorFields() || m_resourceRequest.hasCacheValidatorFields();
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Resource::isPurgeable() const
84502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
846d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_data && !m_data->isLocked();
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Resource::wasPurged() const
85002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
85109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_wasPurged;
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Resource::lock()
85502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_data)
857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_data->isLocked())
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
8605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!hasClients());
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_data->lock()) {
86409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_wasPurged = true;
86502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return false;
86609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)size_t Resource::overheadSize() const
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kAverageClientsHashMapSize = 384;
873fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    return sizeof(Resource) + m_response.memoryUsage() + kAverageClientsHashMapSize + m_resourceRequest.url().string().length() * 2;
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid Resource::didChangePriority(ResourceLoadPriority loadPriority, int intraPriorityValue)
877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_loader)
87907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_loader->didChangePriority(loadPriority, intraPriorityValue);
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
882e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)Resource::ResourceCallback* Resource::ResourceCallback::callbackHandler()
883e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
884e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    DEFINE_STATIC_LOCAL(ResourceCallback, callbackHandler, ());
885e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return &callbackHandler;
886e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
887e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
888e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)Resource::ResourceCallback::ResourceCallback()
889e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    : m_callbackTimer(this, &ResourceCallback::timerFired)
890e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
891e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
892e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
893e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void Resource::ResourceCallback::schedule(Resource* resource)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!m_callbackTimer.isActive())
896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_callbackTimer.startOneShot(0, FROM_HERE);
89707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    resource->assertAlive();
898e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_resourcesWithPendingClients.add(resource);
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
901e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void Resource::ResourceCallback::cancel(Resource* resource)
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
90307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    resource->assertAlive();
904e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_resourcesWithPendingClients.remove(resource);
905e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (m_callbackTimer.isActive() && m_resourcesWithPendingClients.isEmpty())
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_callbackTimer.stop();
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool Resource::ResourceCallback::isScheduled(Resource* resource) const
910d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_resourcesWithPendingClients.contains(resource);
912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
913d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
914fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Resource::ResourceCallback::timerFired(Timer<ResourceCallback>*)
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
916e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    HashSet<Resource*>::iterator end = m_resourcesWithPendingClients.end();
917e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Vector<ResourcePtr<Resource> > resources;
918e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    for (HashSet<Resource*>::iterator it = m_resourcesWithPendingClients.begin(); it != end; ++it)
919e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        resources.append(*it);
920e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_resourcesWithPendingClients.clear();
92107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
92207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (size_t i = 0; i < resources.size(); i++) {
92307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        resources[i]->assertAlive();
924e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        resources[i]->finishPendingClients();
92507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        resources[i]->assertAlive();
92607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
92707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
92807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (size_t i = 0; i < resources.size(); i++)
92907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        resources[i]->assertAlive();
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char* initatorTypeNameToString(const AtomicString& initiatorTypeName)
93309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
93409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::css)
93509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "CSS resource";
93609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::document)
93709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Document";
93809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::icon)
93909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Icon";
94009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::internal)
94109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Internal resource";
94209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::link)
94309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Link element resource";
94409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::processinginstruction)
94509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Processing instruction";
94609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::texttrack)
94709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Text track";
94809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::xml)
94909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "XML resource";
95009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (initiatorTypeName == FetchInitiatorTypeNames::xmlhttprequest)
95109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "XMLHttpRequest";
95209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
95309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return "Resource";
95409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
95509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
95609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* Resource::resourceTypeToString(Type type, const FetchInitiatorInfo& initiatorInfo)
95709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
95809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    switch (type) {
95909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::MainResource:
96009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Main resource";
96109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::Image:
96209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Image";
96309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::CSSStyleSheet:
96409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "CSS stylesheet";
96509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::Script:
96609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Script";
96709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::Font:
96809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Font";
96909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::Raw:
97009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return initatorTypeNameToString(initiatorInfo.name);
97109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::SVGDocument:
97209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "SVG document";
97309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::XSLStyleSheet:
97409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "XSL stylesheet";
97509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::LinkPrefetch:
97609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Link prefetch resource";
97709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::LinkSubresource:
97809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Link subresource";
97909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::TextTrack:
98009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Text track";
98109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Resource::ImportResource:
98209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "Imported resource";
9836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    case Resource::Media:
9846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return "Media";
98509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
98609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_NOT_REACHED();
98709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return initatorTypeNameToString(initiatorInfo.name);
98809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
98909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
990f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#if !LOG_DISABLED
991f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)const char* ResourceTypeName(Resource::Type type)
992f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
993f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    switch (type) {
994f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::MainResource:
995f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "MainResource";
996f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::Image:
997f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "Image";
998f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::CSSStyleSheet:
999f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "CSSStyleSheet";
1000f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::Script:
1001f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "Script";
1002f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::Font:
1003f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "Font";
1004f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::Raw:
1005f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "Raw";
1006f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::SVGDocument:
1007f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "SVGDocument";
1008f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::XSLStyleSheet:
1009f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "XSLStyleSheet";
1010f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::LinkPrefetch:
1011f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "LinkPrefetch";
1012f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::LinkSubresource:
1013f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "LinkSubresource";
1014f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::TextTrack:
1015f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "TextTrack";
1016f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case Resource::ImportResource:
1017f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return "ImportResource";
10186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    case Resource::Media:
10196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return "Media";
1020f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
1021f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_NOT_REACHED();
1022f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return "Unknown";
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1024f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#endif // !LOG_DISABLED
10251fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
1026f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
1027