Changeset 170660 in webkit


Ignore:
Timestamp:
Jul 1, 2014, 1:22:58 PM (11 years ago)
Author:
mitz@apple.com
Message:

[Cocoa] Navigation parameter in navigation delegate messages is nil for navigations started by the Web Content process
https://bugs.webkit.org/show_bug.cgi?id=134482

Reviewed by Tim Horton.

  • UIProcess/API/APILoaderClient.h:

(API::LoaderClient::didDestroyNavigation): New client function, called when a navigation ID
is not going to be used anymore.

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _restoreFromSessionState:]): If restoring triggered a navigation, create a
WKNavigation for its ID.

  • UIProcess/Cocoa/NavigationState.h:
  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::NavigationState::createLoadRequestNavigation): Removed FIXME, because we now remove
navigations from the map in LoaderClient::didDestroyNavigation.
(WebKit::NavigationState::createBackForwardNavigation): Ditto.
(WebKit::NavigationState::createReloadNavigation): Ditto.
(WebKit::NavigationState::createLoadDataNavigation): Ditto.
(WebKit::NavigationState::PolicyClient::decidePolicyForNavigationAction): If we are only
getting a navigation ID now, create a WKNavigation for it. Also changed to create the
NSURLRequest lazily.
(WebKit::NavigationState::LoaderClient::didStartProvisionalLoadForFrame): Assert that
navigationID is not zero and that it maps to an existing WKNavigation.
(WebKit::NavigationState::LoaderClient::didReceiveServerRedirectForProvisionalLoadForFrame):
Ditto.
(WebKit::NavigationState::LoaderClient::didFailProvisionalLoadWithErrorForFrame): Ditto.
(WebKit::NavigationState::LoaderClient::didCommitLoadForFrame): Ditto.
(WebKit::NavigationState::LoaderClient::didFinishDocumentLoadForFrame): Ditto.
(WebKit::NavigationState::LoaderClient::didFinishLoadForFrame): Ditto.
(WebKit::NavigationState::LoaderClient::didFailLoadWithErrorForFrame): Ditto.
(WebKit::NavigationState::LoaderClient::didDestroyNavigation): Override the new client
function to remove the navigation from the map.
(WebKit::NavigationState::LoaderClient::processDidCrash): Clear the navigations map.

  • UIProcess/WebFrameListenerProxy.cpp:

(WebKit::WebFrameListenerProxy::WebFrameListenerProxy): Initialize new m_navigationID
member variable.
(WebKit::WebFrameListenerProxy::receivedPolicyDecision): Pass the navigation ID to
WebFrame::receivedPolicyDecision.

  • UIProcess/WebFrameListenerProxy.h:

(WebKit::WebFrameListenerProxy::navigationID): Added this accessor.
(WebKit::WebFrameListenerProxy::setNavigationID): Ditto.

  • UIProcess/WebFrameProxy.cpp:

(WebKit::WebFrameProxy::receivedPolicyDecision): Added navigationID parameter, which is
passed along to the WebPageProxy.

  • UIProcess/WebFrameProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::receivedPolicyDecision): Added navigationID parameter, which is
passed along in the message to the Web Content process.
(WebKit::WebPageProxy::restoreFromSessionStateData): Changed to return a navigation ID of 0.
(WebKit::WebPageProxy::restoreFromState): Changed to return a navigation ID if one was
started.
(WebKit::WebPageProxy::didDestroyNavigation): Added. Calls the new client function.
(WebKit::WebPageProxy::decidePolicyForNavigationAction): Added navigationID and
newNavigationID parameters. If a main-frame navigation doesn’t already have an ID, assign it
a new ID and return it in the newNavigationID parmeter as well as setting it on the listener
for the asynchronous case.

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in: Added navigationID and newNavigationID parameters.
  • UIProcess/cf/WebPageProxyCF.cpp:

(WebKit::WebPageProxy::restoreFromSessionStateData): Changed to return a navigation ID if
one was started.

  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse): Updated for additional
parameter.
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Send the navigation
ID to the UI process, get the new navigation ID from the reply, and set it on the document
loader.

  • WebProcess/WebPage/WebDocumentLoader.cpp:

