⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 242697 in webkit


Ignore:
Timestamp:
Mar 10, 2019, 8:41:13 PM (7 years ago)
Author:
jiewen_tan@apple.com
Message:

Optimizing loads when creating new pages
https://bugs.webkit.org/show_bug.cgi?id=195516
<rdar://problem/48738086>

Reviewed by Darin Adler.

This patch adds hooks in WebPageProxy::createNewPage to optimize loads, and moves the creationParameters
of API::NavigationAction from UI clients to WebPageProxy::createNewPage. Also, we now pass the whole
API::NavigationAction to the load optimizer instead of the request within.

  • UIProcess/API/APINavigationAction.h:
  • UIProcess/API/APIUIClient.h:

(API::UIClient::createNewPage):

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageUIClient):

  • UIProcess/API/glib/WebKitUIClient.cpp:
  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::tryOptimizingLoad):
(WebKit::tryInterceptNavigation):
(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):

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

(WebKit::UIDelegate::UIClient::createNewPage):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::tryOptimizingLoad):
(WebKit::WebPageProxy::createNewPage):

  • UIProcess/WebPageProxy.h:
Location:
trunk/Source/WebKit
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r242696 r242697  
     12019-03-10  Jiewen Tan  <jiewen_tan@apple.com>
     2
     3        Optimizing loads when creating new pages
     4        https://bugs.webkit.org/show_bug.cgi?id=195516
     5        <rdar://problem/48738086>
     6
     7        Reviewed by Darin Adler.
     8
     9        This patch adds hooks in WebPageProxy::createNewPage to optimize loads, and moves the creationParameters
     10        of API::NavigationAction from UI clients to WebPageProxy::createNewPage. Also, we now pass the whole
     11        API::NavigationAction to the load optimizer instead of the request within.
     12
     13        * UIProcess/API/APINavigationAction.h:
     14        * UIProcess/API/APIUIClient.h:
     15        (API::UIClient::createNewPage):
     16        * UIProcess/API/C/WKPage.cpp:
     17        (WKPageSetPageUIClient):
     18        * UIProcess/API/glib/WebKitUIClient.cpp:
     19        * UIProcess/Cocoa/NavigationState.mm:
     20        (WebKit::tryOptimizingLoad):
     21        (WebKit::tryInterceptNavigation):
     22        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
     23        * UIProcess/Cocoa/UIDelegate.h:
     24        * UIProcess/Cocoa/UIDelegate.mm:
     25        (WebKit::UIDelegate::UIClient::createNewPage):
     26        * UIProcess/WebPageProxy.cpp:
     27        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     28        (WebKit::tryOptimizingLoad):
     29        (WebKit::WebPageProxy::createNewPage):
     30        * UIProcess/WebPageProxy.h:
     31
    1322019-03-10  Tim Horton  <timothy_horton@apple.com>
    233
  • trunk/Source/WebKit/UIProcess/API/APINavigationAction.h

    r241000 r242697  
    3434#include <wtf/URL.h>
    3535
     36#if USE(APPLE_INTERNAL_SDK)
     37#include <WebKitAdditions/APINavigationActionAdditions.h>
     38#endif
     39
    3640namespace API {
    3741
     
    6670    Navigation* mainFrameNavigation() const { return m_mainFrameNavigation.get(); }
    6771
     72#if HAVE(LOAD_OPTIMIZER)
     73APINAVIGATIONACTION_LOADOPTIMIZER_ADDITIONS_1
     74#endif
     75
    6876private:
    6977    NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, Optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WTF::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction, API::Navigation* mainFrameNavigation)
     
    93101
    94102    bool m_shouldOpenAppLinks;
     103#if HAVE(LOAD_OPTIMIZER)
     104APINAVIGATIONACTION_LOADOPTIMIZER_ADDITIONS_2
     105#endif
    95106
    96107    RefPtr<UserInitiatedAction> m_userInitiatedAction;
  • trunk/Source/WebKit/UIProcess/API/APIUIClient.h

    r242664 r242697  
    7474    virtual ~UIClient() { }
    7575
    76     virtual void createNewPage(WebKit::WebPageProxy&, Ref<FrameInfo>&&, WebCore::ResourceRequest&&, WebCore::WindowFeatures&&, WebKit::NavigationActionData&&, CompletionHandler<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler) { completionHandler(nullptr); }
     76    virtual void createNewPage(WebKit::WebPageProxy&, WebCore::WindowFeatures&&, Ref<API::NavigationAction>&&, CompletionHandler<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler) { completionHandler(nullptr); }
    7777    virtual void showPage(WebKit::WebPageProxy*) { }
    7878    virtual void fullscreenMayReturnToInline(WebKit::WebPageProxy*) { }
  • trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp

    r242664 r242697  
    14751475
    14761476    private:
    1477         void createNewPage(WebPageProxy& page, Ref<API::FrameInfo>&& sourceFrameInfo, WebCore::ResourceRequest&& resourceRequest, WebCore::WindowFeatures&& windowFeatures, NavigationActionData&& navigationActionData, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler) final
     1477        void createNewPage(WebPageProxy& page, WebCore::WindowFeatures&& windowFeatures, Ref<API::NavigationAction>&& navigationAction, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler) final
    14781478        {
    14791479            if (m_client.createNewPage) {
     
    14811481                configuration->setRelatedPage(&page);
    14821482
    1483                 auto userInitiatedActivity = page.process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    1484                 bool shouldOpenAppLinks = !hostsAreEqual(sourceFrameInfo->request().url(), resourceRequest.url());
    1485                 auto apiNavigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.ptr(), nullptr, WTF::nullopt, WTFMove(resourceRequest), URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
    1486 
    14871483                auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures);
    14881484
    1489                 return completionHandler(adoptRef(toImpl(m_client.createNewPage(toAPI(&page), toAPI(configuration.ptr()), toAPI(apiNavigationAction.ptr()), toAPI(apiWindowFeatures.ptr()), m_client.base.clientInfo))));
     1485                return completionHandler(adoptRef(toImpl(m_client.createNewPage(toAPI(&page), toAPI(configuration.ptr()), toAPI(navigationAction.ptr()), toAPI(apiWindowFeatures.ptr()), m_client.base.clientInfo))));
    14901486            }
    14911487       
     
    15111507
    15121508                if (m_client.createNewPage_deprecatedForUseWithV1) {
    1513                     Ref<API::URLRequest> request = API::URLRequest::create(resourceRequest);
    1514                     return completionHandler(adoptRef(toImpl(m_client.createNewPage_deprecatedForUseWithV1(toAPI(&page), toAPI(request.ptr()), toAPI(featuresMap.ptr()), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), m_client.base.clientInfo))));
     1509                    Ref<API::URLRequest> request = API::URLRequest::create(navigationAction->request());
     1510                    return completionHandler(adoptRef(toImpl(m_client.createNewPage_deprecatedForUseWithV1(toAPI(&page), toAPI(request.ptr()), toAPI(featuresMap.ptr()), toAPI(navigationAction->modifiers()), toAPI(navigationAction->mouseButton()), m_client.base.clientInfo))));
    15151511                }
    15161512   
    15171513                ASSERT(m_client.createNewPage_deprecatedForUseWithV0);
    1518                 return completionHandler(adoptRef(toImpl(m_client.createNewPage_deprecatedForUseWithV0(toAPI(&page), toAPI(featuresMap.ptr()), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), m_client.base.clientInfo))));
     1514                return completionHandler(adoptRef(toImpl(m_client.createNewPage_deprecatedForUseWithV0(toAPI(&page), toAPI(featuresMap.ptr()), toAPI(navigationAction->modifiers()), toAPI(navigationAction->mouseButton()), m_client.base.clientInfo))));
    15191515            }
    15201516
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp

    r241000 r242697  
    5151
    5252private:
    53     void createNewPage(WebPageProxy& page, Ref<API::FrameInfo>&& frameInfo, WebCore::ResourceRequest&& resourceRequest, WebCore::WindowFeatures&& windowFeatures, NavigationActionData&& navigationActionData, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler) final
    54     {
    55         auto userInitiatedActivity = page.process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    56         WebKitNavigationAction navigationAction(API::NavigationAction::create(WTFMove(navigationActionData), frameInfo.ptr(), nullptr, WTF::nullopt, WTFMove(resourceRequest), URL { }, false, WTFMove(userInitiatedActivity)));
     53    void createNewPage(WebPageProxy& page, WebCore::WindowFeatures&& windowFeatures, Ref<API::NavigationAction>&& apiNavigationAction, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler) final
     54    {
     55        WebKitNavigationAction navigationAction(WTFMove(apiNavigationAction));
    5756        completionHandler(webkitWebViewCreateNewPage(m_webView, windowFeatures, &navigationAction));
    5857    }
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm

    r242339 r242697  
    468468
    469469#if !USE(APPLE_INTERNAL_SDK)
    470 static void tryOptimizingLoad(const WebCore::ResourceRequest&, WebPageProxy&, Function<void(bool)>&& completionHandler)
     470static void tryOptimizingLoad(Ref<API::NavigationAction>&&, WebPageProxy&, Function<void(bool)>&& completionHandler)
    471471{
    472472    completionHandler(false);
     
    478478#if HAVE(APP_LINKS)
    479479    if (navigationAction->shouldOpenAppLinks()) {
    480         auto* localCompletionHandler = new WTF::Function<void (bool)>([request = navigationAction->request().isolatedCopy(), weakPage = makeWeakPtr(page), completionHandler = WTFMove(completionHandler)] (bool success) mutable {
     480        auto url = navigationAction->request().url();
     481        auto* localCompletionHandler = new WTF::Function<void (bool)>([navigationAction = WTFMove(navigationAction), weakPage = makeWeakPtr(page), completionHandler = WTFMove(completionHandler)] (bool success) mutable {
    481482            ASSERT(RunLoop::isMain());
    482483            if (!success && weakPage) {
    483                 tryOptimizingLoad(request, *weakPage, WTFMove(completionHandler));
     484                tryOptimizingLoad(WTFMove(navigationAction), *weakPage, WTFMove(completionHandler));
    484485                return;
    485486            }
    486487            completionHandler(success);
    487488        });
    488         [LSAppLink openWithURL:navigationAction->request().url() completionHandler:[localCompletionHandler](BOOL success, NSError *) {
     489        [LSAppLink openWithURL:url completionHandler:[localCompletionHandler](BOOL success, NSError *) {
    489490            dispatch_async(dispatch_get_main_queue(), [localCompletionHandler, success] {
    490491                (*localCompletionHandler)(success);
     
    496497#endif
    497498
    498     tryOptimizingLoad(navigationAction->request(), page, WTFMove(completionHandler));
     499    tryOptimizingLoad(WTFMove(navigationAction), page, WTFMove(completionHandler));
    499500}
    500501
     
    588589            break;
    589590        case _WKNavigationActionPolicyAllowWithoutTryingAppLink:
    590             tryOptimizingLoad(navigationAction->request(), webPageProxy, [localListener = WTFMove(localListener), websitePolicies = WTFMove(apiWebsitePolicies)] (bool optimizedLoad) {
     591            tryOptimizingLoad(WTFMove(navigationAction), webPageProxy, [localListener = WTFMove(localListener), websitePolicies = WTFMove(apiWebsitePolicies)] (bool optimizedLoad) {
    591592                if (optimizedLoad) {
    592593                    localListener->ignore();
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h

    r242664 r242697  
    8080    private:
    8181        // API::UIClient
    82         void createNewPage(WebPageProxy&, Ref<API::FrameInfo>&&, WebCore::ResourceRequest&&, WebCore::WindowFeatures&&, NavigationActionData&&, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&&) final;
     82        void createNewPage(WebKit::WebPageProxy&, WebCore::WindowFeatures&&, Ref<API::NavigationAction>&&, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&&) final;
    8383        void close(WebPageProxy*) final;
    8484        void fullscreenMayReturnToInline(WebPageProxy*) final;
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm

    r242664 r242697  
    229229}
    230230
    231 void UIDelegate::UIClient::createNewPage(WebPageProxy& page, Ref<API::FrameInfo>&& sourceFrameInfo, WebCore::ResourceRequest&& request, WebCore::WindowFeatures&& windowFeatures, NavigationActionData&& navigationActionData, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler)
     231void UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy&, WebCore::WindowFeatures&& windowFeatures, Ref<API::NavigationAction>&& navigationAction, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler)
    232232{
    233233    auto delegate = m_uiDelegate.m_delegate.get();
     
    237237    [configuration _setRelatedWebView:m_uiDelegate.m_webView];
    238238
    239     auto userInitiatedActivity = page.process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    240     bool shouldOpenAppLinks = !hostsAreEqual(sourceFrameInfo->request().url(), request.url());
    241     auto apiNavigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.ptr(), nullptr, WTF::nullopt, WTFMove(request), URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
    242 
    243239    auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures);
    244240
     
    246242        auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:completionHandler:));
    247243
    248         [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:wrapper(apiNavigationAction) windowFeatures:wrapper(apiWindowFeatures) completionHandler:makeBlockPtr([completionHandler = WTFMove(completionHandler), checker = WTFMove(checker), relatedWebView = RetainPtr<WKWebView>(m_uiDelegate.m_webView)] (WKWebView *webView) mutable {
     244        [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:wrapper(navigationAction) windowFeatures:wrapper(apiWindowFeatures) completionHandler:makeBlockPtr([completionHandler = WTFMove(completionHandler), checker = WTFMove(checker), relatedWebView = RetainPtr<WKWebView>(m_uiDelegate.m_webView)] (WKWebView *webView) mutable {
    249245            if (checker->completionHandlerHasBeenCalled())
    250246                return;
     
    266262        return completionHandler(nullptr);
    267263
    268     RetainPtr<WKWebView> webView = [delegate webView:m_uiDelegate.m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:wrapper(apiNavigationAction) windowFeatures:wrapper(apiWindowFeatures)];
     264    RetainPtr<WKWebView> webView = [delegate webView:m_uiDelegate.m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:wrapper(navigationAction) windowFeatures:wrapper(apiWindowFeatures)];
    269265    if (!webView)
    270266        return completionHandler(nullptr);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r242696 r242697  
    46034603        auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), destinationFrameInfo.ptr(), WTF::nullopt, WTFMove(request), originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity), mainFrameNavigation);
    46044604
     4605#if HAVE(LOAD_OPTIMIZER)
     4606WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_3
     4607#endif
     4608
    46054609        m_navigationClient->decidePolicyForNavigationAction(*this, WTFMove(navigationAction), WTFMove(listener), process->transformHandlesToObjects(userData.object()).get());
    46064610    }
    46074611
    46084612    m_shouldSuppressAppLinksInNextNavigationPolicyDecision = false;
     4613
     4614#if HAVE(LOAD_OPTIMIZER)
     4615WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_4
     4616#endif
    46094617}
    46104618
     
    48924900// UIClient
    48934901
     4902using NewPageCallback = CompletionHandler<void(RefPtr<WebPageProxy>&&)>;
     4903using UIClientCallback = Function<void(Ref<API::NavigationAction>&&, NewPageCallback&&)>;
     4904static void tryOptimizingLoad(Ref<API::NavigationAction>&& navigationAction, WebPageProxy& page, NewPageCallback&& newPageCallback, UIClientCallback&& uiClientCallback)
     4905{
     4906#if HAVE(LOAD_OPTIMIZER)
     4907WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_6
     4908#else
     4909    ASSERT_UNUSED(page, page.pageID());
     4910    uiClientCallback(WTFMove(navigationAction), WTFMove(newPageCallback));
     4911#endif
     4912}
     4913
    48944914void WebPageProxy::createNewPage(const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, ResourceRequest&& request, WindowFeatures&& windowFeatures, NavigationActionData&& navigationActionData, Messages::WebPageProxy::CreateNewPage::DelayedReply&& reply)
    48954915{
    48964916    MESSAGE_CHECK(m_process, m_process->webFrame(originatingFrameInfoData.frameID));
    48974917    auto originatingFrameInfo = API::FrameInfo::create(originatingFrameInfoData, m_process->webPage(originatingPageID));
    4898 
    48994918    auto mainFrameURL = m_mainFrame->url();
    4900 
    4901     m_uiClient->createNewPage(*this, WTFMove(originatingFrameInfo), WTFMove(request), WTFMove(windowFeatures), WTFMove(navigationActionData), [this, protectedThis = makeRef(*this), mainFrameURL, request, reply = WTFMove(reply)] (RefPtr<WebPageProxy> newPage) mutable {
     4919    auto completionHandler = [this, protectedThis = makeRef(*this), mainFrameURL, request, reply = WTFMove(reply)] (RefPtr<WebPageProxy> newPage) mutable {
    49024920        if (!newPage) {
    49034921            reply(0, WTF::nullopt);
     
    49114929        WebsiteDataStore::cloneSessionData(*this, *newPage);
    49124930        newPage->m_shouldSuppressAppLinksInNextNavigationPolicyDecision = hostsAreEqual(URL({ }, mainFrameURL), request.url());
     4931
     4932#if HAVE(LOAD_OPTIMIZER)
     4933WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_5
     4934#endif
     4935    };
     4936
     4937    auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
     4938    bool shouldOpenAppLinks = !hostsAreEqual(originatingFrameInfo->request().url(), request.url());
     4939    auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), originatingFrameInfo.ptr(), nullptr, WTF::nullopt, WTFMove(request), URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
     4940
     4941    tryOptimizingLoad(WTFMove(navigationAction), *this, WTFMove(completionHandler), [this, protectedThis = makeRef(*this), windowFeatures = WTFMove(windowFeatures)] (Ref<API::NavigationAction>&& navigationAction, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler) mutable {
     4942        m_uiClient->createNewPage(*this, WTFMove(windowFeatures), WTFMove(navigationAction), WTFMove(completionHandler));
    49134943    });
    49144944}
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r242696 r242697  
    136136#endif
    137137
     138#if USE(APPLE_INTERNAL_SDK)
     139#include <WebKitAdditions/WebPageProxyAdditions.h>
     140#endif
     141
    138142#if ENABLE(MEDIA_SESSION)
    139143namespace WebCore {
     
    14811485    void webViewDidMoveToWindow();
    14821486
     1487#if HAVE(LOAD_OPTIMIZER)
     1488WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_1
     1489#endif
     1490
    14831491    // IPC::MessageReceiver
    14841492    // Implemented in generated WebPageProxyMessageReceiver.cpp
     
    21882196    bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false };
    21892197
     2198#if HAVE(LOAD_OPTIMIZER)
     2199WEBPAGEPROXY_LOADOPTIMIZER_ADDITIONS_2
     2200#endif
     2201
    21902202    Deque<NativeWebMouseEvent> m_mouseEventQueue;
    21912203    Deque<NativeWebKeyboardEvent> m_keyEventQueue;
Note: See TracChangeset for help on using the changeset viewer.