Changeset 231988 in webkit


Ignore:
Timestamp:
May 18, 2018 4:02:38 PM (6 years ago)
Author:
youenn@apple.com
Message:

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 Chris Dumez.

Source/WebKit:

Make sure that the Content Extension retrieval callback checks that NetworkLoadChecker is alive.
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/NetworkLoadChecker.cpp:

(WebKit::NetworkLoadChecker::checkRequest):
(WebKit::NetworkLoadChecker::processContentExtensionRulesForLoad):

  • NetworkProcess/NetworkLoadChecker.h:

(WebKit::NetworkLoadChecker::weakPtrFactory):

  • NetworkProcess/NetworkResourceLoader.cpp:
  • NetworkProcess/NetworkResourceLoader.h:
  • NetworkProcess/PingLoad.cpp:

(WebKit::PingLoad::PingLoad):

  • NetworkProcess/PingLoad.h:

LayoutTests:

  • http/tests/contentextensions/crash-xhr-expected.txt: Added.
  • http/tests/contentextensions/crash-xhr.html: Added.
  • http/tests/contentextensions/crash-xhr.html.json: Added.
Location:
trunk
Files:
3 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r231982 r231988  
     12018-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
    1132018-05-18  Jer Noble  <jer.noble@apple.com>
    214
  • trunk/Source/WebKit/ChangeLog

    r231984 r231988  
     12018-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
    1252018-05-18  Per Arne Vollan  <pvollan@apple.com>
    226
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp

    r231476 r231988  
    162162{
    163163#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) {
    166171            handler(this->accessControlErrorForValidationHandler(ASCIILiteral("Blocked by content extension")));
    167172            return;
    168173        }
    169         this->continueCheckingRequest(WTFMove(request), WTFMove(handler));
     174        this->continueCheckingRequest(WTFMove(result.value().request), WTFMove(handler));
    170175    });
    171176#else
     
    323328
    324329#if ENABLE(CONTENT_EXTENSIONS)
    325 void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, CompletionHandler<void(ResourceRequest&&, const ContentExtensions::BlockedStatus&)>&& callback)
     330void NetworkLoadChecker::processContentExtensionRulesForLoad(ResourceRequest&& request, ContentExtensionCallback&& callback)
    326331{
    327332    // FIXME: Enable content blockers for navigation loads.
    328333    if (!m_userContentControllerIdentifier || m_options.mode == FetchOptions::Mode::Navigate) {
    329334        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
    334345        auto status = backend.processContentExtensionRulesForPingLoad(request.url(), m_mainDocumentURL);
    335346        applyBlockedStatusToRequest(status, nullptr, request);
    336         callback(WTFMove(request), status);
     347        callback(ContentExtensionResult { WTFMove(request), status });
    337348    });
    338349}
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h

    r231476 r231988  
    3232#include <wtf/CompletionHandler.h>
    3333#include <wtf/Expected.h>
     34#include <wtf/WeakPtr.h>
    3435
    3536namespace WebCore {
     
    4142class NetworkCORSPreflightChecker;
    4243
    43 class NetworkLoadChecker : public RefCounted<NetworkLoadChecker> {
     44class NetworkLoadChecker {
    4445public:
    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);
    4947    ~NetworkLoadChecker();
    5048
     
    6967    WebCore::StoredCredentialsPolicy storedCredentialsPolicy() const { return m_storedCredentialsPolicy; }
    7068
     69    WeakPtrFactory<NetworkLoadChecker>& weakPtrFactory() { return m_weakFactory; }
     70
    7171private:
    72     NetworkLoadChecker(WebCore::FetchOptions&&, PAL::SessionID, WebCore::HTTPHeaderMap&&, WebCore::URL&&, RefPtr<WebCore::SecurityOrigin>&&, WebCore::PreflightPolicy, String&& referrer);
    73 
    7472    WebCore::ContentSecurityPolicy* contentSecurityPolicy();
    7573    bool isChecking() const { return !!m_corsPreflightChecker; }
     
    8886
    8987#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&&);
    9195#endif
    9296
     
    113117    String m_dntHeaderValue;
    114118    String m_referrer;
     119    WeakPtrFactory<NetworkLoadChecker> m_weakFactory;
    115120};
    116121
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

    r231931 r231988  
    120120
    121121    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());
    123123        if (m_parameters.cspResponseHeaders)
    124124            m_networkLoadChecker->setCSPResponseHeaders(ContentSecurityPolicyResponseHeaders { m_parameters.cspResponseHeaders.value() });
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h

    r231931 r231988  
    208208    bool m_isWaitingContinueWillSendRequestForCachedRedirect { false };
    209209    std::unique_ptr<NetworkCache::Entry> m_cacheEntryWaitingForContinueDidReceiveResponse;
    210     RefPtr<NetworkLoadChecker> m_networkLoadChecker;
     210    std::unique_ptr<NetworkLoadChecker> m_networkLoadChecker;
    211211
    212212    std::optional<NetworkActivityTracker> m_networkActivityTracker;
  • trunk/Source/WebKit/NetworkProcess/PingLoad.cpp

    r231445 r231988  
    4343    , m_completionHandler(WTFMove(completionHandler))
    4444    , 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()))
    4646{
    4747
  • trunk/Source/WebKit/NetworkProcess/PingLoad.h

    r230541 r231988  
    7171    RefPtr<NetworkDataTask> m_task;
    7272    WebCore::Timer m_timeoutTimer;
    73     Ref<NetworkLoadChecker> m_networkLoadChecker;
     73    UniqueRef<NetworkLoadChecker> m_networkLoadChecker;
    7474    std::optional<WebCore::ResourceRequest> m_lastRedirectionRequest;
    7575};
Note: See TracChangeset for help on using the changeset viewer.