Title: [94510] trunk
Revision
94510
Author
[email protected]
Date
2011-09-04 21:46:22 -0700 (Sun, 04 Sep 2011)

Log Message

Don't detach elements from the render tree when entering fullscreen mode
https://bugs.webkit.org/show_bug.cgi?id=66531

Source/WebCore:

This prevents plugin instances from being destroyed and reinstantiated
when entering fullscreen mode.

Patch by Jeremy Apthorp <[email protected]> on 2011-09-04
Reviewed by Darin Fisher.

Test: plugins/fullscreen-plugins-dont-reload.html

* dom/Document.cpp:
(WebCore::Document::webkitWillEnterFullScreenForElement):
(WebCore::Document::webkitDidExitFullScreenForElement):
* dom/NodeRenderingContext.cpp:
(WebCore::NodeRendererFactory::createRendererIfNeeded):
* rendering/RenderFullScreen.cpp:
(createFullScreenStyle):
(RenderFullScreen::wrapRenderer):
(RenderFullScreen::unwrapRenderer):
* rendering/RenderFullScreen.h:

LayoutTests:

Test that the plugin is not reloaded when entering fullscreen.

Patch by Jeremy Apthorp <[email protected]> on 2011-09-04
Reviewed by Darin Fisher.

* plugins/fullscreen-plugins-dont-reload-expected.txt: Added.
* plugins/fullscreen-plugins-dont-reload.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (94509 => 94510)


--- trunk/LayoutTests/ChangeLog	2011-09-05 04:18:04 UTC (rev 94509)
+++ trunk/LayoutTests/ChangeLog	2011-09-05 04:46:22 UTC (rev 94510)
@@ -1,3 +1,15 @@
+2011-09-04  Jeremy Apthorp  <[email protected]>
+
+        Don't detach elements from the render tree when entering fullscreen mode
+        https://bugs.webkit.org/show_bug.cgi?id=66531
+
+        Test that the plugin is not reloaded when entering fullscreen.
+
+        Reviewed by Darin Fisher.
+
+        * plugins/fullscreen-plugins-dont-reload-expected.txt: Added.
+        * plugins/fullscreen-plugins-dont-reload.html: Added.
+
 2011-09-04  Dan Bernstein  <[email protected]>
 
         <rdar://problem/10071256> Retain retired custom fonts until the next style recalc

Added: trunk/LayoutTests/plugins/fullscreen-plugins-dont-reload-expected.txt (0 => 94510)