(WebKit::WebDocumentLoader::detachFromFrame): Override to let the UI process know that the
navigation ID will not be used anymore.

  • WebProcess/WebPage/WebDocumentLoader.h:
  • WebProcess/WebPage/WebFrame.cpp:

(WebKit::WebFrame::didReceivePolicyDecision): Added navigationID parameter, set it on the
document loader.
(WebKit::WebFrame::documentLoaderDetached): Pass the message along to the UI process.

  • WebProcess/WebPage/WebFrame.h:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::didReceivePolicyDecision): Pass new navigationID parameter along.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in: Added navigationID parameter.
Location:
trunk/Source/WebKit2
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r170659 r170660  
     12014-07-01  Dan Bernstein  <mitz@apple.com>
     2
     3        [Cocoa] Navigation parameter in navigation delegate messages is nil for navigations started by the Web Content process
     4        https://bugs.webkit.org/show_bug.cgi?id=134482
     5
     6        Reviewed by Tim Horton.
     7
     8        * UIProcess/API/APILoaderClient.h:
     9        (API::LoaderClient::didDestroyNavigation): New client function, called when a navigation ID
     10        is not going to be used anymore.
     11
     12        * UIProcess/API/Cocoa/WKWebView.mm:
     13        (-[WKWebView _restoreFromSessionState:]): If restoring triggered a navigation, create a
     14        WKNavigation for its ID.
     15
     16        * UIProcess/Cocoa/NavigationState.h:
     17        * UIProcess/Cocoa/NavigationState.mm:
     18        (WebKit::NavigationState::createLoadRequestNavigation): Removed FIXME, because we now remove
     19        navigations from the map in LoaderClient::didDestroyNavigation.
     20        (WebKit::NavigationState::createBackForwardNavigation): Ditto.
     21        (WebKit::NavigationState::createReloadNavigation): Ditto.
     22        (WebKit::NavigationState::createLoadDataNavigation): Ditto.
     23        (WebKit::NavigationState::PolicyClient::decidePolicyForNavigationAction): If we are only
     24        getting a navigation ID now, create a WKNavigation for it. Also changed to create the
     25        NSURLRequest lazily.
     26        (WebKit::NavigationState::LoaderClient::didStartProvisionalLoadForFrame): Assert that
     27        navigationID is not zero and that it maps to an existing WKNavigation.
     28        (WebKit::NavigationState::LoaderClient::didReceiveServerRedirectForProvisionalLoadForFrame):
     29        Ditto.
     30        (WebKit::NavigationState::LoaderClient::didFailProvisionalLoadWithErrorForFrame): Ditto.
     31        (WebKit::NavigationState::LoaderClient::didCommitLoadForFrame): Ditto.
     32        (WebKit::NavigationState::LoaderClient::didFinishDocumentLoadForFrame): Ditto.
     33        (WebKit::NavigationState::LoaderClient::didFinishLoadForFrame): Ditto.
     34        (WebKit::NavigationState::LoaderClient::didFailLoadWithErrorForFrame): Ditto.
     35        (WebKit::NavigationState::LoaderClient::didDestroyNavigation): Override the new client
     36        function to remove the navigation from the map.
     37        (WebKit::NavigationState::LoaderClient::processDidCrash): Clear the navigations map.
     38
     39        * UIProcess/WebFrameListenerProxy.cpp:
     40        (WebKit::WebFrameListenerProxy::WebFrameListenerProxy): Initialize new m_navigationID
     41        member variable.
     42        (WebKit::WebFrameListenerProxy::receivedPolicyDecision): Pass the navigation ID to
     43        WebFrame::receivedPolicyDecision.
     44        * UIProcess/WebFrameListenerProxy.h:
     45        (WebKit::WebFrameListenerProxy::navigationID): Added this accessor.
     46        (WebKit::WebFrameListenerProxy::setNavigationID): Ditto.
     47
     48        * UIProcess/WebFrameProxy.cpp:
     49        (WebKit::WebFrameProxy::receivedPolicyDecision): Added navigationID parameter, which is
     50        passed along to the WebPageProxy.
     51        * UIProcess/WebFrameProxy.h:
     52
     53        * UIProcess/WebPageProxy.cpp:
     54        (WebKit::WebPageProxy::receivedPolicyDecision): Added navigationID parameter, which is
     55        passed along in the message to the Web Content process.
     56        (WebKit::WebPageProxy::restoreFromSessionStateData): Changed to return a navigation ID of 0.
     57        (WebKit::WebPageProxy::restoreFromState): Changed to return a navigation ID if one was
     58        started.
     59        (WebKit::WebPageProxy::didDestroyNavigation): Added. Calls the new client function.
     60        (WebKit::WebPageProxy::decidePolicyForNavigationAction): Added navigationID and
     61        newNavigationID parameters. If a main-frame navigation doesn’t already have an ID, assign it
     62        a new ID and return it in the newNavigationID parmeter as well as setting it on the listener
     63        for the asynchronous case.
     64        * UIProcess/WebPageProxy.h:
     65
     66        * UIProcess/WebPageProxy.messages.in: Added navigationID and newNavigationID parameters.
     67
     68        * UIProcess/cf/WebPageProxyCF.cpp:
     69        (WebKit::WebPageProxy::restoreFromSessionStateData): Changed to return a navigation ID if
     70        one was started.
     71
     72        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     73        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse): Updated for additional
     74        parameter.
     75        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Send the navigation
     76        ID to the UI process, get the new navigation ID from the reply, and set it on the document
     77        loader.
     78
     79        * WebProcess/WebPage/WebDocumentLoader.cpp:
     80        (WebKit::WebDocumentLoader::detachFromFrame): Override to let the UI process know that the
     81        navigation ID will not be used anymore.
     82        * WebProcess/WebPage/WebDocumentLoader.h:
     83
     84        * WebProcess/WebPage/WebFrame.cpp:
     85        (WebKit::WebFrame::didReceivePolicyDecision): Added navigationID parameter, set it on the
     86        document loader.
     87        (WebKit::WebFrame::documentLoaderDetached): Pass the message along to the UI process.
     88        * WebProcess/WebPage/WebFrame.h:
     89
     90        * WebProcess/WebPage/WebPage.cpp:
     91        (WebKit::WebPage::didReceivePolicyDecision): Pass new navigationID parameter along.
     92        * WebProcess/WebPage/WebPage.h:
     93
     94        * WebProcess/WebPage/WebPage.messages.in: Added navigationID parameter.
     95
    1962014-07-01  Anders Carlsson  <andersca@apple.com>
    297
  • trunk/Source/WebKit2/UIProcess/API/APILoaderClient.h

    r168407 r170660  
    6666    virtual void didReceiveTitleForFrame(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, API::Object*) { }
    6767    virtual void didFirstLayoutForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, API::Object*) { }
     68    virtual void didDestroyNavigation(WebKit::WebPageProxy*, uint64_t navigationID) { }
    6869
    6970    // FIXME: We should consider removing didFirstVisuallyNonEmptyLayoutForFrame since it is replaced by didLayout.
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r170644 r170660  
    15721572{
    15731573    [sessionState retain];
    1574     _page->restoreFromSessionStateData(API::Data::createWithoutCopying((const unsigned char*)sessionState.bytes, sessionState.length, releaseNSData, sessionState).get());
     1574    uint64_t navigationID = _page->restoreFromSessionStateData(API::Data::createWithoutCopying((const unsigned char*)sessionState.bytes, sessionState.length, releaseNSData, sessionState).get());
     1575    if (navigationID)
     1576        _navigationState->createReloadNavigation(navigationID);
    15751577}
    15761578
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h

    r170137 r170660  
    103103        virtual void didFinishLoadForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, API::Object*) override;
    104104        virtual void didFailLoadWithErrorForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, const WebCore::ResourceError&, API::Object*) override;
     105        virtual void didDestroyNavigation(WebKit::WebPageProxy*, uint64_t navigationID) override;
    105106        virtual void didLayout(WebKit::WebPageProxy*, WebCore::LayoutMilestones, API::Object*) override;
    106107        virtual bool canAuthenticateAgainstProtectionSpaceInFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebKit::WebProtectionSpace*) override;
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm

    r170322 r170660  
    4343#import "WKNSURLExtras.h"
    4444#import "WKNSURLProtectionSpace.h"
     45#import "WKNSURLRequest.h"
    4546#import "WKNavigationActionInternal.h"
    4647#import "WKNavigationDataInternal.h"
     
    164165    [navigation setRequest:request];
    165166
    166     // FIXME: We need to remove the navigation when we're done with it!
    167167    m_navigations.set(navigationID, navigation);
    168168
     
    176176    auto navigation = adoptNS([[WKNavigation alloc] init]);
    177177
    178     // FIXME: We need to remove the navigation when we're done with it!
    179178    m_navigations.set(navigationID, navigation);
    180179
     
    188187    auto navigation = adoptNS([[WKNavigation alloc] init]);
    189188
    190     // FIXME: We need to remove the navigation when we're done with it!
    191189    m_navigations.set(navigationID, navigation);
    192190
     
    200198    auto navigation = adoptNS([[WKNavigation alloc] init]);
    201199
    202     // FIXME: We need to remove the navigation when we're done with it!
    203200    m_navigations.set(navigationID, navigation);
    204201
     
    265262void NavigationState::PolicyClient::decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy* destinationFrame, const NavigationActionData& navigationActionData, WebFrameProxy* sourceFrame, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest& request, RefPtr<WebFramePolicyListenerProxy> listener, API::Object* userData)
    266263{
     264    RetainPtr<NSURLRequest> nsURLRequest = adoptNS(wrapper(*API::URLRequest::create(request).leakRef()));
     265
     266    if (listener->navigationID())
     267        m_navigationState.createLoadRequestNavigation(listener->navigationID(), nsURLRequest.get());
     268
    267269    if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler) {
    268270        if (!destinationFrame) {
     
    271273        }
    272274
    273         NSURLRequest *nsURLRequest = request.nsURLRequest(WebCore::DoNotUpdateHTTPBody);
    274         if ([NSURLConnection canHandleRequest:nsURLRequest]) {
     275        if ([NSURLConnection canHandleRequest:nsURLRequest.get()]) {
    275276            listener->use();
    276277            return;
     
    280281        // A file URL shouldn't fall through to here, but if it did,
    281282        // it would be a security risk to open it.
    282         if (![nsURLRequest.URL isFileURL])
    283             [[NSWorkspace sharedWorkspace] openURL:nsURLRequest.URL];
     283        if (![[nsURLRequest URL] isFileURL])
     284            [[NSWorkspace sharedWorkspace] openURL:[nsURLRequest URL]];
    284285#endif
    285286        listener->ignore();
     
    303304    }
    304305
    305     [navigationAction setRequest:request.nsURLRequest(WebCore::DoNotUpdateHTTPBody)];
     306    [navigationAction setRequest:nsURLRequest.get()];
    306307    [navigationAction _setOriginalURL:originalRequest.url()];
    307308
     
    413414        return;
    414415
    415     // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
    416     WKNavigation *navigation = nil;
    417     if (navigationID)
    418         navigation = m_navigationState.m_navigations.get(navigationID).get();
     416    ASSERT(navigationID);
     417    WKNavigation *navigation = m_navigationState.m_navigations.get(navigationID).get();
     418    ASSERT(navigation);
    419419
    420420    [navigationDelegate webView:m_navigationState.m_webView didStartProvisionalNavigation:navigation];
     
    433433        return;
    434434
    435     // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
    436     WKNavigation *navigation = nil;
    437     if (navigationID)
    438         navigation = m_navigationState.m_navigations.get(navigationID).get();
     435    ASSERT(navigationID);
     436    WKNavigation *navigation = m_navigationState.m_navigations.get(navigationID).get();
     437    ASSERT(navigation);
    439438
    440439    [navigationDelegate webView:m_navigationState.m_webView didReceiveServerRedirectForProvisionalNavigation:navigation];
     
    469468    }
    470469
    471     // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
    472     RetainPtr<WKNavigation> navigation;
    473     if (navigationID)
    474         navigation = m_navigationState.m_navigations.take(navigationID);
     470    ASSERT(navigationID);
     471    RetainPtr<WKNavigation> navigation = m_navigationState.m_navigations.take(navigationID).get();
     472    ASSERT(navigation);
    475473
    476474    // FIXME: Set the error on the navigation object.
     
    499497        return;
    500498
    501     // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
    502     WKNavigation *navigation = nil;
    503     if (navigationID)
    504         navigation = m_navigationState.m_navigations.get(navigationID).get();
     499    ASSERT(navigationID);
     500    WKNavigation *navigation = m_navigationState.m_navigations.get(navigationID).get();
     501    ASSERT(navigation);
    505502
    506503    [navigationDelegate webView:m_navigationState.m_webView didCommitNavigation:navigation];
     
    519516        return;
    520517
    521     WKNavigation *navigation = nil;
    522     if (navigationID)
    523         navigation = m_navigationState.m_navigations.get(navigationID).get();
     518    ASSERT(navigationID);
     519    WKNavigation *navigation = m_navigationState.m_navigations.get(navigationID).get();
     520    ASSERT(navigation);
    524521
    525522    [static_cast<id <WKNavigationDelegatePrivate>>(navigationDelegate.get()) _webView:m_navigationState.m_webView navigationDidFinishDocumentLoad:navigation];
     
    538535        return;
    539536
    540     // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
    541     WKNavigation *navigation = nil;
    542     if (navigationID)
    543         navigation = m_navigationState.m_navigations.get(navigationID).get();
     537    ASSERT(navigationID);
     538    WKNavigation *navigation = m_navigationState.m_navigations.get(navigationID).get();
     539    ASSERT(navigation);
    544540
    545541    [navigationDelegate webView:m_navigationState.m_webView didFinishNavigation:navigation];
     
    558554        return;
    559555
    560     // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
    561     WKNavigation *navigation = nil;
    562     if (navigationID)
    563         navigation = m_navigationState.m_navigations.get(navigationID).get();
     556    ASSERT(navigationID);
     557    WKNavigation *navigation = m_navigationState.m_navigations.get(navigationID).get();
     558    ASSERT(navigation);
    564559
    565560    auto errorWithRecoveryAttempter = createErrorWithRecoveryAttempter(m_navigationState.m_webView, *webFrameProxy, error);
    566561    [navigationDelegate webView:m_navigationState.m_webView didFailNavigation:navigation withError:errorWithRecoveryAttempter.get()];
     562}
     563
     564void NavigationState::LoaderClient::didDestroyNavigation(WebPageProxy*, uint64_t navigationID)
     565{
     566    m_navigationState.m_navigations.remove(navigationID);
    567567}
    568568
     
    667667void NavigationState::LoaderClient::processDidCrash(WebKit::WebPageProxy*)
    668668{
     669    m_navigationState.m_navigations.clear();
     670
    669671    if (!m_navigationState.m_navigationDelegateMethods.webViewWebProcessDidCrash)
    670672        return;
  • trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.cpp

    r95901 r170660  
    3434    : m_frame(frame)
    3535    , m_listenerID(listenerID)
     36    , m_navigationID(0)
    3637{
    3738}
     
    5152        return;
    5253
    53     m_frame->receivedPolicyDecision(action, m_listenerID);
     54    m_frame->receivedPolicyDecision(action, m_listenerID, m_navigationID);
    5455    m_frame = 0;
    5556}
  • trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.h

    r159163 r170660  
    4343    uint64_t listenerID() const { return m_listenerID; }
    4444
     45    uint64_t navigationID() const { return m_navigationID; }
     46    void setNavigationID(uint64_t navigationID) { m_navigationID = navigationID; }
     47
    4548protected:
    4649    WebFrameListenerProxy(WebFrameProxy*, uint64_t listenerID);
     
    5154    RefPtr<WebFrameProxy> m_frame;
    5255    uint64_t m_listenerID;
     56    uint64_t m_navigationID;
    5357};
    5458
  • trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp

    r170000 r170660  
    170170}
    171171
    172 void WebFrameProxy::receivedPolicyDecision(WebCore::PolicyAction action, uint64_t listenerID)
     172void WebFrameProxy::receivedPolicyDecision(WebCore::PolicyAction action, uint64_t listenerID, uint64_t navigationID)
    173173{
    174174    if (!m_page)
     
    177177    ASSERT(m_activeListener);
    178178    ASSERT(m_activeListener->listenerID() == listenerID);
    179     m_page->receivedPolicyDecision(action, this, listenerID);
     179    m_page->receivedPolicyDecision(action, this, listenerID, navigationID);
    180180}
    181181
  • trunk/Source/WebKit2/UIProcess/WebFrameProxy.h

    r170000 r170660  
    110110
    111111    // Policy operations.
    112     void receivedPolicyDecision(WebCore::PolicyAction, uint64_t listenerID);
     112    void receivedPolicyDecision(WebCore::PolicyAction, uint64_t listenerID, uint64_t navigationID = 0);
    113113    WebFramePolicyListenerProxy* setUpPolicyListenerProxy(uint64_t listenerID);
    114114    WebFormSubmissionListenerProxy* setUpFormSubmissionListenerProxy(uint64_t listenerID);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r170644 r170660  
    17091709}
    17101710
    1711 void WebPageProxy::receivedPolicyDecision(PolicyAction action, WebFrameProxy* frame, uint64_t listenerID)
     1711void WebPageProxy::receivedPolicyDecision(PolicyAction action, WebFrameProxy* frame, uint64_t listenerID, uint64_t navigationID)
    17121712{
    17131713    if (!isValid())
     
    17451745    }
    17461746   
    1747     m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame->frameID(), listenerID, action, downloadID), m_pageID);
     1747    m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame->frameID(), listenerID, action, navigationID, downloadID), m_pageID);
    17481748}
    17491749
     
    18411841}
    18421842
    1843 void WebPageProxy::restoreFromSessionStateData(API::Data*)
     1843uint64_t WebPageProxy::restoreFromSessionStateData(API::Data*)
    18441844{
    18451845    // FIXME: Restore the Page from the passed in session state data.
    1846 }
    1847 #endif
    1848 
    1849 void WebPageProxy::restoreFromState(SessionState sessionState)
     1846    return 0;
     1847}
     1848#endif
     1849
     1850uint64_t WebPageProxy::restoreFromState(SessionState sessionState)
    18501851{
    18511852    m_backForwardList->restoreFromState(std::move(sessionState.backForwardListState));
     
    18561857    // FIXME: Navigating should be separate from state restoration.
    18571858
    1858     if (!sessionState.provisionalURL.isNull()) {
    1859         loadRequest(sessionState.provisionalURL);
    1860         return;
    1861     }
     1859    if (!sessionState.provisionalURL.isNull())
     1860        return loadRequest(sessionState.provisionalURL);
    18621861
    18631862    if (WebBackForwardListItem* item = m_backForwardList->currentItem())
    1864         goToBackForwardItem(item);
     1863        return goToBackForwardItem(item);
     1864
     1865    return 0;
    18651866}
    18661867
     
    24272428    m_pageLoadState.commitChanges();
    24282429    m_loaderClient->didFinishProgress(this);
     2430}
     2431
     2432void WebPageProxy::didDestroyNavigation(uint64_t navigationID)
     2433{
     2434    m_loaderClient->didDestroyNavigation(this, navigationID);
    24292435}
    24302436
     
    27732779}
    27742780
    2775 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, IPC::MessageDecoder& decoder, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID)
     2781void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, uint64_t navigationID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, IPC::MessageDecoder& decoder, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, uint64_t& downloadID)
    27762782{
    27772783    RefPtr<API::Object> userData;
     
    27932799   
    27942800    RefPtr<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
     2801    if (!navigationID && frame->isMainFrame()) {
     2802        newNavigationID = generateNavigationID();
     2803        listener->setNavigationID(newNavigationID);
     2804    }
    27952805
    27962806    ASSERT(!m_inDecidePolicyForNavigationAction);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r170644 r170660  
    552552
    553553    PassRefPtr<API::Data> sessionStateData(std::function<bool (WebBackForwardListItem&)>) const;
    554     void restoreFromSessionStateData(API::Data*);
    555     void restoreFromState(SessionState);
     554    uint64_t restoreFromSessionStateData(API::Data*);
     555    uint64_t restoreFromState(SessionState);
    556556
    557557    bool supportsTextZoom() const;
     
    679679#endif
    680680
    681     void receivedPolicyDecision(WebCore::PolicyAction, WebFrameProxy*, uint64_t listenerID);
     681    void receivedPolicyDecision(WebCore::PolicyAction, WebFrameProxy*, uint64_t listenerID, uint64_t navigationID);
    682682
    683683    void backForwardRemovedItem(uint64_t itemID);
     
    958958    void didChangeProgress(double);
    959959    void didFinishProgress();
    960 
    961     void decidePolicyForNavigationAction(uint64_t frameID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, IPC::MessageDecoder&, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID);
     960    void didDestroyNavigation(uint64_t navigationID);
     961
     962    void decidePolicyForNavigationAction(uint64_t frameID, uint64_t navigationID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, IPC::MessageDecoder&, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, uint64_t& downloadID);
    962963    void decidePolicyForNewWindowAction(uint64_t frameID, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, IPC::MessageDecoder&);
    963964    void decidePolicyForResponse(uint64_t frameID, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, IPC::MessageDecoder&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r170447 r170660  
    111111    # Policy messages
    112112    DecidePolicyForResponseSync(uint64_t frameID, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
    113     DecidePolicyForNavigationAction(uint64_t frameID, WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
     113    DecidePolicyForNavigationAction(uint64_t frameID, uint64_t navigationID, WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t newNavigationID, uint64_t policyAction, uint64_t downloadID) Variadic
    114114    DecidePolicyForNewWindowAction(uint64_t frameID, WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    115115    UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::InjectedBundleUserMessageEncoder userData)  Variadic
     
    141141    DidDetectXSSForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    142142    DidSameDocumentNavigationForFrame(uint64_t frameID, uint32_t type, String url, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
     143    DidDestroyNavigation(uint64_t navigationID)
    143144
    144145    FrameDidBecomeFrameSet(uint64_t frameID, bool value)
  • trunk/Source/WebKit2/UIProcess/cf/WebPageProxyCF.cpp

    r170644 r170660  
    105105}
    106106
    107 void WebPageProxy::restoreFromSessionStateData(API::Data* apiData)
     107uint64_t WebPageProxy::restoreFromSessionStateData(API::Data* apiData)
    108108{
    109109    if (!apiData || apiData->size() < sizeof(UInt32))
    110         return;
     110        return 0;
    111111
    112112    const unsigned char* buffer = apiData->bytes();
     
    115115    if (versionHeader != CurrentSessionStateDataVersion) {
    116116        LOG(SessionState, "Unrecognized version header for session state data - cannot restore");
    117         return;
     117        return 0;
    118118    }
    119119   
     
    125125        CFRelease(propertyListError);
    126126        LOG(SessionState, "Could not read session state property list");
    127         return;
     127        return 0;
    128128    }
    129129
    130130    if (!propertyList)
    131         return;
     131        return 0;
    132132       
    133133    if (CFGetTypeID(propertyList.get()) != CFDictionaryGetTypeID()) {
    134134        LOG(SessionState, "SessionState property list is not a CFDictionaryRef (%i) - its CFTypeID is %i", (int)CFDictionaryGetTypeID(), (int)CFGetTypeID(propertyList.get()));
    135         return;
     135        return 0;
    136136    }
    137137
     
    170170                        m_pageLoadState.setPendingAPIRequestURL(transaction, item->url());
    171171
    172                     process().send(Messages::WebPage::RestoreSessionAndNavigateToCurrentItem(generateNavigationID(), state), m_pageID);
     172                    uint64_t navigationID = generateNavigationID();
     173                    process().send(Messages::WebPage::RestoreSessionAndNavigateToCurrentItem(navigationID, state), m_pageID);
     174                    return navigationID;
    173175                }
    174176            }
     
    177179
    178180    if (provisionalURL)
    179         loadRequest(URL(URL(), provisionalURL));
     181        return loadRequest(URL(URL(), provisionalURL));
     182
     183    return 0;
    180184}
    181185
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r170330 r170660  
    671671    // We call this synchronously because CFNetwork can only convert a loading connection to a download from its didReceiveResponse callback.
    672672    if (receivedPolicyAction)
    673         m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID);
     673        m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID);
    674674}
    675675
     
    730730    uint64_t listenerID = m_frame->setUpPolicyListener(std::move(function));
    731731    bool receivedPolicyAction;
     732    uint64_t newNavigationID;
    732733    uint64_t policyAction;
    733734    uint64_t downloadID;
     
    761762    navigationActionData.canHandleRequest = webPage->canHandleRequest(request);
    762763
     764    WebCore::Frame* coreFrame = m_frame->coreFrame();
     765    WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().policyDocumentLoader());
     766    if (!documentLoader)
     767        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().documentLoader());
     768
    763769    // Notify the UIProcess.
    764     if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, navigationAction.resourceRequest(), request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, policyAction, downloadID)))
     770    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, navigationAction.resourceRequest(), request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, newNavigationID, policyAction, downloadID)))
    765771        return;
    766772
    767773    // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply.
    768774    if (receivedPolicyAction)
    769         m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID);
     775        m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID);
    770776}
    771777
  • trunk/Source/WebKit2/WebProcess/WebPage/WebDocumentLoader.cpp

    r162981 r170660  
    2727#include "WebDocumentLoader.h"
    2828
     29#include "WebFrame.h"
     30
    2931using namespace WebCore;
    3032
     
    3537    , m_navigationID(0)
    3638{
     39}
     40
     41void WebDocumentLoader::detachFromFrame()
     42{
     43    if (m_navigationID)
     44        WebFrame::fromCoreFrame(*frame())->documentLoaderDetached(m_navigationID);
     45
     46    m_navigationID = 0;
     47
     48    DocumentLoader::detachFromFrame();
    3749}
    3850
  • trunk/Source/WebKit2/WebProcess/WebPage/WebDocumentLoader.h

    r162981 r170660  
    4444    WebDocumentLoader(const WebCore::ResourceRequest&, const WebCore::SubstituteData&);
    4545
     46    virtual void detachFromFrame() override;
     47
    4648    uint64_t m_navigationID;
    4749};
  • trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp

    r170650 r170660  
    3737#include "WKBundleAPICast.h"
    3838#include "WebChromeClient.h"
     39#include "WebDocumentLoader.h"
    3940#include "WebPage.h"
    4041#include "WebPageProxyMessages.h"
     
    216217}
    217218
    218 void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t downloadID)
     219void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, uint64_t downloadID)
    219220{
    220221    if (!m_coreFrame)
     
    234235
    235236    m_policyDownloadID = downloadID;
     237    if (navigationID) {
     238        WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_coreFrame->loader().policyDocumentLoader());
     239        documentLoader.setNavigationID(navigationID);
     240    }
     241
    236242    function(action);
    237243}
     
    752758}
    753759
     760void WebFrame::documentLoaderDetached(uint64_t navigationID)
     761{
     762    page()->send(Messages::WebPageProxy::DidDestroyNavigation(navigationID));
     763}
     764
    754765#if PLATFORM(COCOA)
    755766RetainPtr<CFDataRef> WebFrame::webArchiveData(FrameFilterFunction callback, void* context)
  • trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.h

    r170650 r170660  
    7878    uint64_t setUpPolicyListener(WebCore::FramePolicyFunction);
    7979    void invalidatePolicyListener();
    80     void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t downloadID);
     80    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, uint64_t downloadID);
    8181
    8282    void startDownload(const WebCore::ResourceRequest&);
     
    132132    void setTextDirection(const String&);
    133133
     134    void documentLoaderDetached(uint64_t navigationID);
     135
    134136    // Simple listener class used by plug-ins to know when frames finish or fail loading.
    135137    class LoadListener {
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r170641 r170660  
    22552255}
    22562256
    2257 void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t downloadID)
     2257void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, uint64_t downloadID)
    22582258{
    22592259    WebFrame* frame = WebProcess::shared().webFrame(frameID);
    22602260    if (!frame)
    22612261        return;
    2262     frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID);
     2262    frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID);
    22632263}
    22642264
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r170652 r170660  
    960960    void updatePreferences(const WebPreferencesStore&);
    961961
    962     void didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t downloadID);
     962    void didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, uint64_t downloadID);
    963963    void setUserAgent(const String&);
    964964    void setCustomTextEncodingName(const String&);
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r170447 r170660  
    135135    DidRemoveBackForwardItem(uint64_t backForwardItemID)
    136136
    137     DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t downloadID)
     137    DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, uint64_t downloadID)
    138138
    139139    ClearSelection()
Note: See TracChangeset for help on using the changeset viewer.