No subject


Wed Aug 1 07:28:53 PDT 2012


possibly cached layer can be uncached, as it won't be needed.
Patch providesa simple solution to that.

* Api/InRegionScroller.cpp:
(BlackBerry::WebKit::InRegionScrollerPrivate::InRegionScrollerPrivate):
(BlackBerry::WebKit::InRegionScrollerPrivate::reset):
(BlackBerry::WebKit::InRegionScrollerPrivate::setScrollPositionWebKitThre=
ad):
(BlackBerry::WebKit::InRegionScrollerPrivate::calculateActiveAndShrinkCac=
hedScrollableAreas):
(WebKit):
(BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionScrollable=
AreasForPoint):
* Api/InRegionScroller_p.h:
(InRegionScrollerPrivate):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href=3D"#trunkSourceWebKitblackberryApiInRegionScrollercpp">trunk/=
Source/WebKit/blackberry/Api/InRegionScroller.cpp</a></li>
<li><a href=3D"#trunkSourceWebKitblackberryApiInRegionScroller_ph">trunk/=
Source/WebKit/blackberry/Api/InRegionScroller_p.h</a></li>
<li><a href=3D"#trunkSourceWebKitblackberryChangeLog">trunk/Source/WebKit=
/blackberry/ChangeLog</a></li>
</ul>

