diff options
-rw-r--r-- | WebCore/config.h | 1 | ||||
-rw-r--r-- | WebCore/page/FrameView.cpp | 7 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp | 3 | ||||
-rw-r--r-- | WebCore/rendering/RenderLayerCompositor.cpp | 17 | ||||
-rw-r--r-- | WebKit/android/nav/CacheBuilder.cpp | 49 |
5 files changed, 38 insertions, 39 deletions
diff --git a/WebCore/config.h b/WebCore/config.h index a7dfecd..c7dd31f 100644 --- a/WebCore/config.h +++ b/WebCore/config.h @@ -143,7 +143,6 @@ #define ENABLE_BLOB 1 #define ANDROID_FLATTEN_FRAMESET -#define ANDROID_FLATTEN_IFRAME #define ANDROID_LAYOUT diff --git a/WebCore/page/FrameView.cpp b/WebCore/page/FrameView.cpp index 5374487..7d9920b 100644 --- a/WebCore/page/FrameView.cpp +++ b/WebCore/page/FrameView.cpp @@ -554,6 +554,13 @@ void FrameView::updateCompositingLayers() RenderView* view = m_frame->contentRenderer(); if (!view) return; +#if ENABLE(ANDROID_OVERFLOW_SCROLL) + // Enter compositing mode for child frames that have layout dimensions. The + // decision to enable compositing for the RenderView will be done in the + // compositor. + if (m_frame->ownerRenderer() && (layoutWidth() | layoutHeight())) + enterCompositingMode(); +#endif // This call will make sure the cached hasAcceleratedCompositing is updated from the pref view->compositor()->cacheAcceleratedCompositingFlags(); diff --git a/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp b/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp index 0fdbc21..c0ad248 100644 --- a/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp +++ b/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp @@ -367,8 +367,7 @@ void GraphicsLayerAndroid::setDrawsContent(bool drawsContent) m_foregroundClipLayer->addChild(m_foregroundLayer); m_contentLayer->addChild(m_foregroundClipLayer); - } else if (false /* FIXME: disable until navigation is fixed */ && - layer->isRootLayer() && + } else if (layer->isRootLayer() && layer->renderer()->frame()->ownerRenderer()) { // Replace the content layer with a scrollable layer. LayerAndroid* layer = new ScrollableLayerAndroid(*m_contentLayer); diff --git a/WebCore/rendering/RenderLayerCompositor.cpp b/WebCore/rendering/RenderLayerCompositor.cpp index ce80e5a..00e596b 100644 --- a/WebCore/rendering/RenderLayerCompositor.cpp +++ b/WebCore/rendering/RenderLayerCompositor.cpp @@ -1178,9 +1178,20 @@ bool RenderLayerCompositor::requiresCompositingForMobileSites(const RenderLayer* return true; HTMLFrameOwnerElement* ownerElement = enclosingIFrameElement(); RenderObject* renderer = ownerElement ? ownerElement->renderer() : 0; - // FIXME: Disabled for now until navigation is fixed. - if (false && layer->isRootLayer() && renderer && renderer->isRenderIFrame()) - return true; + if (layer->isRootLayer() && renderer && renderer->isRenderIFrame()) { + if (layer->renderer()->frame()) { + FrameView* view = layer->renderer()->frame()->view(); + if (view) { + // Enable compositing if the frame can scroll and the contents + // are larger than the layout dimensions. + ScrollbarMode h,v; + view->scrollbarModes(h, v); + if ((h != ScrollbarAlwaysOff && view->layoutWidth() < view->contentsWidth()) || + (v != ScrollbarAlwaysOff && view->layoutHeight() < view->contentsHeight())) + return true; + } + } + } #endif #if ENABLE(COMPOSITED_FIXED_ELEMENTS) // First, check if we are in an iframe, and if so bail out 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(); |