WebKit Bugzilla
Attachment 340451 Details for
Bug 185661
: NetworkLoadChecker should cancel its content extension retrieval task when being destroyed
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-185661-20180515171926.patch (text/plain), 22.08 KB, created by
youenn fablet
on 2018-05-15 17:19:42 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-05-15 17:19:42 PDT
Size:
22.08 KB
patch
obsolete
>Subversion Revision: 231744 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 06d62a4046247736fe55e92cc5797c552fa67a39..6988bdf2118a72da26cd26f46abadc137e5c0b55 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,38 @@ >+2018-05-15 Youenn Fablet <youenn@apple.com> >+ >+ NetworkLoadChecker should cancel its content extension retrieval task when being destroyed >+ https://bugs.webkit.org/show_bug.cgi?id=185661 >+ <rdar://problem/39985509> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ When NetworkLoadChecker is freed, make its Content Extension retrieval callback >+ if any, be called with a cancel error. >+ Store the callbacks in a map keyed by the NetworkLoadChecker pointer instead of a vector for that purpose. >+ >+ This allows stopping NetworkLoadChecker be ref counted. >+ This in turns allows NetworkResourceLoader to delete its NetworkLoadChecker when being deleted as well. >+ By doing so, we simplify the memory management of NetworkResourceLoader and NetworkLoadChecker. >+ >+ * NetworkProcess/NetworkContentRuleListManager.cpp: >+ (WebKit::NetworkContentRuleListManager::~NetworkContentRuleListManager): >+ (WebKit::NetworkContentRuleListManager::contentExtensionsBackend): >+ (WebKit::NetworkContentRuleListManager::addContentRuleLists): >+ (WebKit::NetworkContentRuleListManager::cancelContentExtensionsBackend): >+ * NetworkProcess/NetworkContentRuleListManager.h: >+ * NetworkProcess/NetworkLoadChecker.cpp: >+ (WebKit::NetworkLoadChecker::~NetworkLoadChecker): >+ (WebKit::NetworkLoadChecker::checkRequest): >+ (WebKit::NetworkLoadChecker::processContentExtensionRulesForLoad): >+ * NetworkProcess/NetworkLoadChecker.h: >+ * NetworkProcess/NetworkResourceLoader.cpp: >+ (WebKit::NetworkResourceLoader::startNetworkLoad): >+ (WebKit::NetworkResourceLoader::didReceiveResponse): >+ * NetworkProcess/NetworkResourceLoader.h: >+ * NetworkProcess/PingLoad.cpp: >+ (WebKit::PingLoad::PingLoad): >+ * NetworkProcess/PingLoad.h: >+ > 2018-05-13 Dean Jackson <dino@apple.com> > > WebKit2_Sim-7606.1.17.4 introduced dep cycle >diff --git a/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp b/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp >index c56a5577d5df7efb74238bd24daf62a357dc4ad9..414ecc6ad8811a839948e8978b36d43e292dfaa3 100644 >--- a/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.cpp >@@ -45,21 +45,22 @@ NetworkContentRuleListManager::~NetworkContentRuleListManager() > > WebCore::ContentExtensions::ContentExtensionsBackend backend; > for (auto& callbacks : pendingCallbacks.values()) { >- for (auto& callback : callbacks) >- callback(backend); >+ for (auto& callback : callbacks.values()) >+ callback(makeUnexpected(ResourceError(ResourceError::Type::Cancellation))); > } > } > >-void NetworkContentRuleListManager::contentExtensionsBackend(UserContentControllerIdentifier identifier, BackendCallback&& callback) >+void NetworkContentRuleListManager::contentExtensionsBackend(UserContentControllerIdentifier identifier, void* callbackOwner, BackendCallback&& callback) > { > auto iterator = m_contentExtensionBackends.find(identifier); > if (iterator != m_contentExtensionBackends.end()) { >- callback(*iterator->value); >+ callback(std::reference_wrapper<WebCore::ContentExtensions::ContentExtensionsBackend>(*iterator->value)); > return; > } >+ > m_pendingCallbacks.ensure(identifier, [] { >- return Vector<BackendCallback> { }; >- }).iterator->value.append(WTFMove(callback)); >+ return HashMap<void*, BackendCallback> { }; >+ }).iterator->value.add(callbackOwner, WTFMove(callback)); > NetworkProcess::singleton().parentProcessConnection()->send(Messages::NetworkProcessProxy::ContentExtensionRules { identifier }, 0); > } > >@@ -76,8 +77,8 @@ void NetworkContentRuleListManager::addContentRuleLists(UserContentControllerIde > } > > auto pendingCallbacks = m_pendingCallbacks.take(identifier); >- for (auto& callback : pendingCallbacks) >- callback(backend); >+ for (auto& callback : pendingCallbacks.values()) >+ callback(std::reference_wrapper<WebCore::ContentExtensions::ContentExtensionsBackend>(backend)); > > } > >@@ -104,6 +105,20 @@ void NetworkContentRuleListManager::remove(UserContentControllerIdentifier ident > m_contentExtensionBackends.remove(identifier); > } > >+void NetworkContentRuleListManager::cancelContentExtensionsBackend(UserContentControllerIdentifier identifier, void* callbackOwner) >+{ >+ auto iterator = m_pendingCallbacks.find(identifier); >+ if (iterator == m_pendingCallbacks.end()) >+ return; >+ >+ ASSERT(iterator->value.contains(callbackOwner)); >+ if (auto callback = iterator->value.take(callbackOwner)) { >+ callback(makeUnexpected(ResourceError(ResourceError::Type::Cancellation))); >+ if (iterator->value.isEmpty()) >+ m_pendingCallbacks.remove(iterator); >+ } >+} >+ > } // namespace WebKit > > #endif // ENABLE(CONTENT_EXTENSIONS) >diff --git a/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h b/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h >index 0f76ce259aa7364dc0e7612e0dd33969a66e0785..711f6b1db7ca43043bb6d3bbb250829fe688f12c 100644 >--- a/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h >+++ b/Source/WebKit/NetworkProcess/NetworkContentRuleListManager.h >@@ -46,8 +46,10 @@ public: > > void didReceiveMessage(IPC::Connection&, IPC::Decoder&); > >- using BackendCallback = CompletionHandler<void(WebCore::ContentExtensions::ContentExtensionsBackend&)>; >- void contentExtensionsBackend(UserContentControllerIdentifier, BackendCallback&&); >+ using BackendOrError = Expected<std::reference_wrapper<WebCore::ContentExtensions::ContentExtensionsBackend>, WebCore::ResourceError>; >+ using BackendCallback = CompletionHandler<void(BackendOrError&&)>; >+ void contentExtensionsBackend(UserContentControllerIdentifier, void* callbackOwner, BackendCallback&&); >+ void cancelContentExtensionsBackend(UserContentControllerIdentifier, void* callbackOwner); > > private: > void addContentRuleLists(UserContentControllerIdentifier, const Vector<std::pair<String, WebCompiledContentRuleListData>>&); >@@ -56,7 +58,7 @@ private: > void remove(UserContentControllerIdentifier); > > HashMap<UserContentControllerIdentifier, std::unique_ptr<WebCore::ContentExtensions::ContentExtensionsBackend>> m_contentExtensionBackends; >- HashMap<UserContentControllerIdentifier, Vector<BackendCallback>> m_pendingCallbacks; >+ HashMap<UserContentControllerIdentifier, HashMap<void*, BackendCallback>> m_pendingCallbacks; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp b/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp >index 960731d13547ec48d8c296fb59dd791797f82e69..381424164e3189cd2323ebcd637e096723d8378e 100644 >--- a/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp >@@ -71,7 +71,13 @@ NetworkLoadChecker::NetworkLoadChecker(FetchOptions&& options, PAL::SessionID se > } > } > >-NetworkLoadChecker::~NetworkLoadChecker() = default; >+NetworkLoadChecker::~NetworkLoadChecker() >+{ >+#if ENABLE(CONTENT_EXTENSIONS) >+ if (m_isRetrievingContentController) >+ NetworkProcess::singleton().networkContentRuleListManager().cancelContentExtensionsBackend(*m_userContentControllerIdentifier, this); >+#endif >+} > > void NetworkLoadChecker::check(ResourceRequest&& request, ValidationHandler&& handler) > { >@@ -161,12 +167,17 @@ auto NetworkLoadChecker::accessControlErrorForValidationHandler(String&& message > void NetworkLoadChecker::checkRequest(ResourceRequest&& request, ValidationHandler&& handler) > { > #if ENABLE(CONTENT_EXTENSIONS) >- processContentExtensionRulesForLoad(WTFMove(request), [this, handler = WTFMove(handler)](auto&& request, auto status) mutable { >- if (status.blockedLoad) { >+ processContentExtensionRulesForLoad(WTFMove(request), [this, handler = WTFMove(handler)](auto result) mutable { >+ if (!result.has_value()) { >+ ASSERT(result.error().isCancellation()); >+ handler(makeUnexpected(WTFMove(result.error()))); >+ return; >+ } >+ if (result.value().status.blockedLoad) { > handler(this->accessControlErrorForValidationHandler(ASCIILiteral("Blocked by content extension"))); > return; > } >- this->continueCheckingRequest(WTFMove(request), WTFMove(handler)); >+ this->continueCheckingRequest(WTFMove(result.value().request), WTFMove(handler)); > }); > #else > continueCheckingRequest(WTFMove(request), WTFMove(handler)); >@@ -322,18 +333,27 @@ ContentSecurityPolicy* NetworkLoadChecker::contentSecurityPolicy() > } > > #if ENABLE(CONTENT_EXTENSIONS) >-void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, CompletionHandler<void(ResourceRequest&&, const ContentExtensions::BlockedStatus&)>&& callback) >+void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, ContentExtensionCallback&& callback) > { > // FIXME: Enable content blockers for navigation loads. > if (!m_userContentControllerIdentifier || m_options.mode == FetchOptions::Mode::Navigate) { > ContentExtensions::BlockedStatus status; >- callback(WTFMove(request), status); >+ callback(ContentExtensionResult { WTFMove(request), status }); > return; > } >- NetworkProcess::singleton().networkContentRuleListManager().contentExtensionsBackend(*m_userContentControllerIdentifier, [protectedThis = makeRef(*this), this, request = WTFMove(request), callback = WTFMove(callback)](auto& backend) mutable { >- auto status = backend.processContentExtensionRulesForPingLoad(request.url(), m_mainDocumentURL); >+ >+ m_isRetrievingContentController = true; >+ NetworkProcess::singleton().networkContentRuleListManager().contentExtensionsBackend(*m_userContentControllerIdentifier, this, [this, request = WTFMove(request), callback = WTFMove(callback)](auto result) mutable { >+ if (!result.has_value()) { >+ ASSERT(result.error().isCancellation()); >+ callback(makeUnexpected(WTFMove(result.error()))); >+ return; >+ } >+ >+ m_isRetrievingContentController = false; >+ auto status = result.value().get().processContentExtensionRulesForPingLoad(request.url(), m_mainDocumentURL); > applyBlockedStatusToRequest(status, nullptr, request); >- callback(WTFMove(request), status); >+ callback(ContentExtensionResult { WTFMove(request), status }); > }); > } > #endif // ENABLE(CONTENT_EXTENSIONS) >diff --git a/Source/WebKit/NetworkProcess/NetworkLoadChecker.h b/Source/WebKit/NetworkProcess/NetworkLoadChecker.h >index 9e4754a5d690fe9565f429dbc0092dc8e1d9f001..9a43ebf6a0051d76dc656cf54508e6f4a353c1fe 100644 >--- a/Source/WebKit/NetworkProcess/NetworkLoadChecker.h >+++ b/Source/WebKit/NetworkProcess/NetworkLoadChecker.h >@@ -40,12 +40,9 @@ namespace WebKit { > > class NetworkCORSPreflightChecker; > >-class NetworkLoadChecker : public RefCounted<NetworkLoadChecker> { >+class NetworkLoadChecker { > public: >- 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) >- { >- return adoptRef(*new NetworkLoadChecker { WTFMove(options), sessionID, WTFMove(originalHeaders), WTFMove(url), WTFMove(sourceOrigin), preflightPolicy, WTFMove(referrer) }); >- } >+ NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&, WebCore::PreflightPolicy, String&& referrer); > ~NetworkLoadChecker(); > > using RequestOrError = Expected<WebCore::ResourceRequest, WebCore::ResourceError>; >@@ -69,8 +66,6 @@ public: > WebCore::StoredCredentialsPolicy storedCredentialsPolicy() const { return m_storedCredentialsPolicy; } > > private: >- NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&, WebCore::PreflightPolicy, String&& referrer); >- > WebCore::ContentSecurityPolicy* contentSecurityPolicy(); > bool isChecking() const { return !!m_corsPreflightChecker; } > bool isRedirected() const { return m_redirectCount; } >@@ -87,7 +82,13 @@ private: > RequestOrError accessControlErrorForValidationHandler(String&&); > > #if ENABLE(CONTENT_EXTENSIONS) >- void processContentExtensionRulesForLoad(WebCore::ResourceRequest&&, CompletionHandler<void(WebCore::ResourceRequest&&, const WebCore::ContentExtensions::BlockedStatus&)>&&); >+ struct ContentExtensionResult { >+ WebCore::ResourceRequest request; >+ const WebCore::ContentExtensions::BlockedStatus& status; >+ }; >+ using ContentExtensionResultOrError = Expected<ContentExtensionResult, WebCore::ResourceError>; >+ using ContentExtensionCallback = CompletionHandler<void(ContentExtensionResultOrError)>; >+ void processContentExtensionRulesForLoad(WebCore::ResourceRequest&&, ContentExtensionCallback&&); > #endif > > WebCore::FetchOptions m_options; >@@ -112,6 +113,7 @@ private: > WebCore::PreflightPolicy m_preflightPolicy; > String m_dntHeaderValue; > String m_referrer; >+ bool m_isRetrievingContentController { false }; > }; > > } >diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp b/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >index 8915fbb188ba0e0dc4d375a45eecdab73bade04f..01cdada607a31c070b86fdba4f28bc83c2394640 100644 >--- a/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >@@ -119,7 +119,7 @@ NetworkResourceLoader::NetworkResourceLoader(NetworkResourceLoadParameters&& par > } > > if (synchronousReply || parameters.shouldRestrictHTTPResponseAccess) { >- 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()); >+ 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()); > if (m_parameters.cspResponseHeaders) > m_networkLoadChecker->setCSPResponseHeaders(ContentSecurityPolicyResponseHeaders { m_parameters.cspResponseHeaders.value() }); > #if ENABLE(CONTENT_EXTENSIONS) >@@ -250,6 +250,13 @@ void NetworkResourceLoader::retrieveCacheEntry(const ResourceRequest& request) > > void NetworkResourceLoader::startNetworkLoad(ResourceRequest&& request, FirstLoad load) > { >+ fprintf(stderr, "NetworkResourceLoader::startNetworkLoad %s\n", request.url().string().utf8().data()); >+ for (auto keyValue : request.httpHeaderFields()) >+ fprintf(stderr, "(%s, %s) ", keyValue.key.utf8().data(), keyValue.value.utf8().data()); >+ fprintf(stderr, "\n"); >+ >+// request.setHTTPHeaderField(ASCIILiteral("Accept-Encoding"), ASCIILiteral("identity")); >+ > if (load == FirstLoad::Yes) { > RELEASE_LOG_IF_ALLOWED("startNetworkLoad: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", isMainResource = %d, isSynchronous = %d)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, isMainResource(), isSynchronous()); > >@@ -464,6 +471,11 @@ bool NetworkResourceLoader::shouldInterruptLoadForCSPFrameAncestorsOrXFrameOptio > > auto NetworkResourceLoader::didReceiveResponse(ResourceResponse&& receivedResponse) -> ShouldContinueDidReceiveResponse > { >+ fprintf(stderr, "NetworkResourceLoader::didReceiveResponse %s %d\n", receivedResponse.url().string().utf8().data(), (int)receivedResponse.httpStatusCode()); >+ for (auto keyValue : receivedResponse.httpHeaderFields()) >+ fprintf(stderr, "(%s, %s) ", keyValue.key.utf8().data(), keyValue.value.utf8().data()); >+ fprintf(stderr, "\n"); >+ > RELEASE_LOG_IF_ALLOWED("didReceiveResponse: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", httpStatusCode = %d, length = %" PRId64 ")", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, receivedResponse.httpStatusCode(), receivedResponse.expectedContentLength()); > > m_response = WTFMove(receivedResponse); >diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoader.h b/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >index b6a585eaf1d8a0c56af9fb802bc33bb2d66cb2f9..bdcf6da4d9972928076c2b27e4a61069dd6da6e3 100644 >--- a/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >@@ -207,7 +207,7 @@ private: > std::unique_ptr<NetworkCache::Entry> m_cacheEntryForValidation; > bool m_isWaitingContinueWillSendRequestForCachedRedirect { false }; > std::unique_ptr<NetworkCache::Entry> m_cacheEntryWaitingForContinueDidReceiveResponse; >- RefPtr<NetworkLoadChecker> m_networkLoadChecker; >+ std::unique_ptr<NetworkLoadChecker> m_networkLoadChecker; > > std::optional<NetworkActivityTracker> m_networkActivityTracker; > }; >diff --git a/Source/WebKit/NetworkProcess/PingLoad.cpp b/Source/WebKit/NetworkProcess/PingLoad.cpp >index 35c7c0358e8caffc6e9b624ceb2fc9d43009c552..e3c8aa767ccfc21e1d6458d940d6b61c8f4c323a 100644 >--- a/Source/WebKit/NetworkProcess/PingLoad.cpp >+++ b/Source/WebKit/NetworkProcess/PingLoad.cpp >@@ -42,7 +42,7 @@ PingLoad::PingLoad(NetworkResourceLoadParameters&& parameters, WTF::CompletionHa > : m_parameters(WTFMove(parameters)) > , m_completionHandler(WTFMove(completionHandler)) > , m_timeoutTimer(*this, &PingLoad::timeoutTimerFired) >- , 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())) >+ , 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())) > { > > if (m_parameters.cspResponseHeaders) >diff --git a/Source/WebKit/NetworkProcess/PingLoad.h b/Source/WebKit/NetworkProcess/PingLoad.h >index d194592cea6ee24ec31699133dc6b56e670fa4a2..8b3c7d3c23770ea4a03393efc121b186ef25eda1 100644 >--- a/Source/WebKit/NetworkProcess/PingLoad.h >+++ b/Source/WebKit/NetworkProcess/PingLoad.h >@@ -70,7 +70,7 @@ private: > WTF::CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)> m_completionHandler; > RefPtr<NetworkDataTask> m_task; > WebCore::Timer m_timeoutTimer; >- Ref<NetworkLoadChecker> m_networkLoadChecker; >+ UniqueRef<NetworkLoadChecker> m_networkLoadChecker; > std::optional<WebCore::ResourceRequest> m_lastRedirectionRequest; > }; > >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index e351694c69521ea03ec435a73666bf5b3af06f84..b1ba2e8ba315546bbaf222421754ed830c799ff2 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,15 @@ >+2018-05-15 Youenn Fablet <youenn@apple.com> >+ >+ NetworkLoadChecker should cancel its content extension retrieval task when being destroyed >+ https://bugs.webkit.org/show_bug.cgi?id=185661 >+ <rdar://problem/39985509> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * http/tests/contentextensions/crash-xhr-expected.txt: Added. >+ * http/tests/contentextensions/crash-xhr.html: Added. >+ * http/tests/contentextensions/crash-xhr.html.json: Added. >+ > 2018-05-14 Youenn Fablet <youenn@apple.com> > > readableStreamDefaultControllerError should return early if stream is not readable >diff --git a/LayoutTests/http/tests/contentextensions/crash-xhr-expected.txt b/LayoutTests/http/tests/contentextensions/crash-xhr-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..2064bd247727f5caeaf045eb3cd9637f4fbdfae5 >--- /dev/null >+++ b/LayoutTests/http/tests/contentextensions/crash-xhr-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Test that aborting the XHR while gathering content blockers will not crash the Network Process >+ >diff --git a/LayoutTests/http/tests/contentextensions/crash-xhr.html b/LayoutTests/http/tests/contentextensions/crash-xhr.html >new file mode 100644 >index 0000000000000000000000000000000000000000..91237df09d14745790d3b6df490450328d8bf310 >--- /dev/null >+++ b/LayoutTests/http/tests/contentextensions/crash-xhr.html >@@ -0,0 +1,22 @@ >+<!DOCTYPE html> >+<html> >+<body> >+ <script> >+// We do the xhr load first so that this load will trigger the gathering by NetworkProcess of content blockers. >+const promise = new Promise(resolve => { >+var xhr = new XMLHttpRequest; >+xhr.onloadend = resolve; >+xhr.open("GET", ".", true); >+xhr.send(); >+xhr.abort(); >+}); >+ </script> >+ <script src="/resources/testharness.js"></script> >+ <script src="/resources/testharnessreport.js"></script> >+ <script> >+promise_test((test) => { >+ return promise; >+}, "Test that aborting the XHR while gathering content blockers will not crash the Network Process"); >+ </script> >+</body> >+</html> >diff --git a/LayoutTests/http/tests/contentextensions/crash-xhr.html.json b/LayoutTests/http/tests/contentextensions/crash-xhr.html.json >new file mode 100644 >index 0000000000000000000000000000000000000000..cc4239b911179419599aec367604aec20de5d48d >--- /dev/null >+++ b/LayoutTests/http/tests/contentextensions/crash-xhr.html.json >@@ -0,0 +1,18 @@ >+[ >+ { >+ "action": { >+ "type": "block" >+ }, >+ "trigger": { >+ "url-filter": ".*localhost" >+ } >+ }, >+ { >+ "action": { >+ "type": "ignore-previous-rules" >+ }, >+ "trigger": { >+ "url-filter": ".*whitelist" >+ } >+ } >+]
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185661
:
340439
|
340451
|
340474
|
340492
|
340734