Changeset 95371 in webkit


Ignore:
Timestamp:
Sep 16, 2011 11:07:42 PM (13 years ago)
Author:
koz@chromium.org
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.

Reviewed by James Robinson.

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.

Reviewed by James Robinson.

  • plugins/fullscreen-plugins-dont-reload-expected.txt: Added.
  • plugins/fullscreen-plugins-dont-reload.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r95369 r95371  
     12011-09-16  Jeremy Apthorp <jeremya@chromium.org> and James Kozianski  <koz@chromium.org>
     2
     3        Don't detach elements from the render tree when entering fullscreen mode
     4        https://bugs.webkit.org/show_bug.cgi?id=66531
     5
     6        Test that the plugin is not reloaded when entering fullscreen.
     7
     8        Reviewed by James Robinson.
     9
     10        * plugins/fullscreen-plugins-dont-reload-expected.txt: Added.
     11        * plugins/fullscreen-plugins-dont-reload.html: Added.
     12
    1132011-09-16  Jochen Eisinger  <jochen@chromium.org>
    214
  • trunk/Source/WebCore/ChangeLog

    r95369 r95371  
     12011-09-16  Jeremy Apthorp <jeremya@chromium.org> and James Kozianski  <koz@chromium.org>
     2
     3        Don't detach elements from the render tree when entering fullscreen mode
     4        https://bugs.webkit.org/show_bug.cgi?id=66531
     5
     6        This prevents plugin instances from being destroyed and reinstantiated
     7        when entering fullscreen mode.
     8
     9        Reviewed by James Robinson.
     10
     11        Test: plugins/fullscreen-plugins-dont-reload.html
     12
     13        * dom/Document.cpp:
     14        (WebCore::Document::webkitWillEnterFullScreenForElement):
     15        (WebCore::Document::webkitDidExitFullScreenForElement):
     16        * dom/NodeRenderingContext.cpp:
     17        (WebCore::NodeRendererFactory::createRendererIfNeeded):
     18        * rendering/RenderFullScreen.cpp:
     19        (createFullScreenStyle):
     20        (RenderFullScreen::wrapRenderer):
     21        (RenderFullScreen::unwrapRenderer):
     22        * rendering/RenderFullScreen.h:
     23
    1242011-09-16  Jochen Eisinger  <jochen@chromium.org>
    225
  • trunk/Source/WebCore/dom/Document.cpp

    r95271 r95371  
    48784878    ASSERT(page() && page()->settings()->fullScreenEnabled());
    48794879
     4880    if (m_fullScreenRenderer)
     4881        m_fullScreenRenderer->unwrapRenderer();
     4882
    48804883    m_fullScreenElement = element;
    48814884
     
    48924895
    48934896    if (m_fullScreenElement != documentElement())
    4894         m_fullScreenElement->detach();
     4897        RenderFullScreen::wrapRenderer(renderer, this);
    48954898
    48964899    m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(true);
     
    49434946    m_areKeysEnabledInFullScreen = false;
    49444947    setAnimatingFullScreen(false);
    4945 
     4948   
    49464949    if (m_fullScreenRenderer)
    4947         m_fullScreenRenderer->remove();
    4948    
    4949     if (m_fullScreenElement != documentElement())
    4950         m_fullScreenElement->detach();
     4950        m_fullScreenRenderer->unwrapRenderer();
    49514951
    49524952    m_fullScreenChangeEventTargetQueue.append(m_fullScreenElement.release());
    4953     setFullScreenRenderer(0);
    49544953#if USE(ACCELERATED_COMPOSITING)
    49554954    page()->chrome()->client()->setRootFullScreenLayer(0);
  • trunk/Source/WebCore/dom/NodeRenderingContext.cpp

    r94938 r95371  
    304304}
    305305
    306 #if ENABLE(FULLSCREEN_API)
    307 static RenderObject* wrapWithRenderFullScreen(RenderObject* object, Document* document)
    308 {
    309     RenderFullScreen* fullscreenRenderer = new (document->renderArena()) RenderFullScreen(document);
    310     fullscreenRenderer->setStyle(RenderFullScreen::createFullScreenStyle());
    311     // It's possible that we failed to create the new render and end up wrapping nothing.
    312     // We'll end up displaying a black screen, but Jer says this is expected.
    313     if (object)
    314         fullscreenRenderer->addChild(object);
    315     document->setFullScreenRenderer(fullscreenRenderer);
    316     if (fullscreenRenderer->placeholder())
    317         return fullscreenRenderer->placeholder();
    318     return fullscreenRenderer;
    319 }
    320 #endif
    321 
    322306void NodeRendererFactory::createRendererIfNeeded()
    323307{
     
    356340#if ENABLE(FULLSCREEN_API)
    357341    if (document->webkitIsFullScreen() && document->webkitCurrentFullScreenElement() == node)
    358         newRenderer = wrapWithRenderFullScreen(newRenderer, document);
     342        newRenderer = RenderFullScreen::wrapRenderer(newRenderer, document);
    359343#endif
    360344
  • trunk/Source/WebCore/rendering/RenderFullScreen.cpp

    r94513 r95371  
    8080}
    8181
    82 PassRefPtr<RenderStyle> RenderFullScreen::createFullScreenStyle()
     82static PassRefPtr<RenderStyle> createFullScreenStyle()
    8383{
    8484    RefPtr<RenderStyle> fullscreenStyle = RenderStyle::createDefaultStyle();
     
    9898    fullscreenStyle->setWidth(Length(100.0, Percent));
    9999    fullscreenStyle->setHeight(Length(100.0, Percent));
    100     fullscreenStyle->setLeft(Length(0, Fixed));
    101     fullscreenStyle->setTop(Length(0, Fixed));
     100    fullscreenStyle->setLeft(Length(0, WebCore::Fixed));
     101    fullscreenStyle->setTop(Length(0, WebCore::Fixed));
    102102   
    103103    fullscreenStyle->setBackgroundColor(Color::black);
    104104   
    105105    return fullscreenStyle.release();
     106}
     107
     108RenderObject* RenderFullScreen::wrapRenderer(RenderObject* object, Document* document)
     109{
     110    RenderFullScreen* fullscreenRenderer = new (document->renderArena()) RenderFullScreen(document);
     111    fullscreenRenderer->setStyle(createFullScreenStyle());
     112    if (object) {
     113        if (RenderObject* parent = object->parent()) {
     114            parent->addChild(fullscreenRenderer, object);
     115            object->remove();
     116        }
     117        fullscreenRenderer->addChild(object);
     118    }
     119    document->setFullScreenRenderer(fullscreenRenderer);
     120    if (fullscreenRenderer->placeholder())
     121        return fullscreenRenderer->placeholder();
     122    return fullscreenRenderer;
     123}
     124
     125void RenderFullScreen::unwrapRenderer()
     126{
     127    RenderObject* wrappedRenderer = firstChild();
     128    if (wrappedRenderer) {
     129        wrappedRenderer->remove();
     130        RenderObject* holder = placeholder() ? placeholder() : this;
     131        RenderObject* parent = holder->parent();
     132        if (parent)
     133            parent->addChild(wrappedRenderer, holder);
     134    }
     135    remove();
     136    document()->setFullScreenRenderer(0);
    106137}
    107138
  • trunk/Source/WebCore/rendering/RenderFullScreen.h

    r94513 r95371  
    4242    void createPlaceholder(PassRefPtr<RenderStyle>, const IntRect& frameRect);
    4343
    44     static PassRefPtr<RenderStyle> createFullScreenStyle();
     44
     45    static RenderObject* wrapRenderer(RenderObject* renderer, Document*);
     46    void unwrapRenderer();
    4547
    4648private:
Note: See TracChangeset for help on using the changeset viewer.