diff options
author | Patrick Scott <phanna@android.com> | 2011-01-11 10:39:10 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-01-11 10:39:10 -0800 |
commit | 2652d9bc7b047c80081467b671ba16559a5e3069 (patch) | |
tree | 27b0b74e0566ba5e6550e07a0d5a0e01c9c76db1 | |
parent | cea2bc79994f4e4f617a2e1a372dfc44a3f5365a (diff) | |
parent | 8b0b15e74bb7f1bd03bfd07f706a5afa637b0b73 (diff) | |
download | external_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.cpp | 29 | ||||
-rw-r--r-- | WebCore/rendering/RenderLayer.h | 5 | ||||
-rw-r--r-- | WebKit/android/jni/WebHistory.cpp | 2 | ||||
-rw-r--r-- | WebKit/android/nav/CacheBuilder.cpp | 4 |
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; |