Diff
Modified: branches/safari-607-branch/LayoutTests/ChangeLog (240261 => 240262)
--- branches/safari-607-branch/LayoutTests/ChangeLog 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/LayoutTests/ChangeLog 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,5 +1,61 @@
2019-01-22 Alan Coon <alanc...@apple.com>
+ Cherry-pick r240015. rdar://problem/47099573
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240015 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2019-01-15 Chris Dumez <cdu...@apple.com>
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+2019-01-22 Alan Coon <alanc...@apple.com>
+
Cherry-pick r239993. rdar://problem/47099573
Regression(PSON) View becomes blank after click a cross-site download link
Modified: branches/safari-607-branch/LayoutTests/platform/wk2/TestExpectations (240261 => 240262)
--- branches/safari-607-branch/LayoutTests/platform/wk2/TestExpectations 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/LayoutTests/platform/wk2/TestExpectations 2019-01-22 18:34:34 UTC (rev 240262)
@@ -733,8 +733,8 @@
http/tests/resourceLoadStatistics/non-prevalent-resources-can-access-cookies-in-a-third-party-context.html [ Skip ]
http/tests/resourceLoadStatistics/cap-cache-max-age-for-prevalent-resource.html [ Skip ]
-# This feature is currently disabled by default and unfinished <rdar://problem/38925077>.
-http/tests/navigation/process-swap-window-open.html [ Skip ]
+# Process swapping is only implemented on WebKit2.
+http/tests/navigation/process-swap-window-open.html [ Pass ]
# Cross-Origin-Resource-Policy response header is only implemented in WebKit2.
http/wpt/cross-origin-resource-policy/ [ Pass ]
Modified: branches/safari-607-branch/Source/WebCore/ChangeLog (240261 => 240262)
--- branches/safari-607-branch/Source/WebCore/ChangeLog 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebCore/ChangeLog 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,5 +1,61 @@
2019-01-22 Alan Coon <alanc...@apple.com>
+ Cherry-pick r240015. rdar://problem/47099573
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240015 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2019-01-15 Chris Dumez <cdu...@apple.com>
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+2019-01-22 Alan Coon <alanc...@apple.com>
+
Cherry-pick r239993. rdar://problem/47099573
Regression(PSON) View becomes blank after click a cross-site download link
Modified: branches/safari-607-branch/Source/WebCore/loader/FrameLoader.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebCore/loader/FrameLoader.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebCore/loader/FrameLoader.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -2032,11 +2032,11 @@
Optional<HasInsecureContent> hasInsecureContent = cachedPage->cachedMainFrame()->hasInsecureContent();
- dispatchDidCommitLoad(hasInsecureContent);
-
// FIXME: This API should be turned around so that we ground CachedPage into the Page.
cachedPage->restore(*m_frame.page());
+ dispatchDidCommitLoad(hasInsecureContent);
+
#if PLATFORM(IOS_FAMILY)
m_frame.page()->chrome().setDispatchViewportDataDidChangeSuppressed(false);
m_frame.page()->chrome().dispatchViewportPropertiesDidChange(m_frame.page()->viewportArguments());
Modified: branches/safari-607-branch/Source/WebKit/ChangeLog (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/ChangeLog 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/ChangeLog 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,5 +1,61 @@
2019-01-22 Alan Coon <alanc...@apple.com>
+ Cherry-pick r240015. rdar://problem/47099573
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240015 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2019-01-15 Chris Dumez <cdu...@apple.com>
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+2019-01-22 Alan Coon <alanc...@apple.com>
+
Cherry-pick r239997. rdar://problem/47099573
Fix iOS build after r239993
Modified: branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -73,7 +73,7 @@
encoder.encodeEnum(layerHostingMode);
encoder << mimeTypesWithCustomContentProviders;
encoder << controlledByAutomation;
- encoder << isProcessSwap;
+ encoder << isSwapFromSuspended;
#if PLATFORM(MAC)
encoder << colorSpace;
@@ -227,7 +227,7 @@
return WTF::nullopt;
if (!decoder.decode(parameters.controlledByAutomation))
return WTF::nullopt;
- if (!decoder.decode(parameters.isProcessSwap))
+ if (!decoder.decode(parameters.isSwapFromSuspended))
return WTF::nullopt;
#if PLATFORM(MAC)
Modified: branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -129,7 +129,7 @@
Vector<String> mimeTypesWithCustomContentProviders;
bool controlledByAutomation;
- bool isProcessSwap { false };
+ bool isSwapFromSuspended { false };
#if PLATFORM(MAC)
ColorSpaceData colorSpace;
Modified: branches/safari-607-branch/Source/WebKit/Shared/WebPolicyAction.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/Shared/WebPolicyAction.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/Shared/WebPolicyAction.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -29,11 +29,11 @@
namespace WebKit {
-// FIXME: Remove this type and use WebCore::PolicyAction instead.
enum class WebPolicyAction : uint8_t {
Use,
Download,
- Ignore
+ Ignore,
+ Suspend
};
}
@@ -45,7 +45,8 @@
WebKit::WebPolicyAction,
WebKit::WebPolicyAction::Use,
WebKit::WebPolicyAction::Download,
- WebKit::WebPolicyAction::Ignore
+ WebKit::WebPolicyAction::Ignore,
+ WebKit::WebPolicyAction::Suspend
>;
};
Modified: branches/safari-607-branch/Source/WebKit/Sources.txt (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/Sources.txt 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/Sources.txt 2019-01-22 18:34:34 UTC (rev 240262)
@@ -228,7 +228,6 @@
UIProcess/PersistencyUtils.cpp
UIProcess/ProcessAssertion.cpp
UIProcess/ProcessThrottler.cpp
-UIProcess/ProvisionalPageProxy.cpp
UIProcess/RemoteWebInspectorProxy.cpp
UIProcess/ResourceLoadStatisticsMemoryStore.cpp
UIProcess/ResourceLoadStatisticsPersistentStorage.cpp
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2019-01-22 18:34:34 UTC (rev 240262)
@@ -44,7 +44,6 @@
#import "NavigationState.h"
#import "ObjCObjectGraph.h"
#import "PageClient.h"
-#import "ProvisionalPageProxy.h"
#import "RemoteLayerTreeScrollingPerformanceData.h"
#import "RemoteLayerTreeTransaction.h"
#import "RemoteObjectRegistry.h"
@@ -4683,11 +4682,6 @@
{
Ref<WebKit::WebProcessProxy> protectedProcessProxy(_page->process());
protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient);
-
- if (auto* provisionalPageProxy = _page->provisionalPageProxy()) {
- Ref<WebKit::WebProcessProxy> protectedProcessProxy(provisionalPageProxy->process());
- protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient);
- }
}
#if PLATFORM(MAC)
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/PageClient.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/PageClient.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/PageClient.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -48,7 +48,6 @@
OBJC_CLASS CALayer;
OBJC_CLASS NSFileWrapper;
-OBJC_CLASS NSMenu;
OBJC_CLASS NSSet;
OBJC_CLASS WKDrawingView;
OBJC_CLASS _WKRemoteObjectRegistry;
Deleted: branches/safari-607-branch/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,314 +0,0 @@
-/*
- * Copyright (C) 2019 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ProvisionalPageProxy.h"
-
-#include "APINavigation.h"
-#include "DrawingAreaProxy.h"
-#include "Logging.h"
-#include "PageClient.h"
-#include "WebBackForwardList.h"
-#include "WebBackForwardListItem.h"
-#include "WebErrors.h"
-#include "WebNavigationState.h"
-#include "WebPageMessages.h"
-#include "WebPageProxy.h"
-#include "WebPageProxyMessages.h"
-#include "WebProcessMessages.h"
-#include "WebProcessProxy.h"
-#include <WebCore/ShouldTreatAsContinuingLoad.h>
-
-namespace WebKit {
-
-#define RELEASE_LOG_IF_ALLOWED(channel, fmt, ...) RELEASE_LOG_IF(m_page.isAlwaysOnLoggingAllowed(), channel, "%p - ProvisionalPageProxy::" fmt, this, ##__VA_ARGS__)
-#define RELEASE_LOG_ERROR_IF_ALLOWED(channel, fmt, ...) RELEASE_LOG_ERROR_IF(m_page.isAlwaysOnLoggingAllowed(), channel, "%p - ProvisionalPageProxy::" fmt, this, ##__VA_ARGS__)
-
-ProvisionalPageProxy::ProvisionalPageProxy(WebPageProxy& page, Ref<WebProcessProxy>&& process, std::unique_ptr<SuspendedPageProxy> suspendedPage, uint64_t navigationID, bool isServerRedirect, const WebCore::ResourceRequest& request, ProcessSwapRequestedByClient processSwapRequestedByClient)
- : m_page(page)
- , m_process(WTFMove(process))
- , m_navigationID(navigationID)
- , m_isServerRedirect(isServerRedirect)
- , m_request(request)
- , m_processSwapRequestedByClient(processSwapRequestedByClient)
-#if PLATFORM(IOS_FAMILY)
- , m_suspensionToken(m_process->throttler().foregroundActivityToken())
-#endif
-{
- m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID(), *this);
- m_process->addProvisionalPageProxy(*this);
-
- // If we are reattaching to a SuspendedPage, then the WebProcess' WebPage already exists and
- // WebPageProxy::didCreateMainFrame() will not be called to initialize m_mainFrame. In such
- // case, we need to initialize m_mainFrame to reflect the fact the the WebProcess' WebPage
- // already exists and already has a main frame.
- if (suspendedPage) {
- ASSERT(&suspendedPage->process() == m_process.ptr());
- suspendedPage->unsuspend();
- m_mainFrame = WebFrameProxy::create(m_page, suspendedPage->mainFrameID());
- m_process->frameCreated(suspendedPage->mainFrameID(), *m_mainFrame);
- }
-
- initializeWebPage();
-}
-
-ProvisionalPageProxy::~ProvisionalPageProxy()
-{
- m_process->removeProvisionalPageProxy(*this);
-
- if (m_wasCommitted)
- return;
-
- m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
- m_process->send(Messages::WebPage::Close(), m_page.pageID());
-
- if (m_drawingArea) {
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_drawingArea = nullptr;
- }
-
- RunLoop::main().dispatch([process = m_process.copyRef()] {
- process->maybeShutDown();
- });
-}
-
-void ProvisionalPageProxy::processDidTerminate()
-{
- RELEASE_LOG_ERROR_IF_ALLOWED(ProcessSwapping, "processDidTerminate: pageID = %" PRIu64, m_page.pageID());
- m_page.provisionalProcessDidTerminate();
-}
-
-std::unique_ptr<DrawingAreaProxy> ProvisionalPageProxy::takeDrawingArea()
-{
- return WTFMove(m_drawingArea);
-}
-
-void ProvisionalPageProxy::cancel()
-{
- // If the provisional load started, then indicate that it failed due to cancellation by calling didFailProvisionalLoadForFrame().
- if (m_provisionalLoadURL.isEmpty())
- return;
-
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "cancel: Simulating a didFailProvisionalLoadForFrame for pageID = %" PRIu64, m_page.pageID());
- ASSERT(m_mainFrame);
- auto error = WebKit::cancelledError(m_request);
- error.setType(WebCore::ResourceError::Type::Cancellation);
- didFailProvisionalLoadForFrame(m_mainFrame->frameID(), { }, m_navigationID, m_provisionalLoadURL, error, UserData { }); // Will delete |this|.
-}
-
-void ProvisionalPageProxy::processDidFinishLaunching()
-{
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "processDidFinishLaunching: pageID = %" PRIu64, m_page.pageID());
- finishInitializingWebPageAfterProcessLaunch();
-}
-
-void ProvisionalPageProxy::finishInitializingWebPageAfterProcessLaunch()
-{
- ASSERT(m_process->state() == WebProcessProxy::State::Running);
-
- // FIXME: The WebPageProxy delays adding the visited link store until after the process has launched
- // so the ProvisionalPageProxy does the same. However, do we really need to?
- m_process->addVisitedLinkStore(m_page.visitedLinkStore());
-}
-
-void ProvisionalPageProxy::initializeWebPage()
-{
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_drawingArea = m_page.pageClient().createDrawingAreaProxy();
-
- auto parameters = m_page.creationParameters();
- parameters.isProcessSwap = true;
- m_process->send(Messages::WebProcess::CreateWebPage(m_page.pageID(), parameters), 0);
-
- if (m_process->state() == WebProcessProxy::State::Running)
- finishInitializingWebPageAfterProcessLaunch();
-}
-
-void ProvisionalPageProxy::loadDataWithNavigation(API::Navigation& navigation, const IPC::DataReference& data, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, Optional<WebsitePoliciesData>&& websitePolicies)
-{
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "loadDataWithNavigation: pageID = %" PRIu64, m_page.pageID());
-
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_page.loadDataWithNavigation(navigation, data, MIMEType, encoding, baseURL, userData, WebCore::ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
-}
-
-void ProvisionalPageProxy::loadRequestWithNavigation(API::Navigation& navigation, WebCore::ResourceRequest&& request, WebCore::ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, API::Object* userData, Optional<WebsitePoliciesData>&& websitePolicies)
-{
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "loadRequestWithNavigation: pageID = %" PRIu64, m_page.pageID());
-
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_page.loadRequestWithNavigation(navigation, WTFMove(request), shouldOpenExternalURLsPolicy, userData, WebCore::ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
-}
-
-void ProvisionalPageProxy::goToBackForwardItem(API::Navigation& navigation, WebBackForwardListItem& item, Optional<WebsitePoliciesData>&& websitePolicies)
-{
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "goToBackForwardItem: pageID = %" PRIu64, m_page.pageID());
-
- auto itemStates = m_page.backForwardList().filteredItemStates([this, targetItem = &item](auto& item) {
- if (auto* page = item.suspendedPage()) {
- if (&page->process() == m_process.ptr())
- return false;
- }
- return &item != targetItem;
- });
- m_process->send(Messages::WebPage::UpdateBackForwardListForReattach(WTFMove(itemStates)), m_page.pageID());
- m_process->send(Messages::WebPage::GoToBackForwardItem(navigation.navigationID(), item.itemID(), *navigation.backForwardFrameLoadType(), WebCore::ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)), m_page.pageID());
- m_process->responsivenessTimer().start();
-}
-
-void ProvisionalPageProxy::didCreateMainFrame(uint64_t frameID)
-{
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "didCreateMainFrame: pageID = %" PRIu64 ", frameID = %" PRIu64, m_page.pageID(), frameID);
- ASSERT(!m_mainFrame);
-
- m_mainFrame = WebFrameProxy::create(m_page, frameID);
-
- // Add the frame to the process wide map.
- m_process->frameCreated(frameID, *m_mainFrame);
-
- // This navigation was destroyed so no need to notify of redirect.
- if (!m_page.navigationState().hasNavigation(m_navigationID))
- return;
-
- // Restore the main frame's committed URL as some clients may rely on it until the next load is committed.
- if (auto* mainFrame = m_page.mainFrame())
- m_mainFrame->frameLoadState().setURL(mainFrame->frameLoadState().url());
-
- // Normally, notification of a server redirect comes from the WebContent process.
- // If we are process swapping in response to a server redirect then that notification will not come from the new WebContent process.
- // In this case we have the UIProcess synthesize the redirect notification at the appropriate time.
- if (m_isServerRedirect) {
- m_mainFrame->frameLoadState().didStartProvisionalLoad(m_request.url());
-
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_page.didReceiveServerRedirectForProvisionalLoadForFrame(m_mainFrame->frameID(), m_navigationID, WTFMove(m_request), { });
- }
-}
-
-void ProvisionalPageProxy::didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&& url, URL&& unreachableURL, const UserData& userData)
-{
- // If the previous provisional load used the same process, we may receive IPC for this previous provisional's main frame that we need to ignore.
- if (!m_mainFrame || m_mainFrame->frameID() != frameID)
- return;
-
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "didStartProvisionalLoadForFrame: pageID = %" PRIu64 ", frameID = %" PRIu64 ", navigationID = %" PRIu64, m_page.pageID(), frameID, navigationID);
- ASSERT(m_provisionalLoadURL.isNull());
- m_provisionalLoadURL = url;
-
- // Merely following a server side redirect so there is no need to send a didStartProvisionalLoad again.
- if (m_isServerRedirect)
- return;
-
- // Clients expect the Page's main frame's expectedURL to be the provisional one when a provisional load is started.
- if (auto* pageMainFrame = m_page.mainFrame())
- pageMainFrame->didStartProvisionalLoad(url);
-
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_page.didStartProvisionalLoadForFrame(frameID, navigationID, WTFMove(url), WTFMove(unreachableURL), userData);
-}
-
-void ProvisionalPageProxy::didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError& error, const UserData& userData)
-{
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
-
- RELEASE_LOG_ERROR_IF_ALLOWED(ProcessSwapping, "didFailProvisionalLoadForFrame: pageID = %" PRIu64 ", frameID = %" PRIu64 ", navigationID = %" PRIu64, m_page.pageID(), frameID, navigationID);
- m_provisionalLoadURL = { };
-
- // Make sure the Page's main frame's expectedURL gets cleared since we updated it in didStartProvisionalLoad.
- if (auto* pageMainFrame = m_page.mainFrame())
- pageMainFrame->didFailProvisionalLoad();
-
- m_page.didFailProvisionalLoadForFrame(frameID, frameSecurityOrigin, navigationID, provisionalURL, error, userData); // Will delete |this|.
-}
-
-void ProvisionalPageProxy::didCommitLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo& certificateInfo, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData& userData)
-{
- // If the previous provisional load used the same process, we may receive IPC for this previous provisional's main frame that we need to ignore.
- if (!m_mainFrame || m_mainFrame->frameID() != frameID)
- return;
-
- RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "didCommitLoadForFrame: pageID = %" PRIu64 ", frameID = %" PRIu64 ", navigationID = %" PRIu64, m_page.pageID(), frameID, navigationID);
- m_provisionalLoadURL = { };
- m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
-
- m_wasCommitted = true;
- m_page.commitProvisionalPage(frameID, navigationID, mimeType, frameHasCustomContentProvider, frameLoadType, certificateInfo, containsPluginDocument, forcedHasInsecureContent, userData); // Will delete |this|.
-}
-
-void ProvisionalPageProxy::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
-{
- ASSERT(decoder.messageReceiverName() == Messages::WebPageProxy::messageReceiverName());
-
- if (decoder.messageName() == Messages::WebPageProxy::DidStartProgress::name()
- || decoder.messageName() == Messages::WebPageProxy::DidChangeProgress::name()
- || decoder.messageName() == Messages::WebPageProxy::BackForwardAddItem::name()
- || decoder.messageName() == Messages::WebPageProxy::LogDiagnosticMessage::name()
- || decoder.messageName() == Messages::WebPageProxy::LogDiagnosticMessageWithEnhancedPrivacy::name()
- || decoder.messageName() == Messages::WebPageProxy::SetNetworkRequestsInProgress::name()
-#if PLATFORM(COCOA)
- || decoder.messageName() == Messages::WebPageProxy::RegisterWebProcessAccessibilityToken::name()
-#endif
- || decoder.messageName() == Messages::WebPageProxy::DecidePolicyForNavigationActionAsync::name()
- || decoder.messageName() == Messages::WebPageProxy::StartURLSchemeTask::name()
- || decoder.messageName() == Messages::WebPageProxy::DecidePolicyForResponse::name()
- || decoder.messageName() == Messages::WebPageProxy::DidPerformClientRedirect::name()
- || decoder.messageName() == Messages::WebPageProxy::DidChangeProvisionalURLForFrame::name()
- || decoder.messageName() == Messages::WebPageProxy::DidNavigateWithNavigationData::name())
- {
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_page.didReceiveMessage(connection, decoder);
- return;
- }
-
- if (decoder.messageName() == Messages::WebPageProxy::DidCreateMainFrame::name()) {
- IPC::handleMessage<Messages::WebPageProxy::DidCreateMainFrame>(decoder, this, &ProvisionalPageProxy::didCreateMainFrame);
- return;
- }
-
- if (decoder.messageName() == Messages::WebPageProxy::DidStartProvisionalLoadForFrame::name()) {
- IPC::handleMessage<Messages::WebPageProxy::DidStartProvisionalLoadForFrame>(decoder, this, &ProvisionalPageProxy::didStartProvisionalLoadForFrame);
- return;
- }
-
- if (decoder.messageName() == Messages::WebPageProxy::DidFailProvisionalLoadForFrame::name()) {
- IPC::handleMessage<Messages::WebPageProxy::DidFailProvisionalLoadForFrame>(decoder, this, &ProvisionalPageProxy::didFailProvisionalLoadForFrame);
- return;
- }
-
- if (decoder.messageName() == Messages::WebPageProxy::DidCommitLoadForFrame::name()) {
- IPC::handleMessage<Messages::WebPageProxy::DidCommitLoadForFrame>(decoder, this, &ProvisionalPageProxy::didCommitLoadForFrame);
- return;
- }
-
- LOG(ProcessSwapping, "Unhandled message %s::%s from provisional process", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data());
-}
-
-void ProvisionalPageProxy::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& encoder)
-{
- auto pageProcessOverride = m_page.temporarilyOverrideProcess(m_process);
- m_page.didReceiveSyncMessage(connection, decoder, encoder);
-}
-
-} // namespace WebKit
Deleted: branches/safari-607-branch/Source/WebKit/UIProcess/ProvisionalPageProxy.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/ProvisionalPageProxy.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/ProvisionalPageProxy.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2019 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "MessageReceiver.h"
-#include <wtf/WeakPtr.h>
-
-namespace WebCore {
-class ResourceRequest;
-}
-
-namespace WebKit {
-
-class DrawingAreaProxy;
-class SuspendedPageProxy;
-class WebFrameProxy;
-class WebPageProxy;
-class WebProcessProxy;
-
-class ProvisionalPageProxy : public IPC::MessageReceiver, public CanMakeWeakPtr<ProvisionalPageProxy> {
- WTF_MAKE_FAST_ALLOCATED;
-public:
- ProvisionalPageProxy(WebPageProxy&, Ref<WebProcessProxy>&&, std::unique_ptr<SuspendedPageProxy>, uint64_t navigationID, bool isServerRedirect, const WebCore::ResourceRequest&, ProcessSwapRequestedByClient);
- ~ProvisionalPageProxy();
-
- WebPageProxy& page() { return m_page; }
- WebFrameProxy* mainFrame() const { return m_mainFrame.get(); }
- WebProcessProxy& process() { return m_process.get(); }
- ProcessSwapRequestedByClient processSwapRequestedByClient() const { return m_processSwapRequestedByClient; }
- uint64_t navigationID() const { return m_navigationID; }
-
- DrawingAreaProxy* drawingArea() const { return m_drawingArea.get(); }
- std::unique_ptr<DrawingAreaProxy> takeDrawingArea();
-
- void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, Optional<WebsitePoliciesData>&& = WTF::nullopt);
- void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, Optional<WebsitePoliciesData>&& = WTF::nullopt);
- void goToBackForwardItem(API::Navigation&, WebBackForwardListItem&, Optional<WebsitePoliciesData>&&);
- void cancel();
-
- void processDidFinishLaunching();
- void processDidTerminate();
-
-private:
- // IPC::MessageReceiver
- void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
- void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
-
- void didCreateMainFrame(uint64_t frameID);
- void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
- void didCommitLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo&, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData&);
- void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
-
- void initializeWebPage();
- void finishInitializingWebPageAfterProcessLaunch();
-
- WebPageProxy& m_page;
- Ref<WebProcessProxy> m_process;
- std::unique_ptr<DrawingAreaProxy> m_drawingArea;
- RefPtr<WebFrameProxy> m_mainFrame;
- uint64_t m_navigationID;
- bool m_isServerRedirect;
- WebCore::ResourceRequest m_request;
- ProcessSwapRequestedByClient m_processSwapRequestedByClient;
- bool m_wasCommitted { false };
- URL m_provisionalLoadURL;
-
-#if PLATFORM(IOS_FAMILY)
- ProcessThrottler::ForegroundActivityToken m_suspensionToken;
-#endif
-};
-
-} // namespace WebKit
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/SuspendedPageProxy.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/SuspendedPageProxy.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/SuspendedPageProxy.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -100,10 +100,8 @@
// If the suspended page was not consumed before getting destroyed, then close the corresponding page
// on the WebProcess side.
m_process->send(Messages::WebPage::Close(), m_page.pageID());
+ m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
- if (m_suspensionState == SuspensionState::Suspending)
- m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
-
// We call maybeShutDown() asynchronously since the SuspendedPage is currently being removed from the WebProcessPool
// and we want to avoid re-entering WebProcessPool methods.
RunLoop::main().dispatch([process = m_process.copyRef()] {
@@ -136,6 +134,7 @@
ASSERT(m_suspensionState == SuspensionState::Suspended);
m_suspensionState = SuspensionState::Resumed;
+ m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
m_process->send(Messages::WebPage::SetIsSuspended(false), m_page.pageID());
}
@@ -152,8 +151,6 @@
m_suspensionToken = nullptr;
#endif
- m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
-
if (m_readyToUnsuspendHandler)
m_readyToUnsuspendHandler(this);
}
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/WebFrameProxy.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/WebFrameProxy.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/WebFrameProxy.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -27,7 +27,6 @@
#include "WebFrameProxy.h"
#include "APINavigation.h"
-#include "ProvisionalPageProxy.h"
#include "WebCertificateInfo.h"
#include "WebFramePolicyListenerProxy.h"
#include "WebPageMessages.h"
@@ -75,7 +74,7 @@
if (!m_page)
return false;
- return this == m_page->mainFrame() || (m_page->provisionalPageProxy() && this == m_page->provisionalPageProxy()->mainFrame());
+ return this == m_page->mainFrame();
}
void WebFrameProxy::loadURL(const URL& url)
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -77,7 +77,6 @@
#include "PluginInformation.h"
#include "PluginProcessManager.h"
#include "PrintInfo.h"
-#include "ProvisionalPageProxy.h"
#include "SafeBrowsingWarning.h"
#include "ShareSheetCallbackID.h"
#include "SharedBufferDataReference.h"
@@ -550,13 +549,6 @@
return m_websiteDataStore->sessionID();
}
-DrawingAreaProxy* WebPageProxy::drawingArea() const
-{
- if (m_provisionalPage && m_process.ptr() == &m_provisionalPage->process() && m_provisionalPage->drawingArea())
- return m_provisionalPage->drawingArea();
- return m_drawingArea.get();
-}
-
void WebPageProxy::changeWebsiteDataStore(WebsiteDataStore& websiteDataStore)
{
m_process->processPool().pageEndUsingWebsiteDataStore(*this);
@@ -780,26 +772,38 @@
return true;
}
-void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr<DrawingAreaProxy>&& drawingArea, RefPtr<WebFrameProxy>&& mainFrame)
+void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr<SuspendedPageProxy>&& destinationSuspendedPage, IsSwapFromSuspended isSwapFromSuspended)
{
ASSERT(!m_isClosed);
RELEASE_LOG_IF_ALLOWED(Loading, "swapToWebProcess: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID);
m_process = WTFMove(process);
- ASSERT(!m_drawingArea);
- setDrawingArea(WTFMove(drawingArea));
- ASSERT(!m_mainFrame);
- m_mainFrame = WTFMove(mainFrame);
m_isValid = true;
+ // If we are reattaching to a SuspendedPage, then the WebProcess' WebPage already exists and
+ // WebPageProxy::didCreateMainFrame() will not be called to initialize m_mainFrame. In such
+ // case, we need to initialize m_mainFrame to reflect the fact the the WebProcess' WebPage
+ // already exists and already has a main frame.
+ if (destinationSuspendedPage) {
+ if (!destinationSuspendedPage->failedToSuspend()) {
+ ASSERT(!m_mainFrame);
+ ASSERT(&destinationSuspendedPage->process() == m_process.ptr());
+ destinationSuspendedPage->unsuspend();
+ m_mainFrame = WebFrameProxy::create(*this, destinationSuspendedPage->mainFrameID());
+ m_process->frameCreated(destinationSuspendedPage->mainFrameID(), *m_mainFrame);
+ } else {
+ // We failed to suspend the page so destroy it now and merely reuse its WebContent process.
+ destinationSuspendedPage = nullptr;
+ }
+ }
+
m_process->addExistingWebPage(*this, m_pageID, WebProcessProxy::BeginsUsingDataStore::No);
m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID, *this);
- // No need to initialize the WebPage since it was created when we created the ProvisionalPageProxy.
- finishAttachingToWebProcess(ShouldInitializeWebPage::No);
+ finishAttachingToWebProcess(isSwapFromSuspended);
}
-void WebPageProxy::finishAttachingToWebProcess(ShouldInitializeWebPage shouldInitializePage)
+void WebPageProxy::finishAttachingToWebProcess(IsSwapFromSuspended isSwapFromSuspended)
{
ASSERT(m_process->state() != ChildProcessProxy::State::Terminated);
@@ -835,8 +839,7 @@
m_editableImageController = std::make_unique<EditableImageController>(*this);
#endif
- if (shouldInitializePage == ShouldInitializeWebPage::Yes)
- initializeWebPage();
+ initializeWebPage(isSwapFromSuspended);
m_inspector->updateForNewPageProcess(this);
@@ -901,12 +904,13 @@
return WTFMove(navigation);
}
-void WebPageProxy::setDrawingArea(std::unique_ptr<DrawingAreaProxy>&& drawingArea)
+void WebPageProxy::initializeWebPage(IsSwapFromSuspended isSwapFromSuspended)
{
- m_drawingArea = WTFMove(drawingArea);
- if (!m_drawingArea)
- return;
+ ASSERT(isValid());
+ m_drawingArea = pageClient().createDrawingAreaProxy();
+ ASSERT(m_drawingArea);
+
#if ENABLE(ASYNC_SCROLLING) && PLATFORM(COCOA)
if (m_drawingArea->type() == DrawingAreaTypeRemoteLayerTree) {
m_scrollingCoordinatorProxy = std::make_unique<RemoteScrollingCoordinatorProxy>(*this);
@@ -916,16 +920,15 @@
#endif
}
#endif
-}
-void WebPageProxy::initializeWebPage()
-{
- ASSERT(isValid());
+ auto parameters = creationParameters();
+ parameters.isSwapFromSuspended = isSwapFromSuspended == IsSwapFromSuspended::Yes;
- setDrawingArea(pageClient().createDrawingAreaProxy());
- ASSERT(m_drawingArea);
+#if ENABLE(SERVICE_WORKER)
+ parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore);
+#endif
- process().send(Messages::WebProcess::CreateWebPage(m_pageID, creationParameters()), 0);
+ process().send(Messages::WebProcess::CreateWebPage(m_pageID, parameters), 0);
m_needsToFinishInitializingWebPageAfterProcessLaunch = true;
finishInitializingWebPageAfterProcessLaunch();
@@ -1077,8 +1080,7 @@
auto transaction = m_pageLoadState.transaction();
auto url = ""
- if (shouldTreatAsContinuingLoad != ShouldTreatAsContinuingLoad::Yes)
- m_pageLoadState.setPendingAPIRequestURL(transaction, url);
+ m_pageLoadState.setPendingAPIRequestURL(transaction, url);
if (!isValid())
reattachToWebProcess();
@@ -1296,10 +1298,6 @@
}
m_process->send(Messages::WebPage::StopLoading(), m_pageID);
- if (m_provisionalPage) {
- m_provisionalPage->cancel();
- m_provisionalPage = nullptr;
- }
m_process->responsivenessTimer().start();
}
@@ -2698,7 +2696,7 @@
}
if (processForNavigation.ptr() != &process()) {
- policyAction = WebPolicyAction::Ignore;
+ policyAction = isPageOpenedByDOMShowingInitialEmptyDocument() ? WebPolicyAction::Ignore : WebPolicyAction::Suspend;
RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "decidePolicyForNavigationAction, swapping process %i with process %i for navigation, reason: %{public}s", processIdentifier(), processForNavigation->processIdentifier(), reason.utf8().data());
LOG(ProcessSwapping, "(ProcessSwapping) Switching from process %i to new process (%i) for navigation %" PRIu64 " '%s'", processIdentifier(), processForNavigation->processIdentifier(), navigation->navigationID(), navigation->loggingString());
} else
@@ -2707,14 +2705,8 @@
bool shouldProcessSwap = processForNavigation.ptr() != &process();
receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? WTF::nullopt : WTFMove(data), WTFMove(sender));
- if (!shouldProcessSwap)
- return;
-
- auto suspendedPage = destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr;
- if (suspendedPage && suspendedPage->failedToSuspend())
- suspendedPage = nullptr;
-
- continueNavigationInNewProcess(navigation, WTFMove(suspendedPage), WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data));
+ if (shouldProcessSwap)
+ continueNavigationInNewProcess(navigation, destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr, WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data));
});
}
@@ -2750,46 +2742,25 @@
sender->send(action, navigation ? navigation->navigationID() : 0, downloadID, WTFMove(websitePolicies));
}
-void WebPageProxy::commitProvisionalPage(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo& certificateInfo, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData& userData)
+void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& process, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies)
{
- ASSERT(m_provisionalPage);
- RELEASE_LOG_IF_ALLOWED(Loading, "commitProvisionalPage: previousPID = %i, newPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_provisionalPage->process().processIdentifier(), m_pageID);
+ RELEASE_LOG_IF_ALLOWED(Loading, "continueNavigationInNewProcess: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID);
+ LOG(Loading, "Continuing navigation %" PRIu64 " '%s' in a new web process", navigation.navigationID(), navigation.loggingString());
+ Ref<WebProcessProxy> previousProcess = m_process.copyRef();
Optional<uint64_t> mainFrameIDInPreviousProcess = m_mainFrame ? makeOptional(m_mainFrame->frameID()) : WTF::nullopt;
+ auto mainFrameURL = m_mainFrame ? m_mainFrame->url() : URL();
- ASSERT(m_process.ptr() != &m_provisionalPage->process());
+ ASSERT(m_process.ptr() != process.ptr());
processDidTerminate(ProcessTerminationReason::NavigationSwap);
m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID);
- auto* navigation = navigationState().navigation(m_provisionalPage->navigationID());
- bool didSuspendPreviousPage = navigation ? suspendCurrentPageIfPossible(*navigation, mainFrameIDInPreviousProcess, m_provisionalPage->processSwapRequestedByClient()) : false;
+ bool didSuspendPreviousPage = suspendCurrentPageIfPossible(navigation, mainFrameIDInPreviousProcess, processSwapRequestedByClient);
m_process->removeWebPage(*this, m_pageID, WebProcessProxy::EndsUsingDataStore::No);
- // There is no way we'll be able to return to the page in the previous page so close it.
- if (!didSuspendPreviousPage)
- m_process->send(Messages::WebPage::Close(), pageID());
+ swapToWebProcess(WTFMove(process), WTFMove(suspendedPageProxy), didSuspendPreviousPage ? IsSwapFromSuspended::Yes : IsSwapFromSuspended::No);
- swapToWebProcess(m_provisionalPage->process(), m_provisionalPage->takeDrawingArea(), m_provisionalPage->mainFrame());
-
- didCommitLoadForFrame(frameID, navigationID, mimeType, frameHasCustomContentProvider, frameLoadType, certificateInfo, containsPluginDocument, forcedHasInsecureContent, userData);
-
- m_provisionalPage = nullptr;
-}
-
-void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies)
-{
- RELEASE_LOG_IF_ALLOWED(Loading, "continueNavigationInNewProcess: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID);
- LOG(Loading, "Continuing navigation %" PRIu64 " '%s' in a new web process", navigation.navigationID(), navigation.loggingString());
-
- if (m_provisionalPage) {
- if (m_provisionalPage->navigationID() != navigation.navigationID())
- m_provisionalPage->cancel();
- m_provisionalPage = nullptr;
- }
-
- m_provisionalPage = std::make_unique<ProvisionalPageProxy>(*this, newProcess.copyRef(), WTFMove(suspendedPageProxy), navigation.navigationID(), navigation.currentRequestIsRedirect(), navigation.currentRequest(), processSwapRequestedByClient);
-
if (auto* item = navigation.targetItem()) {
LOG(Loading, "WebPageProxy %p continueNavigationInNewProcess to back item URL %s", this, item->url().utf8().data());
@@ -2796,7 +2767,17 @@
auto transaction = m_pageLoadState.transaction();
m_pageLoadState.setPendingAPIRequestURL(transaction, item->url());
- m_provisionalPage->goToBackForwardItem(navigation, *item, WTFMove(websitePolicies));
+ auto itemStates = m_backForwardList->filteredItemStates([this, targetItem = item](WebBackForwardListItem& item) {
+ if (auto* page = item.suspendedPage()) {
+ if (&page->process() == m_process.ptr())
+ return false;
+ }
+ return &item != targetItem;
+ });
+ m_process->send(Messages::WebPage::UpdateBackForwardListForReattach(WTFMove(itemStates)), m_pageID);
+ m_process->send(Messages::WebPage::GoToBackForwardItem(navigation.navigationID(), item->itemID(), *navigation.backForwardFrameLoadType(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)), m_pageID);
+ m_process->responsivenessTimer().start();
+
return;
}
@@ -2803,15 +2784,50 @@
if (m_backForwardList->currentItem() && (navigation.lockBackForwardList() == LockBackForwardList::Yes || navigation.lockHistory() == LockHistory::Yes)) {
// If WebCore is supposed to lock the history for this load, then the new process needs to know about the current history item so it can update
// it instead of creating a new one.
- newProcess->send(Messages::WebPage::SetCurrentHistoryItemForReattach(m_backForwardList->currentItem()->itemState()), m_pageID);
+ m_process->send(Messages::WebPage::SetCurrentHistoryItemForReattach(m_backForwardList->currentItem()->itemState()), m_pageID);
}
// FIXME: Work out timing of responding with the last policy delegate, etc
ASSERT(!navigation.currentRequest().isEmpty());
if (auto& substituteData = navigation.substituteData())
- m_provisionalPage->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
- m_provisionalPage->loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, WTFMove(websitePolicies));
+ loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
+
+ ASSERT(!m_mainFrame);
+ m_mainFrameCreationHandler = [this, weakThis = makeWeakPtr(*this), navigationID = navigation.navigationID(), request = navigation.currentRequest(), mainFrameURL, isServerRedirect = navigation.currentRequestIsRedirect()]() mutable {
+ if (!weakThis)
+ return;
+
+ ASSERT(m_mainFrame);
+ // This navigation was destroyed so no need to notify of redirect.
+ if (!navigationState().navigation(navigationID))
+ return;
+
+ // Restore the main frame's committed URL as some clients may rely on it until the next load is committed.
+ m_mainFrame->frameLoadState().setURL(mainFrameURL);
+
+ // Normally, notification of a server redirect comes from the WebContent process.
+ // If we are process swapping in response to a server redirect then that notification will not come from the new WebContent process.
+ // In this case we have the UIProcess synthesize the redirect notification at the appropriate time.
+ if (isServerRedirect) {
+ m_mainFrame->frameLoadState().didStartProvisionalLoad(request.url());
+ didReceiveServerRedirectForProvisionalLoadForFrame(m_mainFrame->frameID(), navigationID, WTFMove(request), { });
+ }
+ };
+
+ if (!m_process->processPool().configuration().processSwapsOnWindowOpenWithOpener() || !isPageOpenedByDOMShowingInitialEmptyDocument() || !mainFrameIDInPreviousProcess) {
+ // There is no way we'll be able to return to the page in the previous page so close it.
+ if (!didSuspendPreviousPage)
+ previousProcess->send(Messages::WebPage::Close(), m_pageID);
+ return;
+ }
+
+ m_mainFrameWindowCreationHandler = [this, previousProcess = WTFMove(previousProcess), mainFrameIDInPreviousProcess = *mainFrameIDInPreviousProcess](const GlobalWindowIdentifier& windowIdentifier) {
+ ASSERT(m_mainFrame);
+ GlobalFrameIdentifier navigatedFrameIdentifierInNewProcess { pageID(), m_mainFrame->frameID() };
+ previousProcess->send(Messages::WebPage::FrameBecameRemote(mainFrameIDInPreviousProcess, navigatedFrameIdentifierInNewProcess, windowIdentifier), pageID());
+ };
}
bool WebPageProxy::isPageOpenedByDOMShowingInitialEmptyDocument() const
@@ -3676,6 +3692,11 @@
// Add the frame to the process wide map.
m_process->frameCreated(frameID, *m_mainFrame);
+
+ if (m_mainFrameCreationHandler) {
+ m_mainFrameCreationHandler();
+ m_mainFrameCreationHandler = nullptr;
+ }
}
void WebPageProxy::didCreateSubframe(uint64_t frameID)
@@ -3700,6 +3721,10 @@
void WebPageProxy::didCreateWindow(uint64_t frameID, GlobalWindowIdentifier&& windowIdentifier)
{
+ if (m_mainFrame && m_mainFrame->frameID() == frameID) {
+ if (auto mainFrameWindowCreationHandler = WTFMove(m_mainFrameWindowCreationHandler))
+ mainFrameWindowCreationHandler(windowIdentifier);
+ }
}
double WebPageProxy::estimatedProgress() const
@@ -3752,10 +3777,6 @@
{
PageClientProtector protector(pageClient());
- // On process-swap, the previous process tries to destroy the navigation but the provisional process is actually taking over the navigation.
- if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID)
- return;
-
// FIXME: Message check the navigationID.
m_navigationState->didDestroyNavigation(navigationID);
}
@@ -3773,6 +3794,14 @@
if (frame->isMainFrame() && navigationID)
navigation = navigationState().navigation(navigationID);
+ // If this seemingly new load is actually continuing a server redirect for a previous navigation in a new process,
+ // then we ignore this notification.
+ if (navigation && navigation->currentRequestIsRedirect()) {
+ auto navigationProcessIdentifier = navigation->currentRequestProcessIdentifier();
+ if (navigationProcessIdentifier && *navigationProcessIdentifier != m_process->coreProcessIdentifier())
+ return;
+ }
+
LOG(Loading, "WebPageProxy %" PRIu64 " in process pid %i didStartProvisionalLoadForFrame to frameID %" PRIu64 ", navigationID %" PRIu64 ", url %s", m_pageID, m_process->processIdentifier(), frameID, navigationID, url.string().utf8().data());
RELEASE_LOG_IF_ALLOWED(Loading, "didStartProvisionalLoadForFrame: webPID = %i, pageID = %" PRIu64 ", frameID = %" PRIu64, m_process->processIdentifier(), m_pageID, frameID);
@@ -3880,11 +3909,6 @@
PageClientProtector protector(pageClient());
- if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID && &m_provisionalPage->process() != m_process.ptr()) {
- // The load did not fail, it is merely happening in a new provisional process.
- return;
- }
-
WebFrameProxy* frame = m_process->webFrame(frameID);
MESSAGE_CHECK(frame);
@@ -3923,10 +3947,6 @@
}
m_failingProvisionalLoadURL = { };
-
- // If the provisional page's load fails then we destroy the provisional page.
- if (m_provisionalPage && m_provisionalPage->mainFrame() == frame)
- m_provisionalPage = nullptr;
}
void WebPageProxy::clearLoadDependentCallbacks()
@@ -4318,8 +4338,8 @@
auto* frame = m_process->webFrame(frameID);
MESSAGE_CHECK(frame);
- decidePolicyForNavigationAction(*frame, WTFMove(frameSecurityOrigin), navigationID, WTFMove(navigationActionData), WTFMove(frameInfoData), originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID, process = m_process.copyRef()] (auto... args) {
- process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
+ decidePolicyForNavigationAction(*frame, WTFMove(frameSecurityOrigin), navigationID, WTFMove(navigationActionData), WTFMove(frameInfoData), originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID] (auto... args) {
+ m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
}));
}
@@ -4518,12 +4538,12 @@
MESSAGE_CHECK_URL(response.url());
RefPtr<API::Navigation> navigation = navigationID ? m_navigationState->navigation(navigationID) : nullptr;
- auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frameID, listenerID, navigation = WTFMove(navigation), process = m_process.copyRef()] (WebPolicyAction policyAction, API::WebsitePolicies*, ProcessSwapRequestedByClient processSwapRequestedByClient, RefPtr<SafeBrowsingWarning>&& safeBrowsingWarning) mutable {
+ auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frameID, listenerID, navigation = WTFMove(navigation)] (WebPolicyAction policyAction, API::WebsitePolicies*, ProcessSwapRequestedByClient processSwapRequestedByClient, RefPtr<SafeBrowsingWarning>&& safeBrowsingWarning) mutable {
// FIXME: Assert the API::WebsitePolicies* is nullptr here once clients of WKFramePolicyListenerUseWithPolicies go away.
RELEASE_ASSERT(processSwapRequestedByClient == ProcessSwapRequestedByClient::No);
ASSERT_UNUSED(safeBrowsingWarning, !safeBrowsingWarning);
- receivedPolicyDecision(policyAction, navigation.get(), WTF::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID, process = WTFMove(process)] (auto... args) {
- process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
+ receivedPolicyDecision(policyAction, navigation.get(), WTF::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID] (auto... args) {
+ m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
}));
}, ShouldExpectSafeBrowsingResult::No));
@@ -6343,13 +6363,6 @@
stopAllURLSchemeTasks();
}
-void WebPageProxy::provisionalProcessDidTerminate()
-{
- ASSERT(m_provisionalPage);
- m_provisionalPage->cancel();
- m_provisionalPage = nullptr;
-}
-
static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason)
{
switch (reason) {
@@ -6437,6 +6450,8 @@
void WebPageProxy::resetState(ResetStateReason resetStateReason)
{
m_mainFrame = nullptr;
+ m_mainFrameCreationHandler = nullptr;
+ m_mainFrameWindowCreationHandler = nullptr;
#if PLATFORM(COCOA)
m_scrollingPerformanceData = nullptr;
@@ -6727,10 +6742,6 @@
parameters.applicationManifest = m_configuration->applicationManifest() ? Optional<WebCore::ApplicationManifest>(m_configuration->applicationManifest()->applicationManifest()) : WTF::nullopt;
#endif
-#if ENABLE(SERVICE_WORKER)
- parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore);
-#endif
-
parameters.needsFontAttributes = m_needsFontAttributes;
m_process->addWebUserContentControllerProxy(m_userContentController, parameters);
@@ -8492,21 +8503,6 @@
m_process->send(Messages::WebPage::SimulateDeviceOrientationChange(alpha, beta, gamma), m_pageID);
}
-WebPageProxy::PageProcessOverride::PageProcessOverride(WebPageProxy& page, WebProcessProxy& newProcess)
- : m_page(&page)
- , m_previousProcess(page.process())
-{
- page.m_process = newProcess;
-}
-
-WebPageProxy::PageProcessOverride::PageProcessOverride(PageProcessOverride&&) = default;
-
-WebPageProxy::PageProcessOverride::~PageProcessOverride()
-{
- if (m_page)
- m_page->m_process = WTFMove(m_previousProcess);
-}
-
#if ENABLE(DATA_DETECTION)
void WebPageProxy::detectDataInAllFrames(WebCore::DataDetectorTypes types, CompletionHandler<void(const DataDetectionResult&)>&& completionHandler)
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -225,7 +225,6 @@
class NativeWebMouseEvent;
class NativeWebWheelEvent;
class PageClient;
-class ProvisionalPageProxy;
class RemoteLayerTreeHost;
class RemoteLayerTreeScrollingPerformanceData;
class RemoteLayerTreeTransaction;
@@ -357,7 +356,7 @@
WebFrameProxy* focusedFrame() const { return m_focusedFrame.get(); }
WebFrameProxy* frameSetLargestFrame() const { return m_frameSetLargestFrame.get(); }
- DrawingAreaProxy* drawingArea() const;
+ DrawingAreaProxy* drawingArea() const { return m_drawingArea.get(); }
WebNavigationState& navigationState() { return *m_navigationState.get(); }
@@ -380,7 +379,6 @@
bool addsVisitedLinks() const { return m_addsVisitedLinks; }
void setAddsVisitedLinks(bool addsVisitedLinks) { m_addsVisitedLinks = addsVisitedLinks; }
- VisitedLinkStore& visitedLinkStore() { return m_visitedLinkStore; }
void exitFullscreenImmediately();
void fullscreenMayReturnToInline();
@@ -460,8 +458,8 @@
API::IconLoadingClient& iconLoadingClient() { return *m_iconLoadingClient; }
void setIconLoadingClient(std::unique_ptr<API::IconLoadingClient>&&);
- void initializeWebPage();
- void setDrawingArea(std::unique_ptr<DrawingAreaProxy>&&);
+ enum class IsSwapFromSuspended { No, Yes };
+ void initializeWebPage(IsSwapFromSuspended = IsSwapFromSuspended::No);
WeakPtr<SecKeyProxyStore> secKeyProxyStore(const WebCore::AuthenticationChallenge&);
@@ -999,7 +997,6 @@
void processDidBecomeUnresponsive();
void processDidBecomeResponsive();
void processDidTerminate(ProcessTerminationReason);
- void provisionalProcessDidTerminate();
void dispatchProcessDidTerminate(ProcessTerminationReason);
void willChangeProcessIsResponsive();
void didChangeProcessIsResponsive();
@@ -1028,19 +1025,6 @@
WebProcessProxy& process() { return m_process; }
ProcessID processIdentifier() const;
- class PageProcessOverride {
- public:
- PageProcessOverride(WebPageProxy&, WebProcessProxy& newProcess);
- PageProcessOverride(PageProcessOverride&&);
- ~PageProcessOverride();
-
- private:
- RefPtr<WebPageProxy> m_page;
- Ref<WebProcessProxy> m_previousProcess;
- };
-
- PageProcessOverride temporarilyOverrideProcess(WebProcessProxy& newProcess) { return PageProcessOverride(*this, newProcess); }
-
WebPreferences& preferences() { return m_preferences; }
void setPreferences(WebPreferences&);
@@ -1430,21 +1414,6 @@
EditableImageController& editableImageController() { return *m_editableImageController; }
#endif
- ProvisionalPageProxy* provisionalPageProxy() const { return m_provisionalPage.get(); }
- void commitProvisionalPage(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo&, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData&);
-
- void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
- void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
- void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&);
-
- void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
- void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
-
- // IPC::MessageReceiver
- // Implemented in generated WebPageProxyMessageReceiver.cpp
- void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
- void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
-
private:
WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&);
void platformInitialize();
@@ -1469,6 +1438,12 @@
void setUserAgent(String&&);
+ // IPC::MessageReceiver
+ // Implemented in generated WebPageProxyMessageReceiver.cpp
+ void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
+ void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
+
+
// IPC::MessageSender
bool sendMessage(std::unique_ptr<IPC::Encoder>, OptionSet<IPC::SendOption>) override;
IPC::Connection* messageSenderConnection() override;
@@ -1490,9 +1465,12 @@
void didCreateSubframe(uint64_t frameID);
void didCreateWindow(uint64_t frameID, WebCore::GlobalWindowIdentifier&&);
+ void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
+ void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&);
void willPerformClientRedirectForFrame(uint64_t frameID, const String& url, double delay, WebCore::LockBackForwardList);
void didCancelClientRedirectForFrame(uint64_t frameID);
void didChangeProvisionalURLForFrame(uint64_t frameID, uint64_t navigationID, URL&&);
+ void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
void didCommitLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo&, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData&);
void didFinishDocumentLoadForFrame(uint64_t frameID, uint64_t navigationID, const UserData&);
void didFinishLoadForFrame(uint64_t frameID, uint64_t navigationID, const UserData&);
@@ -1596,16 +1574,18 @@
void setCanShortCircuitHorizontalWheelEvents(bool canShortCircuitHorizontalWheelEvents) { m_canShortCircuitHorizontalWheelEvents = canShortCircuitHorizontalWheelEvents; }
void reattachToWebProcess();
- void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr<DrawingAreaProxy>&&, RefPtr<WebFrameProxy>&& mainFrame);
+ void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr<SuspendedPageProxy>&&, IsSwapFromSuspended);
void didFailToSuspendAfterProcessSwap();
void didSuspendAfterProcessSwap();
- enum class ShouldInitializeWebPage { No, Yes };
- void finishAttachingToWebProcess(ShouldInitializeWebPage = ShouldInitializeWebPage::Yes);
+ void finishAttachingToWebProcess(IsSwapFromSuspended = IsSwapFromSuspended::No);
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, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
+ void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
+
void requestNotificationPermission(uint64_t notificationID, const String& originString);
void showNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, WebCore::NotificationDirection, const String& originString, uint64_t notificationID);
void cancelNotification(uint64_t notificationID);
@@ -1967,6 +1947,8 @@
Ref<WebsiteDataStore> m_websiteDataStore;
RefPtr<WebFrameProxy> m_mainFrame;
+ Function<void()> m_mainFrameCreationHandler;
+ Function<void(const WebCore::GlobalWindowIdentifier&)> m_mainFrameWindowCreationHandler;
RefPtr<WebFrameProxy> m_focusedFrame;
RefPtr<WebFrameProxy> m_frameSetLargestFrame;
@@ -2336,8 +2318,6 @@
bool m_needsFontAttributes { false };
bool m_mayHaveUniversalFileReadSandboxExtension { false };
- std::unique_ptr<ProvisionalPageProxy> m_provisionalPage;
-
#if HAVE(PENCILKIT)
std::unique_ptr<EditableImageController> m_editableImageController;
#endif
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -34,7 +34,6 @@
#include "Logging.h"
#include "PluginInfoStore.h"
#include "PluginProcessManager.h"
-#include "ProvisionalPageProxy.h"
#include "TextChecker.h"
#include "TextCheckerState.h"
#include "UIMessagePortChannelProvider.h"
@@ -585,15 +584,6 @@
}
#endif
-bool WebProcessProxy::hasProvisionalPageWithID(uint64_t pageID) const
-{
- for (auto* provisionalPage : m_provisionalPages) {
- if (provisionalPage->page().pageID() == pageID)
- return true;
- }
- return false;
-}
-
void WebProcessProxy::updateBackForwardItem(const BackForwardListItemState& itemState)
{
if (auto* item = WebBackForwardListItem::itemForID(itemState.identifier)) {
@@ -601,7 +591,7 @@
// the back/forward items page.
// e.g. The old web process is navigating to about:blank for suspension.
// We ignore these updates.
- if (m_pageMap.contains(item->pageID()) || hasProvisionalPageWithID(item->pageID()))
+ if (m_pageMap.contains(item->pageID()))
item->setPageState(itemState.pageState);
}
}
@@ -704,7 +694,6 @@
webConnection->didClose();
auto pages = copyToVectorOf<RefPtr<WebPageProxy>>(m_pageMap.values());
- auto provisionalPages = WTF::map(m_provisionalPages, [](auto* provisionalPage) { return makeWeakPtr(provisionalPage); });
shutDown();
@@ -719,11 +708,6 @@
for (auto& page : pages)
page->processDidTerminate(ProcessTerminationReason::Crash);
-
- for (auto& provisionalPage : provisionalPages) {
- if (provisionalPage)
- provisionalPage->processDidTerminate();
- }
}
void WebProcessProxy::didReceiveInvalidMessage(IPC::Connection& connection, IPC::StringReference messageReceiverName, IPC::StringReference messageName)
@@ -796,12 +780,6 @@
page->processDidFinishLaunching();
}
- for (auto* provisionalPage : m_provisionalPages) {
- ASSERT(this == &provisionalPage->process());
- provisionalPage->processDidFinishLaunching();
- }
-
-
RELEASE_ASSERT(!m_webConnection);
m_webConnection = WebConnectionToWebProcess::create(this);
@@ -895,7 +873,7 @@
bool WebProcessProxy::canTerminateChildProcess()
{
- if (!m_pageMap.isEmpty() || m_processPool->hasSuspendedPageFor(*this) || !m_provisionalPages.isEmpty())
+ if (!m_pageMap.isEmpty() || m_processPool->hasSuspendedPageFor(*this))
return false;
if (!m_processPool->shouldTerminate(this))
Modified: branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -70,7 +70,6 @@
class NetworkProcessProxy;
class ObjCObjectGraph;
class PageClient;
-class ProvisionalPageProxy;
class UserMediaCaptureManagerProxy;
class VisitedLinkStore;
class WebBackForwardListItem;
@@ -125,9 +124,6 @@
enum class EndsUsingDataStore : bool { No, Yes };
void removeWebPage(WebPageProxy&, uint64_t pageID, EndsUsingDataStore);
- void addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(!m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.add(&provisionalPage); }
- void removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.remove(&provisionalPage); }
-
typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); }
unsigned pageCount() const { return m_pageMap.size(); }
unsigned visiblePageCount() const { return m_visiblePageCounter.value(); }
@@ -334,8 +330,6 @@
void logDiagnosticMessageForResourceLimitTermination(const String& limitKey);
- bool hasProvisionalPageWithID(uint64_t pageID) const;
-
enum class IsWeak { No, Yes };
template<typename T> class WeakOrStrongPtr {
public:
@@ -379,7 +373,6 @@
WebPageProxyMap m_pageMap;
WebFrameProxyMap m_frameMap;
- HashSet<ProvisionalPageProxy*> m_provisionalPages;
UserInitiatedActionMap m_userInitiatedActionMap;
HashSet<VisitedLinkStore*> m_visitedLinkStores;
Modified: branches/safari-607-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2019-01-22 18:34:34 UTC (rev 240262)
@@ -3095,8 +3095,6 @@
466BC0381FA266C9002FA9C1 /* WebSWContextManagerConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSWContextManagerConnection.cpp; sourceTree = "<group>"; };
466BC0391FA266C9002FA9C1 /* WebSWContextManagerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWContextManagerConnection.h; sourceTree = "<group>"; };
466BC03A1FA266C9002FA9C1 /* WebSWContextManagerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWContextManagerConnection.messages.in; sourceTree = "<group>"; };
- 4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProvisionalPageProxy.h; sourceTree = "<group>"; };
- 4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProvisionalPageProxy.cpp; sourceTree = "<group>"; };
46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackgroundProcessResponsivenessTimer.cpp; sourceTree = "<group>"; };
46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackgroundProcessResponsivenessTimer.h; sourceTree = "<group>"; };
46DF06391F3905E5001980BB /* NetworkCORSPreflightChecker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCORSPreflightChecker.cpp; sourceTree = "<group>"; };
@@ -7322,8 +7320,6 @@
86E67A22190F411800004AB7 /* ProcessThrottler.cpp */,
86E67A21190F411800004AB7 /* ProcessThrottler.h */,
83048AE51ACA45DC0082C832 /* ProcessThrottlerClient.h */,
- 4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */,
- 4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */,
A55BA81B1BA25B1E007CD33D /* RemoteWebInspectorProxy.cpp */,
A55BA8191BA25B1E007CD33D /* RemoteWebInspectorProxy.h */,
A55BA81A1BA25B1E007CD33D /* RemoteWebInspectorProxy.messages.in */,
Modified: branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -263,6 +263,8 @@
return WebCore::PolicyAction::Ignore;
case WebPolicyAction::Download:
return WebCore::PolicyAction::Download;
+ case WebPolicyAction::Suspend:
+ break;
}
ASSERT_NOT_REACHED();
return WebCore::PolicyAction::Ignore;
@@ -270,8 +272,11 @@
void WebFrame::didReceivePolicyDecision(uint64_t listenerID, WebPolicyAction action, uint64_t navigationID, DownloadID downloadID, Optional<WebsitePoliciesData>&& websitePolicies)
{
- if (!m_coreFrame || !m_policyListenerID || listenerID != m_policyListenerID || !m_policyFunction)
+ if (!m_coreFrame || !m_policyListenerID || listenerID != m_policyListenerID || !m_policyFunction) {
+ if (action == WebPolicyAction::Suspend)
+ page()->send(Messages::WebPageProxy::DidFailToSuspendAfterProcessSwap());
return;
+ }
FramePolicyFunction function = WTFMove(m_policyFunction);
bool forNavigationAction = m_policyFunctionForNavigationAction == ForNavigationAction::Yes;
@@ -287,7 +292,16 @@
documentLoader->setNavigationID(navigationID);
}
+ bool shouldSuspend = false;
+ if (action == WebPolicyAction::Suspend) {
+ shouldSuspend = true;
+ action = ""
+ }
+
function(toPolicyAction(action));
+
+ if (shouldSuspend)
+ page()->suspendForProcessSwap();
}
void WebFrame::startDownload(const WebCore::ResourceRequest& request, const String& suggestedName)
Modified: branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2019-01-22 18:34:34 UTC (rev 240262)
@@ -402,7 +402,7 @@
, m_overrideContentSecurityPolicy { parameters.overrideContentSecurityPolicy }
, m_cpuLimit(parameters.cpuLimit)
#if PLATFORM(MAC)
- , m_shouldAttachDrawingAreaOnPageTransition(parameters.isProcessSwap)
+ , m_shouldAttachDrawingAreaOnPageTransition(parameters.isSwapFromSuspended)
#endif
{
ASSERT(m_pageID);
@@ -472,8 +472,8 @@
m_drawingArea->setPaintingEnabled(false);
m_drawingArea->setShouldScaleViewToFitDocument(parameters.shouldScaleViewToFitDocument);
- if (parameters.isProcessSwap)
- freezeLayerTree(LayerTreeFreezeReason::ProcessSwap);
+ if (parameters.isSwapFromSuspended)
+ freezeLayerTree(LayerTreeFreezeReason::SwapFromSuspended);
#if ENABLE(ASYNC_SCROLLING)
m_useAsyncScrolling = parameters.store.getBoolValueForKey(WebPreferencesKey::threadedScrollingEnabledKey());
@@ -697,7 +697,7 @@
m_drawingArea->updatePreferences(parameters.store);
m_drawingArea->setPaintingEnabled(true);
#if PLATFORM(MAC)
- m_shouldAttachDrawingAreaOnPageTransition = parameters.isProcessSwap;
+ m_shouldAttachDrawingAreaOnPageTransition = parameters.isSwapFromSuspended;
#endif
unfreezeLayerTree(LayerTreeFreezeReason::PageSuspended);
}
@@ -3056,6 +3056,12 @@
WebFrame* frame = WebProcess::singleton().webFrame(frameID);
if (!frame)
return;
+ if (policyAction == WebPolicyAction::Suspend) {
+ ASSERT(frame == m_mainFrame);
+ setIsSuspended(true);
+
+ WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url());
+ }
frame->didReceivePolicyDecision(listenerID, policyAction, navigationID, downloadID, WTFMove(websitePolicies));
}
@@ -3097,7 +3103,7 @@
bool isInitialEmptyDocument = !m_mainFrame;
if (!isInitialEmptyDocument)
- unfreezeLayerTree(LayerTreeFreezeReason::ProcessSwap);
+ unfreezeLayerTree(LayerTreeFreezeReason::SwapFromSuspended);
#if PLATFORM(MAC)
if (m_shouldAttachDrawingAreaOnPageTransition && !isInitialEmptyDocument) {
@@ -6309,10 +6315,6 @@
if (m_isSuspended) {
// Unfrozen on drawing area reset.
freezeLayerTree(LayerTreeFreezeReason::PageSuspended);
-
- WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url());
-
- suspendForProcessSwap();
} else
m_shouldResetDrawingAreaAfterSuspend = true;
}
Modified: branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.h (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.h 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.h 2019-01-22 18:34:34 UTC (rev 240262)
@@ -696,7 +696,7 @@
ProcessSuspended = 1 << 2,
PageSuspended = 1 << 3,
Printing = 1 << 4,
- ProcessSwap = 1 << 5,
+ SwapFromSuspended = 1 << 5,
};
void freezeLayerTree(LayerTreeFreezeReason);
void unfreezeLayerTree(LayerTreeFreezeReason);
Modified: branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (240261 => 240262)
--- branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2019-01-22 18:34:34 UTC (rev 240262)
@@ -97,7 +97,7 @@
updateLayerHostingContext();
setColorSpace(parameters.colorSpace);
- if (!parameters.isProcessSwap)
+ if (!parameters.isSwapFromSuspended)
attach();
}
Modified: branches/safari-607-branch/Tools/ChangeLog (240261 => 240262)
--- branches/safari-607-branch/Tools/ChangeLog 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Tools/ChangeLog 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,5 +1,61 @@
2019-01-22 Alan Coon <alanc...@apple.com>
+ Cherry-pick r240015. rdar://problem/47099573
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240015 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2019-01-15 Chris Dumez <cdu...@apple.com>
+
+ Unreviewed, rolling out r239993, r239995, r239997, and
+ r239999.
+
+ Caused assertions under
+ ViewGestureController::disconnectFromProcess()
+
+ Reverted changesets:
+
+ "Regression(PSON) View becomes blank after click a cross-site
+ download link"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239993
+
+ "Unreviewed iOS build fix after r239993."
+ https://trac.webkit.org/changeset/239995
+
+ "Fix iOS build after r239993"
+ https://bugs.webkit.org/show_bug.cgi?id=193361
+ https://trac.webkit.org/changeset/239997
+
+ "Unreviewed, revert part of r239997 as it is not needed to fix
+ the build."
+ https://trac.webkit.org/changeset/239999
+
+2019-01-22 Alan Coon <alanc...@apple.com>
+
Cherry-pick r239993. rdar://problem/47099573
Regression(PSON) View becomes blank after click a cross-site download link
Modified: branches/safari-607-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm (240261 => 240262)
--- branches/safari-607-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2019-01-22 18:34:26 UTC (rev 240261)
+++ branches/safari-607-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2019-01-22 18:34:34 UTC (rev 240262)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017-2019 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -72,7 +72,6 @@
static HashSet<pid_t> seenPIDs;
static bool willPerformClientRedirect;
static bool didPerformClientRedirect;
-static bool shouldConvertToDownload;
static RetainPtr<NSURL> clientRedirectSourceURL;
static RetainPtr<NSURL> clientRedirectDestinationURL;
@@ -129,11 +128,6 @@
didRepondToPolicyDecisionCall = true;
}
-- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
-{
- decisionHandler(shouldConvertToDownload ? _WKNavigationResponsePolicyBecomeDownload : WKNavigationResponsePolicyAllow);
-}
-
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation
{
seenPIDs.add([webView _webProcessIdentifier]);
@@ -1411,7 +1405,7 @@
EXPECT_FALSE(serverRedirected);
EXPECT_EQ(3, numberOfDecidePolicyCalls);
- EXPECT_EQ(3u, seenPIDs.size());
+ EXPECT_EQ(2u, seenPIDs.size());
}
TEST(ProcessSwap, ServerRedirect2)
@@ -1473,109 +1467,6 @@
EXPECT_WK_STREQ(@"pson://www.webkit.org/main1.html", [[webView URL] absoluteString]);
}
-static const char* linkToWebKitBytes = R"PSONRESOURCE(
-<body>
- <a id="testLink" href=""
-</body>
-)PSONRESOURCE";
-
-TEST(ProcessSwap, PolicyCancelAfterServerRedirect)
-{
- auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
- processPoolConfiguration.get().processSwapsOnNavigation = YES;
- auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
-
- auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
- [webViewConfiguration setProcessPool:processPool.get()];
- auto handler = adoptNS([[PSONScheme alloc] init]);
- [handler addMappingFromURLString:@"pson://www.google.com/main.html" toData:linkToWebKitBytes];
- [handler addRedirectFromURLString:@"pson://www.webkit.org/main.html" toURLString:@"pson://www.apple.com/ignore.html"];
- [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"pson"];
-
- auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
- auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]);
- [webView setNavigationDelegate:navigationDelegate.get()];
-
- navigationDelegate->decidePolicyForNavigationAction = ^(WKNavigationAction *action, void (^decisionHandler)(WKNavigationActionPolicy)) {
- if ([action.request.URL.absoluteString hasSuffix:@"ignore.html"]) {
- decisionHandler(WKNavigationActionPolicyCancel);
- return;
- }
- decisionHandler(WKNavigationActionPolicyAllow);
- };
-
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.google.com/main.html"]];
- [webView loadRequest:request];
-
- TestWebKitAPI::Util::run(&done);
- done = false;
- auto pidAfterFirstLoad = [webView _webProcessIdentifier];
-
- EXPECT_EQ(1, numberOfDecidePolicyCalls);
-
- [webView evaluateJavaScript:@"testLink.click()" completionHandler:nil];
-
- TestWebKitAPI::Util::run(&failed);
- failed = false;
- done = false;
-
- EXPECT_EQ(3, numberOfDecidePolicyCalls);
-
- // We should still be on google.com.
- EXPECT_EQ(pidAfterFirstLoad, [webView _webProcessIdentifier]);
- EXPECT_WK_STREQ(@"pson://www.google.com/main.html", [[webView URL] absoluteString]);
-
- [webView evaluateJavaScript:@"testLink.innerText" completionHandler: [&] (id innerText, NSError *error) {
- EXPECT_WK_STREQ(@"Link", innerText);
- done = true;
- }];
- TestWebKitAPI::Util::run(&done);
- done = false;
-}
-
-TEST(ProcessSwap, CrossSiteDownload)
-{
- auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
- processPoolConfiguration.get().processSwapsOnNavigation = YES;
- auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
-
- auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
- [webViewConfiguration setProcessPool:processPool.get()];
- auto handler = adoptNS([[PSONScheme alloc] init]);
- [handler addMappingFromURLString:@"pson://www.google.com/main.html" toData:linkToWebKitBytes];
- [handler addMappingFromURLString:@"pson://www.webkit.org/main.html" toData:"Hello"];
- [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"pson"];
-
- auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
- auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]);
- [webView setNavigationDelegate:navigationDelegate.get()];
-
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.google.com/main.html"]];
- [webView loadRequest:request];
-
- TestWebKitAPI::Util::run(&done);
- done = false;
- auto pidAfterFirstLoad = [webView _webProcessIdentifier];
-
- shouldConvertToDownload = true;
- [webView evaluateJavaScript:@"testLink.click()" completionHandler:nil];
-
- TestWebKitAPI::Util::run(&failed);
- failed = false;
- shouldConvertToDownload = false;
-
- // We should still be on google.com.
- EXPECT_EQ(pidAfterFirstLoad, [webView _webProcessIdentifier]);
- EXPECT_WK_STREQ(@"pson://www.google.com/main.html", [[webView URL] absoluteString]);
-
- [webView evaluateJavaScript:@"testLink.innerText" completionHandler: [&] (id innerText, NSError *error) {
- EXPECT_WK_STREQ(@"Link", innerText);
- done = true;
- }];
- TestWebKitAPI::Util::run(&done);
- done = false;
-}
-
enum class ShouldEnablePSON { No, Yes };
static void runClientSideRedirectTest(ShouldEnablePSON shouldEnablePSON)
{
@@ -2341,27 +2232,12 @@
EXPECT_EQ(7u, [receivedMessages count]);
EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow NOT persisted", receivedMessages.get()[0]);
- if ([receivedMessages.get()[1] hasPrefix:@"pson://www.webkit.org/main.html"]) {
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[1]);
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow NOT persisted", receivedMessages.get()[2]);
- } else {
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow NOT persisted", receivedMessages.get()[1]);
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[2]);
- }
- if ([receivedMessages.get()[3] hasPrefix:@"pson://www.apple.com/main.html"]) {
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pagehide persisted", receivedMessages.get()[3]);
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow persisted", receivedMessages.get()[4]);
- } else {
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow persisted", receivedMessages.get()[3]);
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pagehide persisted", receivedMessages.get()[4]);
- }
- if ([receivedMessages.get()[5] hasPrefix:@"pson://www.webkit.org/main.html"]) {
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[5]);
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow persisted", receivedMessages.get()[6]);
- } else {
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow persisted", receivedMessages.get()[5]);
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[6]);
- }
+ EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[1]);
+ EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow NOT persisted", receivedMessages.get()[2]);
+ EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pagehide persisted", receivedMessages.get()[3]);
+ EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow persisted", receivedMessages.get()[4]);
+ EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[5]);
+ EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow persisted", receivedMessages.get()[6]);
}
// Disabling the page cache explicitly is (for some reason) not available on iOS.
@@ -2431,27 +2307,12 @@
EXPECT_EQ(7u, [receivedMessages count]);
EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[0]);
- if ([receivedMessages.get()[1] hasPrefix:@"pson://www.webkit.org/main.html"]) {
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[1]);
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[2]);
- } else {
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[1]);
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[2]);
- }
- if ([receivedMessages.get()[3] hasPrefix:@"pson://www.apple.com/main.html"]) {
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - unload", receivedMessages.get()[3]);
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[4]);
- } else {
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[3]);
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - unload", receivedMessages.get()[4]);
- }
- if ([receivedMessages.get()[5] hasPrefix:@"pson://www.webkit.org/main.html"]) {
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[5]);
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[6]);
- } else {
- EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[5]);
- EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[6]);
- }
+ EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[1]);
+ EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[2]);
+ EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - unload", receivedMessages.get()[3]);
+ EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[4]);
+ EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[5]);
+ EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[6]);
}
TEST(ProcessSwap, WebInspector)