diff options
Diffstat (limited to 'WebKit/android/nav/CacheBuilder.cpp')
-rw-r--r-- | WebKit/android/nav/CacheBuilder.cpp | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/WebKit/android/nav/CacheBuilder.cpp b/WebKit/android/nav/CacheBuilder.cpp index cbc580d..52ee72c 100644 --- a/WebKit/android/nav/CacheBuilder.cpp +++ b/WebKit/android/nav/CacheBuilder.cpp @@ -55,6 +55,7 @@ #include "RenderListBox.h" #include "RenderSkinCombo.h" #include "RenderTextControl.h" +#include "RenderView.h" #include "RenderWidget.h" #include "SkCanvas.h" #include "SkPoint.h" @@ -94,7 +95,9 @@ Frame* CacheBuilder::FrameAnd(const CacheBuilder* cacheBuilder) { } CacheBuilder::LayerTracker::~LayerTracker() { - if (mRenderLayer) + // Check for a stacking context to prevent a crash in layers without a + // parent. + if (mRenderLayer && mRenderLayer->stackingContext()) // Restore the scroll position of the layer. Does not affect layers // without overflow scroll as the layer will not be scrolled. mRenderLayer->scrollToOffset(mScroll.x(), mScroll.y(), false, false); @@ -1023,6 +1026,13 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame, cachedRoot->setFocusBounds(focused->getRect()); int globalOffsetX, globalOffsetY; GetGlobalOffset(frame, &globalOffsetX, &globalOffsetY); +#if USE(ACCELERATED_COMPOSITING) + // The frame itself might be composited so we need to track the layer. Do + // not track the base frame's layer as the main content is draw as part of + // BaseLayerAndroid's picture. + if (frame != root && frame->contentRenderer()->usesCompositing() && node->lastChild()) + TrackLayer(layerTracker, frame->contentRenderer(), node->lastChild(), globalOffsetX, globalOffsetY); +#endif while (walk.mMore || (node = node->traverseNextNode()) != NULL) { #if DUMP_NAV_CACHE nodeIndex++; @@ -1105,37 +1115,8 @@ 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()) { - TrackLayer(layerTracker, nodeRenderer, lastChild, - globalOffsetX, globalOffsetY); - size_t size = tracker.size(); - LayerAndroid* layer = layerTracker.last().mLayer; - if (layer) { - int id = layer->uniqueId(); - const RenderLayer* renderLayer = - layerTracker.last().mRenderLayer; - // Global location - IntPoint loc = renderLayer->absoluteBoundingBox().location(); - loc.move(globalOffsetX, globalOffsetY); - // if this is a child of a CachedNode, add a layer - size_t limit = cachedFrame->layerCount() == 0 ? 0 : - cachedFrame->lastLayer()->cachedNodeIndex(); - for (size_t index = 1; index < tracker.size(); index++) { - const FocusTracker& cursorNode = tracker.at(index); - size_t index = cursorNode.mCachedNodeIndex; - if (index <= limit) { // already added? - DBG_NAV_LOGD("index=%d limit=%d id=%d", index, - limit, id); - continue; - } - DBG_NAV_LOGD("call add layer %d", id); - CachedNode* trackedNode = cachedFrame->getIndex(index); - trackedNode->setIsInLayer(true); - trackedNode->setIsUnclipped(true); - AddLayer(cachedFrame, index, loc, id); - } - } - } + if (lastChild && nodeRenderer->hasLayer() && toRenderBox(nodeRenderer)->layer()->backing()) + TrackLayer(layerTracker, nodeRenderer, lastChild, globalOffsetX, globalOffsetY); #endif } bool more = walk.mMore; @@ -2936,7 +2917,9 @@ void CacheBuilder::TrackLayer(WTF::Vector<LayerTracker>& layerTracker, aLayer = aLayer->getChild(0)->getChild(0); if (!aLayer) return; - layer->scrollToOffset(0, 0, false, false); + // Prevent a crash when scrolling a layer that does not have a parent. + if (layer->stackingContext()) + layer->scrollToOffset(0, 0, false, false); #endif layerTracker.grow(layerTracker.size() + 1); LayerTracker& indexTracker = layerTracker.last(); |