Changeset 215263 in webkit
- Timestamp:
- Apr 12, 2017 3:09:14 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r215261 r215263 1 2017-04-10 Antti Koivisto <antti@apple.com> 2 3 Cache small media resources in disk cache 4 https://bugs.webkit.org/show_bug.cgi?id=170676 5 <rdar://problem/31532649> 6 7 Reviewed by Andreas Kling. 8 9 * http/tests/cache/disk-cache/disk-cache-media-small-expected.txt: Added. 10 * http/tests/cache/disk-cache/disk-cache-media-small.html: Added. 11 1 12 2017-04-12 Per Arne Vollan <pvollan@apple.com> 2 13 -
trunk/LayoutTests/platform/ios/TestExpectations
r215145 r215263 138 138 http/tests/media 139 139 imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements 140 http/tests/cache/disk-cache/disk-cache-media-small.html 140 141 141 142 # No touch events -
trunk/LayoutTests/platform/mac-wk2/TestExpectations
r215222 r215263 647 647 webkit.org/b/170410 fast/images/animated-gif-webkit-transform.html [ Pass Failure ] 648 648 649 # Media loading via network cache requires Sierra or newer. 650 [ ElCapitan ] http/tests/cache/disk-cache/disk-cache-media-small.html [ Failure ] 651 649 652 compositing/tiling/non-visible-window-tile-coverage.html [ Pass ] -
trunk/Source/WebCore/ChangeLog
r215262 r215263 1 2017-04-10 Antti Koivisto <antti@apple.com> 2 3 Cache small media resources in disk cache 4 https://bugs.webkit.org/show_bug.cgi?id=170676 5 <rdar://problem/31532649> 6 7 Reviewed by Andreas Kling. 8 9 Test: http/tests/cache/disk-cache/disk-cache-media-small.html 10 11 Testing support. Functional changes are in WebKit2. 12 13 * html/HTMLMediaElement.cpp: 14 (WebCore::HTMLMediaElement::mediaPlayerCreateResourceLoader): 15 (WebCore::HTMLMediaElement::lastMediaResourceLoaderForTesting): 16 * html/HTMLMediaElement.h: 17 * loader/MediaResourceLoader.cpp: 18 (WebCore::MediaResourceLoader::MediaResourceLoader): 19 (WebCore::MediaResourceLoader::addResponseForTesting): 20 (WebCore::MediaResource::responseReceived): 21 * loader/MediaResourceLoader.h: 22 * platform/network/cocoa/WebCoreNSURLSession.mm: 23 (-[WebCoreNSURLSessionDataTask resource:receivedResponse:]): 24 25 We can now receive cached responses. 26 27 * testing/Internals.cpp: 28 (WebCore::responseSourceToString): 29 (WebCore::Internals::xhrResponseSource): 30 (WebCore::Internals::mediaResponseSources): 31 (WebCore::Internals::mediaResponseContentRanges): 32 * testing/Internals.h: 33 * testing/Internals.idl: 34 1 35 2017-04-12 Alex Christensen <achristensen@webkit.org> 2 36 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r215249 r215263 6514 6514 RefPtr<PlatformMediaResourceLoader> HTMLMediaElement::mediaPlayerCreateResourceLoader() 6515 6515 { 6516 return adoptRef(*new MediaResourceLoader(document(), *this, crossOrigin())); 6516 auto mediaResourceLoader = adoptRef(*new MediaResourceLoader(document(), *this, crossOrigin())); 6517 6518 m_lastMediaResourceLoaderForTesting = mediaResourceLoader->createWeakPtr(); 6519 6520 return WTFMove(mediaResourceLoader); 6521 } 6522 6523 const MediaResourceLoader* HTMLMediaElement::lastMediaResourceLoaderForTesting() const 6524 { 6525 return m_lastMediaResourceLoaderForTesting.get(); 6517 6526 } 6518 6527 -
trunk/Source/WebCore/html/HTMLMediaElement.h
r215167 r215263 39 39 #include "UserInterfaceLayoutDirection.h" 40 40 #include "VisibilityChangeClient.h" 41 #include <wtf/WeakPtr.h> 41 42 42 43 #if ENABLE(VIDEO_TRACK) … … 74 75 class MediaKeys; 75 76 class MediaPlayer; 77 class MediaResourceLoader; 76 78 class MediaSession; 77 79 class MediaSource; … … 501 503 502 504 void isVisibleInViewportChanged(); 505 506 WEBCORE_EXPORT const MediaResourceLoader* lastMediaResourceLoaderForTesting() const; 503 507 504 508 protected: … … 1034 1038 std::unique_ptr<DisplaySleepDisabler> m_sleepDisabler; 1035 1039 1040 WeakPtr<const MediaResourceLoader> m_lastMediaResourceLoaderForTesting; 1041 1036 1042 friend class TrackDisplayUpdateScope; 1037 1043 -
trunk/Source/WebCore/loader/MediaResourceLoader.cpp
r212994 r215263 46 46 , m_mediaElement(&mediaElement) 47 47 , m_crossOriginMode(crossOriginMode) 48 , m_weakFactory(this) 48 49 { 49 50 } … … 95 96 ASSERT(m_resources.contains(&mediaResource)); 96 97 m_resources.remove(&mediaResource); 98 } 99 100 void MediaResourceLoader::addResponseForTesting(const ResourceResponse& response) 101 { 102 const auto maximumResponsesForTesting = 5; 103 if (m_responsesForTesting.size() > maximumResponsesForTesting) 104 return; 105 m_responsesForTesting.append(response); 97 106 } 98 107 … … 152 161 if (m_client) 153 162 m_client->responseReceived(*this, response); 163 164 m_loader->addResponseForTesting(response); 154 165 } 155 166 -
trunk/Source/WebCore/loader/MediaResourceLoader.h
r212994 r215263 32 32 #include "ContextDestructionObserver.h" 33 33 #include "PlatformMediaResourceLoader.h" 34 #include "ResourceResponse.h" 34 35 #include <wtf/HashSet.h> 35 36 #include <wtf/Ref.h> 37 #include <wtf/WeakPtr.h> 36 38 #include <wtf/text/WTFString.h> 37 39 … … 54 56 const String& crossOriginMode() const { return m_crossOriginMode; } 55 57 58 Vector<ResourceResponse> responsesForTesting() const { return m_responsesForTesting; } 59 void addResponseForTesting(const ResourceResponse&); 60 61 WeakPtr<const MediaResourceLoader> createWeakPtr() const { return m_weakFactory.createWeakPtr(); } 62 56 63 private: 57 64 void contextDestroyed() override; … … 61 68 String m_crossOriginMode; 62 69 HashSet<MediaResource*> m_resources; 70 WeakPtrFactory<const MediaResourceLoader> m_weakFactory; 71 Vector<ResourceResponse> m_responsesForTesting; 63 72 }; 64 73 -
trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm
r204210 r215263 552 552 - (void)resource:(PlatformMediaResource&)resource receivedResponse:(const ResourceResponse&)response 553 553 { 554 ASSERT(response.source() == ResourceResponse::Source::Network );554 ASSERT(response.source() == ResourceResponse::Source::Network || response.source() == ResourceResponse::Source::DiskCache || response.source() == ResourceResponse::Source::DiskCacheAfterValidation); 555 555 ASSERT_UNUSED(resource, &resource == _resource); 556 556 ASSERT(isMainThread()); -
trunk/Source/WebCore/testing/Internals.cpp
r215242 r215263 93 93 #include "MediaPlayer.h" 94 94 #include "MediaProducer.h" 95 #include "MediaResourceLoader.h" 95 96 #include "MediaStreamTrack.h" 96 97 #include "MemoryCache.h" … … 603 604 } 604 605 605 String Internals::xhrResponseSource(XMLHttpRequest& request)606 { 607 if (re quest.resourceResponse().isNull())606 static String responseSourceToString(const ResourceResponse& response) 607 { 608 if (response.isNull()) 608 609 return "Null response"; 609 switch (re quest.resourceResponse().source()) {610 switch (response.source()) { 610 611 case ResourceResponse::Source::Unknown: 611 612 return "Unknown"; … … 623 624 ASSERT_NOT_REACHED(); 624 625 return "Error"; 626 } 627 628 String Internals::xhrResponseSource(XMLHttpRequest& request) 629 { 630 return responseSourceToString(request.resourceResponse()); 631 } 632 633 Vector<String> Internals::mediaResponseSources(HTMLMediaElement& media) 634 { 635 auto* resourceLoader = media.lastMediaResourceLoaderForTesting(); 636 if (!resourceLoader) 637 return { }; 638 Vector<String> result; 639 auto responses = resourceLoader->responsesForTesting(); 640 for (auto& response : responses) 641 result.append(responseSourceToString(response)); 642 return result; 643 } 644 645 Vector<String> Internals::mediaResponseContentRanges(HTMLMediaElement& media) 646 { 647 auto* resourceLoader = media.lastMediaResourceLoaderForTesting(); 648 if (!resourceLoader) 649 return { }; 650 Vector<String> result; 651 auto responses = resourceLoader->responsesForTesting(); 652 for (auto& response : responses) 653 result.append(response.httpHeaderField(HTTPHeaderName::ContentRange)); 654 return result; 625 655 } 626 656 -
trunk/Source/WebCore/testing/Internals.h
r215181 r215263 103 103 bool isLoadingFromMemoryCache(const String& url); 104 104 String xhrResponseSource(XMLHttpRequest&); 105 Vector<String> mediaResponseSources(HTMLMediaElement&); 106 Vector<String> mediaResponseContentRanges(HTMLMediaElement&); 105 107 bool isSharingStyleSheetContents(HTMLLinkElement&, HTMLLinkElement&); 106 108 bool isStyleSheetLoadingSubresources(HTMLLinkElement&); -
trunk/Source/WebCore/testing/Internals.idl
r215181 r215263 98 98 boolean isLoadingFromMemoryCache(DOMString url); 99 99 DOMString xhrResponseSource(XMLHttpRequest xhr); 100 sequence<DOMString> mediaResponseSources(HTMLMediaElement media); 101 sequence<DOMString> mediaResponseContentRanges(HTMLMediaElement media); 100 102 boolean isSharingStyleSheetContents(HTMLLinkElement a, HTMLLinkElement b); 101 103 boolean isStyleSheetLoadingSubresources(HTMLLinkElement link); -
trunk/Source/WebKit2/ChangeLog
r215262 r215263 1 2017-04-10 Antti Koivisto <antti@apple.com> 2 3 Cache small media resources in disk cache 4 https://bugs.webkit.org/show_bug.cgi?id=170676 5 <rdar://problem/31532649> 6 7 Reviewed by Andreas Kling. 8 9 * NetworkProcess/cache/NetworkCache.cpp: 10 (WebKit::NetworkCache::makeRetrieveDecision): 11 12 Allow retrieving media resources. 13 14 (WebKit::NetworkCache::expectedTotalResourceSizeFromContentRange): 15 (WebKit::NetworkCache::expectedTotalResourceSize): 16 (WebKit::NetworkCache::makeStoreDecision): 17 18 Store media resource if we can figure out its total size and it is less than 5MB 19 (and it is cacheable by the usual rules). 20 1 21 2017-04-12 Alex Christensen <achristensen@webkit.org> 2 22 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp
r215044 r215263 213 213 if (request.httpMethod() != "GET") 214 214 return RetrieveDecision::NoDueToHTTPMethod; 215 if (request.requester() == WebCore::ResourceRequest::Requester::Media)216 return RetrieveDecision::NoDueToStreamingMedia;217 215 if (request.cachePolicy() == WebCore::ReloadIgnoringCacheData && !request.isConditional()) 218 216 return RetrieveDecision::NoDueToReloadIgnoringCache; … … 230 228 } 231 229 232 static StoreDecision makeStoreDecision(const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceResponse& response) 230 static std::optional<size_t> expectedTotalResourceSizeFromContentRange(const WebCore::ResourceResponse& response) 231 { 232 ASSERT(response.httpStatusCode() == 206); 233 234 auto contentRange = response.httpHeaderField(WebCore::HTTPHeaderName::ContentRange); 235 if (contentRange.isNull()) 236 return { }; 237 238 if (!contentRange.startsWith("bytes ")) 239 return { }; 240 241 auto slashPosition = contentRange.find('/'); 242 if (slashPosition == notFound) 243 return { }; 244 245 auto sizeStringLength = contentRange.length() - slashPosition - 1; 246 if (!sizeStringLength) 247 return { }; 248 249 bool isValid; 250 auto size = StringView(contentRange).right(sizeStringLength).toIntStrict(isValid); 251 if (!isValid) 252 return { }; 253 254 return size; 255 } 256 257 static StoreDecision makeStoreDecision(const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceResponse& response, size_t bodySize) 233 258 { 234 259 if (!originalRequest.url().protocolIsInHTTPFamily() || !response.isHTTP()) … … 264 289 } 265 290 266 // Media loaded via XHR is likely being used for MSE streaming (YouTube and Netflix for example).267 291 // Streaming media fills the cache quickly and is unlikely to be reused. 268 292 // FIXME: We should introduce a separate media cache partition that doesn't affect other resources. 269 293 // FIXME: We should also make sure make the MSE paths are copy-free so we can use mapped buffers from disk effectively. 270 294 auto requester = originalRequest.requester(); 271 bool isDefinitelyStreamingMedia = requester == WebCore::ResourceRequest::Requester::Media; 295 bool isDefinitelyMedia = requester == WebCore::ResourceRequest::Requester::Media; 296 if (isDefinitelyMedia) { 297 // Allow caching of smaller media files if we know the total size. 298 const size_t maximumCacheableMediaSize = 5 * 1024 * 1024; 299 auto totalSize = response.httpStatusCode() == 206 ? expectedTotalResourceSizeFromContentRange(response) : bodySize; 300 if (!totalSize || *totalSize > maximumCacheableMediaSize) 301 return StoreDecision::NoDueToStreamingMedia; 302 } 303 272 304 bool isLikelyStreamingMedia = requester == WebCore::ResourceRequest::Requester::XHR && isMediaMIMEType(response.mimeType()); 273 if (isLikelyStreamingMedia || isDefinitelyStreamingMedia) 305 if (isLikelyStreamingMedia) { 306 // Media loaded via XHR is likely being used for MSE streaming (YouTube and Netflix for example). 307 // We have no way of knowing the total media size so disallow caching. 274 308 return StoreDecision::NoDueToStreamingMedia; 309 } 275 310 276 311 return StoreDecision::Yes; … … 375 410 LOG(NetworkCache, "(NetworkProcess) storing %s, partition %s", request.url().string().latin1().data(), makeCacheKey(request).partition().latin1().data()); 376 411 377 StoreDecision storeDecision = makeStoreDecision(request, response );412 StoreDecision storeDecision = makeStoreDecision(request, response, responseData ? responseData->size() : 0); 378 413 if (storeDecision != StoreDecision::Yes) { 379 414 LOG(NetworkCache, "(NetworkProcess) didn't store, storeDecision=%d", static_cast<int>(storeDecision)); … … 419 454 LOG(NetworkCache, "(NetworkProcess) storing redirect %s -> %s", request.url().string().latin1().data(), redirectRequest.url().string().latin1().data()); 420 455 421 StoreDecision storeDecision = makeStoreDecision(request, response );456 StoreDecision storeDecision = makeStoreDecision(request, response, 0); 422 457 if (storeDecision != StoreDecision::Yes) { 423 458 LOG(NetworkCache, "(NetworkProcess) didn't store redirect, storeDecision=%d", static_cast<int>(storeDecision)); -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp
r215152 r215263 365 365 if (request.httpMethod() != "GET") 366 366 return; 367 if (!request.httpHeaderField(HTTPHeaderName::Range).isEmpty()) 368 return; 367 369 368 370 auto isMainResource = request.requester() == ResourceRequest::Requester::Main;
Note: See TracChangeset
for help on using the changeset viewer.