Title: [239223] trunk
Revision
239223
Author
cdu...@apple.com
Date
2018-12-14 11:29:41 -0800 (Fri, 14 Dec 2018)

Log Message

[PSON] Process-swapping on a loadHTMLString causes duplicate decidePolicyForNavigationAction delegate calls
https://bugs.webkit.org/show_bug.cgi?id=192704

Reviewed by Geoffrey Garen.

Source/WebKit:

Process-swapping on a loadHTMLString causes duplicate decidePolicyForNavigationAction delegate calls. This
is because we were failing to pass the ShouldTreatAsContinuingLoad flag to the WebContent process when
doing a LoadData.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::loadData):
(WebKit::WebPageProxy::loadDataWithNavigation):
(WebKit::WebPageProxy::continueNavigationInNewProcess):
* UIProcess/WebPageProxy.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::loadDataImpl):
(WebKit::WebPage::loadData):
(WebKit::WebPage::loadAlternateHTML):
* WebProcess/WebPage/WebPage.h:

Tools:

Extend existing API test to reproduce the problem.

* TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (239222 => 239223)


--- trunk/Source/WebKit/ChangeLog	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Source/WebKit/ChangeLog	2018-12-14 19:29:41 UTC (rev 239223)
@@ -1,3 +1,25 @@
+2018-12-14  Chris Dumez  <cdu...@apple.com>
+
+        [PSON] Process-swapping on a loadHTMLString causes duplicate decidePolicyForNavigationAction delegate calls
+        https://bugs.webkit.org/show_bug.cgi?id=192704
+
+        Reviewed by Geoffrey Garen.
+
+        Process-swapping on a loadHTMLString causes duplicate decidePolicyForNavigationAction delegate calls. This
+        is because we were failing to pass the ShouldTreatAsContinuingLoad flag to the WebContent process when
+        doing a LoadData.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::loadData):
+        (WebKit::WebPageProxy::loadDataWithNavigation):
+        (WebKit::WebPageProxy::continueNavigationInNewProcess):
+        * UIProcess/WebPageProxy.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::loadDataImpl):
+        (WebKit::WebPage::loadData):
+        (WebKit::WebPage::loadAlternateHTML):
+        * WebProcess/WebPage/WebPage.h:
+
 2018-12-14  Joseph Pecoraro  <pecor...@apple.com>
 
         Web Inspector: Prefer "about:blank" instead of an empty string for WebPageDebuggable url

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (239222 => 239223)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2018-12-14 19:29:41 UTC (rev 239223)
@@ -1130,11 +1130,11 @@
         return nullptr;
 
     auto navigation = m_navigationState->createLoadDataNavigation(std::make_unique<API::SubstituteData>(data.vector(), MIMEType, encoding, baseURL, userData));
-    loadDataWithNavigation(navigation, data, MIMEType, encoding, baseURL, userData);
+    loadDataWithNavigation(navigation, data, MIMEType, encoding, baseURL, userData, ShouldTreatAsContinuingLoad::No);
     return WTFMove(navigation);
 }
 
-void WebPageProxy::loadDataWithNavigation(API::Navigation& navigation, const IPC::DataReference& data, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, std::optional<WebsitePoliciesData>&& websitePolicies)
+void WebPageProxy::loadDataWithNavigation(API::Navigation& navigation, const IPC::DataReference& data, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& websitePolicies)
 {
     ASSERT(!m_isClosed);
 
@@ -1151,6 +1151,7 @@
     loadParameters.MIMEType = MIMEType;
     loadParameters.encodingName = encoding;
     loadParameters.baseURLString = baseURL;
+    loadParameters.shouldTreatAsContinuingLoad = shouldTreatAsContinuingLoad == ShouldTreatAsContinuingLoad::Yes;
     loadParameters.userData = UserData(process().transformObjectsToHandles(userData).get());
     loadParameters.websitePolicies = WTFMove(websitePolicies);
     addPlatformLoadParameters(loadParameters);
@@ -2727,7 +2728,7 @@
     // FIXME: Work out timing of responding with the last policy delegate, etc
     ASSERT(!navigation.currentRequest().isEmpty());
     if (auto& substituteData = navigation.substituteData())
-        loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), WTFMove(websitePolicies));
+        loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
     else
         loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (239222 => 239223)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2018-12-14 19:29:41 UTC (rev 239223)
@@ -1576,7 +1576,7 @@
     RefPtr<API::Navigation> reattachToWebProcessForReload();
     RefPtr<API::Navigation> reattachToWebProcessWithItem(WebBackForwardListItem&);
 
-    void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData = nullptr, std::optional<WebsitePoliciesData>&& = std::nullopt);
+    void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& = std::nullopt);
     void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& = std::nullopt);
 
     void requestNotificationPermission(uint64_t notificationID, const String& originString);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (239222 => 239223)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2018-12-14 19:29:41 UTC (rev 239223)
@@ -1379,7 +1379,7 @@
     ASSERT(!m_pendingWebsitePolicies);
 }
 
