Changeset 231988 in webkit
- Timestamp:
- May 18, 2018 4:02:38 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r231982 r231988 1 2018-05-18 Youenn Fablet <youenn@apple.com> 2 3 NetworkLoadChecker should cancel its content extension retrieval task when being destroyed 4 https://bugs.webkit.org/show_bug.cgi?id=185661 5 <rdar://problem/39985509> 6 7 Reviewed by Chris Dumez. 8 9 * http/tests/contentextensions/crash-xhr-expected.txt: Added. 10 * http/tests/contentextensions/crash-xhr.html: Added. 11 * http/tests/contentextensions/crash-xhr.html.json: Added. 12 1 13 2018-05-18 Jer Noble <jer.noble@apple.com> 2 14 -
trunk/Source/WebKit/ChangeLog
r231984 r231988 1 2018-05-18 Youenn Fablet <youenn@apple.com> 2 3 NetworkLoadChecker should cancel its content extension retrieval task when being destroyed 4 https://bugs.webkit.org/show_bug.cgi?id=185661 5 <rdar://problem/39985509> 6 7 Reviewed by Chris Dumez. 8 9 Make sure that the Content Extension retrieval callback checks that NetworkLoadChecker is alive. 10 This allows stopping NetworkLoadChecker be ref counted. 11 This in turns allows NetworkResourceLoader to delete its NetworkLoadChecker when being deleted as well. 12 By doing so, we simplify the memory management of NetworkResourceLoader and NetworkLoadChecker. 13 14 * NetworkProcess/NetworkLoadChecker.cpp: 15 (WebKit::NetworkLoadChecker::checkRequest): 16 (WebKit::NetworkLoadChecker::processContentExtensionRulesForLoad): 17 * NetworkProcess/NetworkLoadChecker.h: 18 (WebKit::NetworkLoadChecker::weakPtrFactory): 19 * NetworkProcess/NetworkResourceLoader.cpp: 20 * NetworkProcess/NetworkResourceLoader.h: 21 * NetworkProcess/PingLoad.cpp: 22 (WebKit::PingLoad::PingLoad): 23 * NetworkProcess/PingLoad.h: 24 1 25 2018-05-18 Per Arne Vollan <pvollan@apple.com> 2 26 -
trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp
r231476 r231988 162 162 { 163 163 #if ENABLE(CONTENT_EXTENSIONS) 164 processContentExtensionRulesForLoad(WTFMove(request), [this, handler = WTFMove(handler)](auto&& request, auto status) mutable { 165 if (status.blockedLoad) { 164 processContentExtensionRulesForLoad(WTFMove(request), [this, handler = WTFMove(handler)](auto result) mutable { 165 if (!result.has_value()) { 166 ASSERT(result.error().isCancellation()); 167 handler(makeUnexpected(WTFMove(result.error()))); 168 return; 169 } 170 if (result.value().status.blockedLoad) { 166 171 handler(this->accessControlErrorForValidationHandler(ASCIILiteral("Blocked by content extension"))); 167 172 return; 168 173 } 169 this->continueCheckingRequest(WTFMove(re quest), WTFMove(handler));174 this->continueCheckingRequest(WTFMove(result.value().request), WTFMove(handler)); 170 175 }); 171 176 #else … … 323 328 324 329 #if ENABLE(CONTENT_EXTENSIONS) 325 void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, Co mpletionHandler<void(ResourceRequest&&, const ContentExtensions::BlockedStatus&)>&& callback)330 void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, ContentExtensionCallback&& callback) 326 331 { 327 332 // FIXME: Enable content blockers for navigation loads. 328 333 if (!m_userContentControllerIdentifier || m_options.mode == FetchOptions::Mode::Navigate) { 329 334 ContentExtensions::BlockedStatus status; 330 callback(WTFMove(request), status); 331 return; 332 } 333 NetworkProcess::singleton().networkContentRuleListManager().contentExtensionsBackend(*m_userContentControllerIdentifier, [protectedThis = makeRef(*this), this, request = WTFMove(request), callback = WTFMove(callback)](auto& backend) mutable { 335 callback(ContentExtensionResult { WTFMove(request), status }); 336 return; 337 } 338 339 NetworkProcess::singleton().networkContentRuleListManager().contentExtensionsBackend(*m_userContentControllerIdentifier, [this, weakThis = makeWeakPtr(this), request = WTFMove(request), callback = WTFMove(callback)](auto& backend) mutable { 340 if (!weakThis) { 341 callback(makeUnexpected(ResourceError { ResourceError::Type::Cancellation })); 342 return; 343 } 344 334 345 auto status = backend.processContentExtensionRulesForPingLoad(request.url(), m_mainDocumentURL); 335 346 applyBlockedStatusToRequest(status, nullptr, request); 336 callback( WTFMove(request), status);347 callback(ContentExtensionResult { WTFMove(request), status }); 337 348 }); 338 349 } -
trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h
r231476 r231988 32 32 #include <wtf/CompletionHandler.h> 33 33 #include <wtf/Expected.h> 34 #include <wtf/WeakPtr.h> 34 35 35 36 namespace WebCore { … … 41 42 class NetworkCORSPreflightChecker; 42 43 43 class NetworkLoadChecker : public RefCounted<NetworkLoadChecker>{44 class NetworkLoadChecker { 44 45 public: 45 static Ref<NetworkLoadChecker> create(WebCore::FetchOptions&& options, PAL::SessionID sessionID, WebCore::HTTPHeaderMap&& originalHeaders, WebCore::URL&& url, RefPtr<WebCore::SecurityOrigin>&& sourceOrigin, WebCore::PreflightPolicy preflightPolicy, String&& referrer) 46 { 47 return adoptRef(*new NetworkLoadChecker { WTFMove(options), sessionID, WTFMove(originalHeaders), WTFMove(url), WTFMove(sourceOrigin), preflightPolicy, WTFMove(referrer) }); 48 } 46 NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&, WebCore::PreflightPolicy, String&& referrer); 49 47 ~NetworkLoadChecker(); 50 48 … … 69 67 WebCore::StoredCredentialsPolicy storedCredentialsPolicy() const { return m_storedCredentialsPolicy; } 70 68 69 WeakPtrFactory<NetworkLoadChecker>& weakPtrFactory() { return m_weakFactory; } 70 71 71 private: 72 NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&, WebCore::PreflightPolicy, String&& referrer);73 74 72 WebCore::ContentSecurityPolicy* contentSecurityPolicy(); 75 73 bool isChecking() const { return !!m_corsPreflightChecker; } … … 88 86 89 87 #if ENABLE(CONTENT_EXTENSIONS) 90 void processContentExtensionRulesForLoad(WebCore::ResourceRequest&&, CompletionHandler<void(WebCore::ResourceRequest&&, const WebCore::ContentExtensions::BlockedStatus&)>&&); 88 struct ContentExtensionResult { 89 WebCore::ResourceRequest request; 90 const WebCore::ContentExtensions::BlockedStatus& status; 91 }; 92 using ContentExtensionResultOrError = Expected<ContentExtensionResult, WebCore::ResourceError>; 93 using ContentExtensionCallback = CompletionHandler<void(ContentExtensionResultOrError)>; 94 void processContentExtensionRulesForLoad(WebCore::ResourceRequest&&, ContentExtensionCallback&&); 91 95 #endif 92 96 … … 113 117 String m_dntHeaderValue; 114 118 String m_referrer; 119 WeakPtrFactory<NetworkLoadChecker> m_weakFactory; 115 120 }; 116 121 -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp
r231931 r231988 120 120 121 121 if (synchronousReply || parameters.shouldRestrictHTTPResponseAccess) { 122 m_networkLoadChecker = NetworkLoadChecker::create(FetchOptions { m_parameters.options }, m_parameters.sessionID, HTTPHeaderMap { m_parameters.originalRequestHeaders }, URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy, originalRequest().httpReferrer());122 m_networkLoadChecker = std::make_unique<NetworkLoadChecker>(FetchOptions { m_parameters.options }, m_parameters.sessionID, HTTPHeaderMap { m_parameters.originalRequestHeaders }, URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy, originalRequest().httpReferrer()); 123 123 if (m_parameters.cspResponseHeaders) 124 124 m_networkLoadChecker->setCSPResponseHeaders(ContentSecurityPolicyResponseHeaders { m_parameters.cspResponseHeaders.value() }); -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h
r231931 r231988 208 208 bool m_isWaitingContinueWillSendRequestForCachedRedirect { false }; 209 209 std::unique_ptr<NetworkCache::Entry> m_cacheEntryWaitingForContinueDidReceiveResponse; 210 RefPtr<NetworkLoadChecker> m_networkLoadChecker;210 std::unique_ptr<NetworkLoadChecker> m_networkLoadChecker; 211 211 212 212 std::optional<NetworkActivityTracker> m_networkActivityTracker; -
trunk/Source/WebKit/NetworkProcess/PingLoad.cpp
r231445 r231988 43 43 , m_completionHandler(WTFMove(completionHandler)) 44 44 , m_timeoutTimer(*this, &PingLoad::timeoutTimerFired) 45 , m_networkLoadChecker( NetworkLoadChecker::create(FetchOptions { m_parameters.options}, m_parameters.sessionID, WTFMove(m_parameters.originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy, m_parameters.request.httpReferrer()))45 , m_networkLoadChecker(makeUniqueRef<NetworkLoadChecker>(FetchOptions { m_parameters.options}, m_parameters.sessionID, WTFMove(m_parameters.originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy, m_parameters.request.httpReferrer())) 46 46 { 47 47 -
trunk/Source/WebKit/NetworkProcess/PingLoad.h
r230541 r231988 71 71 RefPtr<NetworkDataTask> m_task; 72 72 WebCore::Timer m_timeoutTimer; 73 Ref<NetworkLoadChecker> m_networkLoadChecker;73 UniqueRef<NetworkLoadChecker> m_networkLoadChecker; 74 74 std::optional<WebCore::ResourceRequest> m_lastRedirectionRequest; 75 75 };
Note: See TracChangeset
for help on using the changeset viewer.