Title: [176568] trunk/Source/WebKit2
Revision
176568
Author
[email protected]
Date
2014-11-28 10:39:13 -0800 (Fri, 28 Nov 2014)

Log Message

Allow clients of the WKRenderLayerRef C SPI to connect layer trees across frame boundaries
https://bugs.webkit.org/show_bug.cgi?id=139021

Reviewed by Dan Bernstein.

Add WKRenderLayerGetFrameContentsLayer which returns a WKRenderLayerRef for
the content document of a RenderWidget, if its has one (e.g. frames, iframes
and <object> with document contents).

* Shared/API/c/WKRenderLayer.cpp:
(WKRenderLayerGetFrameContentsLayer):
* Shared/API/c/WKRenderLayer.h:
* Shared/UserMessageCoders.h:
(WebKit::UserMessageEncoder::baseEncode):
(WebKit::UserMessageDecoder::baseDecode):
* Shared/WebRenderLayer.cpp:
(WebKit::WebRenderLayer::create):
(WebKit::WebRenderLayer::WebRenderLayer):
* Shared/WebRenderLayer.h:
(WebKit::WebRenderLayer::frameContentsLayer):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (176567 => 176568)


--- trunk/Source/WebKit2/ChangeLog	2014-11-28 17:05:45 UTC (rev 176567)
+++ trunk/Source/WebKit2/ChangeLog	2014-11-28 18:39:13 UTC (rev 176568)
@@ -1,3 +1,26 @@
+2014-11-28  Simon Fraser  <[email protected]>
+
+        Allow clients of the WKRenderLayerRef C SPI to connect layer trees across frame boundaries
+        https://bugs.webkit.org/show_bug.cgi?id=139021
+
+        Reviewed by Dan Bernstein.
+        
+        Add WKRenderLayerGetFrameContentsLayer which returns a WKRenderLayerRef for
+        the content document of a RenderWidget, if its has one (e.g. frames, iframes
+        and <object> with document contents).
+
+        * Shared/API/c/WKRenderLayer.cpp:
+        (WKRenderLayerGetFrameContentsLayer):
+        * Shared/API/c/WKRenderLayer.h:
+        * Shared/UserMessageCoders.h:
+        (WebKit::UserMessageEncoder::baseEncode):
+        (WebKit::UserMessageDecoder::baseDecode):
+        * Shared/WebRenderLayer.cpp:
+        (WebKit::WebRenderLayer::create):
+        (WebKit::WebRenderLayer::WebRenderLayer):
+        * Shared/WebRenderLayer.h:
+        (WebKit::WebRenderLayer::frameContentsLayer):
+
 2014-11-28  Csaba Osztrogonác  <[email protected]>
 
         [WK2] SecComp buildfix after r176452

Modified: trunk/Source/WebKit2/Shared/API/c/WKRenderLayer.cpp (176567 => 176568)


--- trunk/Source/WebKit2/Shared/API/c/WKRenderLayer.cpp	2014-11-28 17:05:45 UTC (rev 176567)
+++ trunk/Source/WebKit2/Shared/API/c/WKRenderLayer.cpp	2014-11-28 18:39:13 UTC (rev 176568)
@@ -129,3 +129,8 @@
 {
     return toAPI(toImpl(renderLayerRef)->positiveZOrderList());
 }
+
+WKRenderLayerRef WKRenderLayerGetFrameContentsLayer(WKRenderLayerRef renderLayerRef)
+{
+    return toAPI(toImpl(renderLayerRef)->frameContentsLayer());
+}

Modified: trunk/Source/WebKit2/Shared/API/c/WKRenderLayer.h (176567 => 176568)


--- trunk/Source/WebKit2/Shared/API/c/WKRenderLayer.h	2014-11-28 17:05:45 UTC (rev 176567)
+++ trunk/Source/WebKit2/Shared/API/c/WKRenderLayer.h	2014-11-28 18:39:13 UTC (rev 176568)
@@ -38,7 +38,7 @@
 
 WK_EXPORT WKRenderObjectRef WKRenderLayerGetRenderer(WKRenderLayerRef renderLayer);
 
-// FIXME: Remove this function once Safari does not require it.
+// FIXME: Remove this function once Safari does not require it. Clients can access this data via the renderer.
 WK_EXPORT WKStringRef WKRenderLayerCopyRendererName(WKRenderLayerRef renderLayer);
 
 // FIXME: Remove these three functions once Safari does not require them.
