Diff
Modified: trunk/Source/WebKit/ChangeLog (233780 => 233781)
--- trunk/Source/WebKit/ChangeLog 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/ChangeLog 2018-07-12 21:24:38 UTC (rev 233781)
@@ -1,3 +1,93 @@
+2018-07-12 Said Abou-Hallawa <sabouhall...@apple.com>
+
+ [iOS] When bringing MobileSafari to the foreground, images are drawn asynchronously after removing a snapshot that included them
+ https://bugs.webkit.org/show_bug.cgi?id=187374
+ <rdar://problem/41249545>
+
+ Reviewed by Tim Horton.
+
+ UIProcess should block committing all the layer tree transactions for
+ immediate update until it receives a one whose activityStateChangeID is
+ greater than or equal to the one it sends with SetActivityState message.
+
+ * Scripts/webkit/messages.py:
+ Fix the messages code generator to include DrawingAreaInfo.h for the WebKit
+ typedef ActivityStateChangeID.
+
+ * Shared/DrawingAreaInfo.h:
+ Define ActivityStateChangeID to be uint64_t. Add a definition for the case
+ when the UIProcess won't be blocked for a reply back from the WebProcess.
+
+ * Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h:
+ (WebKit::RemoteLayerTreeTransaction::activityStateChangeID const):
+ (WebKit::RemoteLayerTreeTransaction::setActivityStateChangeID):
+ Add a member for activityStateChangeID in the LayerTreeTransaction.
+
+ * Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm:
+ (WebKit::RemoteLayerTreeTransaction::encode const):
+ (WebKit::RemoteLayerTreeTransaction::decode):
+ Make LayerTreeTransaction know how to encode and decode activityStateChangeID.
+
+ * UIProcess/DrawingAreaProxy.h:
+ (WebKit::DrawingAreaProxy::waitForDidUpdateActivityState):
+ * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h:
+ * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm:
+ (WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
+ (WebKit::RemoteLayerTreeDrawingAreaProxy::waitForDidUpdateActivityState):
+ Make the DrawingArea in the UIProcess wait the layer tree with a certain
+ activityStateChangeID.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::dispatchActivityStateChange):
+ (WebKit::WebPageProxy::waitForDidUpdateActivityState):
+ If m_activityStateChangeWantsSynchronousReply is true, generate a new
+ activityStateChangeID and send it in the SetActivityState message.
+
+ * UIProcess/WebPageProxy.h:
+ (WebKit::WebPageProxy::takeNextActivityStateChangeID):
+ A simple way to generate a new activityStateChangeID.
+
+ * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h:
+ * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm:
+ (WebKit::TiledCoreAnimationDrawingAreaProxy::waitForDidUpdateActivityState):
+ Fix the UIProcess functions' prototype for Mac.
+
+ * WebProcess/WebPage/AcceleratedDrawingArea.cpp:
+ (WebKit::AcceleratedDrawingArea::activityStateDidChange):
+ * WebProcess/WebPage/AcceleratedDrawingArea.h:
+ Fix the UIProcess functions' prototype for GTK.
+
+ * WebProcess/WebPage/DrawingArea.h:
+ (WebKit::DrawingArea::activityStateDidChange):
+ * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
+ Replace wantsDidUpdateActivityState with activityStateChangeID. Treat
+ activityStateChangeID == ActivityStateChangeAsynchronous as if
+ wantsDidUpdateActivityState == false.
+
+ * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
+ (WebKit::RemoteLayerTreeDrawingArea::flushLayers):
+ Make the WebPrcess pass the activityStateChangeID which it receives from
+ the SetActivityState message to the LayerTreeTransaction.
+
+ (WebKit::RemoteLayerTreeDrawingArea::activityStateDidChange):
+ When receiving the SetActivityState, treat activityStateChangeID !=
+ ActivityStateChangeAsynchronous as if wantsDidUpdateActivityState == true.
+
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::reinitializeWebPage):
+ (WebKit::WebPage::setActivityState):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+ Replace the boolean wantsDidUpdateActivityState with activityStateChangeID
+ in the SetActivityState message.
+
+ * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+ * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+ (WebKit::TiledCoreAnimationDrawingArea::TiledCoreAnimationDrawingArea):
+ (WebKit::TiledCoreAnimationDrawingArea::activityStateDidChange):
+ (WebKit::TiledCoreAnimationDrawingArea::didUpdateActivityStateTimerFired):
+ Fix the WebProcess functions' prototype for Mac.
+
2018-07-12 Antti Koivisto <an...@apple.com>
REGRESSION (r232356): After zooming a page in and out, it's possible to temporarily have missing tiles (google.com, apple.com)
Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (233780 => 233781)
--- trunk/Source/WebKit/Scripts/webkit/messages.py 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py 2018-07-12 21:24:38 UTC (rev 233781)
@@ -196,6 +196,7 @@
'WebCore::ServiceWorkerOrClientIdentifier',
'WebCore::ServiceWorkerRegistrationIdentifier',
'WebCore::SWServerConnectionIdentifier',
+ 'WebKit::ActivityStateChangeID',
'WebKit::UserContentControllerIdentifier',
])
@@ -416,6 +417,7 @@
'WebCore::TextIndicatorData': ['<WebCore/TextIndicator.h>'],
'WebCore::ViewportAttributes': ['<WebCore/ViewportArguments.h>'],
'WebCore::SelectionRect': ['"EditorState.h"'],
+ 'WebKit::ActivityStateChangeID': ['"DrawingAreaInfo.h"'],
'WebKit::BackForwardListItemState': ['"SessionState.h"'],
'WebKit::LayerHostingMode': ['"LayerTreeContext.h"'],
'WebKit::PageState': ['"SessionState.h"'],
Modified: trunk/Source/WebKit/Shared/DrawingAreaInfo.h (233780 => 233781)
--- trunk/Source/WebKit/Shared/DrawingAreaInfo.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/Shared/DrawingAreaInfo.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -23,8 +23,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef DrawingAreaType_h
-#define DrawingAreaType_h
+#pragma once
namespace WebKit {
@@ -38,7 +37,10 @@
DrawingAreaTypeImpl
#endif
};
+
+enum {
+ ActivityStateChangeAsynchronous = 0
+};
+typedef uint64_t ActivityStateChangeID;
} // namespace WebKit
-
-#endif // DrawingAreaType_h
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h (233780 => 233781)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -25,6 +25,7 @@
#pragma once
+#include "DrawingAreaInfo.h"
#include "DynamicViewportSizeUpdate.h"
#include "EditorState.h"
#include "GenericCallback.h"
@@ -261,6 +262,9 @@
uint64_t transactionID() const { return m_transactionID; }
void setTransactionID(uint64_t transactionID) { m_transactionID = transactionID; }
+ ActivityStateChangeID activityStateChangeID() const { return m_activityStateChangeID; }
+ void setActivityStateChangeID(ActivityStateChangeID activityStateChangeID) { m_activityStateChangeID = activityStateChangeID; }
+
typedef CallbackID TransactionCallbackID;
const Vector<TransactionCallbackID>& callbackIDs() const { return m_callbackIDs; }
void setCallbackIDs(Vector<TransactionCallbackID>&& callbackIDs) { m_callbackIDs = WTFMove(callbackIDs); }
@@ -301,6 +305,7 @@
double m_viewportMetaTagWidth { -1 };
uint64_t m_renderTreeSize { 0 };
uint64_t m_transactionID { 0 };
+ ActivityStateChangeID m_activityStateChangeID { ActivityStateChangeAsynchronous };
WebCore::LayoutMilestones m_newlyReachedLayoutMilestones { 0 };
bool m_scaleWasSetByUIProcess { false };
bool m_allowsUserScaling { false };
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm (233780 => 233781)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm 2018-07-12 21:24:38 UTC (rev 233781)
@@ -544,6 +544,7 @@
encoder << m_renderTreeSize;
encoder << m_transactionID;
+ encoder << m_activityStateChangeID;
encoder << m_newlyReachedLayoutMilestones;
@@ -653,6 +654,9 @@
if (!decoder.decode(result.m_transactionID))
return false;
+ if (!decoder.decode(result.m_activityStateChangeID))
+ return false;
+
if (!decoder.decode(result.m_newlyReachedLayoutMilestones))
return false;
Modified: trunk/Source/WebKit/UIProcess/DrawingAreaProxy.h (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/DrawingAreaProxy.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/DrawingAreaProxy.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -84,7 +84,7 @@
virtual void updateDebugIndicator() { }
- virtual void waitForDidUpdateActivityState() { }
+ virtual void waitForDidUpdateActivityState(ActivityStateChangeID) { }
virtual void dispatchAfterEnsuringDrawing(WTF::Function<void (CallbackBase::Error)>&&) { ASSERT_NOT_REACHED(); }
Modified: trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -82,7 +82,7 @@
void updateDebugIndicatorPosition();
void initializeDebugIndicator();
- void waitForDidUpdateActivityState() override;
+ void waitForDidUpdateActivityState(ActivityStateChangeID) override;
void hideContentUntilPendingUpdate() override;
void hideContentUntilAnyUpdate() override;
bool hasVisibleContent() const override;
@@ -115,6 +115,7 @@
uint64_t m_lastVisibleTransactionID { 0 };
uint64_t m_transactionIDForPendingCACommit { 0 };
uint64_t m_transactionIDForUnhidingContent { 0 };
+ ActivityStateChangeID m_activityStateChangeID { ActivityStateChangeAsynchronous };
CallbackMap m_callbacks;
Modified: trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm 2018-07-12 21:24:38 UTC (rev 233781)
@@ -190,6 +190,7 @@
ASSERT(layerTreeTransaction.transactionID() == m_lastVisibleTransactionID + 1);
m_transactionIDForPendingCACommit = layerTreeTransaction.transactionID();
+ m_activityStateChangeID = layerTreeTransaction.activityStateChangeID();
if (layerTreeTransaction.hasEditorState())
m_webPageProxy.editorStateChanged(layerTreeTransaction.editorState());
@@ -429,8 +430,10 @@
m_webPageProxy.didUpdateActivityState();
}
-void RemoteLayerTreeDrawingAreaProxy::waitForDidUpdateActivityState()
+void RemoteLayerTreeDrawingAreaProxy::waitForDidUpdateActivityState(ActivityStateChangeID activityStateChangeID)
{
+ ASSERT(activityStateChangeID != ActivityStateChangeAsynchronous);
+
// We must send the didUpdate message before blocking on the next commit, otherwise
// we can be guaranteed that the next commit won't come until after the waitForAndDispatchImmediately times out.
if (m_didUpdateMessageState != DoesNotNeedDidUpdate)
@@ -446,7 +449,12 @@
return Seconds::fromMilliseconds(250);
#endif
}();
- m_webPageProxy.process().connection()->waitForAndDispatchImmediately<Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTree>(m_webPageProxy.pageID(), activityStateUpdateTimeout, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
+
+ auto startTime = MonotonicTime::now();
+ while (m_webPageProxy.process().connection()->waitForAndDispatchImmediately<Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTree>(m_webPageProxy.pageID(), activityStateUpdateTimeout - (MonotonicTime::now() - startTime), IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives)) {
+ if (activityStateChangeID == ActivityStateChangeAsynchronous || activityStateChangeID <= m_activityStateChangeID)
+ return;
+ }
}
void RemoteLayerTreeDrawingAreaProxy::dispatchAfterEnsuringDrawing(WTF::Function<void (CallbackBase::Error)>&& callbackFunction)
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-07-12 21:24:38 UTC (rev 233781)
@@ -1590,9 +1590,11 @@
if (!(m_activityState & ActivityState::IsVisible))
m_activityStateChangeWantsSynchronousReply = false;
- if (changed || m_activityStateChangeWantsSynchronousReply || !m_nextActivityStateChangeCallbacks.isEmpty())
- m_process->send(Messages::WebPage::SetActivityState(m_activityState, m_activityStateChangeWantsSynchronousReply, m_nextActivityStateChangeCallbacks), m_pageID);
+ auto activityStateChangeID = m_activityStateChangeWantsSynchronousReply ? takeNextActivityStateChangeID() : ActivityStateChangeAsynchronous;
+ if (changed || activityStateChangeID != ActivityStateChangeAsynchronous || !m_nextActivityStateChangeCallbacks.isEmpty())
+ m_process->send(Messages::WebPage::SetActivityState(m_activityState, activityStateChangeID, m_nextActivityStateChangeCallbacks), m_pageID);
+
m_nextActivityStateChangeCallbacks.clear();
// This must happen after the SetActivityState message is sent, to ensure the page visibility event can fire.
@@ -1626,8 +1628,8 @@
updateBackingStoreDiscardableState();
- if (m_activityStateChangeWantsSynchronousReply)
- waitForDidUpdateActivityState();
+ if (activityStateChangeID != ActivityStateChangeAsynchronous)
+ waitForDidUpdateActivityState(activityStateChangeID);
m_potentiallyChangedActivityStateFlags = ActivityState::NoFlags;
m_activityStateChangeWantsSynchronousReply = false;
@@ -1697,7 +1699,7 @@
m_process->send(Messages::WebPage::SetLayerHostingMode(layerHostingMode), m_pageID);
}
-void WebPageProxy::waitForDidUpdateActivityState()
+void WebPageProxy::waitForDidUpdateActivityState(ActivityStateChangeID activityStateChangeID)
{
if (!isValid())
return;
@@ -1720,7 +1722,7 @@
m_waitingForDidUpdateActivityState = true;
- m_drawingArea->waitForDidUpdateActivityState();
+ m_drawingArea->waitForDidUpdateActivityState(activityStateChangeID);
}
IntSize WebPageProxy::viewSize() const
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -505,7 +505,7 @@
enum class ActivityStateChangeDispatchMode { Deferrable, Immediate };
void activityStateDidChange(WebCore::ActivityState::Flags mayHaveChanged, bool wantsSynchronousReply = false, ActivityStateChangeDispatchMode = ActivityStateChangeDispatchMode::Deferrable);
bool isInWindow() const { return m_activityState & WebCore::ActivityState::IsInWindow; }
- void waitForDidUpdateActivityState();
+ void waitForDidUpdateActivityState(ActivityStateChangeID);
void didUpdateActivityState() { m_waitingForDidUpdateActivityState = false; }
void layerHostingModeDidChange();
@@ -1127,6 +1127,11 @@
void setOverlayScrollbarStyle(std::optional<WebCore::ScrollbarOverlayStyle>);
std::optional<WebCore::ScrollbarOverlayStyle> overlayScrollbarStyle() const { return m_scrollbarOverlayStyle; }
+ // When the state of the window changes such that the WebPage needs immediate update, the UIProcess sends a new
+ // ActivityStateChangeID to the WebProcess through the SetActivityState message. The UIProcess will wait till it
+ // receives a CommitLayerTree which has an ActivityStateChangeID equal to or greater than the one it sent.
+ ActivityStateChangeID takeNextActivityStateChangeID() { return ++m_currentActivityStateChangeID; }
+
bool shouldRecordNavigationSnapshots() const { return m_shouldRecordNavigationSnapshots; }
void setShouldRecordNavigationSnapshots(bool shouldRecordSnapshots) { m_shouldRecordNavigationSnapshots = shouldRecordSnapshots; }
void recordAutomaticNavigationSnapshot();
@@ -2141,6 +2146,7 @@
std::optional<WebCore::ScrollbarOverlayStyle> m_scrollbarOverlayStyle;
uint64_t m_navigationID { 0 };
+ ActivityStateChangeID m_currentActivityStateChangeID { ActivityStateChangeAsynchronous };
WebPreferencesStore::ValueMap m_configurationPreferenceValues;
WebCore::ActivityState::Flags m_potentiallyChangedActivityStateFlags { WebCore::ActivityState::NoFlags };
@@ -2193,7 +2199,6 @@
RunLoop::Timer<WebPageProxy> m_resetRecentCrashCountTimer;
unsigned m_recentCrashCount { 0 };
-
};
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -50,7 +50,7 @@
void adjustTransientZoom(double scale, WebCore::FloatPoint origin) override;
void commitTransientZoom(double scale, WebCore::FloatPoint origin) override;
- void waitForDidUpdateActivityState() override;
+ void waitForDidUpdateActivityState(ActivityStateChangeID) override;
void dispatchAfterEnsuringDrawing(WTF::Function<void (CallbackBase::Error)>&&) override;
void dispatchPresentationCallbacksAfterFlushingLayers(const Vector<CallbackID>&) final;
Modified: trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm (233780 => 233781)
--- trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm 2018-07-12 21:24:38 UTC (rev 233781)
@@ -120,7 +120,7 @@
sendUpdateGeometry();
}
-void TiledCoreAnimationDrawingAreaProxy::waitForDidUpdateActivityState()
+void TiledCoreAnimationDrawingAreaProxy::waitForDidUpdateActivityState(ActivityStateChangeID)
{
Seconds activityStateUpdateTimeout = Seconds::fromMilliseconds(250);
m_webPageProxy.process().connection()->waitForAndDispatchImmediately<Messages::WebPageProxy::DidUpdateActivityState>(m_webPageProxy.pageID(), activityStateUpdateTimeout, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives);
Modified: trunk/Source/WebKit/WebProcess/WebPage/AcceleratedDrawingArea.cpp (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/AcceleratedDrawingArea.cpp 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/AcceleratedDrawingArea.cpp 2018-07-12 21:24:38 UTC (rev 233781)
@@ -455,7 +455,7 @@
}
#endif
-void AcceleratedDrawingArea::activityStateDidChange(ActivityState::Flags changed, bool, const Vector<CallbackID>&)
+void AcceleratedDrawingArea::activityStateDidChange(ActivityState::Flags changed, ActivityStateChangeID, const Vector<CallbackID>&)
{
if (changed & ActivityState::IsVisible) {
if (m_webPage.isVisible())
Modified: trunk/Source/WebKit/WebProcess/WebPage/AcceleratedDrawingArea.h (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/AcceleratedDrawingArea.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/AcceleratedDrawingArea.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -68,7 +68,7 @@
void destroyNativeSurfaceHandleForCompositing(bool&) override;
#endif
- void activityStateDidChange(WebCore::ActivityState::Flags, bool /* wantsDidUpdateActivityState */, const Vector<CallbackID>& /* callbackIDs */) override;
+ void activityStateDidChange(WebCore::ActivityState::Flags, ActivityStateChangeID, const Vector<CallbackID>& /* callbackIDs */) override;
void attachViewOverlayGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*) override;
void layerHostDidFlushLayers() override;
Modified: trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.h (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/DrawingArea.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -119,7 +119,7 @@
virtual void dispatchAfterEnsuringUpdatedScrollPosition(WTF::Function<void ()>&&);
- virtual void activityStateDidChange(WebCore::ActivityState::Flags, bool /* wantsDidUpdateActivityState */, const Vector<CallbackID>&) { }
+ virtual void activityStateDidChange(WebCore::ActivityState::Flags, ActivityStateChangeID, const Vector<CallbackID>&) { }
virtual void setLayerHostingMode(LayerHostingMode) { }
virtual bool markLayersVolatileImmediatelyIfPossible() { return true; }
Modified: trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -102,7 +102,7 @@
void mainFrameContentSizeChanged(const WebCore::IntSize&) override;
- void activityStateDidChange(WebCore::ActivityState::Flags changed, bool wantsDidUpdateActivityState, const Vector<CallbackID>& callbackIDs) override;
+ void activityStateDidChange(WebCore::ActivityState::Flags changed, ActivityStateChangeID, const Vector<CallbackID>& callbackIDs) override;
bool adjustLayerFlushThrottling(WebCore::LayerFlushThrottleState::Flags) override;
@@ -163,6 +163,7 @@
uint64_t m_currentTransactionID { 0 };
Vector<RemoteLayerTreeTransaction::TransactionCallbackID> m_pendingCallbackIDs;
+ ActivityStateChangeID m_activityStateChangeID { ActivityStateChangeAsynchronous };
WebCore::LayoutMilestones m_pendingNewlyReachedLayoutMilestones { 0 };
Modified: trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm 2018-07-12 21:24:38 UTC (rev 233781)
@@ -372,6 +372,9 @@
layerTransaction.setNewlyReachedLayoutMilestones(m_pendingNewlyReachedLayoutMilestones);
m_pendingNewlyReachedLayoutMilestones = 0;
+ layerTransaction.setActivityStateChangeID(m_activityStateChangeID);
+ m_activityStateChangeID = ActivityStateChangeAsynchronous;
+
RemoteScrollingCoordinatorTransaction scrollingTransaction;
#if ENABLE(ASYNC_SCROLLING)
if (m_webPage.scrollingCoordinator())
@@ -482,12 +485,13 @@
m_connection->sendMessage(WTFMove(m_commitEncoder), { });
}
-void RemoteLayerTreeDrawingArea::activityStateDidChange(ActivityState::Flags, bool wantsDidUpdateActivityState, const Vector<CallbackID>&)
+void RemoteLayerTreeDrawingArea::activityStateDidChange(ActivityState::Flags, ActivityStateChangeID activityStateChangeID, const Vector<CallbackID>&)
{
// FIXME: Should we suspend painting while not visible, like TiledCoreAnimationDrawingArea? Probably.
- if (wantsDidUpdateActivityState) {
+ if (activityStateChangeID != ActivityStateChangeAsynchronous) {
m_nextFlushIsForImmediatePaint = true;
+ m_activityStateChangeID = activityStateChangeID;
scheduleCompositingLayerFlushImmediately();
}
}
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-07-12 21:24:38 UTC (rev 233781)
@@ -656,7 +656,7 @@
m_drawingArea->attachDrawingArea();
if (m_activityState != parameters.activityState)
- setActivityState(parameters.activityState, false, Vector<CallbackID>());
+ setActivityState(parameters.activityState, ActivityStateChangeAsynchronous, Vector<CallbackID>());
if (m_layerHostingMode != parameters.layerHostingMode)
setLayerHostingMode(parameters.layerHostingMode);
}
@@ -2785,7 +2785,7 @@
}
}
-void WebPage::setActivityState(ActivityState::Flags activityState, bool wantsDidUpdateActivityState, const Vector<CallbackID>& callbackIDs)
+void WebPage::setActivityState(ActivityState::Flags activityState, ActivityStateChangeID activityStateChangeID, const Vector<CallbackID>& callbackIDs)
{
ActivityState::Flags changed = m_activityState ^ activityState;
m_activityState = activityState;
@@ -2801,7 +2801,7 @@
for (auto* pluginView : m_pluginViews)
pluginView->activityStateDidChange(changed);
- m_drawingArea->activityStateDidChange(changed, wantsDidUpdateActivityState, callbackIDs);
+ m_drawingArea->activityStateDidChange(changed, activityStateChangeID, callbackIDs);
WebProcess::singleton().pageActivityStateDidChange(m_pageID, changed);
if (changed & ActivityState::IsInWindow)
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -33,6 +33,7 @@
#include "APIInjectedBundlePageUIClient.h"
#include "APIObject.h"
#include "CallbackID.h"
+#include "DrawingAreaInfo.h"
#include "EditingRange.h"
#include "InjectedBundlePageContextMenuClient.h"
#include "InjectedBundlePageFullScreenClient.h"
@@ -1167,7 +1168,7 @@
void setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent&, CallbackID);
void updateIsInWindow(bool isInitialState = false);
void visibilityDidChange();
- void setActivityState(WebCore::ActivityState::Flags, bool wantsDidUpdateActivityState, const Vector<CallbackID>& callbackIDs);
+ void setActivityState(WebCore::ActivityState::Flags, ActivityStateChangeID, const Vector<CallbackID>& callbackIDs);
void validateCommand(const String&, CallbackID);
void executeEditCommand(const String&, const String&);
void setEditable(bool);
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-07-12 21:24:38 UTC (rev 233781)
@@ -22,7 +22,7 @@
messages -> WebPage LegacyReceiver {
SetInitialFocus(bool forward, bool isKeyboardEventValid, WebKit::WebKeyboardEvent event, WebKit::CallbackID callbackID)
- SetActivityState(unsigned activityState, bool wantsDidUpdateActivityState, Vector<WebKit::CallbackID> callbackIDs)
+ SetActivityState(unsigned activityState, WebKit::ActivityStateChangeID activityStateChangeID, Vector<WebKit::CallbackID> callbackIDs)
SetLayerHostingMode(enum WebKit::LayerHostingMode layerHostingMode)
SetDrawsBackground(bool drawsBackground)
Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h 2018-07-12 21:24:38 UTC (rev 233781)
@@ -81,7 +81,7 @@
bool shouldUseTiledBackingForFrameView(const WebCore::FrameView&) override;
- void activityStateDidChange(WebCore::ActivityState::Flags changed, bool wantsDidUpdateActivityState, const Vector<CallbackID>&) override;
+ void activityStateDidChange(WebCore::ActivityState::Flags changed, ActivityStateChangeID, const Vector<CallbackID>&) override;
void didUpdateActivityStateTimerFired();
void attachViewOverlayGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*) override;
@@ -153,7 +153,7 @@
RunLoop::Timer<TiledCoreAnimationDrawingArea> m_sendDidUpdateActivityStateTimer;
Vector<CallbackID> m_nextActivityStateChangeCallbackIDs;
- bool m_wantsDidUpdateActivityState;
+ ActivityStateChangeID m_activityStateChangeID { ActivityStateChangeAsynchronous };
WebCore::GraphicsLayer* m_viewOverlayRootLayer;
Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (233780 => 233781)
--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2018-07-12 20:11:30 UTC (rev 233780)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm 2018-07-12 21:24:38 UTC (rev 233781)
@@ -80,7 +80,6 @@
, m_isPaintingSuspended(!(parameters.activityState & ActivityState::IsVisible))
, m_transientZoomScale(1)
, m_sendDidUpdateActivityStateTimer(RunLoop::main(), this, &TiledCoreAnimationDrawingArea::didUpdateActivityStateTimerFired)
- , m_wantsDidUpdateActivityState(false)
, m_viewOverlayRootLayer(nullptr)
{
m_webPage.corePage()->settings().setForceCompositingMode(true);
@@ -469,10 +468,10 @@
}
}
-void TiledCoreAnimationDrawingArea::activityStateDidChange(ActivityState::Flags changed, bool wantsDidUpdateActivityState, const Vector<CallbackID>& nextActivityStateChangeCallbackIDs)
+void TiledCoreAnimationDrawingArea::activityStateDidChange(ActivityState::Flags changed, ActivityStateChangeID activityStateChangeID, const Vector<CallbackID>& nextActivityStateChangeCallbackIDs)
{
m_nextActivityStateChangeCallbackIDs.appendVector(nextActivityStateChangeCallbackIDs);
- m_wantsDidUpdateActivityState |= wantsDidUpdateActivityState;
+ m_activityStateChangeID = std::max(m_activityStateChangeID, activityStateChangeID);
if (changed & ActivityState::IsVisible) {
if (m_webPage.isVisible())
@@ -481,7 +480,7 @@
suspendPainting();
}
- if (m_wantsDidUpdateActivityState || !m_nextActivityStateChangeCallbackIDs.isEmpty())
+ if (m_activityStateChangeID != ActivityStateChangeAsynchronous || !m_nextActivityStateChangeCallbackIDs.isEmpty())
m_sendDidUpdateActivityStateTimer.startOneShot(0_s);
}
@@ -489,7 +488,7 @@
{
[CATransaction flush];
- if (m_wantsDidUpdateActivityState)
+ if (m_activityStateChangeID != ActivityStateChangeAsynchronous)
m_webPage.send(Messages::WebPageProxy::DidUpdateActivityState());
for (auto callbackID : m_nextActivityStateChangeCallbackIDs)
@@ -496,7 +495,7 @@
m_webPage.send(Messages::WebPageProxy::VoidCallback(callbackID));
m_nextActivityStateChangeCallbackIDs.clear();
- m_wantsDidUpdateActivityState = false;
+ m_activityStateChangeID = ActivityStateChangeAsynchronous;
}
void TiledCoreAnimationDrawingArea::suspendPainting()