Title: [233781] trunk/Source/WebKit
Revision
233781
Author
commit-qu...@webkit.org
Date
2018-07-12 14:24:38 -0700 (Thu, 12 Jul 2018)

Log Message

[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>

Patch by Said Abou-Hallawa <sabouhall...@apple.com> on 2018-07-12
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.

Modified Paths

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()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to