Changeset 256857 in webkit


Ignore:
Timestamp:
Feb 18, 2020 3:09:01 PM (4 years ago)
Author:
youenn@apple.com
Message:

NetworkDataTask should not expect its session wrapper to be always live
https://bugs.webkit.org/show_bug.cgi?id=207903
rdar://problem/59291486

Reviewed by Alex Christensen.

NetworkDataTaskCocoa should take a weak pointer to its session wrapper.
If the session wrapper is still valid, then we can remove the task from the session wrapper map.
We cannot guarantee session wrapper is valid since NetworkDataTask is ref counted.

  • NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
  • NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:

(WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
(WebKit::NetworkDataTaskCocoa::~NetworkDataTaskCocoa):

Location:
trunk/Source/WebKit
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r256853 r256857  
     12020-02-18  Youenn Fablet  <youenn@apple.com>
     2
     3        NetworkDataTask should not expect its session wrapper to be always live
     4        https://bugs.webkit.org/show_bug.cgi?id=207903
     5        rdar://problem/59291486
     6
     7        Reviewed by Alex Christensen.
     8
     9        NetworkDataTaskCocoa should take a weak pointer to its session wrapper.
     10        If the session wrapper is still valid, then we can remove the task from the session wrapper map.
     11        We cannot guarantee session wrapper is valid since NetworkDataTask is ref counted.
     12
     13        * NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
     14        * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
     15        (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
     16        (WebKit::NetworkDataTaskCocoa::~NetworkDataTaskCocoa):
     17
    1182020-02-18  Antti Koivisto  <antti@apple.com>
    219
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h

    r255846 r256857  
    9191    bool isAlwaysOnLoggingAllowed() const;
    9292
    93     SessionWrapper& m_sessionWrapper;
     93    WeakPtr<SessionWrapper> m_sessionWrapper;
    9494    RefPtr<SandboxExtension> m_sandboxExtension;
    9595    RetainPtr<NSURLSessionDataTask> m_task;
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm

    r255846 r256857  
    231231NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, bool dataTaskIsForMainResourceNavigationForAnyFrame, Optional<NetworkActivityTracker> networkActivityTracker)
    232232    : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation)
    233     , m_sessionWrapper(static_cast<NetworkSessionCocoa&>(session).sessionWrapperForTask(requestWithCredentials, storedCredentialsPolicy))
     233    , m_sessionWrapper(makeWeakPtr(static_cast<NetworkSessionCocoa&>(session).sessionWrapperForTask(requestWithCredentials, storedCredentialsPolicy)))
    234234    , m_frameID(frameID)
    235235    , m_pageID(pageID)
     
    278278    applySniffingPoliciesAndBindRequestToInferfaceIfNeeded(nsRequest, shouldContentSniff == WebCore::ContentSniffingPolicy::SniffContent && !url.isLocalFile(), shouldContentEncodingSniff == WebCore::ContentEncodingSniffingPolicy::Sniff);
    279279
    280     m_task = [m_sessionWrapper.session dataTaskWithRequest:nsRequest];
     280    m_task = [m_sessionWrapper->session dataTaskWithRequest:nsRequest];
    281281
    282282    BEGIN_SIGNPOST(m_task, "%{public}s pri: %f preconnect: %d", url.string().ascii().data(), toNSURLSessionTaskPriority(request.priority()), shouldPreconnectOnly == PreconnectOnly::Yes);
    283283
    284     RELEASE_ASSERT(!m_sessionWrapper.dataTaskMap.contains([m_task taskIdentifier]));
    285     m_sessionWrapper.dataTaskMap.add([m_task taskIdentifier], this);
     284    RELEASE_ASSERT(!m_sessionWrapper->dataTaskMap.contains([m_task taskIdentifier]));
     285    m_sessionWrapper->dataTaskMap.add([m_task taskIdentifier], this);
    286286    LOG(NetworkSession, "%llu Creating NetworkDataTask with URL %s", [m_task taskIdentifier], nsRequest.URL.absoluteString.UTF8String);
    287287
     
    319319NetworkDataTaskCocoa::~NetworkDataTaskCocoa()
    320320{
    321     if (!m_task || !m_session)
     321    if (!m_task || !m_sessionWrapper)
    322322        return;
    323323
    324     RELEASE_ASSERT(m_sessionWrapper.dataTaskMap.get([m_task taskIdentifier]) == this);
    325     m_sessionWrapper.dataTaskMap.remove([m_task taskIdentifier]);
     324    RELEASE_ASSERT(m_sessionWrapper->dataTaskMap.get([m_task taskIdentifier]) == this);
     325    m_sessionWrapper->dataTaskMap.remove([m_task taskIdentifier]);
    326326}
    327327
Note: See TracChangeset for help on using the changeset viewer.