summaryrefslogtreecommitdiffstats
path: root/WebKit/android/nav/CacheBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/android/nav/CacheBuilder.cpp')
-rw-r--r--WebKit/android/nav/CacheBuilder.cpp49
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();