</div>
<div id=3D"patch">
<h3>Diff</h3>
<a id=3D"trunkSourceWebKitblackberryApiInRegionScrollercpp"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebKit/blackberry/Api/I=
nRegionScroller.cpp (126766 =3D> 126767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebKit/blackberry/Api/InRegionScrol=
ler.cpp	2012-08-27 15:49:10 UTC (rev 126766)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp	2012-08-27 15=
:49:48 UTC (rev 126767)
</span><span class=3D"lines">@@ -76,6 +76,7 @@
</span><span class=3D"cx">=20
</span><span class=3D"cx"> InRegionScrollerPrivate::InRegionScrollerPriva=
te(WebPagePrivate* webPagePrivate)
</span><span class=3D"cx">     : m_webPage(webPagePrivate)
</span><ins>+    , m_needsActiveScrollableAreaCalculation(false)
</ins><span class=3D"cx"> {
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><span class=3D"lines">@@ -93,6 +94,7 @@
</span><span class=3D"cx"> {
</span><span class=3D"cx">     setNode(0);
</span><span class=3D"cx">=20
</span><ins>+    m_needsActiveScrollableAreaCalculation =3D false;
</ins><span class=3D"cx">     for (size_t i =3D 0; i &lt; m_activeInRegio=
nScrollableAreas.size(); ++i)
</span><span class=3D"cx">         delete m_activeInRegionScrollableAreas=
[i];
</span><span class=3D"cx">     m_activeInRegionScrollableAreas.clear();
</span><span class=3D"lines">@@ -143,13 +145,42 @@
</span><span class=3D"cx">     if (!layer)
</span><span class=3D"cx">         return false;
</span><span class=3D"cx">=20
</span><ins>+    calculateActiveAndShrinkCachedScrollableAreas(layer);
+
</ins><span class=3D"cx">     // FIXME: Clamp maximum and minimum scroll =
positions as a last attempt to fix round errors.
</span><span class=3D"cx">     return setLayerScrollPosition(layer, scrol=
lPosition);
</span><span class=3D"cx"> }
</span><span class=3D"cx">=20
</span><ins>+void InRegionScrollerPrivate::calculateActiveAndShrinkCached=
ScrollableAreas(RenderLayer* layer)
+{
+    if (!m_needsActiveScrollableAreaCalculation)
+        return;
+
+    ASSERT(layer);
+    std::vector&lt;Platform::ScrollViewBase*&gt;::iterator end =3D m_act=
iveInRegionScrollableAreas.end();
+    std::vector&lt;Platform::ScrollViewBase*&gt;::iterator it =3D m_acti=
veInRegionScrollableAreas.begin();
+    while (it !=3D end) {
+        InRegionScrollableArea* curr =3D static_cast&lt;InRegionScrollab=
leArea*&gt;(*it);
+
+        if (layer =3D=3D curr-&gt;layer()) {
+            ++it;
+            continue;
+        }
+
+        delete *it;
+        it =3D m_activeInRegionScrollableAreas.erase(it);
+        // ::erase invalidates the iterators.
+        end =3D m_activeInRegionScrollableAreas.end();
+    }
+
+    ASSERT(m_activeInRegionScrollableAreas.size() =3D=3D 1);
+    m_needsActiveScrollableAreaCalculation =3D false;
+}
+
</ins><span class=3D"cx"> void InRegionScrollerPrivate::calculateInRegion=
ScrollableAreasForPoint(const WebCore::IntPoint&amp; point)
</span><span class=3D"cx"> {
</span><span class=3D"cx">     ASSERT(m_activeInRegionScrollableAreas.emp=
ty());
</span><ins>+    m_needsActiveScrollableAreaCalculation =3D false;
</ins><span class=3D"cx">=20
</span><span class=3D"cx">     HitTestResult result =3D m_webPage-&gt;m_m=
ainFrame-&gt;eventHandler()-&gt;hitTestResultAtPoint(m_webPage-&gt;mapFro=
mViewportToContents(point), false /*allowShadowContent*/);
</span><span class=3D"cx">     Node* node =3D result.innerNonSharedNode()=
;
</span><span class=3D"lines">@@ -190,6 +221,8 @@
</span><span class=3D"cx">     if (m_activeInRegionScrollableAreas.empty(=
))
</span><span class=3D"cx">         return;
</span><span class=3D"cx">=20
</span><ins>+    m_needsActiveScrollableAreaCalculation =3D true;
+
</ins><span class=3D"cx">     // Post-calculate the visible window rects =
in reverse hit test order so
</span><span class=3D"cx">     // we account for all and any clipping rec=
ts.
</span><span class=3D"cx">     WebCore::IntRect recursiveClippingRect(Web=
Core::IntPoint::zero(), m_webPage-&gt;transformedViewportSize());
</span></span></pre></div>
<a id=3D"trunkSourceWebKitblackberryApiInRegionScroller_ph"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebKit/blackberry/Api/I=
nRegionScroller_p.h (126766 =3D> 126767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebKit/blackberry/Api/InRegionScrol=
ler_p.h	2012-08-27 15:49:10 UTC (rev 126766)
+++ trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h	2012-08-27 15=
:49:48 UTC (rev 126767)
</span><span class=3D"lines">@@ -60,12 +60,15 @@
</span><span class=3D"cx"> private:
</span><span class=3D"cx">     bool setLayerScrollPosition(WebCore::Rende=
rLayer*, const WebCore::IntPoint&amp; scrollPosition);
</span><span class=3D"cx">=20
</span><ins>+    void calculateActiveAndShrinkCachedScrollableAreas(WebCo=
re::RenderLayer*);
+
</ins><span class=3D"cx">     void pushBackInRegionScrollable(InRegionScr=
ollableArea*);
</span><span class=3D"cx">=20
</span><span class=3D"cx">     void adjustScrollDelta(const WebCore::IntP=
oint&amp; maxOffset, const WebCore::IntPoint&amp; currentOffset, WebCore:=
:IntSize&amp; delta) const;
</span><span class=3D"cx">=20
</span><span class=3D"cx">     RefPtr&lt;WebCore::Node&gt; m_inRegionScro=
llStartingNode;
</span><span class=3D"cx">     std::vector&lt;Platform::ScrollViewBase*&g=
t; m_activeInRegionScrollableAreas;
</span><ins>+    bool m_needsActiveScrollableAreaCalculation;
</ins><span class=3D"cx"> };
</span><span class=3D"cx">=20
</span><span class=3D"cx"> }
</span></span></pre></div>
<a id=3D"trunkSourceWebKitblackberryChangeLog"></a>
<div class=3D"modfile"><h4>Modified: trunk/Source/WebKit/blackberry/Chang=
eLog (126766 =3D> 126767)</h4>
<pre class=3D"diff"><span>
<span class=3D"info">--- trunk/Source/WebKit/blackberry/ChangeLog	2012-08=
-27 15:49:10 UTC (rev 126766)
+++ trunk/Source/WebKit/blackberry/ChangeLog	2012-08-27 15:49:48 UTC (rev=
 126767)
</span><span class=3D"lines">@@ -1,5 +1,29 @@
</span><span class=3D"cx"> 2012-08-25  Antonio Gomes  &lt;agomes at rim.com&=
gt;
</span><span class=3D"cx">=20
</span><ins>+        BlackBerry] Shrink the in-region nested scrollable l=
ist as soon as we can
+        https://bugs.webkit.org/show_bug.cgi?id=3D95019
+
+        Reviewed by Rob Buis.
+
+        We cache all possible nested scrollable in-region layers given a=
 point.
+        It is up to the client to pick a view, based on the scroll posit=
ion and limits
+        of each layer, and on the direction user swipes its finger.
+        From the point we pick a view on, we stick with it, and any othe=
r
+        possibly cached layer can be uncached, as it won't be needed.
+        Patch provides a simple solution to that.
+
+        * Api/InRegionScroller.cpp:
+        (BlackBerry::WebKit::InRegionScrollerPrivate::InRegionScrollerPr=
ivate):
+        (BlackBerry::WebKit::InRegionScrollerPrivate::reset):
+        (BlackBerry::WebKit::InRegionScrollerPrivate::setScrollPositionW=
ebKitThread):
+        (BlackBerry::WebKit::InRegionScrollerPrivate::calculateActiveAnd=
ShrinkCachedScrollableAreas):
+        (WebKit):
+        (BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionS=
crollableAreasForPoint):
+        * Api/InRegionScroller_p.h:
+        (InRegionScrollerPrivate):
+
+2012-08-25  Antonio Gomes  &lt;agomes at rim.com&gt;
+
</ins><span class=3D"cx">         For convenience, make RenderLayer::encl=
osingElement a public method.
</span><span class=3D"cx">         https://bugs.webkit.org/show_bug.cgi?i=
d=3D95018
</span><span class=3D"cx">=20
</span></span></pre>
</div>
</div>

</body>
</html>


More information about the webkit-changes mailing list