--- trunk/LayoutTests/plugins/fullscreen-plugins-dont-reload-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/plugins/fullscreen-plugins-dont-reload-expected.txt	2011-09-05 04:46:22 UTC (rev 94510)
@@ -0,0 +1,18 @@
+ALERT: Plugin Loaded!
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderInline {A} at (0,0) size 81x18 [color=#0000EE]
+        RenderText {#text} at (0,136) size 81x18
+          text run at (0,136) width 81: "go fullscreen"
+      RenderText {#text} at (81,136) size 4x18
+        text run at (81,136) width 4: " "
+      RenderBlock (generated) at (85,0) size 300x150
+      RenderText {#text} at (0,0) size 0x0
+      RenderText {#text} at (0,0) size 0x0
+layer at (0,0) size 800x600
+  RenderFullScreen zI: 2147483647 at (0,0) size 800x600 [bgcolor=#000000]
+    RenderBlock (anonymous) at (250,225) size 300x150
+      RenderEmbeddedObject {EMBED} at (0,0) size 300x150 [bgcolor=#FFFFFF]

Added: trunk/LayoutTests/plugins/fullscreen-plugins-dont-reload.html (0 => 94510)


--- trunk/LayoutTests/plugins/fullscreen-plugins-dont-reload.html	                        (rev 0)
+++ trunk/LayoutTests/plugins/fullscreen-plugins-dont-reload.html	2011-09-05 04:46:22 UTC (rev 94510)
@@ -0,0 +1,26 @@
+<html>
+<a id='link' href=""
+fullscreen</a>
+<embed id="plg" type="application/x-webkit-test-netscape" src=""
+
+<script>
+if (window.layoutTestController) {
+    layoutTestController.waitUntilDone();
+
+    setTimeout(function () {
+        var link = document.getElementById('link');
+        var x = link.offsetLeft + 5;
+        var y = link.offsetTop + 5;
+        eventSender.mouseMoveTo(x, y);
+        eventSender.mouseDown();
+        eventSender.mouseUp();
+
+        setTimeout(function () {
+            layoutTestController.notifyDone();
+        }, 0);
+    }, 100);
+}
+
+
+</script>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (94509 => 94510)


--- trunk/Source/WebCore/ChangeLog	2011-09-05 04:18:04 UTC (rev 94509)
+++ trunk/Source/WebCore/ChangeLog	2011-09-05 04:46:22 UTC (rev 94510)
@@ -1,3 +1,26 @@
+2011-09-04  Jeremy Apthorp  <[email protected]>
+
+        Don't detach elements from the render tree when entering fullscreen mode
+        https://bugs.webkit.org/show_bug.cgi?id=66531
+
+        This prevents plugin instances from being destroyed and reinstantiated
+        when entering fullscreen mode.
+
+        Reviewed by Darin Fisher.
+
+        Test: plugins/fullscreen-plugins-dont-reload.html
+
+        * dom/Document.cpp:
+        (WebCore::Document::webkitWillEnterFullScreenForElement):
+        (WebCore::Document::webkitDidExitFullScreenForElement):
+        * dom/NodeRenderingContext.cpp:
+        (WebCore::NodeRendererFactory::createRendererIfNeeded):
+        * rendering/RenderFullScreen.cpp:
+        (createFullScreenStyle):
+        (RenderFullScreen::wrapRenderer):
+        (RenderFullScreen::unwrapRenderer):
+        * rendering/RenderFullScreen.h:
+
 2011-09-04  Dan Bernstein  <[email protected]>
 
         <rdar://problem/10071256> Retain retired custom fonts until the next style recalc

Modified: trunk/Source/WebCore/dom/Document.cpp (94509 => 94510)


--- trunk/Source/WebCore/dom/Document.cpp	2011-09-05 04:18:04 UTC (rev 94509)
+++ trunk/Source/WebCore/dom/Document.cpp	2011-09-05 04:46:22 UTC (rev 94510)
@@ -4887,7 +4887,7 @@
     }
 
     if (m_fullScreenElement != documentElement())
-        m_fullScreenElement->detach();
+        RenderFullScreen::wrapRenderer(renderer, this);
 
     m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(true);
     
@@ -4938,15 +4938,11 @@
 {
     m_areKeysEnabledInFullScreen = false;
     setAnimatingFullScreen(false);
-
-    if (m_fullScreenRenderer)
-        m_fullScreenRenderer->remove();
     
-    if (m_fullScreenElement != documentElement())
-        m_fullScreenElement->detach();
+    if (m_fullScreenRenderer)
+        m_fullScreenRenderer->unwrapRenderer();
 
     m_fullScreenChangeEventTargetQueue.append(m_fullScreenElement.release());
-    setFullScreenRenderer(0);
 #if USE(ACCELERATED_COMPOSITING)
     page()->chrome()->client()->setRootFullScreenLayer(0);
 #endif

Modified: trunk/Source/WebCore/dom/NodeRenderingContext.cpp (94509 => 94510)


--- trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2011-09-05 04:18:04 UTC (rev 94509)
+++ trunk/Source/WebCore/dom/NodeRenderingContext.cpp	2011-09-05 04:46:22 UTC (rev 94510)
@@ -320,22 +320,6 @@
     return newRenderer;
 }
 
-#if ENABLE(FULLSCREEN_API)
-static RenderObject* wrapWithRenderFullScreen(RenderObject* object, Document* document)
-{
-    RenderFullScreen* fullscreenRenderer = new (document->renderArena()) RenderFullScreen(document);
-    fullscreenRenderer->setStyle(RenderFullScreen::createFullScreenStyle());
-    // It's possible that we failed to create the new render and end up wrapping nothing.
-    // We'll end up displaying a black screen, but Jer says this is expected.
-    if (object)
-        fullscreenRenderer->addChild(object);
-    document->setFullScreenRenderer(fullscreenRenderer);
-    if (fullscreenRenderer->placeholder())
-        return fullscreenRenderer->placeholder();
-    return fullscreenRenderer;
-}
-#endif
-
 void NodeRendererFactory::createRendererIfNeeded()
 {
     Node* node = m_context.node();
@@ -356,7 +340,7 @@
 
 #if ENABLE(FULLSCREEN_API)
     if (document->webkitIsFullScreen() && document->webkitCurrentFullScreenElement() == node)
-        newRenderer = wrapWithRenderFullScreen(newRenderer, document);
+        newRenderer = RenderFullScreen::wrapRenderer(newRenderer, document);
 #endif
 
     // FIXME: This side effect should be visible from attach() code.

Modified: trunk/Source/WebCore/rendering/RenderFullScreen.cpp (94509 => 94510)


--- trunk/Source/WebCore/rendering/RenderFullScreen.cpp	2011-09-05 04:18:04 UTC (rev 94509)
+++ trunk/Source/WebCore/rendering/RenderFullScreen.cpp	2011-09-05 04:46:22 UTC (rev 94510)
@@ -79,7 +79,7 @@
     RenderDeprecatedFlexibleBox::willBeDestroyed();
 }
 
-PassRefPtr<RenderStyle> RenderFullScreen::createFullScreenStyle()
+static PassRefPtr<RenderStyle> createFullScreenStyle()
 {
     RefPtr<RenderStyle> fullscreenStyle = RenderStyle::createDefaultStyle();
 
@@ -97,14 +97,45 @@
     fullscreenStyle->setPosition(FixedPosition);
     fullscreenStyle->setWidth(Length(100.0, Percent));
     fullscreenStyle->setHeight(Length(100.0, Percent));
-    fullscreenStyle->setLeft(Length(0, Fixed));
-    fullscreenStyle->setTop(Length(0, Fixed));
+    fullscreenStyle->setLeft(Length(0, WebCore::Fixed));
+    fullscreenStyle->setTop(Length(0, WebCore::Fixed));
     
     fullscreenStyle->setBackgroundColor(Color::black);
     
     return fullscreenStyle.release();
 }
 
+RenderObject* RenderFullScreen::wrapRenderer(RenderObject* object, Document* document)
+{
+    RenderFullScreen* fullscreenRenderer = new (document->renderArena()) RenderFullScreen(document);
+    fullscreenRenderer->setStyle(createFullScreenStyle());
+    if (object) {
+        if (RenderObject* parent = object->parent()) {
+            parent->addChild(fullscreenRenderer, object);
+            object->remove();
+        }
+        fullscreenRenderer->addChild(object);
+    }
+    document->setFullScreenRenderer(fullscreenRenderer);
+    if (fullscreenRenderer->placeholder())
+        return fullscreenRenderer->placeholder();
+    return fullscreenRenderer;
+}
+
+void RenderFullScreen::unwrapRenderer()
+{
+    RenderObject* wrappedRenderer = firstChild();
+    if (wrappedRenderer) {
+        wrappedRenderer->remove();
+        RenderObject* holder = placeholder() ? placeholder() : this;
+        RenderObject* parent = holder->parent();
+        if (parent)
+            parent->addChild(wrappedRenderer, holder);
+    }
+    remove();
+    document()->setFullScreenRenderer(0);
+}
+
 void RenderFullScreen::setPlaceholder(RenderBlock* placeholder)
 {
     m_placeholder = placeholder;

Modified: trunk/Source/WebCore/rendering/RenderFullScreen.h (94509 => 94510)


--- trunk/Source/WebCore/rendering/RenderFullScreen.h	2011-09-05 04:18:04 UTC (rev 94509)
+++ trunk/Source/WebCore/rendering/RenderFullScreen.h	2011-09-05 04:46:22 UTC (rev 94510)
@@ -41,8 +41,10 @@
     RenderBlock* placeholder() { return m_placeholder; }
     void createPlaceholder(PassRefPtr<RenderStyle>, const IntRect& frameRect);
 
-    static PassRefPtr<RenderStyle> createFullScreenStyle();
 
+    static RenderObject* wrapRenderer(RenderObject* renderer, Document*);
+    void unwrapRenderer();
+
 private:
     virtual void willBeDestroyed();
     
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to