Changeset 239210 in webkit
- Timestamp:
- Dec 14, 2018 9:40:53 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r239204 r239210 1 2018-12-14 Chris Dumez <cdumez@apple.com> 2 3 [PSON] WebsitePolicies are lost on process-swap 4 https://bugs.webkit.org/show_bug.cgi?id=192694 5 <rdar://problem/46715748> 6 7 Reviewed by Brady Eidson. 8 9 In case of process-swap on navigation, instead of sending the websitePolicies to the old 10 process, send them to the new process as we trigger the navigation. We tell the new process 11 that it is continuing a load and it will therefore not re-trigger a decidePolicyForNavigationAction. 12 13 * Shared/LoadParameters.cpp: 14 (WebKit::LoadParameters::encode const): 15 (WebKit::LoadParameters::decode): 16 * Shared/LoadParameters.h: 17 * UIProcess/WebPageProxy.cpp: 18 (WebKit::WebPageProxy::reattachToWebProcessForReload): 19 (WebKit::WebPageProxy::reattachToWebProcessWithItem): 20 (WebKit::WebPageProxy::loadRequestWithNavigation): 21 (WebKit::WebPageProxy::loadDataWithNavigation): 22 (WebKit::WebPageProxy::goToBackForwardItem): 23 (WebKit::WebPageProxy::receivedNavigationPolicyDecision): 24 (WebKit::WebPageProxy::continueNavigationInNewProcess): 25 * UIProcess/WebPageProxy.h: 26 * WebProcess/WebPage/WebPage.cpp: 27 (WebKit::WebPage::loadRequest): 28 (WebKit::WebPage::loadDataImpl): 29 (WebKit::WebPage::loadData): 30 (WebKit::WebPage::loadAlternateHTML): 31 (WebKit::WebPage::goToBackForwardItem): 32 (WebKit::WebPage::createDocumentLoader): 33 * WebProcess/WebPage/WebPage.h: 34 * WebProcess/WebPage/WebPage.messages.in: 35 1 36 2018-12-14 Patrick Griffis <pgriffis@igalia.com> 2 37 -
trunk/Source/WebKit/Shared/LoadParameters.cpp
r238633 r239210 50 50 encoder << unreachableURLString; 51 51 encoder << provisionalLoadErrorURLString; 52 encoder << websitePolicies; 52 53 encoder << shouldOpenExternalURLsPolicy; 53 54 encoder << shouldTreatAsContinuingLoad; … … 106 107 return false; 107 108 109 std::optional<std::optional<WebsitePoliciesData>> websitePolicies; 110 decoder >> websitePolicies; 111 if (!websitePolicies) 112 return false; 113 data.websitePolicies = WTFMove(*websitePolicies); 114 108 115 if (!decoder.decode(data.shouldOpenExternalURLsPolicy)) 109 116 return false; -
trunk/Source/WebKit/Shared/LoadParameters.h
r238633 r239210 29 29 #include "SandboxExtension.h" 30 30 #include "UserData.h" 31 #include "WebsitePoliciesData.h" 31 32 #include <WebCore/FrameLoaderTypes.h> 32 33 #include <WebCore/ResourceRequest.h> … … 61 62 String provisionalLoadErrorURLString; 62 63 64 std::optional<WebsitePoliciesData> websitePolicies; 65 63 66 uint64_t shouldOpenExternalURLsPolicy; 64 67 bool shouldTreatAsContinuingLoad { false }; -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r239196 r239210 860 860 861 861 // We allow stale content when reloading a WebProcess that's been killed or crashed. 862 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation->navigationID(), m_backForwardList->currentItem()->itemID(), FrameLoadType::IndexedBackForward, ShouldTreatAsContinuingLoad::No ), m_pageID);862 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation->navigationID(), m_backForwardList->currentItem()->itemID(), FrameLoadType::IndexedBackForward, ShouldTreatAsContinuingLoad::No, std::nullopt), m_pageID); 863 863 m_process->responsivenessTimer().start(); 864 864 … … 879 879 auto navigation = m_navigationState->createBackForwardNavigation(item, m_backForwardList->currentItem(), FrameLoadType::IndexedBackForward); 880 880 881 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation->navigationID(), item.itemID(), FrameLoadType::IndexedBackForward, ShouldTreatAsContinuingLoad::No ), m_pageID);881 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation->navigationID(), item.itemID(), FrameLoadType::IndexedBackForward, ShouldTreatAsContinuingLoad::No, std::nullopt), m_pageID); 882 882 m_process->responsivenessTimer().start(); 883 883 … … 1050 1050 } 1051 1051 1052 void WebPageProxy::loadRequestWithNavigation(API::Navigation& navigation, ResourceRequest&& request, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, API::Object* userData, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad )1052 void WebPageProxy::loadRequestWithNavigation(API::Navigation& navigation, ResourceRequest&& request, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, API::Object* userData, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& websitePolicies) 1053 1053 { 1054 1054 ASSERT(!m_isClosed); … … 1068 1068 loadParameters.userData = UserData(process().transformObjectsToHandles(userData).get()); 1069 1069 loadParameters.shouldTreatAsContinuingLoad = shouldTreatAsContinuingLoad == ShouldTreatAsContinuingLoad::Yes; 1070 loadParameters.websitePolicies = WTFMove(websitePolicies); 1070 1071 loadParameters.lockHistory = navigation.lockHistory(); 1071 1072 loadParameters.lockBackForwardList = navigation.lockBackForwardList(); … … 1134 1135 } 1135 1136 1136 void WebPageProxy::loadDataWithNavigation(API::Navigation& navigation, const IPC::DataReference& data, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData )1137 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) 1137 1138 { 1138 1139 ASSERT(!m_isClosed); … … 1152 1153 loadParameters.baseURLString = baseURL; 1153 1154 loadParameters.userData = UserData(process().transformObjectsToHandles(userData).get()); 1155 loadParameters.websitePolicies = WTFMove(websitePolicies); 1154 1156 addPlatformLoadParameters(loadParameters); 1155 1157 … … 1330 1332 navigation = m_navigationState->createBackForwardNavigation(item, m_backForwardList->currentItem(), frameLoadType); 1331 1333 1332 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation ? navigation->navigationID() : 0, item.itemID(), frameLoadType, ShouldTreatAsContinuingLoad::No ), m_pageID);1334 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation ? navigation->navigationID() : 0, item.itemID(), frameLoadType, ShouldTreatAsContinuingLoad::No, std::nullopt), m_pageID); 1333 1335 m_process->responsivenessTimer().start(); 1334 1336 … … 2639 2641 RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "%p - WebPageProxy::decidePolicyForNavigationAction, keep using process %i for navigation, reason: %{public}s", this, processIdentifier(), reason.utf8().data()); 2640 2642 2641 receivedPolicyDecision(policyAction, navigation.ptr(), WTFMove(data), WTFMove(sender)); 2642 2643 if (processForNavigation.ptr() != &process()) 2644 continueNavigationInNewProcess(navigation, destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr, WTFMove(processForNavigation), processSwapRequestedByClient); 2643 bool shouldProcessSwap = processForNavigation.ptr() != &process(); 2644 receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? std::nullopt : WTFMove(data), WTFMove(sender)); 2645 2646 if (shouldProcessSwap) 2647 continueNavigationInNewProcess(navigation, destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr, WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data)); 2645 2648 }); 2646 2649 } … … 2678 2681 } 2679 2682 2680 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& process, ProcessSwapRequestedByClient processSwapRequestedByClient )2683 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& process, ProcessSwapRequestedByClient processSwapRequestedByClient, std::optional<WebsitePoliciesData>&& websitePolicies) 2681 2684 { 2682 2685 LOG(Loading, "Continuing navigation %" PRIu64 " '%s' in a new web process", navigation.navigationID(), navigation.loggingString()); … … 2710 2713 }); 2711 2714 m_process->send(Messages::WebPage::UpdateBackForwardListForReattach(WTFMove(itemStates)), m_pageID); 2712 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation.navigationID(), item->itemID(), *navigation.backForwardFrameLoadType(), ShouldTreatAsContinuingLoad::Yes ), m_pageID);2715 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation.navigationID(), item->itemID(), *navigation.backForwardFrameLoadType(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)), m_pageID); 2713 2716 m_process->responsivenessTimer().start(); 2714 2717 … … 2725 2728 ASSERT(!navigation.currentRequest().isEmpty()); 2726 2729 if (auto& substituteData = navigation.substituteData()) 2727 loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get() );2730 loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), WTFMove(websitePolicies)); 2728 2731 else 2729 loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, ShouldTreatAsContinuingLoad::Yes );2732 loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)); 2730 2733 2731 2734 ASSERT(!m_mainFrame); -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r239196 r239210 1577 1577 RefPtr<API::Navigation> reattachToWebProcessWithItem(WebBackForwardListItem&); 1578 1578 1579 void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData = nullptr );1580 void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad );1579 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); 1580 void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& = std::nullopt); 1581 1581 1582 1582 void requestNotificationPermission(uint64_t notificationID, const String& originString); … … 1894 1894 void reportPageLoadResult(const WebCore::ResourceError& = { }); 1895 1895 1896 void continueNavigationInNewProcess(API::Navigation&, std::unique_ptr<SuspendedPageProxy>&&, Ref<WebProcessProxy>&&, ProcessSwapRequestedByClient );1896 void continueNavigationInNewProcess(API::Navigation&, std::unique_ptr<SuspendedPageProxy>&&, Ref<WebProcessProxy>&&, ProcessSwapRequestedByClient, std::optional<WebsitePoliciesData>&&); 1897 1897 1898 1898 void setNeedsFontAttributes(bool); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r239182 r239210 1354 1354 1355 1355 m_pendingNavigationID = loadParameters.navigationID; 1356 m_pendingWebsitePolicies = WTFMove(loadParameters.websitePolicies); 1356 1357 1357 1358 m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), WTFMove(loadParameters.sandboxExtensionHandle)); … … 1375 1376 1376 1377 ASSERT(!m_pendingNavigationID); 1377 } 1378 1379 void WebPage::loadDataImpl(uint64_t navigationID, Ref<SharedBuffer>&& sharedBuffer, const String& MIMEType, const String& encodingName, const URL& baseURL, const URL& unreachableURL, const UserData& userData) 1378 ASSERT(!m_pendingWebsitePolicies); 1379 } 1380 1381 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) 1380 1382 { 1381 1383 SendStopResponsivenessTimer stopper; 1382 1384 1383 1385 m_pendingNavigationID = navigationID; 1386 m_pendingWebsitePolicies = WTFMove(websitePolicies); 1384 1387 1385 1388 ResourceRequest request(baseURL); … … 1401 1404 auto sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(loadParameters.data.data()), loadParameters.data.size()); 1402 1405 URL baseURL = loadParameters.baseURLString.isEmpty() ? WTF::blankURL() : URL(URL(), loadParameters.baseURLString); 1403 loadDataImpl(loadParameters.navigationID, WTFMove( sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, URL(), loadParameters.userData);1404 } 1405 1406 void WebPage::loadAlternateHTML( const LoadParameters& loadParameters)1406 loadDataImpl(loadParameters.navigationID, WTFMove(loadParameters.websitePolicies), WTFMove(sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, URL(), loadParameters.userData); 1407 } 1408 1409 void WebPage::loadAlternateHTML(LoadParameters&& loadParameters) 1407 1410 { 1408 1411 platformDidReceiveLoadParameters(loadParameters); … … 1413 1416 auto sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(loadParameters.data.data()), loadParameters.data.size()); 1414 1417 m_mainFrame->coreFrame()->loader().setProvisionalLoadErrorBeingHandledURL(provisionalLoadErrorURL); 1415 loadDataImpl(loadParameters.navigationID, WTFMove( sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, unreachableURL, loadParameters.userData);1418 loadDataImpl(loadParameters.navigationID, WTFMove(loadParameters.websitePolicies), WTFMove(sharedBuffer), loadParameters.MIMEType, loadParameters.encodingName, baseURL, unreachableURL, loadParameters.userData); 1416 1419 m_mainFrame->coreFrame()->loader().setProvisionalLoadErrorBeingHandledURL({ }); 1417 1420 } … … 1476 1479 } 1477 1480 1478 void WebPage::goToBackForwardItem(uint64_t navigationID, const BackForwardItemIdentifier& backForwardItemID, FrameLoadType backForwardType, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad )1481 void WebPage::goToBackForwardItem(uint64_t navigationID, const BackForwardItemIdentifier& backForwardItemID, FrameLoadType backForwardType, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&& websitePolicies) 1479 1482 { 1480 1483 SendStopResponsivenessTimer stopper; … … 1491 1494 ASSERT(!m_pendingNavigationID); 1492 1495 m_pendingNavigationID = navigationID; 1496 m_pendingWebsitePolicies = WTFMove(websitePolicies); 1493 1497 1494 1498 m_page->goToItem(*item, backForwardType, shouldTreatAsContinuingLoad); … … 5980 5984 m_pendingNavigationID = 0; 5981 5985 } 5986 5987 if (auto pendingWebsitePolicies = WTFMove(m_pendingWebsitePolicies)) 5988 WebsitePoliciesData::applyToDocumentLoader(WTFMove(*pendingWebsitePolicies), documentLoader); 5982 5989 } 5983 5990 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r239182 r239210 51 51 #include "WebURLSchemeHandler.h" 52 52 #include "WebUserContentController.h" 53 #include "WebsitePoliciesData.h" 53 54 #include <JavaScriptCore/InspectorFrontendChannel.h> 54 55 #include <WebCore/ActivityState.h> … … 1195 1196 String sourceForFrame(WebFrame*); 1196 1197 1197 void loadDataImpl(uint64_t navigationID, Ref<WebCore::SharedBuffer>&&, const String& MIMEType, const String& encodingName, const URL& baseURL, const URL& failingURL, const UserData&);1198 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&); 1198 1199 1199 1200 // Actions … … 1202 1203 void loadRequest(LoadParameters&&); 1203 1204 void loadData(LoadParameters&&); 1204 void loadAlternateHTML( const LoadParameters&);1205 void loadAlternateHTML(LoadParameters&&); 1205 1206 void navigateToPDFLinkWithSimulatedClick(const String& url, WebCore::IntPoint documentPoint, WebCore::IntPoint screenPoint); 1206 1207 void reload(uint64_t navigationID, uint32_t reloadOptions, SandboxExtension::Handle&&); 1207 void goToBackForwardItem(uint64_t navigationID, const WebCore::BackForwardItemIdentifier&, WebCore::FrameLoadType, WebCore::ShouldTreatAsContinuingLoad );1208 void goToBackForwardItem(uint64_t navigationID, const WebCore::BackForwardItemIdentifier&, WebCore::FrameLoadType, WebCore::ShouldTreatAsContinuingLoad, std::optional<WebsitePoliciesData>&&); 1208 1209 void tryRestoreScrollPosition(); 1209 1210 void setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent&, CallbackID); … … 1749 1750 1750 1751 uint64_t m_pendingNavigationID { 0 }; 1752 std::optional<WebsitePoliciesData> m_pendingWebsitePolicies; 1751 1753 1752 1754 bool m_mainFrameProgressCompleted { false }; -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r239006 r239210 146 146 CenterSelectionInVisibleArea() 147 147 148 GoToBackForwardItem(uint64_t navigationID, struct WebCore::BackForwardItemIdentifier backForwardItemID, enum:uint8_t WebCore::FrameLoadType backForwardType, enum:bool WebCore::ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad )148 GoToBackForwardItem(uint64_t navigationID, struct WebCore::BackForwardItemIdentifier backForwardItemID, enum:uint8_t WebCore::FrameLoadType backForwardType, enum:bool WebCore::ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, std::optional<WebKit::WebsitePoliciesData> websitePolicies) 149 149 TryRestoreScrollPosition() 150 150 -
trunk/Tools/ChangeLog
r239207 r239210 1 2018-12-14 Chris Dumez <cdumez@apple.com> 2 3 [PSON] WebsitePolicies are lost on process-swap 4 https://bugs.webkit.org/show_bug.cgi?id=192694 5 <rdar://problem/46715748> 6 7 Reviewed by Brady Eidson. 8 9 Extend existing API test to reproduce the issue. 10 11 * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm: 12 1 13 2018-12-14 Michael Catanzaro <mcatanzaro@igalia.com> 2 14 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm
r239046 r239210 973 973 TestWebKitAPI::Util::spinRunLoop(); 974 974 loadCount = 0; 975 976 request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"test://www.google.com/main.html"]]; 977 [webView loadRequest:request]; 978 979 TestWebKitAPI::Util::run(&finishedNavigation); 980 finishedNavigation = false; 981 982 EXPECT_EQ(1U, loadCount); 983 loadCount = 0; 975 984 } 976 985
Note: See TracChangeset
for help on using the changeset viewer.