-void WebPage::loadDataImpl(uint64_t navigationID, std::optional<WebsitePoliciesData>&& websitePolicies, Ref<SharedBuffer>&& sharedBuffer, const String& MIMEType, const String& encodingName, const URL& baseURL, const URL& unreachableURL, const UserData& userData)
+void WebPage::loadDataImpl(uint64_t navigationID, bool shouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& websitePolicies, Ref<SharedBuffer>&& sharedBuffer, const String& MIMEType, const String& encodingName, const URL& baseURL, const URL& unreachableURL, const UserData& userData)
 {
     SendStopResponsivenessTimer stopper;
 
@@ -1395,7 +1395,9 @@
     m_loaderClient->willLoadDataRequest(*this, request, const_cast<SharedBuffer*>(substituteData.content()), substituteData.mimeType(), substituteData.textEncoding(), substituteData.failingURL(), WebProcess::singleton().transformHandlesToObjects(userData.object()).get());
 
     // Initate the load in WebCore.
-    m_mainFrame->coreFrame()->loader().load(FrameLoadRequest(*m_mainFrame->coreFrame(), request, ShouldOpenExternalURLsPolicy::ShouldNotAllow, substituteData));
+    FrameLoadRequest frameLoadRequest(*m_mainFrame->coreFrame(), request, ShouldOpenExternalURLsPolicy::ShouldNotAllow, substituteData);
+    frameLoadRequest.setShouldTreatAsContinuingLoad(shouldTreatAsContinuingLoad);
+    m_mainFrame->coreFrame()->loader().load(WTFMove(frameLoadRequest));
 }
 
 void WebPage::loadData(LoadParameters&& loadParameters)
@@ -1404,7 +1406,7 @@
 
     auto sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(loadParameters.data.data()), loadParameters.data.size());
     URL baseURL = loadParameters.baseURLString.isEmpty() ? WTF::blankURL() : URL(URL(), loadParameters.baseURLString);
-    loadDataImpl(loadParameters.navigationID, WTFMove(loadParameters.websitePolicies), WTFMove(sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, URL(), loadParameters.userData);
+    loadDataImpl(loadParameters.navigationID, loadParameters.shouldTreatAsContinuingLoad, WTFMove(loadParameters.websitePolicies), WTFMove(sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, URL(), loadParameters.userData);
 }
 
 void WebPage::loadAlternateHTML(LoadParameters&& loadParameters)
@@ -1416,7 +1418,7 @@
     URL provisionalLoadErrorURL = loadParameters.provisionalLoadErrorURLString.isEmpty() ? URL() : URL(URL(), loadParameters.provisionalLoadErrorURLString);
     auto sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(loadParameters.data.data()), loadParameters.data.size());
     m_mainFrame->coreFrame()->loader().setProvisionalLoadErrorBeingHandledURL(provisionalLoadErrorURL);    
-    loadDataImpl(loadParameters.navigationID, WTFMove(loadParameters.websitePolicies), WTFMove(sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, unreachableURL, loadParameters.userData);
+    loadDataImpl(loadParameters.navigationID, loadParameters.shouldTreatAsContinuingLoad, WTFMove(loadParameters.websitePolicies), WTFMove(sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, unreachableURL, loadParameters.userData);
     m_mainFrame->coreFrame()->loader().setProvisionalLoadErrorBeingHandledURL({ });
 }
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (239222 => 239223)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2018-12-14 19:29:41 UTC (rev 239223)
@@ -1196,7 +1196,7 @@
 
     String sourceForFrame(WebFrame*);
 
-    void loadDataImpl(uint64_t navigationID, std::optional<WebsitePoliciesData>&&, Ref<WebCore::SharedBuffer>&&, const String& MIMEType, const String& encodingName, const URL& baseURL, const URL& failingURL, const UserData&);
+    void loadDataImpl(uint64_t navigationID, bool shouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&&, Ref<WebCore::SharedBuffer>&&, const String& MIMEType, const String& encodingName, const URL& baseURL, const URL& failingURL, const UserData&);
 
     // Actions
     void tryClose();

Modified: trunk/Tools/ChangeLog (239222 => 239223)


--- trunk/Tools/ChangeLog	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Tools/ChangeLog	2018-12-14 19:29:41 UTC (rev 239223)
@@ -1,5 +1,16 @@
 2018-12-14  Chris Dumez  <cdu...@apple.com>
 
+        [PSON] Process-swapping on a loadHTMLString causes duplicate decidePolicyForNavigationAction delegate calls
+        https://bugs.webkit.org/show_bug.cgi?id=192704
+
+        Reviewed by Geoffrey Garen.
+
+        Extend existing API test to reproduce the problem.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
+
+2018-12-14  Chris Dumez  <cdu...@apple.com>
+
         [PSON] WebsitePolicies are lost on process-swap
         https://bugs.webkit.org/show_bug.cgi?id=192694
         <rdar://problem/46715748>

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm (239222 => 239223)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm	2018-12-14 19:05:43 UTC (rev 239222)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm	2018-12-14 19:29:41 UTC (rev 239223)
@@ -2997,6 +2997,8 @@
     auto delegate = adoptNS([[PSONNavigationDelegate alloc] init]);
     [webView setNavigationDelegate:delegate.get()];
 
+    numberOfDecidePolicyCalls = 0;
+
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.webkit.org/main.html"]];
     [webView loadRequest:request];
 
@@ -3014,6 +3016,8 @@
     auto pid2 = [webView _webProcessIdentifier];
     EXPECT_NE(pid1, pid2);
 
+    EXPECT_EQ(2, numberOfDecidePolicyCalls);
+
     [webView evaluateJavaScript:@"document.body.innerText" completionHandler:^(id innerText, NSError *error) {
         EXPECT_WK_STREQ(@"substituteData", (NSString *)innerText);
         done = true;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to