Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: Source/core/fetch/Resource.cpp

Issue 929953002: CachedMetadata support for ServiceWorker script. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: incorporated kinuko's comment Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 for (size_t i = 0; i < WTF_ARRAY_LENGTH(headerPrefixesToIgnoreAfterRevalidat ion); i++) { 89 for (size_t i = 0; i < WTF_ARRAY_LENGTH(headerPrefixesToIgnoreAfterRevalidat ion); i++) {
90 if (header.startsWith(headerPrefixesToIgnoreAfterRevalidation[i], false) ) 90 if (header.startsWith(headerPrefixesToIgnoreAfterRevalidation[i], false) )
91 return false; 91 return false;
92 } 92 }
93 return true; 93 return true;
94 } 94 }
95 95
96 DEFINE_DEBUG_ONLY_GLOBAL(RefCountedLeakCounter, cachedResourceLeakCounter, ("Res ource")); 96 DEFINE_DEBUG_ONLY_GLOBAL(RefCountedLeakCounter, cachedResourceLeakCounter, ("Res ource"));
97 unsigned Resource::s_instanceCount = 0; 97 unsigned Resource::s_instanceCount = 0;
98 98
99 class Resource::CacheHandler : public CachedMetadataHandler {
100 public:
101 static PassOwnPtr<CacheHandler> create(Resource* resource)
102 {
103 return adoptPtr(new CacheHandler(resource));
104 }
105 ~CacheHandler() override { }
106 void setCachedMetadata(unsigned, const char*, size_t, CacheType) override;
107 void clearCachedMetadata(CacheType) override;
108 CachedMetadata* cachedMetadata(unsigned) const override;
109 String encoding() const override;
110
111 private:
112 explicit CacheHandler(Resource*);
113 Resource* m_resource;
114 };
115
116 Resource::CacheHandler::CacheHandler(Resource* resource)
117 : m_resource(resource)
118 {
119 }
120
121 void Resource::CacheHandler::setCachedMetadata(unsigned dataTypeID, const char* data, size_t size, CacheType type)
122 {
123 m_resource->setCachedMetadata(dataTypeID, data, size, type);
124 }
125
126 void Resource::CacheHandler::clearCachedMetadata(CacheType type)
127 {
128 m_resource->clearCachedMetadata(type);
129 }
130
131 CachedMetadata* Resource::CacheHandler::cachedMetadata(unsigned dataTypeID) cons t
132 {
133 return m_resource->cachedMetadata(dataTypeID);
134 }
135
136 String Resource::CacheHandler::encoding() const
137 {
138 return m_resource->encoding();
139 }
140
99 Resource::Resource(const ResourceRequest& request, Type type) 141 Resource::Resource(const ResourceRequest& request, Type type)
100 : m_resourceRequest(request) 142 : m_resourceRequest(request)
101 , m_responseTimestamp(currentTime()) 143 , m_responseTimestamp(currentTime())
102 , m_cancelTimer(this, &Resource::cancelTimerFired) 144 , m_cancelTimer(this, &Resource::cancelTimerFired)
103 , m_loadFinishTime(0) 145 , m_loadFinishTime(0)
104 , m_identifier(0) 146 , m_identifier(0)
105 , m_encodedSize(0) 147 , m_encodedSize(0)
106 , m_decodedSize(0) 148 , m_decodedSize(0)
107 , m_handleCount(0) 149 , m_handleCount(0)
108 , m_preloadCount(0) 150 , m_preloadCount(0)
(...skipping 20 matching lines...) Expand all
129 #endif 171 #endif
130 memoryCache()->registerLiveResource(*this); 172 memoryCache()->registerLiveResource(*this);
131 173
132 if (!m_resourceRequest.url().hasFragmentIdentifier()) 174 if (!m_resourceRequest.url().hasFragmentIdentifier())
133 return; 175 return;
134 KURL urlForCache = MemoryCache::removeFragmentIdentifierIfNeeded(m_resourceR equest.url()); 176 KURL urlForCache = MemoryCache::removeFragmentIdentifierIfNeeded(m_resourceR equest.url());
135 if (urlForCache.hasFragmentIdentifier()) 177 if (urlForCache.hasFragmentIdentifier())
136 return; 178 return;
137 m_fragmentIdentifierForRequest = m_resourceRequest.url().fragmentIdentifier( ); 179 m_fragmentIdentifierForRequest = m_resourceRequest.url().fragmentIdentifier( );
138 m_resourceRequest.setURL(urlForCache); 180 m_resourceRequest.setURL(urlForCache);
181
182 if (url().protocolIsInHTTPFamily())
vogelheim 2015/02/16 17:29:50 nitpick: This is exactly right, but maybe add a 1
horo 2015/02/16 17:54:26 Done.
183 m_cacheHandler = CacheHandler::create(this);
139 } 184 }
140 185
141 Resource::~Resource() 186 Resource::~Resource()
142 { 187 {
143 ASSERT(!m_resourceToRevalidate); // Should be true because canDelete() check s this. 188 ASSERT(!m_resourceToRevalidate); // Should be true because canDelete() check s this.
144 ASSERT(canDelete()); 189 ASSERT(canDelete());
145 RELEASE_ASSERT(!memoryCache()->contains(this)); 190 RELEASE_ASSERT(!memoryCache()->contains(this));
146 RELEASE_ASSERT(!ResourceCallback::callbackHandler()->isScheduled(this)); 191 RELEASE_ASSERT(!ResourceCallback::callbackHandler()->isScheduled(this));
147 assertAlive(); 192 assertAlive();
148 193
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 { 458 {
414 // We only expect to receive cached metadata from the platform once. 459 // We only expect to receive cached metadata from the platform once.
415 // If this triggers, it indicates an efficiency problem which is most 460 // If this triggers, it indicates an efficiency problem which is most
416 // likely unexpected in code designed to improve performance. 461 // likely unexpected in code designed to improve performance.
417 ASSERT(!m_cachedMetadata); 462 ASSERT(!m_cachedMetadata);
418 ASSERT(!m_resourceToRevalidate); 463 ASSERT(!m_resourceToRevalidate);
419 464
420 m_cachedMetadata = CachedMetadata::deserialize(data, size); 465 m_cachedMetadata = CachedMetadata::deserialize(data, size);
421 } 466 }
422 467
423 void Resource::setCachedMetadata(unsigned dataTypeID, const char* data, size_t s ize, MetadataCacheType cacheType) 468 CachedMetadataHandler* Resource::cacheHandler()
469 {
470 return m_cacheHandler.get();
471 }
472
473 void Resource::setCachedMetadata(unsigned dataTypeID, const char* data, size_t s ize, CachedMetadataHandler::CacheType cacheType)
424 { 474 {
425 // Currently, only one type of cached metadata per resource is supported. 475 // Currently, only one type of cached metadata per resource is supported.
426 // If the need arises for multiple types of metadata per resource this could 476 // If the need arises for multiple types of metadata per resource this could
427 // be enhanced to store types of metadata in a map. 477 // be enhanced to store types of metadata in a map.
428 ASSERT(!m_cachedMetadata); 478 ASSERT(!m_cachedMetadata);
429 479
430 m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size); 480 m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size);
431 481
432 // We don't support sending the metadata to the platform when the response 482 // We don't support sending the metadata to the platform when the response
433 // was fetched via a ServiceWorker to prevent an attacker's Service Worker 483 // was fetched via a ServiceWorker to prevent an attacker's Service Worker
434 // from poisoning the metadata cache. 484 // from poisoning the metadata cache.
435 // FIXME: Support sending the metadata even if the response was fetched via 485 // FIXME: Support sending the metadata even if the response was fetched via
436 // a ServiceWorker. https://crbug.com/448706 486 // a ServiceWorker. https://crbug.com/448706
437 if (cacheType == SendToPlatform && !m_response.wasFetchedViaServiceWorker()) { 487 if (cacheType == CachedMetadataHandler::SendToPlatform && !m_response.wasFet chedViaServiceWorker()) {
438 const Vector<char>& serializedData = m_cachedMetadata->serialize(); 488 const Vector<char>& serializedData = m_cachedMetadata->serialize();
439 blink::Platform::current()->cacheMetadata(m_response.url(), m_response.r esponseTime(), serializedData.data(), serializedData.size()); 489 blink::Platform::current()->cacheMetadata(m_response.url(), m_response.r esponseTime(), serializedData.data(), serializedData.size());
440 } 490 }
441 } 491 }
442 492
443 void Resource::clearCachedMetadata(MetadataCacheType cacheType) 493 void Resource::clearCachedMetadata(CachedMetadataHandler::CacheType cacheType)
444 { 494 {
445 m_cachedMetadata.clear(); 495 m_cachedMetadata.clear();
446 496
447 if (cacheType == SendToPlatform) 497 if (cacheType == CachedMetadataHandler::SendToPlatform)
448 blink::Platform::current()->cacheMetadata(m_response.url(), m_response.r esponseTime(), 0, 0); 498 blink::Platform::current()->cacheMetadata(m_response.url(), m_response.r esponseTime(), 0, 0);
449 } 499 }
450 500
451 bool Resource::canDelete() const 501 bool Resource::canDelete() const
452 { 502 {
453 return !hasClients() && !m_loader && !m_preloadCount && hasRightHandleCountA partFromCache(0) 503 return !hasClients() && !m_loader && !m_preloadCount && hasRightHandleCountA partFromCache(0)
454 && !m_protectorCount && !m_resourceToRevalidate && !m_proxyResource; 504 && !m_protectorCount && !m_resourceToRevalidate && !m_proxyResource;
455 } 505 }
456 506
457 bool Resource::hasOneHandle() const 507 bool Resource::hasOneHandle() const
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 return "ImportResource"; 1072 return "ImportResource";
1023 case Resource::Media: 1073 case Resource::Media:
1024 return "Media"; 1074 return "Media";
1025 } 1075 }
1026 ASSERT_NOT_REACHED(); 1076 ASSERT_NOT_REACHED();
1027 return "Unknown"; 1077 return "Unknown";
1028 } 1078 }
1029 #endif // !LOG_DISABLED 1079 #endif // !LOG_DISABLED
1030 1080
1031 } 1081 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698