<!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>[167152] 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/167152">167152</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-04-11 14:41:28 -0700 (Fri, 11 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Support document-relative and custom-frame page overlays
https://bugs.webkit.org/show_bug.cgi?id=131560
&lt;rdar://problem/16595556&gt;

Reviewed by Simon Fraser.

Add &quot;document-relative&quot; overlays, which attach to (and scroll with) the document,
and can be given a frame rect within the document to avoid overallocation of backing store.

* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::didChangeScrollOffset):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::mainFrame):
(WebKit::WebPage::mainFrameView):
(WebKit::WebPage::didChangeScrollOffsetForFrame):
* WebProcess/WebPage/WebPage.h:
Let the PageOverlayController know *which* frame scrolled, instead of &quot;any frame&quot;.

* WebProcess/WebPage/FindController.cpp:
(WebKit::FindController::updateFindUIAfterPageScroll):
Factor out shared code.

(WebKit::FindController::willMoveToWebPage):
(WebKit::FindController::drawRect):
We can use clearRect() instead of a transparency layer and fillRect().
I've looked through all the other overlay clients I know of and none of them
depend on having a transparency layer at the overlay level.

* WebProcess/WebPage/PageOverlay.cpp:
(WebKit::PageOverlay::create):
(WebKit::PageOverlay::PageOverlay):
(WebKit::PageOverlay::bounds):
(WebKit::PageOverlay::frame):
(WebKit::PageOverlay::setFrame):
(WebKit::PageOverlay::drawRect):
Add OverlayType, which allows creation of Document or View relative overlays.
All overlays up to this point are View relative, so we default to that.
Document-relative overlays scroll with the page instead of repainting as
the page scrolls. They can also be given an explicit frame, allowing them
to be smaller than the entire document.

* WebProcess/WebPage/PageOverlay.h:
(WebKit::PageOverlay::overlayType):
(WebKit::PageOverlay::webPage):
(WebKit::PageOverlay::client): Deleted.
* WebProcess/WebPage/PageOverlayController.cpp:
(WebKit::PageOverlayController::initialize):
(WebKit::PageOverlayController::installPageOverlay):
(WebKit::PageOverlayController::uninstallPageOverlay):
(WebKit::PageOverlayController::updateForceSynchronousScrollLayerPositionUpdates):
(WebKit::updateOverlayGeometry):
(WebKit::PageOverlayController::setPageOverlayNeedsDisplay):
(WebKit::PageOverlayController::didChangeViewSize):
(WebKit::PageOverlayController::didChangeDocumentSize):
(WebKit::PageOverlayController::didChangeDeviceScaleFactor):
(WebKit::PageOverlayController::didScrollFrame):
(WebKit::PageOverlayController::flushPageOverlayLayers):
(WebKit::PageOverlayController::didChangeOverlayFrame):
Keep two overlay root layers - one for view-relative
and one for document-relative overlays.
Don't force synchronous scrolling if we only have document-relative overlays.
Update the overlay's position as well as its size whenever necessary.
Update document-relative overlay geometry when the document size changes.
Only explicitly flush view-relative overlays; document-relative ones
are plugged into the WebCore layer tree and flushed along with the page.

* WebProcess/WebPage/PageOverlayController.h:
(WebKit::PageOverlayController::documentOverlayRootLayer):
(WebKit::PageOverlayController::viewOverlayRootLayer):
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h:
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::setRootCompositingLayer):
(WebKit::RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged):
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::mainFrameContentSizeChanged):
(WebKit::TiledCoreAnimationDrawingArea::setRootCompositingLayer):
Let the PageOverlay controller know when the document size changes.
When we set up compositing, push the document overlay root layer
down into WebCore.

