Title: [187945] releases/WebKitGTK/webkit-2.8/Source/WebKit2
Revision
187945
Author
carlo...@webkit.org
Date
2015-08-05 00:33:24 -0700 (Wed, 05 Aug 2015)

Log Message

Merge r187471 - First in-window viewStateChange synchronously blocks despite not previously being in-window
https://bugs.webkit.org/show_bug.cgi?id=147344
<rdar://problem/22021772>

Reviewed by Simon Fraser.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::updateViewState):
(WebKit::WebPageProxy::dispatchViewStateChange):
The whole point of m_viewWasEverInWindow was so that we would not
synchronously wait when a view was added to a window for the first time,
only all subsequent times.

However, since m_viewWasEverInWindow was being set *before* being
checked in dispatchViewStateChange, we were always blocking. This is
a huge waste of main-thread time, because there's no reason to wait
for the first paint if you've never seen the view before (and shouldn't
expect it to have content).

Instead, set the flag after dispatching a view state change, so it becomes
"have we ever sent a view state with IsInWindow set" instead.

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog (187944 => 187945)


--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog	2015-08-05 07:28:24 UTC (rev 187944)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog	2015-08-05 07:33:24 UTC (rev 187945)
@@ -1,3 +1,27 @@
+2015-07-27  Tim Horton  <timothy_hor...@apple.com>
+
+        First in-window viewStateChange synchronously blocks despite not previously being in-window
+        https://bugs.webkit.org/show_bug.cgi?id=147344
+        <rdar://problem/22021772>
+
+        Reviewed by Simon Fraser.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::updateViewState):
+        (WebKit::WebPageProxy::dispatchViewStateChange):
+        The whole point of m_viewWasEverInWindow was so that we would not
+        synchronously wait when a view was added to a window for the first time,
+        only all subsequent times.
+
+        However, since m_viewWasEverInWindow was being set *before* being
+        checked in dispatchViewStateChange, we were always blocking. This is
+        a huge waste of main-thread time, because there's no reason to wait
+        for the first paint if you've never seen the view before (and shouldn't
+        expect it to have content).
+
+        Instead, set the flag after dispatching a view state change, so it becomes
+        "have we ever sent a view state with IsInWindow set" instead.
+
 2015-07-27  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Pass a GstInstallPluginsContext to gst_install_plugins_async

Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp (187944 => 187945)


--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp	2015-08-05 07:28:24 UTC (rev 187944)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp	2015-08-05 07:33:24 UTC (rev 187945)
@@ -1242,10 +1242,8 @@
         m_viewState |= ViewState::IsVisible;
     if (flagsToUpdate & ViewState::IsVisibleOrOccluded && m_pageClient.isViewVisibleOrOccluded())
         m_viewState |= ViewState::IsVisibleOrOccluded;
-    if (flagsToUpdate & ViewState::IsInWindow && m_pageClient.isViewInWindow()) {
+    if (flagsToUpdate & ViewState::IsInWindow && m_pageClient.isViewInWindow())
         m_viewState |= ViewState::IsInWindow;
-        m_viewWasEverInWindow = true;
-    }
     if (flagsToUpdate & ViewState::IsVisuallyIdle && m_pageClient.isVisuallyIdle())
         m_viewState |= ViewState::IsVisuallyIdle;
 }
@@ -1310,8 +1308,9 @@
     updateViewState(m_potentiallyChangedViewStateFlags);
     ViewState::Flags changed = m_viewState ^ previousViewState;
 
+    bool isNowInWindow = (changed & ViewState::IsInWindow) && isInWindow();
     // We always want to wait for the Web process to reply if we've been in-window before and are coming back in-window.
-    if (m_viewWasEverInWindow && (changed & ViewState::IsInWindow) && isInWindow())
+    if (m_viewWasEverInWindow && isNowInWindow)
         m_viewStateChangeWantsSynchronousReply = true;
 
     // Don't wait synchronously if the view state is not visible. (This matters in particular on iOS, where a hidden page may be suspended.)
@@ -1346,6 +1345,7 @@
 
     m_potentiallyChangedViewStateFlags = ViewState::NoFlags;
     m_viewStateChangeWantsSynchronousReply = false;
+    m_viewWasEverInWindow |= isNowInWindow;
 }
 
 void WebPageProxy::updateActivityToken()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to