Diff
Modified: trunk/Source/WebKit/ChangeLog (236137 => 236138)
--- trunk/Source/WebKit/ChangeLog 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/ChangeLog 2018-09-18 15:41:31 UTC (rev 236138)
@@ -1,3 +1,96 @@
+2018-09-18 Antti Koivisto <[email protected]>
+
+ REGRESSION (PSON): White or Black flash occurs when process swapping on navigation on Mac
+ https://bugs.webkit.org/show_bug.cgi?id=189663
+ <rdar://problem/44184955>
+
+ Reviewed by Geoff Garen.
+
+ We need to keep the layer tree of the previous page alive and visible until we have something
+ to render on the new page. With PSON on Mac this means that we should keep displaying the
+ layer tree from the previus process.
+
+ This patch moves the management of 'attaching' the drawing area (Mac only concept) from web process
+ to UI process. This is when we parent the layer tree to the view root layer. It also ensures that
+ the layer tree is not deleted too early on process swap and that it still eventually gets deleted.
+
+ * UIProcess/DrawingAreaProxy.h:
+ (WebKit::DrawingAreaProxy::attachInWebProcess):
+ * UIProcess/SuspendedPageProxy.cpp:
+ (WebKit::messageNamesToIgnoreWhileSuspended):
+ (WebKit::SuspendedPageProxy::tearDownDrawingAreaInWebProcess):
+
+ We no longer tear down drawing area (layer tree) for suspended pages automatically. Send an explicit
+ message for it.
+
+ * UIProcess/SuspendedPageProxy.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::reattachToWebProcess):
+
+ Only call didRelaunchProcess when process actually relaunched (not navigation process launch) to
+ match not calling processDidExit in resetStateAfterProcessExited.
+
+ (WebKit::WebPageProxy::didCompletePageTransition):
+
+ Attach the drawing area if appropriate.
+
+ (WebKit::WebPageProxy::decidePolicyForNavigationAction):
+
+ Send suspend message to WebPage immediately instead waiting for the runloop callback. This is needed so we
+ can avoid flashing the initial empty document load when the new Page object is created.
+
+ (WebKit::WebPageProxy::resetStateAfterProcessExited):
+
+ Don't call processDidExit when suspending, not exiting the process (this function needs a new name or rafactoring).
+ This avoids clearing the drawing area and flashing to black.
+
+ (WebKit::WebPageProxy::enterAcceleratedCompositingMode):
+
+ This is called when we have switched to the new layer tree.
+ Tear down the drawing area in the previus process.
+
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.messages.in:
+ * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h:
+ * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
+ (WebKit::TiledCoreAnimationDrawingAreaProxy::attachInWebProcess):
+
+ Send a message to the web process to attach the drawing area.
+
+ * WebProcess/WebPage/DrawingArea.h:
+ (WebKit::DrawingArea::attach):
+ (WebKit::DrawingArea::attachDrawingArea): Deleted.
+
+ Rename to be less redundant.
+
+ * WebProcess/WebPage/DrawingArea.messages.in:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::reinitializeWebPage):
+
+ Don't attach drawing area automatically. It will be done by a message from UI process.
+
+ (WebKit::WebPage::setLayerTreeStateIsFrozen):
+
+ Layer tree is always frozen in a suspended process (if it exists).
+
+ (WebKit::WebPage::didStartPageTransition):
+ (WebKit::WebPage::didCompletePageTransition):
+
+ Notify UI process of transition completion.
+
+ (WebKit::WebPage::setIsSuspended):
+ (WebKit::WebPage::tearDownDrawingAreaForSuspend):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+ * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+ * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+ (WebKit::TiledCoreAnimationDrawingArea::TiledCoreAnimationDrawingArea):
+
+ Don't attach drawing area automatically. It will be done by a message from UI process.
+
+ (WebKit::TiledCoreAnimationDrawingArea::attach):
+ (WebKit::TiledCoreAnimationDrawingArea::attachDrawingArea): Deleted.
+
2018-09-18 Claudio Saavedra <[email protected]>
[WPE] Implement mouse event modifiers
Modified: trunk/Source/WebKit/UIProcess/DrawingAreaProxy.h (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/DrawingAreaProxy.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/DrawingAreaProxy.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -82,6 +82,8 @@
void viewExposedRectChangedTimerFired();
#endif
+ virtual void attachInWebProcess() { }
+
virtual void updateDebugIndicator() { }
virtual void waitForDidUpdateActivityState(ActivityStateChangeID) { }
Modified: trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp 2018-09-18 15:41:31 UTC (rev 236138)
@@ -54,6 +54,7 @@
messageNames.get().add("DidDestroyNavigation");
messageNames.get().add("DidFinishDocumentLoadForFrame");
messageNames.get().add("DidFinishProgress");
+ messageNames.get().add("DidCompletePageTransition");
messageNames.get().add("DidFirstLayoutForFrame");
messageNames.get().add("DidFirstVisuallyNonEmptyLayoutForFrame");
messageNames.get().add("DidNavigateWithNavigationData");
@@ -109,6 +110,11 @@
m_page.suspendedPageClosed(*this);
}
+void SuspendedPageProxy::tearDownDrawingAreaInWebProcess()
+{
+ m_process->send(Messages::WebPage::TearDownDrawingAreaForSuspend(), m_page.pageID());
+}
+
void SuspendedPageProxy::didFinishLoad()
{
ASSERT(m_process);
Modified: trunk/Source/WebKit/UIProcess/SuspendedPageProxy.h (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/SuspendedPageProxy.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/SuspendedPageProxy.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -49,6 +49,7 @@
void webProcessDidClose(WebProcessProxy&);
void destroyWebPageInWebProcess();
+ void tearDownDrawingAreaInWebProcess();
#if !LOG_DISABLED
const char* loggingString() const;
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-09-18 15:41:31 UTC (rev 236138)
@@ -56,8 +56,8 @@
#include "AuthenticationDecisionListener.h"
#include "DataReference.h"
#include "DownloadProxy.h"
+#include "DrawingAreaMessages.h"
#include "DrawingAreaProxy.h"
-#include "DrawingAreaProxyMessages.h"
#include "EventDispatcherMessages.h"
#include "FrameInfoData.h"
#include "LoadParameters.h"
@@ -798,7 +798,9 @@
initializeWebPage();
- pageClient().didRelaunchProcess();
+ if (!navigation)
+ pageClient().didRelaunchProcess();
+
m_drawingArea->waitForBackingStoreUpdateOnNextPaint();
}
@@ -2449,6 +2451,8 @@
if (proposedProcess.ptr() != &process()) {
RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "%p - WebPageProxy::decidePolicyForNavigationAction, swapping process %i with process %i for navigation, reason: %{public}s", this, processIdentifier(), proposedProcess->processIdentifier(), reason.utf8().data());
LOG(ProcessSwapping, "(ProcessSwapping) Switching from process %i to new process (%i) for navigation %" PRIu64 " '%s'", processIdentifier(), proposedProcess->processIdentifier(), navigation->navigationID(), navigation->loggingString());
+
+ process().send(Messages::WebPage::SetIsSuspended(true), pageID());
RunLoop::main().dispatch([this, protectedThis = makeRef(*this), navigation = makeRef(*navigation), proposedProcess = WTFMove(proposedProcess)]() mutable {
continueNavigationInNewProcess(navigation, WTFMove(proposedProcess));
@@ -3445,6 +3449,22 @@
m_pageLoadState.commitChanges();
}
+void WebPageProxy::didCompletePageTransition(bool isInitialEmptyDocument)
+{
+#if PLATFORM(MAC)
+ if (!m_drawingArea)
+ return;
+
+ // Attach drawing area for the initial empty document only if this is not a process swap.
+ if (isInitialEmptyDocument && m_suspendedPage)
+ return;
+
+ m_drawingArea->attachInWebProcess();
+#else
+ UNUSED_PARAM(isInitialEmptyDocument);
+#endif
+}
+
void WebPageProxy::setNetworkRequestsInProgress(bool networkRequestsInProgress)
{
auto transaction = m_pageLoadState.transaction();
@@ -6167,7 +6187,9 @@
m_editorState = EditorState();
- pageClient().processDidExit();
+ if (terminationReason != ProcessTerminationReason::NavigationSwap)
+ pageClient().processDidExit();
+
pageClient().clearAllEditCommands();
auto resetStateReason = terminationReason == ProcessTerminationReason::NavigationSwap ? ResetStateReason::NavigationSwap : ResetStateReason::WebProcessExited;
@@ -6308,6 +6330,10 @@
void WebPageProxy::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
{
pageClient().enterAcceleratedCompositingMode(layerTreeContext);
+
+ // We have completed the page transition and can tear down the layers in the suspended process.
+ if (m_suspendedPage)
+ m_suspendedPage->tearDownDrawingAreaInWebProcess();
}
void WebPageProxy::exitAcceleratedCompositingMode()
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -1423,6 +1423,7 @@
void didStartProgress();
void didChangeProgress(double);
void didFinishProgress();
+ void didCompletePageTransition(bool isInitialEmptyDocument);
void setNetworkRequestsInProgress(bool);
void hasInsecureContent(WebCore::HasInsecureContent&);
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in 2018-09-18 15:41:31 UTC (rev 236138)
@@ -117,6 +117,8 @@
DidFinishProgress()
DidStartProgress()
+ DidCompletePageTransition(bool isInitialEmptyDocument)
+
SetNetworkRequestsInProgress(bool networkRequestsInProgress)
# Frame lifetime messages
Modified: trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -38,6 +38,8 @@
private:
// DrawingAreaProxy
+ void attachInWebProcess() override;
+
void deviceScaleFactorDidChange() override;
void sizeDidChange() override;
void colorSpaceDidChange() override;
Modified: trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm (236137 => 236138)
--- trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm 2018-09-18 15:41:31 UTC (rev 236138)
@@ -53,6 +53,11 @@
m_callbacks.invalidate(CallbackBase::Error::OwnerWasInvalidated);
}
+void TiledCoreAnimationDrawingAreaProxy::attachInWebProcess()
+{
+ m_webPageProxy.process().send(Messages::DrawingArea::Attach(), m_webPageProxy.pageID());
+}
+
void TiledCoreAnimationDrawingAreaProxy::deviceScaleFactorDidChange()
{
m_webPageProxy.process().send(Messages::DrawingArea::SetDeviceScaleFactor(m_webPageProxy.deviceScaleFactor()), m_webPageProxy.pageID());
Modified: trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.h (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -151,7 +151,7 @@
void displayWasRefreshed();
#endif
- virtual void attachDrawingArea() { };
+ virtual void attach() { };
protected:
DrawingArea(DrawingAreaType, WebPage&);
Modified: trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.messages.in (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.messages.in 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.messages.in 2018-09-18 15:41:31 UTC (rev 236138)
@@ -45,7 +45,11 @@
DestroyNativeSurfaceHandleForCompositing() -> (bool handled)
#endif
-#if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
+#if PLATFORM(MAC)
+ Attach()
+
+#if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
DisplayWasRefreshed()
#endif
+#endif
}
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-09-18 15:41:31 UTC (rev 236138)
@@ -657,7 +657,6 @@
m_drawingArea->updatePreferences(parameters.store);
m_drawingArea->setPaintingEnabled(true);
}
- m_drawingArea->attachDrawingArea();
if (m_activityState != parameters.activityState)
setActivityState(parameters.activityState, ActivityStateChangeAsynchronous, Vector<CallbackID>());
@@ -2215,7 +2214,7 @@
if (!drawingArea)
return;
- drawingArea->setLayerTreeStateIsFrozen(frozen);
+ drawingArea->setLayerTreeStateIsFrozen(frozen || m_isSuspended);
}
void WebPage::callVolatilityCompletionHandlers(bool succeeded)
@@ -2846,7 +2845,7 @@
void WebPage::didStartPageTransition()
{
- m_drawingArea->setLayerTreeStateIsFrozen(true);
+ setLayerTreeStateIsFrozen(true);
#if PLATFORM(MAC)
bool hasPreviouslyFocusedDueToUserInteraction = m_hasEverFocusedElementDueToUserInteractionSincePageTransition;
@@ -2870,8 +2869,11 @@
void WebPage::didCompletePageTransition()
{
- if (m_drawingArea)
- m_drawingArea->setLayerTreeStateIsFrozen(false);
+ // FIXME: Layer tree freezing should be managed entirely in the UI process side.
+ setLayerTreeStateIsFrozen(false);
+
+ bool isInitialEmptyDocument = !m_mainFrame;
+ send(Messages::WebPageProxy::DidCompletePageTransition(isInitialEmptyDocument));
}
void WebPage::show()
@@ -6000,10 +6002,22 @@
return;
m_isSuspended = suspended;
- if (m_isSuspended)
- m_drawingArea = nullptr;
+
+#if PLATFORM(MAC)
+ // Drawing area is cleared by a message from the UI process.
+ setLayerTreeStateIsFrozen(true);
+#else
+ tearDownDrawingAreaForSuspend();
+#endif
}
+void WebPage::tearDownDrawingAreaForSuspend()
+{
+ if (!m_isSuspended)
+ return;
+ m_drawingArea = nullptr;
+}
+
void WebPage::frameBecameRemote(uint64_t frameID, GlobalFrameIdentifier&& remoteFrameIdentifier, GlobalWindowIdentifier&& remoteWindowIdentifier)
{
RefPtr<WebFrame> frame = WebProcess::singleton().webFrame(frameID);
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -1414,6 +1414,7 @@
void urlSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceError&);
void setIsSuspended(bool);
+ void tearDownDrawingAreaForSuspend();
RefPtr<WebImage> snapshotAtSize(const WebCore::IntRect&, const WebCore::IntSize& bitmapSize, SnapshotOptions);
RefPtr<WebImage> snapshotNode(WebCore::Node&, SnapshotOptions, unsigned maximumPixelCount = std::numeric_limits<unsigned>::max());
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-09-18 15:41:31 UTC (rev 236138)
@@ -506,6 +506,7 @@
URLSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceError error)
SetIsSuspended(bool suspended)
+ TearDownDrawingAreaForSuspend();
#if HAVE(CFNETWORK_STORAGE_PARTITIONING)
StorageAccessResponse(bool wasGranted, uint64_t contextId)
Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h 2018-09-18 15:41:31 UTC (rev 236138)
@@ -103,7 +103,7 @@
void addTransactionCallbackID(CallbackID) override;
void setShouldScaleViewToFitDocument(bool) override;
- void attachDrawingArea() override;
+ void attach() override;
void adjustTransientZoom(double scale, WebCore::FloatPoint origin) override;
void commitTransientZoom(double scale, WebCore::FloatPoint origin) override;
Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (236137 => 236138)
--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2018-09-18 15:40:14 UTC (rev 236137)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2018-09-18 15:41:31 UTC (rev 236138)
@@ -91,8 +91,6 @@
updateLayerHostingContext();
setColorSpace(parameters.colorSpace);
-
- attachDrawingArea();
}
TiledCoreAnimationDrawingArea::~TiledCoreAnimationDrawingArea()
@@ -101,7 +99,7 @@
}
-void TiledCoreAnimationDrawingArea::attachDrawingArea()
+void TiledCoreAnimationDrawingArea::attach()
{
LayerTreeContext layerTreeContext;
layerTreeContext.contextID = m_layerHostingContext->contextID();