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 < 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<Platform::ScrollViewBase*>::iterator end =3D m_act=
iveInRegionScrollableAreas.end();
+ std::vector<Platform::ScrollViewBase*>::iterator it =3D m_acti=
veInRegionScrollableAreas.begin();
+ while (it !=3D end) {
+ InRegionScrollableArea* curr =3D static_cast<InRegionScrollab=
leArea*>(*it);
+
+ if (layer =3D=3D curr->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& 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->m_m=
ainFrame->eventHandler()->hitTestResultAtPoint(m_webPage->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->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& 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& maxOffset, const WebCore::IntPoint& currentOffset, WebCore:=
:IntSize& delta) const;
</span><span class=3D"cx">=20
</span><span class=3D"cx"> RefPtr<WebCore::Node> m_inRegionScro=
llStartingNode;
</span><span class=3D"cx"> std::vector<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 <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 <agomes at rim.com>
+
</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