<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[196062] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/196062">196062</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-02-03 03:04:33 -0800 (Wed, 03 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Reduce IPC traffic due to view state changes
https://bugs.webkit.org/show_bug.cgi?id=153745

Reviewed by Sergio Villar Senin.

Very often view state changes happen one after another in a very
short period of time, even in the same run loop iteration. For
example, when you switch to the web view window, the view is
focused and the active window flag changes as well. In that case
we are sending two messages to the web process and the page
updates its status according to the new flags in two steps. So, we
could group all state changes happening in the same run loop
iteration and notify about them all in the next iteration. This
also prevents unnecessary changes of state when we quickly go back
to a previous state, for example in focus follows mouse
configurations if you move the mouse outside the window and then
inside the window again quickly.

* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(_WebKitWebViewBasePrivate::_WebKitWebViewBasePrivate): Use
VirewState::Flags to keep the web view state instead of
boolean, and also to keep the flags that need to be updated. Use a
timer to update web view state flags.
(_WebKitWebViewBasePrivate::updateViewStateTimerFired): Call
WebPageProxy::viewStateDidChange() and reset the flags that need
to be updated.
(webkitWebViewBaseScheduleUpdateViewState): Update the flags that
need to be updated and schedule the timer if it's not active.
(toplevelWindowFocusInEvent): Use the flags and schedule an update.
(toplevelWindowFocusOutEvent): Ditto.
(toplevelWindowStateEvent): Also mark the view as hidden when minimized.
(webkitWebViewBaseSetToplevelOnScreenWindow): Connect to
window-state-event instead of deprecated visibility-notify-event.
(webkitWebViewBaseMap): Use the flags and schedule an update.
(webkitWebViewBaseUnmap): Ditto.
(webkitWebViewBaseSetFocus): Ditto.
(webkitWebViewBaseIsInWindowActive): Use the flags.
(webkitWebViewBaseIsFocused): Ditto
(webkitWebViewBaseIsVisible): Ditto.
(webkitWebViewBaseIsInWindow): Removed this since it was unused.
* UIProcess/API/gtk/WebKitWebViewBasePrivate.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasePrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (196061 => 196062)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-02-03 10:37:12 UTC (rev 196061)
+++ trunk/Source/WebKit2/ChangeLog        2016-02-03 11:04:33 UTC (rev 196062)
</span><span class="lines">@@ -1,5 +1,49 @@
</span><span class="cx"> 2016-02-03  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        [GTK] Reduce IPC traffic due to view state changes
+        https://bugs.webkit.org/show_bug.cgi?id=153745
+
+        Reviewed by Sergio Villar Senin.
+
+        Very often view state changes happen one after another in a very
+        short period of time, even in the same run loop iteration. For
+        example, when you switch to the web view window, the view is
+        focused and the active window flag changes as well. In that case
+        we are sending two messages to the web process and the page
+        updates its status according to the new flags in two steps. So, we
+        could group all state changes happening in the same run loop
+        iteration and notify about them all in the next iteration. This
+        also prevents unnecessary changes of state when we quickly go back
+        to a previous state, for example in focus follows mouse
+        configurations if you move the mouse outside the window and then
+        inside the window again quickly.
+
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (_WebKitWebViewBasePrivate::_WebKitWebViewBasePrivate): Use
+        VirewState::Flags to keep the web view state instead of
+        boolean, and also to keep the flags that need to be updated. Use a
+        timer to update web view state flags.
+        (_WebKitWebViewBasePrivate::updateViewStateTimerFired): Call
+        WebPageProxy::viewStateDidChange() and reset the flags that need
+        to be updated.
+        (webkitWebViewBaseScheduleUpdateViewState): Update the flags that
+        need to be updated and schedule the timer if it's not active.
+        (toplevelWindowFocusInEvent): Use the flags and schedule an update.
+        (toplevelWindowFocusOutEvent): Ditto.
+        (toplevelWindowStateEvent): Also mark the view as hidden when minimized.
+        (webkitWebViewBaseSetToplevelOnScreenWindow): Connect to
+        window-state-event instead of deprecated visibility-notify-event.
+        (webkitWebViewBaseMap): Use the flags and schedule an update.
+        (webkitWebViewBaseUnmap): Ditto.
+        (webkitWebViewBaseSetFocus): Ditto.
+        (webkitWebViewBaseIsInWindowActive): Use the flags.
+        (webkitWebViewBaseIsFocused): Ditto
+        (webkitWebViewBaseIsVisible): Ditto.
+        (webkitWebViewBaseIsInWindow): Removed this since it was unused.
+        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
+
+2016-02-03  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
</ins><span class="cx">         Unreviewed. Fix incorrect ASSERT introduced in r196053.
</span><span class="cx"> 
</span><span class="cx">         * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (196061 => 196062)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2016-02-03 10:37:12 UTC (rev 196061)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2016-02-03 11:04:33 UTC (rev 196062)
</span><span class="lines">@@ -148,12 +148,23 @@
</span><span class="cx"> typedef HashMap&lt;uint32_t, GUniquePtr&lt;GdkEvent&gt;&gt; TouchEventsMap;
</span><span class="cx"> 
</span><span class="cx"> struct _WebKitWebViewBasePrivate {
</span><ins>+    _WebKitWebViewBasePrivate()
+        : updateViewStateTimer(RunLoop::main(), this, &amp;_WebKitWebViewBasePrivate::updateViewStateTimerFired)
</ins><span class="cx"> #if USE(REDIRECTED_XCOMPOSITE_WINDOW)
</span><del>-    _WebKitWebViewBasePrivate()
-        : clearRedirectedWindowSoonTimer(RunLoop::main(), this, &amp;_WebKitWebViewBasePrivate::clearRedirectedWindowSoonTimerFired)
</del><ins>+        , clearRedirectedWindowSoonTimer(RunLoop::main(), this, &amp;_WebKitWebViewBasePrivate::clearRedirectedWindowSoonTimerFired)
+#endif
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    void updateViewStateTimerFired()
+    {
+        if (!pageProxy)
+            return;
+        pageProxy-&gt;viewStateDidChange(viewStateFlagsToUpdate);
+        viewStateFlagsToUpdate = ViewState::NoFlags;
+    }
+
+#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
</ins><span class="cx">     void clearRedirectedWindowSoonTimerFired()
</span><span class="cx">     {
</span><span class="cx">         if (redirectedWindow)
</span><span class="lines">@@ -182,13 +193,12 @@
</span><span class="cx">     GtkWindow* toplevelOnScreenWindow;
</span><span class="cx">     unsigned long toplevelFocusInEventID;
</span><span class="cx">     unsigned long toplevelFocusOutEventID;
</span><del>-    unsigned long toplevelVisibilityEventID;
</del><ins>+    unsigned long toplevelWindowStateEventID;
</ins><span class="cx"> 
</span><span class="cx">     // View State.
</span><del>-    bool isInWindowActive : 1;
-    bool isFocused : 1;
-    bool isVisible : 1;
-    bool isWindowVisible : 1;
</del><ins>+    ViewState::Flags viewState;
+    ViewState::Flags viewStateFlagsToUpdate;
+    RunLoop::Timer&lt;WebKitWebViewBasePrivate&gt; updateViewStateTimer;
</ins><span class="cx"> 
</span><span class="cx">     WebKitWebViewBaseDownloadRequestHandler downloadHandler;
</span><span class="cx"> 
</span><span class="lines">@@ -216,37 +226,56 @@
</span><span class="cx"> 
</span><span class="cx"> WEBKIT_DEFINE_TYPE(WebKitWebViewBase, webkit_web_view_base, GTK_TYPE_CONTAINER)
</span><span class="cx"> 
</span><ins>+static void webkitWebViewBaseScheduleUpdateViewState(WebKitWebViewBase* webViewBase, ViewState::Flags flagsToUpdate)
+{
+    WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
+    priv-&gt;viewStateFlagsToUpdate |= flagsToUpdate;
+    if (priv-&gt;updateViewStateTimer.isActive())
+        return;
+
+    priv-&gt;updateViewStateTimer.startOneShot(0);
+}
+
</ins><span class="cx"> static gboolean toplevelWindowFocusInEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
</span><del>-    if (!priv-&gt;isInWindowActive) {
-        priv-&gt;isInWindowActive = true;
-        priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::WindowIsActive);
-    }
</del><ins>+    if (priv-&gt;viewState &amp; ViewState::WindowIsActive)
+        return FALSE;
</ins><span class="cx"> 
</span><ins>+    priv-&gt;viewState |= ViewState::WindowIsActive;
+    webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::WindowIsActive);
+
</ins><span class="cx">     return FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static gboolean toplevelWindowFocusOutEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
</span><del>-    if (priv-&gt;isInWindowActive) {
-        priv-&gt;isInWindowActive = false;
-        priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::WindowIsActive);
-    }
</del><ins>+    if (!(priv-&gt;viewState &amp; ViewState::WindowIsActive))
+        return FALSE;
</ins><span class="cx"> 
</span><ins>+    priv-&gt;viewState &amp;= ~ViewState::WindowIsActive;
+    webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::WindowIsActive);
+
</ins><span class="cx">     return FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean toplevelWindowVisibilityEvent(GtkWidget*, GdkEventVisibility* visibilityEvent, WebKitWebViewBase* webViewBase)
</del><ins>+static gboolean toplevelWindowStateEvent(GtkWidget*, GdkEventWindowState* event, WebKitWebViewBase* webViewBase)
</ins><span class="cx"> {
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
</span><del>-    bool isWindowVisible = visibilityEvent-&gt;state != GDK_VISIBILITY_FULLY_OBSCURED;
-    if (priv-&gt;isWindowVisible != isWindowVisible) {
-        priv-&gt;isWindowVisible = isWindowVisible;
-        priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::IsVisible);
-    }
</del><ins>+    if (!(event-&gt;changed_mask &amp; GDK_WINDOW_STATE_ICONIFIED))
+        return FALSE;
</ins><span class="cx"> 
</span><ins>+    bool visible = !(event-&gt;new_window_state &amp; GDK_WINDOW_STATE_ICONIFIED);
+    if ((visible &amp;&amp; priv-&gt;viewState &amp; ViewState::IsVisible) || (!visible &amp;&amp; !(priv-&gt;viewState &amp; ViewState::IsVisible)))
+        return FALSE;
+
+    if (visible)
+        priv-&gt;viewState |= ViewState::IsVisible;
+    else
+        priv-&gt;viewState &amp;= ~ViewState::IsVisible;
+    webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible);
+
</ins><span class="cx">     return FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -264,13 +293,16 @@
</span><span class="cx">         g_signal_handler_disconnect(priv-&gt;toplevelOnScreenWindow, priv-&gt;toplevelFocusOutEventID);
</span><span class="cx">         priv-&gt;toplevelFocusOutEventID = 0;
</span><span class="cx">     }
</span><del>-    if (priv-&gt;toplevelVisibilityEventID) {
-        g_signal_handler_disconnect(priv-&gt;toplevelOnScreenWindow, priv-&gt;toplevelVisibilityEventID);
-        priv-&gt;toplevelVisibilityEventID = 0;
</del><ins>+    if (priv-&gt;toplevelWindowStateEventID) {
+        g_signal_handler_disconnect(priv-&gt;toplevelOnScreenWindow, priv-&gt;toplevelWindowStateEventID);
+        priv-&gt;toplevelWindowStateEventID = 0;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     priv-&gt;toplevelOnScreenWindow = window;
</span><del>-    priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::IsInWindow);
</del><ins>+    if (!(priv-&gt;viewState &amp; ViewState::IsInWindow)) {
+        priv-&gt;viewState |= ViewState::IsInWindow;
+        webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsInWindow);
+    }
</ins><span class="cx">     if (!priv-&gt;toplevelOnScreenWindow)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -280,9 +312,8 @@
</span><span class="cx">     priv-&gt;toplevelFocusOutEventID =
</span><span class="cx">         g_signal_connect(priv-&gt;toplevelOnScreenWindow, &quot;focus-out-event&quot;,
</span><span class="cx">                          G_CALLBACK(toplevelWindowFocusOutEvent), webViewBase);
</span><del>-    priv-&gt;toplevelVisibilityEventID =
-        g_signal_connect(priv-&gt;toplevelOnScreenWindow, &quot;visibility-notify-event&quot;,
-                         G_CALLBACK(toplevelWindowVisibilityEvent), webViewBase);
</del><ins>+    priv-&gt;toplevelWindowStateEventID =
+        g_signal_connect(priv-&gt;toplevelOnScreenWindow, &quot;window-state-event&quot;, G_CALLBACK(toplevelWindowStateEvent), webViewBase);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webkitWebViewBaseRealize(GtkWidget* widget)
</span><span class="lines">@@ -639,21 +670,24 @@
</span><span class="cx"> 
</span><span class="cx">     WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
</span><del>-    if (!priv-&gt;isVisible) {
-        priv-&gt;isVisible = true;
-        priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::IsVisible);
-    }
</del><ins>+    if (priv-&gt;viewState &amp; ViewState::IsVisible)
+        return;
+
+    priv-&gt;viewState |= ViewState::IsVisible;
+    webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webkitWebViewBaseUnmap(GtkWidget* widget)
</span><span class="cx"> {
</span><span class="cx">     GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)-&gt;unmap(widget);
</span><span class="cx"> 
</span><del>-    WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)-&gt;priv;
-    if (priv-&gt;isVisible) {
-        priv-&gt;isVisible = false;
-        priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::IsVisible);
-    }
</del><ins>+    WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
+    WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
+    if (!(priv-&gt;viewState &amp; ViewState::IsVisible))
+        return;
+
+    priv-&gt;viewState &amp;= ~ViewState::IsVisible;
+    webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static gboolean webkitWebViewBaseFocusInEvent(GtkWidget* widget, GdkEventFocus* event)
</span><span class="lines">@@ -1300,49 +1334,48 @@
</span><span class="cx"> void webkitWebViewBaseSetFocus(WebKitWebViewBase* webViewBase, bool focused)
</span><span class="cx"> {
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
</span><del>-    if (priv-&gt;isFocused == focused)
</del><ins>+    if ((focused &amp;&amp; priv-&gt;viewState &amp; ViewState::IsFocused) || (!focused &amp;&amp; !(priv-&gt;viewState &amp; ViewState::IsFocused)))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    unsigned viewStateFlags = ViewState::IsFocused;
-    priv-&gt;isFocused = focused;
</del><ins>+    ViewState::Flags flagsToUpdate = ViewState::IsFocused;
+    if (focused) {
+        priv-&gt;viewState |= ViewState::IsFocused;
</ins><span class="cx"> 
</span><del>-    // If the view has received the focus and the window is not active
-    // mark the current window as active now. This can happen if the
-    // toplevel window is a GTK_WINDOW_POPUP and the focus has been
-    // set programatically like WebKitTestRunner does, because POPUP
-    // can't be focused.
-    if (priv-&gt;isFocused &amp;&amp; !priv-&gt;isInWindowActive) {
-        priv-&gt;isInWindowActive = true;
-        viewStateFlags |= ViewState::WindowIsActive;
-    }
-    priv-&gt;pageProxy-&gt;viewStateDidChange(viewStateFlags);
</del><ins>+        // If the view has received the focus and the window is not active
+        // mark the current window as active now. This can happen if the
+        // toplevel window is a GTK_WINDOW_POPUP and the focus has been
+        // set programatically like WebKitTestRunner does, because POPUP
+        // can't be focused.
+        if (!(priv-&gt;viewState &amp; ViewState::WindowIsActive)) {
+            priv-&gt;viewState |= ViewState::WindowIsActive;
+            flagsToUpdate |= ViewState::WindowIsActive;
+        }
+    } else
+        priv-&gt;viewState &amp;= ~ViewState::IsFocused;
+
+    webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool webkitWebViewBaseIsInWindowActive(WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span><del>-    return webViewBase-&gt;priv-&gt;isInWindowActive;
</del><ins>+    return webViewBase-&gt;priv-&gt;viewState &amp; ViewState::WindowIsActive;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool webkitWebViewBaseIsFocused(WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span><del>-    return webViewBase-&gt;priv-&gt;isFocused;
</del><ins>+    return webViewBase-&gt;priv-&gt;viewState &amp; ViewState::IsFocused;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool webkitWebViewBaseIsVisible(WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span><del>-    return webViewBase-&gt;priv-&gt;isVisible;
</del><ins>+    return webViewBase-&gt;priv-&gt;viewState &amp; ViewState::IsVisible;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool webkitWebViewBaseIsInWindow(WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span><del>-    return webViewBase-&gt;priv-&gt;toplevelOnScreenWindow;
</del><ins>+    return webViewBase-&gt;priv-&gt;viewState &amp; ViewState::IsInWindow;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool webkitWebViewBaseIsWindowVisible(WebKitWebViewBase* webViewBase)
-{
-    return webViewBase-&gt;priv-&gt;isWindowVisible;
-}
-
</del><span class="cx"> void webkitWebViewBaseSetDownloadRequestHandler(WebKitWebViewBase* webViewBase, WebKitWebViewBaseDownloadRequestHandler downloadHandler)
</span><span class="cx"> {
</span><span class="cx">     webViewBase-&gt;priv-&gt;downloadHandler = downloadHandler;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasePrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h (196061 => 196062)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h        2016-02-03 10:37:12 UTC (rev 196061)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h        2016-02-03 11:04:33 UTC (rev 196062)
</span><span class="lines">@@ -60,7 +60,6 @@
</span><span class="cx"> bool webkitWebViewBaseIsFocused(WebKitWebViewBase*);
</span><span class="cx"> bool webkitWebViewBaseIsVisible(WebKitWebViewBase*);
</span><span class="cx"> bool webkitWebViewBaseIsInWindow(WebKitWebViewBase*);
</span><del>-bool webkitWebViewBaseIsWindowVisible(WebKitWebViewBase*);
</del><span class="cx"> 
</span><span class="cx"> typedef void (*WebKitWebViewBaseDownloadRequestHandler) (WebKitWebViewBase*, WebKit::DownloadProxy*);
</span><span class="cx"> void webkitWebViewBaseSetDownloadRequestHandler(WebKitWebViewBase*, WebKitWebViewBaseDownloadRequestHandler);
</span></span></pre>
</div>
</div>

</body>
</html>