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;