summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Scott <phanna@android.com>2011-01-11 10:39:10 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-01-11 10:39:10 -0800
commit2652d9bc7b047c80081467b671ba16559a5e3069 (patch)
tree27b0b74e0566ba5e6550e07a0d5a0e01c9c76db1
parentcea2bc79994f4e4f617a2e1a372dfc44a3f5365a (diff)
parent8b0b15e74bb7f1bd03bfd07f706a5afa637b0b73 (diff)
downloadexternal_webkit-2652d9bc7b047c80081467b671ba16559a5e3069.zip
external_webkit-2652d9bc7b047c80081467b671ba16559a5e3069.tar.gz
external_webkit-2652d9bc7b047c80081467b671ba16559a5e3069.tar.bz2
Merge "Prevent a crash by caching overflow scrolling." into honeycomb
-rw-r--r--WebCore/rendering/RenderLayer.cpp29
-rw-r--r--WebCore/rendering/RenderLayer.h5
-rw-r--r--WebKit/android/jni/WebHistory.cpp2
-rw-r--r--WebKit/android/nav/CacheBuilder.cpp4
4 files changed, 16 insertions, 24 deletions
diff --git a/WebCore/rendering/RenderLayer.cpp b/WebCore/rendering/RenderLayer.cpp
index 06ce331..06ecb29 100644
--- a/WebCore/rendering/RenderLayer.cpp
+++ b/WebCore/rendering/RenderLayer.cpp
@@ -175,6 +175,9 @@ RenderLayer::RenderLayer(RenderBoxModelObject* renderer)
, m_hasCompositingDescendant(false)
, m_mustOverlapCompositedLayers(false)
#endif
+#if ENABLE(ANDROID_OVERFLOW_SCROLL)
+ , m_hasOverflowScroll(false)
+#endif
, m_marquee(0)
, m_staticX(0)
, m_staticY(0)
@@ -792,7 +795,7 @@ FloatPoint RenderLayer::perspectiveOrigin() const
RenderLayer* RenderLayer::stackingContext() const
{
RenderLayer* layer = parent();
-#if ENABLE(COMPOSITED_FIXED_ELEMENTS)
+#if ENABLE(COMPOSITED_FIXED_ELEMENTS) || ENABLE(ANDROID_OVERFLOW_SCROLL)
// When using composited fixed elements, they are turned into a stacking
// context and we thus need to return them.
// We can simplify the while loop by using isStackingContext(); with
@@ -1933,21 +1936,6 @@ bool RenderLayer::hasOverflowControls() const
return m_hBar || m_vBar || m_scrollCorner || renderer()->style()->resize() != RESIZE_NONE;
}
#if ENABLE(ANDROID_OVERFLOW_SCROLL)
-bool RenderLayer::hasOverflowScroll() const
-{
- if (!enclosingElement())
- return false;
- if (m_scrollDimensionsDirty)
- return false;
- EOverflow x = renderer()->style()->overflowX();
- if ((x == OSCROLL || x == OAUTO) && m_scrollWidth > renderBox()->clientWidth())
- return true;
- EOverflow y = renderer()->style()->overflowY();
- if ((y == OSCROLL || y == OAUTO) && m_scrollHeight > renderBox()->clientHeight())
- return true;
- return false;
-}
-
bool RenderLayer::hasOverflowParent() const
{
const RenderLayer* layer = this;
@@ -2166,11 +2154,12 @@ RenderLayer::updateScrollInfoAfterLayout()
updateOverflowStatus(horizontalOverflow, verticalOverflow);
#if ENABLE(ANDROID_OVERFLOW_SCROLL)
- if (hasOverflowScroll()) {
- rendererContentChanged();
- if (parent())
- parent()->dirtyNormalFlowList();
+ bool hasOverflowScroll = (horizontalOverflow && m_hBar) || (verticalOverflow && m_vBar);
+ if (hasOverflowScroll != m_hasOverflowScroll) {
+ m_hasOverflowScroll = hasOverflowScroll;
+ dirtyZOrderLists();
dirtyStackingContextZOrderLists();
+ renderer()->node()->setNeedsStyleRecalc(SyntheticStyleChange);
}
#endif
}
diff --git a/WebCore/rendering/RenderLayer.h b/WebCore/rendering/RenderLayer.h
index 2a80a17..8d176df 100644
--- a/WebCore/rendering/RenderLayer.h
+++ b/WebCore/rendering/RenderLayer.h
@@ -275,7 +275,7 @@ public:
bool hasOverflowControls() const;
#if ENABLE(ANDROID_OVERFLOW_SCROLL)
- bool hasOverflowScroll() const;
+ bool hasOverflowScroll() const { return m_hasOverflowScroll; }
bool hasOverflowParent() const;
#endif
void positionOverflowControls(int tx, int ty);
@@ -703,6 +703,9 @@ protected:
bool m_hasCompositingDescendant : 1;
bool m_mustOverlapCompositedLayers : 1;
#endif
+#if ENABLE(ANDROID_OVERFLOW_SCROLL)
+ bool m_hasOverflowScroll : 1;
+#endif
RenderMarquee* m_marquee; // Used by layers with overflow:marquee
diff --git a/WebKit/android/jni/WebHistory.cpp b/WebKit/android/jni/WebHistory.cpp
index d3893ff..04d5e4e 100644
--- a/WebKit/android/jni/WebHistory.cpp
+++ b/WebKit/android/jni/WebHistory.cpp
@@ -168,7 +168,7 @@ static void WebHistoryInflate(JNIEnv* env, jobject obj, jint frame, jbyteArray d
// Inflate the history tree into one HistoryItem or null if the inflation
// failed.
RefPtr<WebCore::HistoryItem> newItem = WebCore::HistoryItem::create();
- RefPtr<WebHistoryItem> bridge = new WebHistoryItem(env, obj, newItem.get());
+ RefPtr<WebHistoryItem> bridge = adoptRef(new WebHistoryItem(env, obj, newItem.get()));
newItem->setBridge(bridge.get());
// Inflate the item recursively. If it fails, that is ok. We'll have an
diff --git a/WebKit/android/nav/CacheBuilder.cpp b/WebKit/android/nav/CacheBuilder.cpp
index ea436e7..40b2711 100644
--- a/WebKit/android/nav/CacheBuilder.cpp
+++ b/WebKit/android/nav/CacheBuilder.cpp
@@ -1117,7 +1117,7 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
#if USE(ACCELERATED_COMPOSITING)
// If this renderer has its own layer and the layer is composited,
// start tracking it.
- if (lastChild && nodeRenderer->hasLayer() && toRenderBox(nodeRenderer)->layer()->backing())
+ if (lastChild && nodeRenderer->hasLayer() && toRenderBoxModelObject(nodeRenderer)->layer()->backing())
TrackLayer(layerTracker, nodeRenderer, lastChild, globalOffsetX, globalOffsetY);
#endif
}
@@ -2916,7 +2916,7 @@ void CacheBuilder::TrackLayer(WTF::Vector<LayerTracker>& layerTracker,
IntPoint scroll(layer->scrollXOffset(), layer->scrollYOffset());
#if ENABLE(ANDROID_OVERFLOW_SCROLL)
// If this is an overflow element, track the content layer.
- if (layer->hasOverflowScroll())
+ if (layer->hasOverflowScroll() && aLayer->getChild(0))
aLayer = aLayer->getChild(0)->getChild(0);
if (!aLayer)
return;