Changeset 211894 in webkit
- Timestamp:
- Feb 8, 2017 1:11:32 PM (7 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r211893 r211894 1 2017-02-08 Antti Koivisto <antti@apple.com> 2 3 Allow speculative redirects 4 https://bugs.webkit.org/show_bug.cgi?id=167982 5 6 Reviewed by Andreas Kling. 7 8 If speculative loader hits a redirect it will drop it on the floor. We should use it instead. 9 10 * NetworkProcess/NetworkResourceLoader.cpp: 11 (WebKit::NetworkResourceLoader::continueWillSendRequest): 12 (WebKit::NetworkResourceLoader::dispatchWillSendRequestForCacheEntry): 13 14 Reset m_isWaitingContinueWillSendRequestForCachedRedirect bit immediately. 15 16 * NetworkProcess/cache/NetworkCache.cpp: 17 (WebKit::NetworkCache::Cache::makeRedirectEntry): 18 19 Factor to a function. 20 21 (WebKit::NetworkCache::Cache::storeRedirect): 22 * NetworkProcess/cache/NetworkCache.h: 23 (WebKit::NetworkCache::Cache::speculativeLoadManager): 24 * NetworkProcess/cache/NetworkCacheEntry.cpp: 25 (WebKit::NetworkCache::Entry::Entry): 26 27 Use std::optional instead std::unique_ptr for the redirect request. 28 29 (WebKit::NetworkCache::Entry::decodeStorageRecord): 30 * NetworkProcess/cache/NetworkCacheEntry.h: 31 (WebKit::NetworkCache::Entry::redirectRequest): 32 * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp: 33 (WebKit::NetworkCache::SpeculativeLoad::willSendRedirectedRequest): 34 35 Make a cache entry for speculative redirect. 36 Redirect is not actually performed, the target resource will have a separate 37 speculative entry. 38 39 (WebKit::NetworkCache::SpeculativeLoad::didFinishLoading): 40 (WebKit::NetworkCache::SpeculativeLoad::didFailLoading): 41 (WebKit::NetworkCache::SpeculativeLoad::didComplete): 42 43 Protect against multiple completions. 44 45 (WebKit::NetworkCache::SpeculativeLoad::abort): Deleted. 46 * NetworkProcess/cache/NetworkCacheSpeculativeLoad.h: 47 * NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp: 48 (WebKit::NetworkCache::SpeculativeLoadManager::retrieve): 49 50 Make successful retrieves asynchronous to avoid re-entrancy problems. 51 1 52 2017-02-08 Jer Noble <jer.noble@apple.com> 2 53 -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp
r211882 r211894 477 477 #if ENABLE(NETWORK_CACHE) 478 478 if (m_isWaitingContinueWillSendRequestForCachedRedirect) { 479 m_isWaitingContinueWillSendRequestForCachedRedirect = false; 480 479 481 LOG(NetworkCache, "(NetworkProcess) Retrieving cached redirect"); 480 482 … … 484 486 startNetworkLoad(newRequest); 485 487 486 m_isWaitingContinueWillSendRequestForCachedRedirect = false;487 488 return; 488 489 } … … 644 645 { 645 646 ASSERT(entry->redirectRequest()); 647 ASSERT(!m_isWaitingContinueWillSendRequestForCachedRedirect); 648 646 649 LOG(NetworkCache, "(NetworkProcess) Executing cached redirect"); 647 650 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp
r211882 r211894 396 396 } 397 397 398 std::unique_ptr<Entry> Cache::makeRedirectEntry(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, const WebCore::ResourceRequest& redirectRequest) 399 { 400 return std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, WebCore::collectVaryingRequestHeaders(request, response)); 401 } 402 398 403 std::unique_ptr<Entry> Cache::store(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, RefPtr<WebCore::SharedBuffer>&& responseData, Function<void (MappedBody&)>&& completionHandler) 399 404 { … … 455 460 } 456 461 457 std::unique_ptr<Entry> cacheEntry = std::make_unique<Entry>(makeCacheKey(request), response, redirectRequest, WebCore::collectVaryingRequestHeaders(request, response)); 458 462 auto cacheEntry = makeRedirectEntry(request, response, redirectRequest); 459 463 auto record = cacheEntry->encodeAsStorageRecord(); 460 464 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h
r211882 r211894 126 126 127 127 std::unique_ptr<Entry> makeEntry(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&); 128 std::unique_ptr<Entry> makeRedirectEntry(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, const WebCore::ResourceRequest& redirectRequest); 128 129 129 130 void dumpContentsToFile(); 130 131 131 132 String recordsPath() const; 133 134 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION) 135 SpeculativeLoadManager* speculativeLoadManager() { return m_speculativeLoadManager.get(); } 136 #endif 132 137 133 138 private: -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEntry.cpp
r211882 r211894 55 55 { 56 56 ASSERT(m_key.type() == "Resource"); 57 58 m_redirectRequest.emplace(); 59 m_redirectRequest->setAsIsolatedCopy(redirectRequest); 57 60 // Redirect body is not needed even if exists. 58 59 m_redirectRequest = std::make_unique<WebCore::ResourceRequest>();60 m_redirectRequest->setAsIsolatedCopy(redirectRequest);61 61 m_redirectRequest->setHTTPBody(nullptr); 62 62 } … … 67 67 , m_response(other.m_response) 68 68 , m_varyingRequestHeaders(other.m_varyingRequestHeaders) 69 , m_redirectRequest(other.m_redirectRequest) 69 70 , m_buffer(other.m_buffer) 70 71 , m_sourceStorageRecord(other.m_sourceStorageRecord) … … 130 131 131 132 if (isRedirect) { 132 entry->m_redirectRequest = std::make_unique<WebCore::ResourceRequest>();133 entry->m_redirectRequest.emplace(); 133 134 if (!entry->m_redirectRequest->decodeWithoutPlatformData(decoder)) 134 135 return nullptr; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEntry.h
r211882 r211894 60 60 61 61 WebCore::SharedBuffer* buffer() const; 62 const WebCore::ResourceRequest* redirectRequest() const { return m_redirectRequest.get(); }62 const std::optional<WebCore::ResourceRequest>& redirectRequest() const { return m_redirectRequest; } 63 63 64 64 #if ENABLE(SHAREABLE_RESOURCE) … … 84 84 Vector<std::pair<String, String>> m_varyingRequestHeaders; 85 85 86 std:: unique_ptr<WebCore::ResourceRequest> m_redirectRequest;86 std::optional<WebCore::ResourceRequest> m_redirectRequest; 87 87 mutable RefPtr<WebCore::SharedBuffer> m_buffer; 88 88 #if ENABLE(SHAREABLE_RESOURCE) -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp
r211882 r211894 68 68 } 69 69 70 void SpeculativeLoad::willSendRedirectedRequest(ResourceRequest&& , ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)70 void SpeculativeLoad::willSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse) 71 71 { 72 LOG(NetworkCacheSpeculativePreloading, "(NetworkProcess) Speculative revalidation for %s hit a redirect, aborting the load.", redirectResponse.url().string().utf8().data()); 73 // We drop speculative revalidations if they redirect for now as we would need to notify WebCore of such redirects. 74 abort(); 72 LOG(NetworkCacheSpeculativePreloading, "Speculative redirect %s -> %s", request.url().string().utf8().data(), redirectRequest.url().string().utf8().data()); 73 74 m_cacheEntry = NetworkCache::singleton().storeRedirect(request, redirectResponse, redirectRequest); 75 // Create a synthetic cache entry if we can't store. 76 if (!m_cacheEntry) 77 m_cacheEntry = NetworkCache::singleton().makeRedirectEntry(request, redirectResponse, redirectRequest); 78 79 auto load = WTFMove(m_networkLoad); 80 81 // Don't follow the redirect. The redirect target will be registered for speculative load when it is loaded. 82 didComplete(); 83 84 // This causes call to didFailLoading(). 85 if (load) 86 load->continueWillSendRequest({ }); 75 87 } 76 88 … … 107 119 void SpeculativeLoad::didFinishLoading(double finishTime) 108 120 { 121 if (m_didComplete) 122 return; 109 123 if (!m_cacheEntry && m_bufferedDataForCache) { 110 m_cacheEntry = NetworkCache::singleton().store(m_originalRequest, m_response, WTFMove(m_bufferedDataForCache), [](auto& mappedBody) { });124 m_cacheEntry = NetworkCache::singleton().store(m_originalRequest, m_response, m_bufferedDataForCache.copyRef(), [](auto& mappedBody) { }); 111 125 // Create a synthetic cache entry if we can't store. 112 126 if (!m_cacheEntry && m_response.httpStatusCode() == 200) … … 126 140 void SpeculativeLoad::didFailLoading(const ResourceError&) 127 141 { 142 if (m_didComplete) 143 return; 128 144 m_cacheEntry = nullptr; 129 145 130 didComplete();131 }132 133 void SpeculativeLoad::abort()134 {135 if (m_networkLoad)136 m_networkLoad->cancel();137 138 m_cacheEntry = nullptr;139 146 didComplete(); 140 147 } … … 144 151 RELEASE_ASSERT(RunLoop::isMain()); 145 152 153 if (m_didComplete) 154 return; 155 m_didComplete = true; 146 156 m_networkLoad = nullptr; 147 157 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h
r211882 r211894 65 65 void didFailLoading(const WebCore::ResourceError&) override; 66 66 67 void abort();68 67 void didComplete(); 69 68 … … 78 77 RefPtr<WebCore::SharedBuffer> m_bufferedDataForCache; 79 78 std::unique_ptr<NetworkCache::Entry> m_cacheEntry; 79 bool m_didComplete { false }; 80 80 }; 81 81 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp
r211882 r211894 346 346 { 347 347 if (auto preloadedEntry = m_preloadedEntries.take(storageKey)) { 348 completionHandler(preloadedEntry->takeCacheEntry()); 348 RunLoop::main().dispatch([completionHandler = WTFMove(completionHandler), cacheEntry = preloadedEntry->takeCacheEntry()] () mutable { 349 completionHandler(WTFMove(cacheEntry)); 350 }); 349 351 return; 350 352 }
Note: See TracChangeset
for help on using the changeset viewer.