<!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>[161609] trunk/Source</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/161609">161609</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2014-01-09 17:34:24 -0800 (Thu, 09 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Source/WebCore: text-decoration-skip: ink does not work with line wraps
https://bugs.webkit.org/show_bug.cgi?id=126729

Patch by Myles C. Maxfield &lt;mmaxfield@apple.com&gt; on 2014-01-09
Reviewed by Simon Fraser.

InlineTextBox's m_start and m_length fields are offsets into the renderer's string,
not the generated TextRun. Because of this distinction, when multiple InlineTextBoxes
were constructed for the same element, all the subsequent elements would use incorrect
indices and therefore not have skipping decorations.

Test: fast/css3-text/css3-text-decoration/text-decoration-skip/text-decoration-skip-ink-multiline.html

* platform/graphics/Font.h:
* platform/graphics/mac/FontMac.mm:
(WebCore::Font::dashesForIntersectionsWithRect):
* rendering/InlineTextBox.cpp:
(WebCore::drawSkipInkUnderline):
(WebCore::InlineTextBox::paintDecoration):
* rendering/TextPainter.cpp:
(WebCore::TextPainter::dashesForIntersectionsWithRect):
* rendering/TextPainter.h:

Source/WebKit2: Change Page, FocusController to use ViewState
https://bugs.webkit.org/show_bug.cgi?id=126533

Reviewed by Tim Horton.

These classes currently maintain a set of separate fields to represent the view state;
combine these into a single field, and allow WebPage to send the combined update rather
than individual changes.

Maintain existing interface for WebKit1 clients.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::WebPage):
    - Combined separate calls to Page::setViewState.
(WebKit::WebPage::updateIsInWindow):
    - Simplied from setIsInWindow.
(WebKit::WebPage::setViewState):
    - Combined separate calls to Page::setViewState.
* WebProcess/WebPage/WebPage.h:
    - Declare updateIsInWindow.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebCorepageFocusControllercpp">trunk/Source/WebCore/page/FocusController.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFocusControllerh">trunk/Source/WebCore/page/FocusController.h</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebCore/ChangeLog        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -2781,6 +2781,69 @@
