Changeset 183467 in webkit
- Timestamp:
- Apr 28, 2015, 5:49:30 AM (10 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r183454 r183467 1 2015-04-28 Antti Koivisto <antti@apple.com> 2 3 Network Cache: Disk cache getting filled by YouTube video data 4 https://bugs.webkit.org/show_bug.cgi?id=144259 5 6 Reviewed by Darin Adler. 7 8 * http/tests/cache/disk-cache/disk-cache-media-expected.txt: Added. 9 * http/tests/cache/disk-cache/disk-cache-media.html: Added. 10 * http/tests/cache/disk-cache/resources/cache-test.js: 11 (generateTestURL): 12 1 13 2015-04-25 Simon Fraser <simon.fraser@apple.com> 2 14 -
trunk/LayoutTests/http/tests/cache/disk-cache/resources/cache-test.js
r183261 r183467 47 47 if (expiresInFutureIn304) 48 48 testURL += "&expires-in-future-in-304=1"; 49 testURL += "&uniqueId=" + uniqueTestId++ + "&Content-type=text/plain"; 49 testURL += "&uniqueId=" + uniqueTestId++; 50 if (!test.responseHeaders || !test.responseHeaders["Content-Type"]) 51 testURL += "&Content-Type=text/plain"; 50 52 for (var header in test.responseHeaders) 51 53 testURL += '&' + header + '=' + makeHeaderValue(test.responseHeaders[header]); -
trunk/Source/WebCore/ChangeLog
r183466 r183467 1 2015-04-28 Antti Koivisto <antti@apple.com> 2 3 Network Cache: Disk cache getting filled by YouTube video data 4 https://bugs.webkit.org/show_bug.cgi?id=144259 5 6 Reviewed by Darin Adler. 7 8 MSE media is loaded via XHR and tends to eventually fill the cache. 9 10 YouTube serves the media chunks cacheable, however they are rarely (if ever) reused. 11 We can reduce disk writes and keep more useful resources around by not caching them 12 13 Test: http/tests/cache/disk-cache/disk-cache-media.html 14 15 * loader/DocumentLoader.cpp: 16 (WebCore::DocumentLoader::startLoadingMainResource): 17 18 Set the requester. 19 20 * loader/cache/CachedRawResource.cpp: 21 (WebCore::CachedRawResource::CachedRawResource): 22 * page/DiagnosticLoggingKeys.cpp: 23 (WebCore::DiagnosticLoggingKeys::streamingMedia): 24 * page/DiagnosticLoggingKeys.h: 25 * platform/network/ResourceRequestBase.cpp: 26 (WebCore::ResourceRequestBase::adopt): 27 (WebCore::ResourceRequestBase::copyData): 28 (WebCore::equalIgnoringHeaderFields): 29 * platform/network/ResourceRequestBase.h: 30 (WebCore::ResourceRequestBase::requester): 31 (WebCore::ResourceRequestBase::setRequester): 32 33 Add requester type to the request object. Currently this is main resource, xhr or unspecified. 34 35 (WebCore::ResourceRequestBase::encodeWithoutPlatformData): 36 (WebCore::ResourceRequestBase::decodeWithoutPlatformData): 37 * platform/network/cf/ResourceRequest.h: 38 (WebCore::ResourceRequest::deprecatedSetMainResourceRequest): Deleted. 39 (WebCore::ResourceRequest::deprecatedIsMainResourceRequest): Deleted. 40 41 Replace this iOS only field with shared mechanism. 42 43 * platform/network/ios/QuickLook.mm: 44 (WebCore::QuickLookHandle::create): 45 * xml/XMLHttpRequest.cpp: 46 (WebCore::XMLHttpRequest::createRequest): 47 48 Set the requester. 49 1 50 2015-04-28 Namhoon Kim <nakim@ea.com> 2 51 -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r183195 r183467 935 935 m_loadingMainResource = false; 936 936 937 #if PLATFORM(IOS)938 // FIXME: Remove PLATFORM(IOS)-guard once we upstream the iOS changes to ResourceRequest.h.939 m_request.deprecatedSetMainResourceRequest(false);940 #endif941 942 937 if (this == frameLoader()->activeDocumentLoader()) 943 938 checkLoadComplete(); … … 1404 1399 } 1405 1400 1406 #if PLATFORM(IOS)1407 // FIXME: Remove PLATFORM(IOS)-guard once we upstream the iOS changes to ResourceRequest.h.1408 m_request.deprecatedSetMainResourceRequest(true);1409 #endif1410 1411 1401 ResourceRequest request(m_request); 1402 request.setRequester(ResourceRequest::Requester::Main); 1403 1412 1404 static NeverDestroyed<ResourceLoaderOptions> mainResourceLoadOptions(SendCallbacks, SniffContent, BufferData, AllowStoredCredentials, AskClientForAllCredentials, SkipSecurityCheck, UseDefaultOriginRestrictionsForType, IncludeCertificateInfo); 1413 1405 CachedResourceRequest cachedResourceRequest(request, mainResourceLoadOptions); -
trunk/Source/WebCore/loader/cache/CachedRawResource.cpp
r182369 r183467 43 43 , m_allowEncodedDataReplacement(true) 44 44 { 45 // FIXME: The wrong CachedResource::Type here may cause a bad cast elsewhere.46 45 ASSERT(isMainOrRawResource()); 47 46 } -
trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp
r183081 r183467 374 374 } 375 375 376 String DiagnosticLoggingKeys::streamingMedia() 377 { 378 return ASCIILiteral("streamingMedia"); 379 } 380 376 381 String DiagnosticLoggingKeys::styleSheetKey() 377 382 { -
trunk/Source/WebCore/page/DiagnosticLoggingKeys.h
r183081 r183467 107 107 static String scriptKey(); 108 108 static String sourceKey(); 109 WEBCORE_EXPORT static String streamingMedia(); 109 110 static String styleSheetKey(); 110 111 static String svgDocumentKey(); -
trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp
r181136 r183467 58 58 request->setHTTPMethod(data->m_httpMethod); 59 59 request->setPriority(data->m_priority); 60 request->setRequester(data->m_requester); 60 61 61 62 request->updateResourceRequest(); … … 91 92 data->m_httpHeaders = httpHeaderFields().copyData(); 92 93 data->m_priority = priority(); 94 data->m_requester = m_requester; 93 95 94 96 data->m_responseContentDispositionEncodingFallbackArray.reserveInitialCapacity(m_responseContentDispositionEncodingFallbackArray.size()); … … 497 499 return false; 498 500 501 if (a.requester() != b.requester()) 502 return false; 503 499 504 FormData* formDataA = a.httpBody(); 500 505 FormData* formDataB = b.httpBody(); -
trunk/Source/WebCore/platform/network/ResourceRequestBase.h
r182059 r183467 148 148 void setHiddenFromInspector(bool hiddenFromInspector) { m_hiddenFromInspector = hiddenFromInspector; } 149 149 150 enum class Requester { Unspecified, Main, XHR }; 151 WEBCORE_EXPORT Requester requester() const { return m_requester; } 152 WEBCORE_EXPORT void setRequester(Requester requester) { m_requester = requester; } 153 150 154 #if !PLATFORM(COCOA) 151 155 bool encodingRequiresPlatformData() const { return true; } … … 225 229 unsigned m_hiddenFromInspector : 1; 226 230 unsigned m_priority : 4; 231 Requester m_requester { Requester::Unspecified }; 227 232 228 233 private: … … 256 261 bool m_allowCookies; 257 262 ResourceLoadPriority m_priority; 263 ResourceRequestBase::Requester m_requester; 258 264 }; 259 265 … … 277 283 encoder << m_allowCookies; 278 284 encoder.encodeEnum(m_priority); 285 encoder.encodeEnum(m_requester); 279 286 } 280 287 … … 319 326 m_priority = priority; 320 327 328 if (!decoder.decodeEnum(m_requester)) 329 return false; 330 321 331 return true; 322 332 } -
trunk/Source/WebCore/platform/network/cf/ResourceRequest.h
r181136 r183467 119 119 static bool resourcePrioritiesEnabled(); 120 120 121 #if PLATFORM(IOS)122 // FIXME: deprecatedIsMainResourceRequest() does not return the correct value if the ResourceRequest has been123 // deserialized from an IPC message. As a result this function can only be relied on when networking is not in a124 // separate process.125 void deprecatedSetMainResourceRequest(bool isMainResourceRequest) const { m_mainResourceRequest = isMainResourceRequest; }126 bool deprecatedIsMainResourceRequest() const { return m_mainResourceRequest; }127 128 private:129 mutable bool m_mainResourceRequest = false;130 #endif131 132 121 private: 133 122 friend class ResourceRequestBase; -
trunk/Source/WebCore/platform/network/ios/QuickLook.mm
r183172 r183467 460 460 { 461 461 ASSERT_ARG(handle, handle); 462 if ( !handle->firstRequest().deprecatedIsMainResourceRequest()|| ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:[nsResponse MIMEType]])462 if (handle->firstRequest().requester() != ResourceRequest::Requester::Main || ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:[nsResponse MIMEType]]) 463 463 return nullptr; 464 464 … … 472 472 { 473 473 ASSERT_ARG(handle, handle); 474 if ( !handle->firstRequest().deprecatedIsMainResourceRequest()|| ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:(NSString *)CFURLResponseGetMIMEType(cfResponse)])474 if (handle->firstRequest().requester() != ResourceRequest::Requester::Main || ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:(NSString *)CFURLResponseGetMIMEType(cfResponse)]) 475 475 return nullptr; 476 476 -
trunk/Source/WebCore/xml/XMLHttpRequest.cpp
r182923 r183467 746 746 747 747 ResourceRequest request(m_url); 748 request.setRequester(ResourceRequest::Requester::XHR); 748 749 request.setHTTPMethod(m_method); 749 750 -
trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm
r183405 r183467 364 364 ResourceLoadPriority priority = request.priority(); 365 365 bool isHiddenFromInspector = request.hiddenFromInspector(); 366 #if PLATFORM(IOS) 367 bool isMainResourceRequest = request.deprecatedIsMainResourceRequest(); 366 auto requester = request.requester(); 367 #if PLATFORM(IOS) 368 368 if (implementations->webThreadWillSendRequestFunc) { 369 369 newURLRequest = (NSURLRequest *)CallResourceLoadDelegateInWebThread(implementations->webThreadWillSendRequestFunc, webView, @selector(webThreadWebView:resource:willSendRequest:redirectResponse:fromDataSource:), [webView _objectForIdentifier:identifier], currentURLRequest, redirectResponse.nsURLResponse(), dataSource(loader)); … … 376 376 request = newURLRequest; 377 377 request.setHiddenFromInspector(isHiddenFromInspector); 378 #if PLATFORM(IOS)379 request.deprecatedSetMainResourceRequest(isMainResourceRequest);380 #endif381 378 request.setPriority(priority); 379 request.setRequester(requester); 382 380 } 383 381 -
trunk/Source/WebKit2/ChangeLog
r183463 r183467 1 2015-04-28 Antti Koivisto <antti@apple.com> 2 3 Network Cache: Disk cache getting filled by YouTube video data 4 https://bugs.webkit.org/show_bug.cgi?id=144259 5 6 Reviewed by Darin Adler. 7 8 MSE media is loaded via XHR and tends to eventually fill the cache. 9 10 YouTube serves the media chunks cacheable, however they are rarely (if ever) reused. 11 We can reduce disk writes and keep more useful resources around by not caching them 12 13 * NetworkProcess/NetworkResourceLoader.cpp: 14 (WebKit::NetworkResourceLoader::didReceiveResponseAsync): 15 (WebKit::NetworkResourceLoader::didRetrieveCacheEntry): 16 * NetworkProcess/cache/NetworkCache.cpp: 17 (WebKit::NetworkCache::makeStoreDecision): 18 19 Don't store if the requester is XHR and response has video or audio content type. 20 21 * NetworkProcess/cache/NetworkCache.h: 22 * NetworkProcess/cache/NetworkCacheStatistics.cpp: 23 (WebKit::NetworkCache::storeDecisionToDiagnosticKey): 24 * Shared/Network/NetworkResourceLoadParameters.cpp: 25 (WebKit::NetworkResourceLoadParameters::NetworkResourceLoadParameters): 26 (WebKit::NetworkResourceLoadParameters::encode): 27 (WebKit::NetworkResourceLoadParameters::decode): 28 * Shared/Network/NetworkResourceLoadParameters.h: 29 30 The requester type is now part of the ResourceRequest, no need for separate parameter. 31 32 * Shared/mac/WebCoreArgumentCodersMac.mm: 33 (IPC::ArgumentCoder<ResourceRequest>::encodePlatformData): 34 (IPC::ArgumentCoder<ResourceRequest>::decodePlatformData): 35 * WebProcess/Network/WebResourceLoadScheduler.cpp: 36 (WebKit::WebResourceLoadScheduler::scheduleLoad): 37 1 38 2015-04-28 Zan Dobersek <zdobersek@igalia.com> 2 39 -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp
r183081 r183467 254 254 #endif 255 255 256 bool shouldWaitContinueDidReceiveResponse = originalRequest().requester() == ResourceRequest::Requester::Main; 256 257 if (shouldSendDidReceiveResponse) { 257 258 if (isSynchronous()) 258 259 m_synchronousLoadData->response = m_response; 259 260 else { 260 if (!sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(m_response, m_parameters.isMainResource)))261 if (!sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(m_response, shouldWaitContinueDidReceiveResponse))) 261 262 return; 262 263 } … … 264 265 265 266 // For main resources, the web process is responsible for sending back a NetworkResourceLoader::ContinueDidReceiveResponse message. 266 bool shouldContinueDidReceiveResponse = ! m_parameters.isMainResource;267 bool shouldContinueDidReceiveResponse = !shouldWaitContinueDidReceiveResponse; 267 268 #if ENABLE(NETWORK_CACHE) 268 269 shouldContinueDidReceiveResponse = shouldContinueDidReceiveResponse || m_cacheEntryForValidation; … … 544 545 sendReplyToSynchronousRequest(*m_synchronousLoadData, entry->buffer()); 545 546 } else { 546 sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(entry->response(), m_parameters.isMainResource)); 547 bool needsContinueDidReceiveResponseMessage = originalRequest().requester() == ResourceRequest::Requester::Main; 548 sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(entry->response(), needsContinueDidReceiveResponseMessage)); 547 549 548 550 #if ENABLE(SHAREABLE_RESOURCE) -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp
r183387 r183467 268 268 } 269 269 270 static bool isMediaMIMEType(const String& mimeType) 271 { 272 if (mimeType.startsWith("video/", /*caseSensitive*/ false)) 273 return true; 274 if (mimeType.startsWith("audio/", /*caseSensitive*/ false)) 275 return true; 276 return false; 277 } 278 270 279 static StoreDecision makeStoreDecision(const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceResponse& response) 271 280 { … … 291 300 } 292 301 293 // Main resource has ResourceLoadPriorityVeryHigh.294 bool storeUnconditionallyForHistoryNavigation = originalRequest.priority() == WebCore::ResourceLoadPriorityVeryHigh;302 bool isMainResource = originalRequest.requester() == WebCore::ResourceRequest::Requester::Main; 303 bool storeUnconditionallyForHistoryNavigation = isMainResource || originalRequest.priority() == WebCore::ResourceLoadPriorityVeryHigh; 295 304 if (!storeUnconditionallyForHistoryNavigation) { 296 305 auto now = std::chrono::system_clock::now(); … … 301 310 return StoreDecision::NoDueToUnlikelyToReuse; 302 311 } 312 313 // Media loaded via XHR is likely being used for MSE streaming (YouTube and Netflix for example). 314 // Streaming media fills the cache quickly and is unlikely to be reused. 315 // FIXME: We should introduce a separate media cache partition that doesn't affect other resources. 316 // FIXME: We should also make sure make the MSE paths are copy-free so we can use mapped buffers from disk effectively. 317 bool isLikelyStreamingMedia = originalRequest.requester() == WebCore::ResourceRequest::Requester::XHR && isMediaMIMEType(response.mimeType()); 318 if (isLikelyStreamingMedia) 319 return StoreDecision::NoDueToStreamingMedia; 303 320 304 321 return StoreDecision::Yes; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h
r183081 r183467 72 72 NoDueToHTTPStatusCode, 73 73 NoDueToNoStoreRequest, 74 NoDueToUnlikelyToReuse 74 NoDueToUnlikelyToReuse, 75 NoDueToStreamingMedia 75 76 }; 76 77 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.cpp
r183081 r183467 245 245 case StoreDecision::NoDueToUnlikelyToReuse: 246 246 return WebCore::DiagnosticLoggingKeys::unlikelyToReuseKey(); 247 case StoreDecision::NoDueToStreamingMedia: 248 return WebCore::DiagnosticLoggingKeys::streamingMedia(); 247 249 case StoreDecision::Yes: 248 250 // It was stored but could not be retrieved so it must have been pruned from the cache. -
trunk/Source/WebKit2/Shared/Network/NetworkResourceLoadParameters.cpp
r173468 r183467 46 46 , clientCredentialPolicy(DoNotAskClientForAnyCredentials) 47 47 , shouldClearReferrerOnHTTPSToHTTPRedirect(true) 48 , isMainResource(false)49 48 , defersLoading(false) 50 49 , needsCertificateInfo(false) … … 95 94 encoder.encodeEnum(clientCredentialPolicy); 96 95 encoder << shouldClearReferrerOnHTTPSToHTTPRedirect; 97 encoder << isMainResource;98 96 encoder << defersLoading; 99 97 encoder << needsCertificateInfo; … … 152 150 if (!decoder.decode(result.shouldClearReferrerOnHTTPSToHTTPRedirect)) 153 151 return false; 154 if (!decoder.decode(result.isMainResource))155 return false;156 152 if (!decoder.decode(result.defersLoading)) 157 153 return false; -
trunk/Source/WebKit2/Shared/Network/NetworkResourceLoadParameters.h
r173468 r183467 62 62 WebCore::ClientCredentialPolicy clientCredentialPolicy; 63 63 bool shouldClearReferrerOnHTTPSToHTTPRedirect; 64 bool isMainResource;65 64 bool defersLoading; 66 65 bool needsCertificateInfo; -
trunk/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm
r182630 r183467 85 85 // The fallback array is part of CFURLRequest, but it is not encoded by WKCFURLRequestCreateSerializableRepresentation. 86 86 encoder << resourceRequest.responseContentDispositionEncodingFallbackArray(); 87 encoder.encodeEnum(resourceRequest.requester()); 87 88 } 88 89 #else … … 110 111 // The fallback array is part of NSURLRequest, but it is not encoded by WKNSURLRequestCreateSerializableRepresentation. 111 112 encoder << resourceRequest.responseContentDispositionEncodingFallbackArray(); 113 encoder.encodeEnum(resourceRequest.requester()); 112 114 } 113 115 #endif … … 151 153 responseContentDispositionEncodingFallbackArray.size() > 2 ? responseContentDispositionEncodingFallbackArray[2] : String() 152 154 ); 155 156 ResourceRequest::Requester requester; 157 if (!decoder.decodeEnum(requester)) 158 return false; 159 resourceRequest.setRequester(requester); 153 160 154 161 return true; -
trunk/Source/WebKit2/WebProcess/Network/WebResourceLoadScheduler.cpp
r179584 r183467 174 174 loadParameters.clientCredentialPolicy = (webFrame && webPage && resourceLoader->isAllowedToAskUserForCredentials()) ? AskClientForAllCredentials : DoNotAskClientForAnyCredentials; 175 175 loadParameters.shouldClearReferrerOnHTTPSToHTTPRedirect = shouldClearReferrerOnHTTPSToHTTPRedirect; 176 loadParameters.isMainResource = resource && resource->type() == CachedResource::MainResource;177 176 loadParameters.defersLoading = resourceLoader->defersLoading(); 178 177 loadParameters.needsCertificateInfo = resourceLoader->shouldIncludeCertificateInfo();
Note:
See TracChangeset
for help on using the changeset viewer.