@@ -68,6 +68,8 @@
 WK_EXPORT WKArrayRef WKRenderLayerGetNormalFlowList(WKRenderLayerRef renderLayer);
 WK_EXPORT WKArrayRef WKRenderLayerGetPositiveZOrderList(WKRenderLayerRef renderLayer);
 
+WK_EXPORT WKRenderLayerRef WKRenderLayerGetFrameContentsLayer(WKRenderLayerRef renderLayer);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/Source/WebKit2/Shared/UserMessageCoders.h (176567 => 176568)


--- trunk/Source/WebKit2/Shared/UserMessageCoders.h	2014-11-28 17:05:45 UTC (rev 176567)
+++ trunk/Source/WebKit2/Shared/UserMessageCoders.h	2014-11-28 18:39:13 UTC (rev 176568)
@@ -159,6 +159,7 @@
             encoder << Owner(coder, renderLayer->negativeZOrderList());
             encoder << Owner(coder, renderLayer->normalFlowList());
             encoder << Owner(coder, renderLayer->positiveZOrderList());
+            encoder << Owner(coder, renderLayer->frameContentsLayer());
             return true;
         }
         case API::Object::Type::RenderObject: {
@@ -397,6 +398,7 @@
             RefPtr<API::Object> negativeZOrderList;
             RefPtr<API::Object> normalFlowList;
             RefPtr<API::Object> positiveZOrderList;
+            RefPtr<API::Object> frameContentsLayer;
 
             Owner rendererCoder(coder, renderer);
             if (!decoder.decode(rendererCoder))
@@ -424,9 +426,14 @@
             Owner positiveZOrderListCoder(coder, positiveZOrderList);
             if (!decoder.decode(positiveZOrderListCoder))
                 return false;
+
+            Owner frameContentsLayerCoder(coder, frameContentsLayer);
+            if (!decoder.decode(frameContentsLayerCoder))
+                return false;
+
             coder.m_root = WebRenderLayer::create(static_pointer_cast<WebRenderObject>(renderer), isReflection, isClipping, isClipped, static_cast<WebRenderLayer::CompositingLayerType>(compositingLayerTypeAsUInt32),
                 absoluteBoundingBox, backingStoreMemoryEstimate, static_pointer_cast<API::Array>(negativeZOrderList), static_pointer_cast<API::Array>(normalFlowList),
-                static_pointer_cast<API::Array>(positiveZOrderList));
+                static_pointer_cast<API::Array>(positiveZOrderList), static_pointer_cast<WebRenderLayer>(frameContentsLayer));
             break;
         }
         case API::Object::Type::RenderObject: {

Modified: trunk/Source/WebKit2/Shared/WebRenderLayer.cpp (176567 => 176568)


--- trunk/Source/WebKit2/Shared/WebRenderLayer.cpp	2014-11-28 17:05:45 UTC (rev 176567)
+++ trunk/Source/WebKit2/Shared/WebRenderLayer.cpp	2014-11-28 18:39:13 UTC (rev 176568)
@@ -36,6 +36,7 @@
 #include <WebCore/RenderLayer.h>
 #include <WebCore/RenderLayerBacking.h>
 #include <WebCore/RenderView.h>
+#include <WebCore/RenderWidget.h>
 #include <WebCore/StyledElement.h>
 
 using namespace WebCore;
@@ -46,25 +47,25 @@
 {
     Frame* mainFrame = page->mainFrame();
     if (!mainFrame)
-        return 0;
+        return nullptr;
 
     if (!mainFrame->loader().client().hasHTMLView())
-        return 0;
+        return nullptr;
 
     RenderView* contentRenderer = mainFrame->contentRenderer();
     if (!contentRenderer)
-        return 0;
+        return nullptr;
 
     RenderLayer* rootLayer = contentRenderer->layer();
     if (!rootLayer)
-        return 0;
+        return nullptr;
 
     return adoptRef(new WebRenderLayer(rootLayer));
 }
 
-PassRefPtr<WebRenderLayer> WebRenderLayer::create(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType type, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList)
+PassRefPtr<WebRenderLayer> WebRenderLayer::create(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType type, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList, PassRefPtr<WebRenderLayer> frameContentsLayer)
 {
-    return adoptRef(new WebRenderLayer(renderer, isReflection, isClipping, isClipped, type, absoluteBoundingBox, backingStoreMemoryEstimate, negativeZOrderList, normalFlowList, positiveZOrderList));
+    return adoptRef(new WebRenderLayer(renderer, isReflection, isClipping, isClipped, type, absoluteBoundingBox, backingStoreMemoryEstimate, negativeZOrderList, normalFlowList, positiveZOrderList, frameContentsLayer));
 }
 
 PassRefPtr<API::Array> WebRenderLayer::createArrayFromLayerList(Vector<RenderLayer*>* list)
@@ -118,9 +119,16 @@
     m_negativeZOrderList = createArrayFromLayerList(layer->negZOrderList());
     m_normalFlowList = createArrayFromLayerList(layer->normalFlowList());
     m_positiveZOrderList = createArrayFromLayerList(layer->posZOrderList());
+
+    if (is<RenderWidget>(layer->renderer())) {
+        if (Document* contentDocument = downcast<RenderWidget>(layer->renderer()).frameOwnerElement().contentDocument()) {
+            if (RenderView* view = contentDocument->renderView())
+                m_frameContentsLayer = adoptRef(new WebRenderLayer(view->layer()));
+        }
+    }
 }
 