* WebCore.exp.in:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::RenderLayerCompositor):
(WebCore::RenderLayerCompositor::rebuildCompositingLayerTree):
(WebCore::RenderLayerCompositor::setDocumentOverlayRootLayer):
* rendering/RenderLayerCompositor.h:
Add the concept of a document overlay layer, which is plugged in as the
last child of the root content layer. Expose it to WebKit2.</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="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorh">trunk/Source/WebCore/rendering/RenderLayerCompositor.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageFindControllercpp">trunk/Source/WebKit2/WebProcess/WebPage/FindController.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagePageOverlaycpp">trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagePageOverlayh">trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagePageOverlayControllercpp">trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagePageOverlayControllerh">trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.h</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>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacRemoteLayerTreeDrawingAreah">trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacRemoteLayerTreeDrawingAreamm">trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm">trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebCore/ChangeLog        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-04-11  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Support document-relative and custom-frame page overlays
+        https://bugs.webkit.org/show_bug.cgi?id=131560
+        &lt;rdar://problem/16595556&gt;
+
+        Reviewed by Simon Fraser.
+
+        * WebCore.exp.in:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::RenderLayerCompositor):
+        (WebCore::RenderLayerCompositor::rebuildCompositingLayerTree):
+        (WebCore::RenderLayerCompositor::setDocumentOverlayRootLayer):
+        * rendering/RenderLayerCompositor.h:
+        Add the concept of a document overlay layer, which is plugged in as the
+        last child of the root content layer. Expose it to WebKit2.
+
</ins><span class="cx"> 2014-04-09  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Autocorrection causes ASSERT when replacing alternative string
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -868,6 +868,7 @@
</span><span class="cx"> __ZN7WebCore21NetworkStorageSession28createPrivateBrowsingSessionERKN3WTF6StringE
</span><span class="cx"> __ZN7WebCore21PlatformKeyboardEvent24disambiguateKeyDownEventENS_13PlatformEvent4TypeEb
</span><span class="cx"> __ZN7WebCore21RemoteCommandListener6createERNS_27RemoteCommandListenerClientE
</span><ins>+__ZN7WebCore21RenderLayerCompositor27setDocumentOverlayRootLayerEPNS_13GraphicsLayerE
</ins><span class="cx"> __ZN7WebCore21ResourceLoadScheduler20servePendingRequestsENS_20ResourceLoadPriorityE
</span><span class="cx"> __ZN7WebCore21ResourceLoadScheduler20servePendingRequestsEPNS0_15HostInformationENS_20ResourceLoadPriorityE
</span><span class="cx"> __ZN7WebCore21ResourceLoadScheduler21resumePendingRequestsEv
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -255,6 +255,7 @@
</span><span class="cx">     , m_isTrackingRepaints(false)
</span><span class="cx">     , m_layersWithTiledBackingCount(0)
</span><span class="cx">     , m_rootLayerAttachment(RootLayerUnattached)
</span><ins>+    , m_documentOverlayRootLayer(nullptr)
</ins><span class="cx">     , m_layerFlushTimer(this, &amp;RenderLayerCompositor::layerFlushTimerFired)
</span><span class="cx">     , m_layerFlushThrottlingEnabled(page() &amp;&amp; page()-&gt;progress().isMainLoadProgressing())
</span><span class="cx">     , m_layerFlushThrottlingTemporarilyDisabledForInteraction(false)
</span><span class="lines">@@ -1460,6 +1461,9 @@
</span><span class="cx"> 
</span><span class="cx">         childLayersOfEnclosingLayer.append(layerBacking-&gt;childForSuperlayers());
</span><span class="cx">     }
</span><ins>+
+    if (m_documentOverlayRootLayer)
+        childLayersOfEnclosingLayer.append(m_documentOverlayRootLayer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderLayerCompositor::rebuildRegionCompositingLayerTree(RenderNamedFlowFragment* region, Vector&lt;GraphicsLayer*&gt;&amp; childList, int depth)
</span><span class="lines">@@ -3810,4 +3814,12 @@
</span><span class="cx">     m_renderView.frameView().firePaintRelatedMilestonesIfNeeded();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderLayerCompositor::setDocumentOverlayRootLayer(GraphicsLayer* documentOverlayRootLayer)
+{
+    if (m_documentOverlayRootLayer)
+        m_documentOverlayRootLayer-&gt;removeFromParent();
+    m_documentOverlayRootLayer = documentOverlayRootLayer;
+    scheduleCompositingLayerUpdate();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -304,6 +304,8 @@
</span><span class="cx">     void setRootExtendedBackgroundColor(const Color&amp;);
</span><span class="cx">     Color rootExtendedBackgroundColor() const { return m_rootExtendedBackgroundColor; }
</span><span class="cx"> 
</span><ins>+    void setDocumentOverlayRootLayer(GraphicsLayer*);
+
</ins><span class="cx"> private:
</span><span class="cx">     class OverlapMap;
</span><span class="cx"> 
</span><span class="lines">@@ -506,6 +508,8 @@
</span><span class="cx">     std::unique_ptr&lt;GraphicsLayer&gt; m_layerForFooter;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    GraphicsLayer* m_documentOverlayRootLayer;
+
</ins><span class="cx">     std::unique_ptr&lt;GraphicsLayerUpdater&gt; m_layerUpdater; // Updates tiled layer visible area periodically while animations are running.
</span><span class="cx"> 
</span><span class="cx">     Timer&lt;RenderLayerCompositor&gt; m_layerFlushTimer;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/ChangeLog        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -1,3 +1,85 @@
</span><ins>+2014-04-11  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Support document-relative and custom-frame page overlays
+        https://bugs.webkit.org/show_bug.cgi?id=131560
+        &lt;rdar://problem/16595556&gt;
+
+        Reviewed by Simon Fraser.
+
+        Add &quot;document-relative&quot; overlays, which attach to (and scroll with) the document,
+        and can be given a frame rect within the document to avoid overallocation of backing store.
+
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::didChangeScrollOffset):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::mainFrame):
+        (WebKit::WebPage::mainFrameView):
+        (WebKit::WebPage::didChangeScrollOffsetForFrame):
+        * WebProcess/WebPage/WebPage.h:
+        Let the PageOverlayController know *which* frame scrolled, instead of &quot;any frame&quot;.
+
+        * WebProcess/WebPage/FindController.cpp:
+        (WebKit::FindController::updateFindUIAfterPageScroll):
+        Factor out shared code.
+
+        (WebKit::FindController::willMoveToWebPage):
+        (WebKit::FindController::drawRect):
+        We can use clearRect() instead of a transparency layer and fillRect().
+        I've looked through all the other overlay clients I know of and none of them
+        depend on having a transparency layer at the overlay level.
+
+        * WebProcess/WebPage/PageOverlay.cpp:
+        (WebKit::PageOverlay::create):
+        (WebKit::PageOverlay::PageOverlay):
+        (WebKit::PageOverlay::bounds):
+        (WebKit::PageOverlay::frame):
+        (WebKit::PageOverlay::setFrame):
+        (WebKit::PageOverlay::drawRect):
+        Add OverlayType, which allows creation of Document or View relative overlays.
+        All overlays up to this point are View relative, so we default to that.
+        Document-relative overlays scroll with the page instead of repainting as
+        the page scrolls. They can also be given an explicit frame, allowing them
+        to be smaller than the entire document.
+
+        * WebProcess/WebPage/PageOverlay.h:
+        (WebKit::PageOverlay::overlayType):
+        (WebKit::PageOverlay::webPage):
+        (WebKit::PageOverlay::client): Deleted.
+        * WebProcess/WebPage/PageOverlayController.cpp:
+        (WebKit::PageOverlayController::initialize):
+        (WebKit::PageOverlayController::installPageOverlay):
+        (WebKit::PageOverlayController::uninstallPageOverlay):
+        (WebKit::PageOverlayController::updateForceSynchronousScrollLayerPositionUpdates):
+        (WebKit::updateOverlayGeometry):
+        (WebKit::PageOverlayController::setPageOverlayNeedsDisplay):
+        (WebKit::PageOverlayController::didChangeViewSize):
+        (WebKit::PageOverlayController::didChangeDocumentSize):
+        (WebKit::PageOverlayController::didChangeDeviceScaleFactor):
+        (WebKit::PageOverlayController::didScrollFrame):
+        (WebKit::PageOverlayController::flushPageOverlayLayers):
+        (WebKit::PageOverlayController::didChangeOverlayFrame):
+        Keep two overlay root layers - one for view-relative
+        and one for document-relative overlays.
+        Don't force synchronous scrolling if we only have document-relative overlays.
+        Update the overlay's position as well as its size whenever necessary.
+        Update document-relative overlay geometry when the document size changes.
+        Only explicitly flush view-relative overlays; document-relative ones
+        are plugged into the WebCore layer tree and flushed along with the page.
+
+        * WebProcess/WebPage/PageOverlayController.h:
+        (WebKit::PageOverlayController::documentOverlayRootLayer):
+        (WebKit::PageOverlayController::viewOverlayRootLayer):
+        * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h:
+        * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+        (WebKit::RemoteLayerTreeDrawingArea::setRootCompositingLayer):
+        (WebKit::RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged):
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::mainFrameContentSizeChanged):
+        (WebKit::TiledCoreAnimationDrawingArea::setRootCompositingLayer):
+        Let the PageOverlay controller know when the document size changes.
+        When we set up compositing, push the document overlay root layer
+        down into WebCore.
+
</ins><span class="cx"> 2014-04-11  Pratik Solanki  &lt;psolanki@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS WebKit2]: Share NSURLCache directory for webkit processes
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -1579,17 +1579,7 @@
</span><span class="cx">     if (!webPage)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    webPage-&gt;didChangeScrollOffsetForAnyFrame();
-
-    if (!m_frame-&gt;isMainFrame())
-        return;
-
-    // If this is called when tearing down a FrameView, the WebCore::Frame's
-    // current FrameView will be null.
-    if (!m_frame-&gt;coreFrame()-&gt;view())
-        return;
-
-    webPage-&gt;updateMainFrameScrollOffsetPinning();
</del><ins>+    webPage-&gt;didChangeScrollOffsetForFrame(m_frame-&gt;coreFrame());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool WebFrameLoaderClient::allowScript(bool enabledPerSettings)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageFindControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/FindController.cpp (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/FindController.cpp        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/FindController.cpp        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -162,9 +162,8 @@
</span><span class="cx">             RefPtr&lt;PageOverlay&gt; findPageOverlay = PageOverlay::create(this);
</span><span class="cx">             m_findPageOverlay = findPageOverlay.get();
</span><span class="cx">             m_webPage-&gt;installPageOverlay(findPageOverlay.release(), PageOverlay::FadeMode::Fade);
</span><del>-            m_findPageOverlay-&gt;setNeedsDisplay();
-        } else
-            m_findPageOverlay-&gt;setNeedsDisplay();
</del><ins>+        }
+        m_findPageOverlay-&gt;setNeedsDisplay();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -394,7 +393,7 @@
</span><span class="cx"> static const float overlayBackgroundBlue = 0.1;
</span><span class="cx"> static const float overlayBackgroundAlpha = 0.25;
</span><span class="cx"> 
</span><del>-void FindController::drawRect(PageOverlay* /*pageOverlay*/, GraphicsContext&amp; graphicsContext, const IntRect&amp; dirtyRect)
</del><ins>+void FindController::drawRect(PageOverlay*, GraphicsContext&amp; graphicsContext, const IntRect&amp; dirtyRect)
</ins><span class="cx"> {
</span><span class="cx">     Color overlayBackgroundColor(overlayBackgroundRed, overlayBackgroundGreen, overlayBackgroundBlue, overlayBackgroundAlpha);
</span><span class="cx"> 
</span><span class="lines">@@ -413,16 +412,13 @@
</span><span class="cx">         for (size_t i = 0; i &lt; rects.size(); ++i) {
</span><span class="cx">             IntRect whiteFrameRect = rects[i];
</span><span class="cx">             whiteFrameRect.inflate(1);
</span><del>-
</del><span class="cx">             graphicsContext.fillRect(whiteFrameRect);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    graphicsContext.setFillColor(Color::transparent, ColorSpaceSRGB);
-
</del><span class="cx">     // Clear out the holes.
</span><span class="cx">     for (size_t i = 0; i &lt; rects.size(); ++i)
</span><del>-        graphicsContext.fillRect(rects[i]);
</del><ins>+        graphicsContext.clearRect(rects[i]);
</ins><span class="cx"> 
</span><span class="cx">     if (!m_isShowingFindIndicator)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagePageOverlaycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.cpp        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -42,12 +42,12 @@
</span><span class="cx"> static const double fadeAnimationDuration = 0.2;
</span><span class="cx"> static const double fadeAnimationFrameRate = 30;
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;PageOverlay&gt; PageOverlay::create(Client* client)
</del><ins>+PassRefPtr&lt;PageOverlay&gt; PageOverlay::create(Client* client, OverlayType overlayType)
</ins><span class="cx"> {
</span><del>-    return adoptRef(new PageOverlay(client));
</del><ins>+    return adoptRef(new PageOverlay(client, overlayType));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-PageOverlay::PageOverlay(Client* client)
</del><ins>+PageOverlay::PageOverlay(Client* client, OverlayType overlayType)
</ins><span class="cx">     : m_client(client)
</span><span class="cx">     , m_webPage(0)
</span><span class="cx">     , m_fadeAnimationTimer(RunLoop::main(), this, &amp;PageOverlay::fadeAnimationTimerFired)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx">     , m_fadeAnimationDuration(fadeAnimationDuration)
</span><span class="cx">     , m_fadeAnimationType(NoAnimation)
</span><span class="cx">     , m_fractionFadedIn(1.0)
</span><ins>+    , m_overlayType(overlayType)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -64,20 +65,45 @@
</span><span class="cx"> 
</span><span class="cx"> IntRect PageOverlay::bounds() const
</span><span class="cx"> {
</span><del>-    FrameView* frameView = m_webPage-&gt;corePage()-&gt;mainFrame().view();
</del><ins>+    if (!m_overrideFrame.isEmpty())
+        return IntRect(IntPoint(), m_overrideFrame.size());
</ins><span class="cx"> 
</span><del>-    int width = frameView-&gt;width();
-    int height = frameView-&gt;height();
</del><ins>+    FrameView* frameView = m_webPage-&gt;mainFrameView();
</ins><span class="cx"> 
</span><del>-    if (!ScrollbarTheme::theme()-&gt;usesOverlayScrollbars()) {
-        if (frameView-&gt;verticalScrollbar())
-            width -= frameView-&gt;verticalScrollbar()-&gt;width();
-        if (frameView-&gt;horizontalScrollbar())
-            height -= frameView-&gt;horizontalScrollbar()-&gt;height();
-    }    
-    return IntRect(0, 0, width, height);
</del><ins>+    switch (m_overlayType) {
+    case OverlayType::View: {
+        int width = frameView-&gt;width();
+        int height = frameView-&gt;height();
+
+        if (!ScrollbarTheme::theme()-&gt;usesOverlayScrollbars()) {
+            if (frameView-&gt;verticalScrollbar())
+                width -= frameView-&gt;verticalScrollbar()-&gt;width();
+            if (frameView-&gt;horizontalScrollbar())
+                height -= frameView-&gt;horizontalScrollbar()-&gt;height();
+        }
+        return IntRect(0, 0, width, height);
+    }
+    case OverlayType::Document:
+        return IntRect(IntPoint(), frameView-&gt;contentsSize());
+    };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IntRect PageOverlay::frame() const
+{
+    if (!m_overrideFrame.isEmpty())
+        return m_overrideFrame;
+
+    return bounds();
+}
+
+void PageOverlay::setFrame(IntRect frame)
+{
+    m_overrideFrame = frame;
+
+    if (m_webPage)
+        m_webPage-&gt;pageOverlayController().didChangeOverlayFrame(this);
+}
+
</ins><span class="cx"> void PageOverlay::setPage(WebPage* webPage)
</span><span class="cx"> {
</span><span class="cx">     m_client-&gt;willMoveToWebPage(this, webPage);
</span><span class="lines">@@ -108,12 +134,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     GraphicsContextStateSaver stateSaver(graphicsContext);
</span><del>-    graphicsContext.beginTransparencyLayer(1);
-    graphicsContext.setCompositeOperation(CompositeCopy);
-
</del><span class="cx">     m_client-&gt;drawRect(this, graphicsContext, paintRect);
</span><del>-
-    graphicsContext.endTransparencyLayer();
</del><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> bool PageOverlay::mouseEvent(const WebMouseEvent&amp; mouseEvent)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagePageOverlayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/PageOverlay.h        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -28,13 +28,12 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;APIObject.h&quot;
</span><span class="cx"> #include &quot;WKBase.h&quot;
</span><ins>+#include &lt;WebCore/IntRect.h&gt;
</ins><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><del>-    class GraphicsContext;
-    class IntPoint;
-    class IntRect;
</del><ins>+class GraphicsContext;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -59,7 +58,12 @@
</span><span class="cx">         virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay*, bool /* parameterizedNames */) { return 0; }
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static PassRefPtr&lt;PageOverlay&gt; create(Client*);
</del><ins>+    enum class OverlayType {
+        View, // Fixed to the view size; does not scale or scroll with the document, repaints on scroll.
+        Document, // Scales and scrolls with the document.
+    };
+
+    static PassRefPtr&lt;PageOverlay&gt; create(Client*, OverlayType = OverlayType::View);
</ins><span class="cx">     virtual ~PageOverlay();
</span><span class="cx"> 
</span><span class="cx">     void setPage(WebPage*);
</span><span class="lines">@@ -81,13 +85,17 @@
</span><span class="cx">     Client* client() const { return m_client; }
</span><span class="cx"> 
</span><span class="cx">     enum class FadeMode { DoNotFade, Fade };
</span><ins>+
+    OverlayType overlayType() { return m_overlayType; }
+
+    WebCore::IntRect bounds() const;
+    WebCore::IntRect frame() const;
+    void setFrame(WebCore::IntRect);
</ins><span class="cx">     
</span><span class="cx"> protected:
</span><del>-    explicit PageOverlay(Client*);
</del><ins>+    explicit PageOverlay(Client*, OverlayType);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebCore::IntRect bounds() const;
-
</del><span class="cx">     void startFadeAnimation();
</span><span class="cx">     void fadeAnimationTimerFired();
</span><span class="cx"> 
</span><span class="lines">@@ -106,6 +114,9 @@
</span><span class="cx"> 
</span><span class="cx">     FadeAnimationType m_fadeAnimationType;
</span><span class="cx">     float m_fractionFadedIn;
</span><ins>+
+    OverlayType m_overlayType;
+    WebCore::IntRect m_overrideFrame;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagePageOverlayControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.cpp (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.cpp        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.cpp        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -29,9 +29,11 @@
</span><span class="cx"> #include &quot;DrawingArea.h&quot;
</span><span class="cx"> #include &quot;PageOverlay.h&quot;
</span><span class="cx"> #include &quot;WebPage.h&quot;
</span><ins>+#include &lt;WebCore/Frame.h&gt;
</ins><span class="cx"> #include &lt;WebCore/FrameView.h&gt;
</span><span class="cx"> #include &lt;WebCore/GraphicsContext.h&gt;
</span><span class="cx"> #include &lt;WebCore/GraphicsLayer.h&gt;
</span><ins>+#include &lt;WebCore/MainFrame.h&gt;
</ins><span class="cx"> #include &lt;WebCore/ScrollingCoordinator.h&gt;
</span><span class="cx"> #include &lt;WebCore/Settings.h&gt;
</span><span class="cx"> #include &lt;WebCore/TiledBacking.h&gt;
</span><span class="lines">@@ -47,17 +49,21 @@
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::initialize()
</span><span class="cx"> {
</span><del>-    ASSERT(!m_rootLayer);
</del><ins>+    ASSERT(!m_documentOverlayRootLayer);
+    ASSERT(!m_viewOverlayRootLayer);
</ins><span class="cx"> 
</span><del>-    m_rootLayer = GraphicsLayer::create(m_webPage-&gt;drawingArea()-&gt;graphicsLayerFactory(), this);
</del><ins>+    m_documentOverlayRootLayer = GraphicsLayer::create(m_webPage-&gt;drawingArea()-&gt;graphicsLayerFactory(), this);
+    m_viewOverlayRootLayer = GraphicsLayer::create(m_webPage-&gt;drawingArea()-&gt;graphicsLayerFactory(), this);
</ins><span class="cx"> #ifndef NDEBUG
</span><del>-    m_rootLayer-&gt;setName(&quot;Page Overlay container&quot;);
</del><ins>+    m_documentOverlayRootLayer-&gt;setName(&quot;Page Overlay container (document-relative)&quot;);
+    m_viewOverlayRootLayer-&gt;setName(&quot;Page Overlay container (view-relative)&quot;);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::installPageOverlay(PassRefPtr&lt;PageOverlay&gt; pageOverlay, PageOverlay::FadeMode fadeMode)
</span><span class="cx"> {
</span><del>-    ASSERT(m_rootLayer);
</del><ins>+    ASSERT(m_documentOverlayRootLayer);
+    ASSERT(m_viewOverlayRootLayer);
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;PageOverlay&gt; overlay = pageOverlay;
</span><span class="cx"> 
</span><span class="lines">@@ -71,20 +77,26 @@
</span><span class="cx">         overlay-&gt;startFadeInAnimation();
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;GraphicsLayer&gt; layer = GraphicsLayer::create(m_webPage-&gt;drawingArea()-&gt;graphicsLayerFactory(), this);
</span><ins>+    layer-&gt;setAnchorPoint(FloatPoint3D());
+    layer-&gt;setPosition(overlay-&gt;frame().location());
</ins><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     layer-&gt;setName(&quot;Page Overlay content&quot;);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     updateSettingsForLayer(layer.get());
</span><del>-    m_rootLayer-&gt;addChild(layer.get());
</del><ins>+
+    switch (overlay-&gt;overlayType()) {
+    case PageOverlay::OverlayType::View:
+        m_viewOverlayRootLayer-&gt;addChild(layer.get());
+        break;
+    case PageOverlay::OverlayType::Document:
+        m_documentOverlayRootLayer-&gt;addChild(layer.get());
+        break;
+    }
+
</ins><span class="cx">     m_overlayGraphicsLayers.set(overlay.get(), std::move(layer));
</span><span class="cx"> 
</span><del>-#if ENABLE(ASYNC_SCROLLING)
-    if (Page* page = m_webPage-&gt;corePage()) {
-        if (ScrollingCoordinator* scrollingCoordinator = page-&gt;scrollingCoordinator())
-            scrollingCoordinator-&gt;setForceSynchronousScrollLayerPositionUpdates(true);
-    }
-#endif
</del><ins>+    updateForceSynchronousScrollLayerPositionUpdates();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::uninstallPageOverlay(PageOverlay* overlay, PageOverlay::FadeMode fadeMode)
</span><span class="lines">@@ -102,17 +114,36 @@
</span><span class="cx">     ASSERT(overlayIndex != notFound);
</span><span class="cx">     m_pageOverlays.remove(overlayIndex);
</span><span class="cx"> 
</span><del>-    if (!m_pageOverlays.isEmpty())
-        return;
</del><ins>+    updateForceSynchronousScrollLayerPositionUpdates();
+}
</ins><span class="cx"> 
</span><ins>+void PageOverlayController::updateForceSynchronousScrollLayerPositionUpdates()
+{
</ins><span class="cx"> #if ENABLE(ASYNC_SCROLLING)
</span><ins>+    bool forceSynchronousScrollLayerPositionUpdates = false;
+
+    for (auto&amp; overlay : m_pageOverlays) {
+        if (overlay-&gt;overlayType() == PageOverlay::OverlayType::View)
+            forceSynchronousScrollLayerPositionUpdates = true;
+    }
+
</ins><span class="cx">     if (Page* page = m_webPage-&gt;corePage()) {
</span><span class="cx">         if (ScrollingCoordinator* scrollingCoordinator = page-&gt;scrollingCoordinator())
</span><del>-            scrollingCoordinator-&gt;setForceSynchronousScrollLayerPositionUpdates(false);
</del><ins>+            scrollingCoordinator-&gt;setForceSynchronousScrollLayerPositionUpdates(forceSynchronousScrollLayerPositionUpdates);
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void updateOverlayGeometry(PageOverlay* overlay, GraphicsLayer* graphicsLayer)
+{
+    if (!graphicsLayer-&gt;drawsContent())
+        return;
+
+    graphicsLayer-&gt;setPosition(overlay-&gt;frame().location());
+    graphicsLayer-&gt;setSize(overlay-&gt;frame().size());
+    graphicsLayer-&gt;setNeedsDisplay();
+}
+
</ins><span class="cx"> void PageOverlayController::setPageOverlayNeedsDisplay(PageOverlay* overlay, const WebCore::IntRect&amp; dirtyRect)
</span><span class="cx"> {
</span><span class="cx">     GraphicsLayer* graphicsLayer = m_overlayGraphicsLayers.get(overlay);
</span><span class="lines">@@ -121,8 +152,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (!graphicsLayer-&gt;drawsContent()) {
</span><span class="cx">         graphicsLayer-&gt;setDrawsContent(true);
</span><del>-        graphicsLayer-&gt;setSize(m_webPage-&gt;size());
</del><ins>+        updateOverlayGeometry(overlay, graphicsLayer);
</ins><span class="cx">     }
</span><ins>+
</ins><span class="cx">     graphicsLayer-&gt;setNeedsDisplayInRect(dirtyRect);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -147,14 +179,20 @@
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::didChangeViewSize()
</span><span class="cx"> {
</span><del>-    for (auto&amp; graphicsLayer : m_overlayGraphicsLayers.values()) {
-        if (!graphicsLayer-&gt;drawsContent())
-            continue;
-        graphicsLayer-&gt;setSize(m_webPage-&gt;size());
-        graphicsLayer-&gt;setNeedsDisplay();
</del><ins>+    for (auto&amp; overlayAndLayer : m_overlayGraphicsLayers) {
+        if (overlayAndLayer.key-&gt;overlayType() == PageOverlay::OverlayType::View)
+            updateOverlayGeometry(overlayAndLayer.key, overlayAndLayer.value.get());
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void PageOverlayController::didChangeDocumentSize()
+{
+    for (auto&amp; overlayAndLayer : m_overlayGraphicsLayers) {
+        if (overlayAndLayer.key-&gt;overlayType() == PageOverlay::OverlayType::Document)
+            updateOverlayGeometry(overlayAndLayer.key, overlayAndLayer.value.get());
+    }
+}
+
</ins><span class="cx"> void PageOverlayController::didChangePreferences()
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; graphicsLayer : m_overlayGraphicsLayers.values())
</span><span class="lines">@@ -163,8 +201,11 @@
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::didChangeDeviceScaleFactor()
</span><span class="cx"> {
</span><del>-    m_rootLayer-&gt;noteDeviceOrPageScaleFactorChangedIncludingDescendants();
-    invalidateAllPageOverlayLayers();
</del><ins>+    m_documentOverlayRootLayer-&gt;noteDeviceOrPageScaleFactorChangedIncludingDescendants();
+    m_viewOverlayRootLayer-&gt;noteDeviceOrPageScaleFactorChangedIncludingDescendants();
+
+    for (auto&amp; graphicsLayer : m_overlayGraphicsLayers.values())
+        graphicsLayer-&gt;setNeedsDisplay();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::didChangeExposedRect()
</span><span class="lines">@@ -172,20 +213,17 @@
</span><span class="cx">     m_webPage-&gt;drawingArea()-&gt;scheduleCompositingLayerFlush();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageOverlayController::didScrollAnyFrame()
</del><ins>+void PageOverlayController::didScrollFrame(Frame* frame)
</ins><span class="cx"> {
</span><del>-    invalidateAllPageOverlayLayers();
</del><ins>+    for (auto&amp; overlayAndLayer : m_overlayGraphicsLayers) {
+        if (overlayAndLayer.key-&gt;overlayType() == PageOverlay::OverlayType::View || !frame-&gt;isMainFrame())
+            overlayAndLayer.value-&gt;setNeedsDisplay();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageOverlayController::invalidateAllPageOverlayLayers()
-{
-    for (auto&amp; graphicsLayer : m_overlayGraphicsLayers.values())
-        graphicsLayer-&gt;setNeedsDisplay();
-}
-
</del><span class="cx"> void PageOverlayController::flushPageOverlayLayers(FloatRect visibleRect)
</span><span class="cx"> {
</span><del>-    m_rootLayer-&gt;flushCompositingState(visibleRect);
</del><ins>+    m_viewOverlayRootLayer-&gt;flushCompositingState(visibleRect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageOverlayController::updateSettingsForLayer(GraphicsLayer* layer)
</span><span class="lines">@@ -259,4 +297,16 @@
</span><span class="cx">     m_webPage-&gt;drawingArea()-&gt;scheduleCompositingLayerFlush();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void PageOverlayController::didChangeOverlayFrame(PageOverlay* overlay)
+{
+    ASSERT(m_pageOverlays.contains(overlay));
+
+    GraphicsLayer* graphicsLayer = m_overlayGraphicsLayers.get(overlay);
+
+    if (!graphicsLayer-&gt;drawsContent())
+        return;
+
+    updateOverlayGeometry(overlay, graphicsLayer);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagePageOverlayControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.h (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.h        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/PageOverlayController.h        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -33,6 +33,10 @@
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><ins>+namespace WebCore {
+class Frame;
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class WebMouseEvent;
</span><span class="lines">@@ -44,7 +48,8 @@
</span><span class="cx"> 
</span><span class="cx">     void initialize();
</span><span class="cx"> 
</span><del>-    WebCore::GraphicsLayer* rootLayer() const { return m_rootLayer.get(); }
</del><ins>+    WebCore::GraphicsLayer* documentOverlayRootLayer() const { return m_documentOverlayRootLayer.get(); }
+    WebCore::GraphicsLayer* viewOverlayRootLayer() const { return m_viewOverlayRootLayer.get(); }
</ins><span class="cx"> 
</span><span class="cx">     void installPageOverlay(PassRefPtr&lt;PageOverlay&gt;, PageOverlay::FadeMode);
</span><span class="cx">     void uninstallPageOverlay(PageOverlay*, PageOverlay::FadeMode);
</span><span class="lines">@@ -54,10 +59,12 @@
</span><span class="cx">     void clearPageOverlay(PageOverlay*);
</span><span class="cx"> 
</span><span class="cx">     void didChangeViewSize();
</span><ins>+    void didChangeDocumentSize();
</ins><span class="cx">     void didChangePreferences();
</span><span class="cx">     void didChangeDeviceScaleFactor();
</span><span class="cx">     void didChangeExposedRect();
</span><del>-    void didScrollAnyFrame();
</del><ins>+    void didScrollFrame(WebCore::Frame*);
+    void didChangeOverlayFrame(PageOverlay*);
</ins><span class="cx"> 
</span><span class="cx">     void flushPageOverlayLayers(WebCore::FloatRect);
</span><span class="cx"> 
</span><span class="lines">@@ -69,7 +76,7 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void updateSettingsForLayer(WebCore::GraphicsLayer*);
</span><del>-    void invalidateAllPageOverlayLayers();
</del><ins>+    void updateForceSynchronousScrollLayerPositionUpdates();
</ins><span class="cx"> 
</span><span class="cx">     // WebCore::GraphicsLayerClient
</span><span class="cx">     virtual void notifyAnimationStarted(const WebCore::GraphicsLayer*, double) override { }
</span><span class="lines">@@ -78,7 +85,8 @@
</span><span class="cx">     virtual float deviceScaleFactor() const override;
</span><span class="cx">     virtual void didCommitChangesForLayer(const WebCore::GraphicsLayer*) const override { }
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;WebCore::GraphicsLayer&gt; m_rootLayer;
</del><ins>+    std::unique_ptr&lt;WebCore::GraphicsLayer&gt; m_documentOverlayRootLayer;
+    std::unique_ptr&lt;WebCore::GraphicsLayer&gt; m_viewOverlayRootLayer;
</ins><span class="cx">     HashMap&lt;PageOverlay*, std::unique_ptr&lt;WebCore::GraphicsLayer&gt;&gt; m_overlayGraphicsLayers;
</span><span class="cx">     Vector&lt;RefPtr&lt;PageOverlay&gt;&gt; m_pageOverlays;
</span><span class="cx">     WebPage* m_webPage;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -3817,7 +3817,7 @@
</span><span class="cx"> 
</span><span class="cx"> Frame* WebPage::mainFrame() const
</span><span class="cx"> {
</span><del>-    return m_page ? &amp;m_page-&gt;mainFrame() : 0;
</del><ins>+    return m_page ? &amp;m_page-&gt;mainFrame() : nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FrameView* WebPage::mainFrameView() const
</span><span class="lines">@@ -3825,7 +3825,7 @@
</span><span class="cx">     if (Frame* frame = mainFrame())
</span><span class="cx">         return frame-&gt;view();
</span><span class="cx">     
</span><del>-    return 0;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::setScrollingPerformanceLoggingEnabled(bool enabled)
</span><span class="lines">@@ -4506,9 +4506,19 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void WebPage::didChangeScrollOffsetForAnyFrame()
</del><ins>+void WebPage::didChangeScrollOffsetForFrame(Frame* frame)
</ins><span class="cx"> {
</span><del>-    m_pageOverlayController.didScrollAnyFrame();
</del><ins>+    m_pageOverlayController.didScrollFrame(frame);
+
+    if (!frame-&gt;isMainFrame())
+        return;
+
+    // If this is called when tearing down a FrameView, the WebCore::Frame's
+    // current FrameView will be null.
+    if (!frame-&gt;view())
+        return;
+
+    updateMainFrameScrollOffsetPinning();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -780,7 +780,7 @@
</span><span class="cx">     void handleTelephoneNumberClick(const String&amp; number, const WebCore::IntPoint&amp;);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    void didChangeScrollOffsetForAnyFrame();
</del><ins>+    void didChangeScrollOffsetForFrame(WebCore::Frame*);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WebPage(uint64_t pageID, const WebPageCreationParameters&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacRemoteLayerTreeDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.h        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -81,6 +81,8 @@
</span><span class="cx">     virtual void setDeviceScaleFactor(float) override;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    virtual void mainFrameContentSizeChanged(const WebCore::IntSize&amp;) override;
+
</ins><span class="cx">     void updateScrolledExposedRect();
</span><span class="cx"> 
</span><span class="cx">     void layerFlushTimerFired(WebCore::Timer&lt;RemoteLayerTreeDrawingArea&gt;*);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacRemoteLayerTreeDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -38,6 +38,8 @@
</span><span class="cx"> #import &lt;WebCore/Frame.h&gt;
</span><span class="cx"> #import &lt;WebCore/FrameView.h&gt;
</span><span class="cx"> #import &lt;WebCore/MainFrame.h&gt;
</span><ins>+#import &lt;WebCore/RenderLayerCompositor.h&gt;
+#import &lt;WebCore/RenderView.h&gt;
</ins><span class="cx"> #import &lt;WebCore/Settings.h&gt;
</span><span class="cx"> #import &lt;WebCore/TiledBacking.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -89,9 +91,11 @@
</span><span class="cx">     Vector&lt;GraphicsLayer *&gt; children;
</span><span class="cx">     if (rootLayer) {
</span><span class="cx">         children.append(rootLayer);
</span><del>-        children.append(m_webPage-&gt;pageOverlayController().rootLayer());
</del><ins>+        children.append(m_webPage-&gt;pageOverlayController().viewOverlayRootLayer());
</ins><span class="cx">     }
</span><span class="cx">     m_rootLayer-&gt;setChildren(children);
</span><ins>+
+    m_webPage-&gt;mainFrameView()-&gt;renderView()-&gt;compositor().setDocumentOverlayRootLayer(m_webPage-&gt;pageOverlayController().documentOverlayRootLayer());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteLayerTreeDrawingArea::updateGeometry(const IntSize&amp; viewSize, const IntSize&amp; layerPosition)
</span><span class="lines">@@ -293,4 +297,9 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged(const IntSize&amp;)
+{
+    m_webPage-&gt;pageOverlayController().didChangeDocumentSize();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (167151 => 167152)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2014-04-11 21:35:17 UTC (rev 167151)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2014-04-11 21:41:28 UTC (rev 167152)
</span><span class="lines">@@ -201,6 +201,8 @@
</span><span class="cx"> 
</span><span class="cx"> void TiledCoreAnimationDrawingArea::mainFrameContentSizeChanged(const IntSize&amp;)
</span><span class="cx"> {
</span><ins>+    m_webPage-&gt;pageOverlayController().didChangeDocumentSize();
+
</ins><span class="cx">     if (!m_webPage-&gt;minimumLayoutSize().width())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -445,8 +447,10 @@
</span><span class="cx">     [CATransaction begin];
</span><span class="cx">     [CATransaction setDisableActions:YES];
</span><span class="cx"> 
</span><del>-    [m_hostingLayer setSublayers:layer ? @[ layer, m_webPage-&gt;pageOverlayController().rootLayer()-&gt;platformLayer() ] : @[ ]];
</del><ins>+    [m_hostingLayer setSublayers:layer ? @[ layer, m_webPage-&gt;pageOverlayController().viewOverlayRootLayer()-&gt;platformLayer() ] : @[ ]];
</ins><span class="cx"> 
</span><ins>+    m_webPage-&gt;mainFrameView()-&gt;renderView()-&gt;compositor().setDocumentOverlayRootLayer(m_webPage-&gt;pageOverlayController().documentOverlayRootLayer());
+
</ins><span class="cx">     bool hadRootLayer = !!m_rootLayer;
</span><span class="cx">     m_rootLayer = layer;
</span><span class="cx">     [m_rootLayer setSublayerTransform:m_transform];
</span></span></pre>
</div>
</div>

</body>
</html>