OSDN Git Service

Enable iframe scrolling.
authorPatrick Scott <phanna@android.com>
Mon, 13 Dec 2010 16:20:07 +0000 (11:20 -0500)
committerPatrick Scott <phanna@android.com>
Mon, 13 Dec 2010 17:52:59 +0000 (12:52 -0500)
Turn off iframe expansion and record iframes in a composited layer.
Fix navigation by tracking iframe layers if needed.  Remove the logic to add
focused nodes to the last tracked layer as it is not needed and might add nodes
to the wrong layer.

Bug: 3219076321166632010773194321
Change-Id: Ifc0b83102438255db7e4b62ad260f50ebbdb0e50

WebCore/config.h
WebCore/page/FrameView.cpp
WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
WebCore/rendering/RenderLayerCompositor.cpp
WebKit/android/nav/CacheBuilder.cpp

index a7dfecd..c7dd31f 100644 (file)
 #define ENABLE_BLOB 1
 
 #define ANDROID_FLATTEN_FRAMESET
-#define ANDROID_FLATTEN_IFRAME
 
 #define ANDROID_LAYOUT
 
index 5374487..7d9920b 100644 (file)
@@ -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();
index 0fdbc21..c0ad248 100644 (file)
@@ -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);
index ce80e5a..00e596b 100644 (file)
@@ -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
index cbc580d..52ee72c 100644 (file)
@@ -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();