-WebRenderLayer::WebRenderLayer(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType type, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList)
+WebRenderLayer::WebRenderLayer(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType type, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList, PassRefPtr<WebRenderLayer> frameContentsLayer)
     : m_renderer(renderer)
     , m_isReflection(isReflection)
     , m_isClipping(isClipping)
@@ -131,6 +139,7 @@
     , m_negativeZOrderList(negativeZOrderList)
     , m_normalFlowList(normalFlowList)
     , m_positiveZOrderList(positiveZOrderList)
+    , m_frameContentsLayer(frameContentsLayer)
 {
 }
 

Modified: trunk/Source/WebKit2/Shared/WebRenderLayer.h (176567 => 176568)


--- trunk/Source/WebKit2/Shared/WebRenderLayer.h	2014-11-28 17:05:45 UTC (rev 176567)
+++ trunk/Source/WebKit2/Shared/WebRenderLayer.h	2014-11-28 18:39:13 UTC (rev 176568)
@@ -41,11 +41,12 @@
     enum CompositingLayerType { None, Normal, Tiled, Media, Container };
 
     static PassRefPtr<WebRenderLayer> create(WebPage*);
-    static PassRefPtr<WebRenderLayer> create(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList);
+    static PassRefPtr<WebRenderLayer> create(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList, PassRefPtr<WebRenderLayer> frameContentsLayer);
 
     API::Array* negativeZOrderList() const { return m_negativeZOrderList.get(); }
     API::Array* normalFlowList() const { return m_normalFlowList.get(); }
     API::Array* positiveZOrderList() const { return m_positiveZOrderList.get(); }
+    WebRenderLayer* frameContentsLayer() const { return m_frameContentsLayer.get(); }
 
     WebRenderObject* renderer() const { return m_renderer.get(); }
     bool isReflection() const { return m_isReflection; }
@@ -57,7 +58,7 @@
 
 private:
     explicit WebRenderLayer(WebCore::RenderLayer*);
-    WebRenderLayer(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList);
+    WebRenderLayer(PassRefPtr<WebRenderObject> renderer, bool isReflection, bool isClipping, bool isClipped, CompositingLayerType, WebCore::IntRect absoluteBoundingBox, double backingStoreMemoryEstimate, PassRefPtr<API::Array> negativeZOrderList, PassRefPtr<API::Array> normalFlowList, PassRefPtr<API::Array> positiveZOrderList, PassRefPtr<WebRenderLayer> frameContentsLayer);
 
     static PassRefPtr<API::Array> createArrayFromLayerList(Vector<WebCore::RenderLayer*>*);
 
@@ -72,6 +73,8 @@
     RefPtr<API::Array> m_negativeZOrderList;
     RefPtr<API::Array> m_normalFlowList;
     RefPtr<API::Array> m_positiveZOrderList;
+
+    RefPtr<WebRenderLayer> m_frameContentsLayer;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to