</span><span class="cx"> 
</span><span class="cx"> 2014-01-06  Gavin Barraclough  &lt;barraclough@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Change Page, FocusController to use ViewState
+        https://bugs.webkit.org/show_bug.cgi?id=126533
+
+        Reviewed by Tim Horton.
+
+        These classes currently maintain a set of separate fields to represent the view state;
+        combine these into a single field, and allow WebPage to send the combined update rather
+        than individual changes.
+
+        Maintain existing interface for WebKit1 clients.
+
+        * WebCore.exp.in:
+            - Added WebCore::setViewState, removed WebCore::setIsVisuallyIdle.
+        * page/FocusController.cpp:
+        (WebCore::FocusController::FocusController):
+            - Initialize combined m_viewState.
+        (WebCore::FocusController::setFocused):
+            - Calls setViewState.
+        (WebCore::FocusController::setFocusedInternal):
+            - setFocused -&gt; setFocusedInternal.
+        (WebCore::FocusController::setViewState):
+            - Added, update all ViewState flags.
+        (WebCore::FocusController::setActive):
+            - Calls setViewState.
+        (WebCore::FocusController::setActiveInternal):
+            - setActive -&gt; setActiveInternal.
+        (WebCore::FocusController::setContentIsVisible):
+            - Calls setViewState.
+        (WebCore::FocusController::setContentIsVisibleInternal):
+            - setContentIsVisible -&gt; setContentIsVisibleInternal.
+        * page/FocusController.h:
+        (WebCore::FocusController::isActive):
+        (WebCore::FocusController::isFocused):
+        (WebCore::FocusController::contentIsVisible):
+            - Implemented in terms of ViewState.
+        * page/Page.cpp:
+        (WebCore::Page::Page):
+            - Initialize using PageInitialViewState.
+        (WebCore::Page::setIsInWindow):
+            - Calls setViewState.
+        (WebCore::Page::setIsInWindowInternal):
+            - setIsInWindow -&gt; setIsInWindowInternal.
+        (WebCore::Page::setIsVisuallyIdleInternal):
+            - setIsVisuallyIdle -&gt; setIsVisuallyIdleInternal.
+        (WebCore::Page::setViewState):
+            - Added, update all ViewState flags, including FocusController.
+        (WebCore::Page::setIsVisible):
+            - Calls setViewState.
+        (WebCore::Page::setIsVisibleInternal):
+            - setIsVisible -&gt; setIsVisibleInternal.
+        (WebCore::Page::visibilityState):
+            - m_isVisible -&gt; isVisible()
+        (WebCore::Page::hiddenPageCSSAnimationSuspensionStateChanged):
+            - m_isVisible -&gt; isVisible()
+        * page/Page.h:
+        (WebCore::Page::isVisible):
+        (WebCore::Page::isInWindow):
+            - Implemented in terms of ViewState.
+        (WebCore::Page::scriptedAnimationsSuspended):
+            - Combined member fields into ViewState::Flags.
+
+2014-01-06  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
</ins><span class="cx">         Move ViewState to WebCore
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=126488
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -971,6 +971,7 @@
</span><span class="cx"> __ZN7WebCore4Page11PageClientsD1Ev
</span><span class="cx"> __ZN7WebCore4Page12setGroupNameERKN3WTF6StringE
</span><span class="cx"> __ZN7WebCore4Page12setIsVisibleEbb
</span><ins>+__ZN7WebCore4Page12setViewStateEjb
</ins><span class="cx"> __ZN7WebCore4Page13rangeOfStringERKN3WTF6StringEPNS_5RangeEj
</span><span class="cx"> __ZN7WebCore4Page13setIsInWindowEb
</span><span class="cx"> __ZN7WebCore4Page13setPaginationERKNS_10PaginationE
</span><span class="lines">@@ -980,7 +981,6 @@
</span><span class="cx"> __ZN7WebCore4Page16countFindMatchesERKN3WTF6StringEjj
</span><span class="cx"> __ZN7WebCore4Page16setCanStartMediaEb
</span><span class="cx"> __ZN7WebCore4Page16setDefersLoadingEb
</span><del>-__ZN7WebCore4Page17setIsVisuallyIdleEb
</del><span class="cx"> __ZN7WebCore4Page18removeSchedulePairEN3WTF10PassRefPtrINS1_12SchedulePairEEE
</span><span class="cx"> __ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointE
</span><span class="cx"> __ZN7WebCore4Page19addFooterWithHeightEi
</span></span></pre></div>
<a id="trunkSourceWebCorepageFocusControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FocusController.cpp (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FocusController.cpp        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebCore/page/FocusController.cpp        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -158,12 +158,10 @@
</span><span class="cx">     return element.isKeyboardFocusable(&amp;event) || isNonFocusableShadowHost(element, event);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FocusController::FocusController(Page&amp; page)
</del><ins>+FocusController::FocusController(Page&amp; page, ViewState::Flags viewState)
</ins><span class="cx">     : m_page(page)
</span><del>-    , m_isActive(false)
-    , m_isFocused(false)
</del><span class="cx">     , m_isChangingFocusedFrame(false)
</span><del>-    , m_contentIsVisible(false)
</del><ins>+    , m_viewState(viewState)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -205,12 +203,12 @@
</span><span class="cx"> 
</span><span class="cx"> void FocusController::setFocused(bool focused)
</span><span class="cx"> {
</span><del>-    if (isFocused() == focused)
-        return;
-    
-    m_isFocused = focused;
</del><ins>+    setViewState(focused ? m_viewState | ViewState::IsFocused : m_viewState &amp; ~ViewState::IsFocused);
+}
</ins><span class="cx"> 
</span><del>-    if (!m_isFocused)
</del><ins>+void FocusController::setFocusedInternal(bool focused)
+{
+    if (!isFocused())
</ins><span class="cx">         focusedOrMainFrame().eventHandler().stopAutoscrollTimer();
</span><span class="cx"> 
</span><span class="cx">     if (!m_focusedFrame)
</span><span class="lines">@@ -635,13 +633,26 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void FocusController::setViewState(ViewState::Flags viewState)
+{
+    ViewState::Flags changed = m_viewState ^ viewState;
+    m_viewState = viewState;
+
+    if (changed &amp; ViewState::IsFocused)
+        setFocusedInternal(viewState &amp; ViewState::IsFocused);
+    if (changed &amp; ViewState::WindowIsActive)
+        setActiveInternal(viewState &amp; ViewState::WindowIsActive);
+    if (changed &amp; ViewState::IsVisible)
+        setContentIsVisibleInternal(viewState &amp; ViewState::IsVisible);
+}
+
</ins><span class="cx"> void FocusController::setActive(bool active)
</span><span class="cx"> {
</span><del>-    if (m_isActive == active)
-        return;
</del><ins>+    setViewState(active ? m_viewState | ViewState::WindowIsActive : m_viewState &amp; ~ViewState::WindowIsActive);
+}
</ins><span class="cx"> 
</span><del>-    m_isActive = active;
-
</del><ins>+void FocusController::setActiveInternal(bool active)
+{
</ins><span class="cx">     if (FrameView* view = m_page.mainFrame().view()) {
</span><span class="cx">         if (!view-&gt;platformWidget()) {
</span><span class="cx">             view-&gt;updateLayoutAndStyleIfNeededRecursive();
</span><span class="lines">@@ -665,11 +676,11 @@
</span><span class="cx"> 
</span><span class="cx"> void FocusController::setContentIsVisible(bool contentIsVisible)
</span><span class="cx"> {
</span><del>-    if (m_contentIsVisible == contentIsVisible)
-        return;
</del><ins>+    setViewState(contentIsVisible ? m_viewState | ViewState::IsVisible : m_viewState &amp; ~ViewState::IsVisible);
+}
</ins><span class="cx"> 
</span><del>-    m_contentIsVisible = contentIsVisible;
-
</del><ins>+void FocusController::setContentIsVisibleInternal(bool contentIsVisible)
+{
</ins><span class="cx">     FrameView* view = m_page.mainFrame().view();
</span><span class="cx">     if (!view)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCorepageFocusControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FocusController.h (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FocusController.h        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebCore/page/FocusController.h        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;FocusDirection.h&quot;
</span><span class="cx"> #include &quot;LayoutRect.h&quot;
</span><ins>+#include &quot;ViewState.h&quot;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="lines">@@ -62,7 +63,7 @@
</span><span class="cx"> class FocusController {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(FocusController); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    explicit FocusController(Page&amp;);
</del><ins>+    explicit FocusController(Page&amp;, ViewState::Flags);
</ins><span class="cx"> 
</span><span class="cx">     void setFocusedFrame(PassRefPtr&lt;Frame&gt;);
</span><span class="cx">     Frame* focusedFrame() const { return m_focusedFrame.get(); }
</span><span class="lines">@@ -73,19 +74,26 @@
</span><span class="cx"> 
</span><span class="cx">     bool setFocusedElement(Element*, PassRefPtr&lt;Frame&gt;, FocusDirection = FocusDirectionNone);
</span><span class="cx"> 
</span><ins>+    void setViewState(ViewState::Flags);
+
</ins><span class="cx">     void setActive(bool);
</span><del>-    bool isActive() const { return m_isActive; }
</del><ins>+    bool isActive() const { return m_viewState &amp; ViewState::WindowIsActive; }
</ins><span class="cx"> 
</span><span class="cx">     void setFocused(bool);
</span><del>-    bool isFocused() const { return m_isFocused; }
</del><ins>+    bool isFocused() const { return m_viewState &amp; ViewState::IsFocused; }
</ins><span class="cx"> 
</span><span class="cx">     void setContentIsVisible(bool);
</span><ins>+    bool contentIsVisible() const { return m_viewState &amp; ViewState::IsVisible; }
</ins><span class="cx"> 
</span><span class="cx">     // These methods are used in WebCore/bindings/objc/DOM.mm.
</span><span class="cx">     Element* nextFocusableElement(FocusNavigationScope, Node* start, KeyboardEvent*);
</span><span class="cx">     Element* previousFocusableElement(FocusNavigationScope, Node* start, KeyboardEvent*);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void setActiveInternal(bool);
+    void setFocusedInternal(bool);
+    void setContentIsVisibleInternal(bool);
+
</ins><span class="cx">     bool advanceFocusDirectionally(FocusDirection, KeyboardEvent*);
</span><span class="cx">     bool advanceFocusInDocumentOrder(FocusDirection, KeyboardEvent*, bool initialFocus);
</span><span class="cx"> 
</span><span class="lines">@@ -111,11 +119,8 @@
</span><span class="cx"> 
</span><span class="cx">     Page&amp; m_page;
</span><span class="cx">     RefPtr&lt;Frame&gt; m_focusedFrame;
</span><del>-    bool m_isActive;
-    bool m_isFocused;
</del><span class="cx">     bool m_isChangingFocusedFrame;
</span><del>-    bool m_contentIsVisible;
-
</del><ins>+    ViewState::Flags m_viewState;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebCore/page/Page.cpp        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -123,13 +123,15 @@
</span><span class="cx">     return page-&gt;deviceScaleFactor();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static const ViewState::Flags PageInitialViewState = ViewState::IsVisible | ViewState::IsInWindow;
+
</ins><span class="cx"> Page::Page(PageClients&amp; pageClients)
</span><span class="cx">     : m_chrome(std::make_unique&lt;Chrome&gt;(*this, *pageClients.chromeClient))
</span><span class="cx">     , m_dragCaretController(std::make_unique&lt;DragCaretController&gt;())
</span><span class="cx"> #if ENABLE(DRAG_SUPPORT)
</span><span class="cx">     , m_dragController(std::make_unique&lt;DragController&gt;(*this, *pageClients.dragClient))
</span><span class="cx"> #endif
</span><del>-    , m_focusController(std::make_unique&lt;FocusController&gt;(*this))
</del><ins>+    , m_focusController(std::make_unique&lt;FocusController&gt;(*this, PageInitialViewState))
</ins><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span><span class="cx">     , m_contextMenuController(std::make_unique&lt;ContextMenuController&gt;(*this, *pageClients.contextMenuClient))
</span><span class="cx"> #endif
</span><span class="lines">@@ -171,9 +173,8 @@
</span><span class="cx">     , m_minimumTimerInterval(Settings::defaultMinDOMTimerInterval())
</span><span class="cx">     , m_timerAlignmentInterval(Settings::defaultDOMTimerAlignmentInterval())
</span><span class="cx">     , m_isEditable(false)
</span><del>-    , m_isInWindow(true)
-    , m_isVisible(true)
</del><span class="cx">     , m_isPrerender(false)
</span><ins>+    , m_viewState(PageInitialViewState)
</ins><span class="cx">     , m_requestedLayoutMilestones(0)
</span><span class="cx">     , m_headerHeight(0)
</span><span class="cx">     , m_footerHeight(0)
</span><span class="lines">@@ -877,11 +878,11 @@
</span><span class="cx"> 
</span><span class="cx"> void Page::setIsInWindow(bool isInWindow)
</span><span class="cx"> {
</span><del>-    if (m_isInWindow == isInWindow)
-        return;
</del><ins>+    setViewState(isInWindow ? m_viewState | ViewState::IsInWindow : m_viewState &amp; ~ViewState::IsInWindow);
+}
</ins><span class="cx"> 
</span><del>-    m_isInWindow = isInWindow;
-
</del><ins>+void Page::setIsInWindowInternal(bool isInWindow)
+{
</ins><span class="cx">     for (Frame* frame = &amp;mainFrame(); frame; frame = frame-&gt;tree().traverseNext()) {
</span><span class="cx">         if (FrameView* frameView = frame-&gt;view())
</span><span class="cx">             frameView-&gt;setIsInWindow(isInWindow);
</span><span class="lines">@@ -909,7 +910,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Page::setIsVisuallyIdle(bool isVisuallyIdle)
</del><ins>+void Page::setIsVisuallyIdleInternal(bool isVisuallyIdle)
</ins><span class="cx"> {
</span><span class="cx">     m_pageThrottler-&gt;setIsVisuallyIdle(isVisuallyIdle);
</span><span class="cx"> }
</span><span class="lines">@@ -1212,15 +1213,37 @@
</span><span class="cx">         CachedImage::resumeAnimatingImagesForLoader(frame-&gt;document()-&gt;cachedResourceLoader());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Page::setViewState(ViewState::Flags viewState, bool isInitialState)
+{
+    ViewState::Flags changed = m_viewState ^ viewState;
+    m_viewState = viewState;
+
+    // We want to make sure to update the active state while hidden, so if the view is going
+    // to be visible then update the focus controller first (it may currently still be hidden).
+    if (changed &amp;&amp; (m_viewState &amp; ViewState::IsVisible))
+        m_focusController-&gt;setViewState(viewState);
+
+    if (changed &amp; ViewState::IsVisible)
+        setIsVisibleInternal(viewState &amp; ViewState::IsVisible, isInitialState);
+    if (changed &amp; ViewState::IsInWindow)
+        setIsInWindowInternal(viewState &amp; ViewState::IsInWindow);
+    if (changed &amp; ViewState::IsVisuallyIdle)
+        setIsVisuallyIdleInternal(viewState &amp; ViewState::IsVisuallyIdle);
+
+    if (changed &amp;&amp; !(m_viewState &amp; ViewState::IsVisible))
+        m_focusController-&gt;setViewState(viewState);
+}
+
</ins><span class="cx"> void Page::setIsVisible(bool isVisible, bool isInitialState)
</span><span class="cx"> {
</span><ins>+    setViewState(isVisible ? m_viewState | ViewState::IsVisible : m_viewState &amp; ~ViewState::IsVisible, isInitialState);
+}
+
+void Page::setIsVisibleInternal(bool isVisible, bool isInitialState)
+{
</ins><span class="cx">     // FIXME: The visibility state should be stored on the top-level document.
</span><span class="cx">     // https://bugs.webkit.org/show_bug.cgi?id=116769
</span><span class="cx"> 
</span><del>-    if (m_isVisible == isVisible)
-        return;
-    m_isVisible = isVisible;
-
</del><span class="cx">     if (isVisible) {
</span><span class="cx">         m_isPrerender = false;
</span><span class="cx"> 
</span><span class="lines">@@ -1282,7 +1305,7 @@
</span><span class="cx"> #if ENABLE(PAGE_VISIBILITY_API)
</span><span class="cx"> PageVisibilityState Page::visibilityState() const
</span><span class="cx"> {
</span><del>-    if (m_isVisible)
</del><ins>+    if (isVisible())
</ins><span class="cx">         return PageVisibilityStateVisible;
</span><span class="cx">     if (m_isPrerender)
</span><span class="cx">         return PageVisibilityStatePrerender;
</span><span class="lines">@@ -1544,7 +1567,7 @@
</span><span class="cx"> #if (ENABLE_PAGE_VISIBILITY_API)
</span><span class="cx"> void Page::hiddenPageCSSAnimationSuspensionStateChanged()
</span><span class="cx"> {
</span><del>-    if (!m_isVisible) {
</del><ins>+    if (!isVisible()) {
</ins><span class="cx">         if (m_settings-&gt;hiddenPageCSSAnimationSuspensionEnabled())
</span><span class="cx">             mainFrame().animation().suspendAnimations();
</span><span class="cx">         else
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebCore/page/Page.h        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;PlatformScreen.h&quot;
</span><span class="cx"> #include &quot;Region.h&quot;
</span><span class="cx"> #include &quot;Supplementable.h&quot;
</span><ins>+#include &quot;ViewState.h&quot;
</ins><span class="cx"> #include &quot;ViewportArguments.h&quot;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="lines">@@ -294,18 +295,18 @@
</span><span class="cx">     unsigned pageCount() const;
</span><span class="cx"> 
</span><span class="cx">     // Notifications when the Page starts and stops being presented via a native window.
</span><ins>+    void setViewState(ViewState::Flags, bool isInitial = false);
</ins><span class="cx">     void setIsVisible(bool isVisible, bool isInitial);
</span><span class="cx">     void setIsPrerender();
</span><del>-    bool isVisible() const { return m_isVisible; }
</del><ins>+    bool isVisible() const { return m_viewState &amp; ViewState::IsVisible; }
</ins><span class="cx"> 
</span><span class="cx">     // Notification that this Page was moved into or out of a native window.
</span><span class="cx">     void setIsInWindow(bool);
</span><del>-    bool isInWindow() const { return m_isInWindow; }
</del><ins>+    bool isInWindow() const { return m_viewState &amp; ViewState::IsInWindow; }
</ins><span class="cx"> 
</span><span class="cx">     void suspendScriptedAnimations();
</span><span class="cx">     void resumeScriptedAnimations();
</span><span class="cx">     bool scriptedAnimationsSuspended() const { return m_scriptedAnimationsSuspended; }
</span><del>-    void setIsVisuallyIdle(bool);
</del><span class="cx"> 
</span><span class="cx">     void userStyleSheetLocationChanged();
</span><span class="cx">     const String&amp; userStyleSheet() const;
</span><span class="lines">@@ -419,6 +420,10 @@
</span><span class="cx"> private:
</span><span class="cx">     void initGroup();
</span><span class="cx"> 
</span><ins>+    void setIsInWindowInternal(bool);
+    void setIsVisibleInternal(bool isVisible, bool isInitial);
+    void setIsVisuallyIdleInternal(bool);
+
</ins><span class="cx"> #if ASSERT_DISABLED
</span><span class="cx">     void checkSubframeCountConsistency() const { }
</span><span class="cx"> #else
</span><span class="lines">@@ -522,9 +527,8 @@
</span><span class="cx">     double m_timerAlignmentInterval;
</span><span class="cx"> 
</span><span class="cx">     bool m_isEditable;
</span><del>-    bool m_isInWindow;
-    bool m_isVisible;
</del><span class="cx">     bool m_isPrerender;
</span><ins>+    ViewState::Flags m_viewState;
</ins><span class="cx"> 
</span><span class="cx">     LayoutMilestones m_requestedLayoutMilestones;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebKit2/ChangeLog        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-01-06  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        Change Page, FocusController to use ViewState
+        https://bugs.webkit.org/show_bug.cgi?id=126533
+
+        Reviewed by Tim Horton.
+
+        These classes currently maintain a set of separate fields to represent the view state;
+        combine these into a single field, and allow WebPage to send the combined update rather
+        than individual changes.
+
+        Maintain existing interface for WebKit1 clients.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::WebPage):
+            - Combined separate calls to Page::setViewState.
+        (WebKit::WebPage::updateIsInWindow):
+            - Simplied from setIsInWindow.
+        (WebKit::WebPage::setViewState):
+            - Combined separate calls to Page::setViewState.
+        * WebProcess/WebPage/WebPage.h:
+            - Declare updateIsInWindow.
+
</ins><span class="cx"> 2014-01-09  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Upstream iOS changes after r161530
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -371,18 +371,9 @@
</span><span class="cx"> 
</span><span class="cx">     setMemoryCacheMessagesEnabled(parameters.areMemoryCacheClientCallsEnabled);
</span><span class="cx"> 
</span><del>-    setActive(parameters.viewState &amp; ViewState::WindowIsActive);
-    setFocused(parameters.viewState &amp; ViewState::IsFocused);
</del><ins>+    m_page-&gt;setViewState(m_viewState, true);
+    updateIsInWindow(true);
</ins><span class="cx"> 
</span><del>-    // Page defaults to in-window, but setIsInWindow depends on it being a valid indicator of actually having been put into a window.
-    bool isInWindow = parameters.viewState &amp; ViewState::IsInWindow;
-    if (!isInWindow)
-        m_page-&gt;setIsInWindow(false);
-    else
-        WebProcess::shared().pageDidEnterWindow(m_pageID);
-
-    setIsInWindow(isInWindow);
-
</del><span class="cx">     setMinimumLayoutSize(parameters.minimumLayoutSize);
</span><span class="cx">     setAutoSizingShouldExpandToViewHeight(parameters.autoSizingShouldExpandToViewHeight);
</span><span class="cx">     
</span><span class="lines">@@ -425,9 +416,6 @@
</span><span class="cx">     if (m_useAsyncScrolling)
</span><span class="cx">         WebProcess::shared().eventDispatcher().addScrollingTreeForPage(this);
</span><span class="cx"> #endif
</span><del>-
-    m_page-&gt;setIsVisible(m_viewState &amp; ViewState::IsVisible, true);
-    setIsVisuallyIdle(m_viewState &amp; ViewState::IsVisuallyIdle);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebPage::~WebPage()
</span><span class="lines">@@ -1911,18 +1899,6 @@
</span><span class="cx">     m_findController.showFindIndicatorInSelection();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::setActive(bool isActive)
-{
-    m_page-&gt;focusController().setActive(isActive);
-}
-
-void WebPage::setViewIsVisible(bool isVisible)
-{
-    corePage()-&gt;focusController().setContentIsVisible(isVisible);
-
-    m_page-&gt;setIsVisible(m_viewState &amp; ViewState::IsVisible, false);
-}
-
</del><span class="cx"> void WebPage::setDrawsBackground(bool drawsBackground)
</span><span class="cx"> {
</span><span class="cx">     if (m_drawsBackground == drawsBackground)
</span><span class="lines">@@ -1978,11 +1954,6 @@
</span><span class="cx">         view-&gt;willEndLiveResize();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::setFocused(bool isFocused)
-{
-    m_page-&gt;focusController().setFocused(isFocused);
-}
-
</del><span class="cx"> void WebPage::setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent&amp; event)
</span><span class="cx"> {
</span><span class="cx">     if (!m_page)
</span><span class="lines">@@ -2037,15 +2008,16 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::setIsInWindow(bool isInWindow)
</del><ins>+void WebPage::updateIsInWindow(bool isInitialState)
</ins><span class="cx"> {
</span><del>-    bool pageWasInWindow = m_page-&gt;isInWindow();
-    
</del><ins>+    bool isInWindow = m_viewState &amp; WebCore::ViewState::IsInWindow;
+
</ins><span class="cx">     if (!isInWindow) {
</span><span class="cx">         m_setCanStartMediaTimer.stop();
</span><span class="cx">         m_page-&gt;setCanStartMedia(false);
</span><span class="cx">         
</span><del>-        if (pageWasInWindow)
</del><ins>+        // The WebProcess does not yet know about this page; no need to tell it we're leaving the window.
+        if (!isInitialState)
</ins><span class="cx">             WebProcess::shared().pageWillLeaveWindow(m_pageID);
</span><span class="cx">     } else {
</span><span class="cx">         // Defer the call to Page::setCanStartMedia() since it ends up sending a synchronous message to the UI process
</span><span class="lines">@@ -2054,12 +2026,9 @@
</span><span class="cx">         if (m_mayStartMediaWhenInWindow)
</span><span class="cx">             m_setCanStartMediaTimer.startOneShot(0);
</span><span class="cx"> 
</span><del>-        if (!pageWasInWindow)
-            WebProcess::shared().pageDidEnterWindow(m_pageID);
</del><ins>+        WebProcess::shared().pageDidEnterWindow(m_pageID);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_page-&gt;setIsInWindow(isInWindow);
-
</del><span class="cx">     if (isInWindow)
</span><span class="cx">         layoutIfNeeded();
</span><span class="cx"> }
</span><span class="lines">@@ -2070,25 +2039,13 @@
</span><span class="cx">     m_viewState = viewState;
</span><span class="cx"> 
</span><span class="cx">     m_drawingArea-&gt;viewStateDidChange(changed);
</span><del>-
-    // We want to make sure to update the active state while hidden, so if the view is hidden then update the active state
-    // early (in case it becomes visible), and if the view was visible then update active state later (in case it hides).
-    if (changed &amp; ViewState::IsFocused)
-        setFocused(viewState &amp; ViewState::IsFocused);
-    if (changed &amp; ViewState::WindowIsActive &amp;&amp; !(m_viewState &amp; ViewState::IsVisible))
-        setActive(viewState &amp; ViewState::WindowIsActive);
-    if (changed &amp; ViewState::IsVisible)
-        setViewIsVisible(viewState &amp; ViewState::IsVisible);
-    if (changed &amp; ViewState::WindowIsActive &amp;&amp; m_viewState &amp; ViewState::IsVisible)
-        setActive(viewState &amp; ViewState::WindowIsActive);
-    if (changed &amp; ViewState::IsInWindow)
-        setIsInWindow(viewState &amp; ViewState::IsInWindow);
-    if (changed &amp; ViewState::IsVisuallyIdle)
-        setIsVisuallyIdle(viewState &amp; ViewState::IsVisuallyIdle);
-
</del><ins>+    m_page-&gt;setViewState(viewState);
</ins><span class="cx">     for (auto* pluginView : m_pluginViews)
</span><span class="cx">         pluginView-&gt;viewStateDidChange(changed);
</span><span class="cx"> 
</span><ins>+    if (changed &amp; ViewState::IsInWindow)
+        updateIsInWindow();
+
</ins><span class="cx">     if (wantsDidUpdateViewState)
</span><span class="cx">         m_sendDidUpdateViewStateTimer.startOneShot(0);
</span><span class="cx"> }
</span><span class="lines">@@ -3694,11 +3651,6 @@
</span><span class="cx">         m_page-&gt;setIsPrerender();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::setIsVisuallyIdle(bool isVisuallyIdle)
-{
-    m_page-&gt;setIsVisuallyIdle(isVisuallyIdle);
-}
-
</del><span class="cx"> void WebPage::setScrollingPerformanceLoggingEnabled(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     m_scrollingPerformanceLoggingEnabled = enabled;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (161608 => 161609)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-01-10 01:29:56 UTC (rev 161608)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-01-10 01:34:24 UTC (rev 161609)
</span><span class="lines">@@ -729,8 +729,7 @@
</span><span class="cx">     void setViewIsVisible(bool);
</span><span class="cx">     void setInitialFocus(bool forward, bool isKeyboardEventValid, const WebKeyboardEvent&amp;);
</span><span class="cx">     void setWindowResizerSize(const WebCore::IntSize&amp;);
</span><del>-    void setIsInWindow(bool);
-    void setIsVisuallyIdle(bool);
</del><ins>+    void updateIsInWindow(bool isInitialState = false);
</ins><span class="cx">     void setViewState(WebCore::ViewState::Flags, bool wantsDidUpdateViewState);
</span><span class="cx">     void validateCommand(const String&amp;, uint64_t);
</span><span class="cx">     void executeEditCommand(const String&amp;);
</span></span></pre>
</div>
</div>

</body>
</html>