OSDN Git Service

Add android specific virtual function to GraphicsLayerClient.
authorShimeng (Simon) Wang <swang@google.com>
Thu, 14 Jul 2011 22:13:53 +0000 (15:13 -0700)
committerShimeng (Simon) Wang <swang@google.com>
Thu, 14 Jul 2011 23:05:01 +0000 (16:05 -0700)
This lets the GraphicsLayerClient instance decides whether it has
owning RenderLayer, instead of using static_cast.

This makes overflow'ed iframe scrollable again.

This change also reverts Tenghui's CL:
https://android-git.corp.google.com/g/#change,115508

Tested on scrollable iframe and inline video.

issue: 4902019
Change-Id: I252f5432b0750c5cac0a4404663e1730ef006cfc

Source/WebCore/platform/graphics/GraphicsLayerClient.h
Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
Source/WebCore/rendering/RenderLayerBacking.h
Source/WebCore/rendering/RenderLayerCompositor.cpp

index afb297d..aab176b 100644 (file)
@@ -32,6 +32,9 @@ namespace WebCore {
 
 class GraphicsContext;
 class GraphicsLayer;
+#if PLATFORM(ANDROID)
+class RenderLayer;
+#endif
 class IntPoint;
 class IntRect;
 class FloatPoint;
@@ -54,6 +57,10 @@ class GraphicsLayerClient {
 public:
     virtual ~GraphicsLayerClient() {}
 
+#if PLATFORM(ANDROID)
+    virtual RenderLayer* owningLayer() const { return 0; }
+#endif
+
     // Callback for when hardware-accelerated animation started.
     virtual void notifyAnimationStarted(const GraphicsLayer*, double time) = 0;
 
index fc9d85f..fb41ccb 100644 (file)
@@ -107,9 +107,7 @@ SkLength convertLength(Length len)
 
 static RenderLayer* renderLayerFromClient(GraphicsLayerClient* client)
 {
-    if (client)
-        return static_cast<RenderLayerBacking*>(client)->owningLayer();
-    return 0;
+    return client ? client->owningLayer() : 0;
 }
 
 GraphicsLayerAndroid::GraphicsLayerAndroid(GraphicsLayerClient* client) :
@@ -220,10 +218,9 @@ void GraphicsLayerAndroid::removeFromParent()
 
 void GraphicsLayerAndroid::updateFixedPosition()
 {
-    if (!m_client)
-        return;
-
     RenderLayer* renderLayer = renderLayerFromClient(m_client);
+    if (!renderLayer)
+        return;
     RenderView* view = static_cast<RenderView*>(renderLayer->renderer());
 
     if (!view)
@@ -316,8 +313,8 @@ void GraphicsLayerAndroid::setSize(const FloatSize& size)
     // If it is a media layer the size may have changed as a result of the media
     // element (e.g. plugin) gaining focus. Therefore, we must sync the size of
     // the focus' outline so that our UI thread can draw accordingly.
-    if (m_contentLayer->isMedia() && m_client) {
-        RenderLayer* layer = renderLayerFromClient(m_client);
+    RenderLayer* layer = renderLayerFromClient(m_client);
+    if (layer && m_contentLayer->isMedia()) {
         RenderBox* box = layer->renderBox();
         int outline = box->view()->maximalOutlineSize();
         static_cast<MediaLayer*>(m_contentLayer)->setOutlineSize(outline);
@@ -554,6 +551,8 @@ bool GraphicsLayerAndroid::repaint()
         IntRect layerBounds(0, 0, m_size.width(), m_size.height());
 
         RenderLayer* layer = renderLayerFromClient(m_client);
+        if (!layer)
+            return false;
         if (m_foregroundLayer) {
             PaintingPhase phase(this);
             // Paint the background into a separate context.
index f1b8972..9e68209 100644 (file)
@@ -59,6 +59,9 @@ public:
     RenderLayerBacking(RenderLayer*);
     ~RenderLayerBacking();
 
+#if PLATFORM(ANDROID)
+    virtual
+#endif
     RenderLayer* owningLayer() const { return m_owningLayer; }
 
     enum UpdateDepth { CompositingChildren, AllDescendants };
index 66dcf40..786f806 100644 (file)
@@ -1520,15 +1520,6 @@ bool RenderLayerCompositor::needsContentsCompositingLayer(const RenderLayer* lay
 
 bool RenderLayerCompositor::requiresScrollLayer(RootLayerAttachment attachment) const
 {
-#if PLATFORM(ANDROID)
-    // Recently, RenderLayerCompositor is changed to be a subclass of
-    // GraphicsLayerClient, and it is used for iframe.
-    // http://trac.webkit.org/changeset/75262
-    // We have our own support for iframe, before we embrace this new approach,
-    // we will disable it.
-    // TODO: Investigate how to utilize this way to support iframe.
-    return false;
-#endif
     // We need to handle our own scrolling if we're:
     return !m_renderView->frameView()->platformWidget() // viewless (i.e. non-Mac, or Mac in WebKit2)
         || attachment == RootLayerAttachedViaEnclosingFrame; // a composited frame on Mac