Changeset 53110 in webkit


Ignore:
Timestamp:
Jan 11, 2010 4:15:06 PM (14 years ago)
Author:
Simon Fraser
Message:

2010-01-11 Simon Fraser <Simon Fraser>

Reviewed by Kevin Decker.

https://bugs.webkit.org/show_bug.cgi?id=33455
Allows plugins to participate in accelerated compositing

For plugins using the CoreAnimation rendering mode, host their CALayers in the
accelerated compositing layer tree.

This requires making normal flow RenderLayers for RenderEmbeddedObjects when they represent
a plugin using this mode.

  • WebCore.base.exp: Export Node::setNeedsStyleRecalc() for use by WebKit.
  • WebCore.xcodeproj/project.pbxproj: Re-order files for sorting.
  • rendering/RenderEmbeddedObject.h:
  • rendering/RenderEmbeddedObject.cpp: (WebCore::RenderEmbeddedObject::requiresLayer): Make a layer if the plugin is using accelerated compositing mode. (WebCore::RenderEmbeddedObject::allowsAcceleratedCompositing): Asks whether the plugin has a layer, via PluginWidget.
  • rendering/RenderLayer.cpp: (WebCore::RenderLayer::shouldBeNormalFlowOnly): (WebCore::RenderLayer::isSelfPaintingLayer): RenderEmbeddedObjects should be normal flow layers, and self-painting layers.
  • rendering/RenderLayerBacking.cpp: (WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration): Parent the plugin's layer in the GraphicsLayer when updating the layer configuration.
  • rendering/RenderLayerCompositor.h:
  • rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::requiresCompositingLayer): (WebCore::RenderLayerCompositor::requiresCompositingForPlugin): RenderEmbeddedObjects that allow accelerated compositing trip accelerated compositing mode for the page.
Location:
trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r53106 r53110  
     12010-01-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Reviewed by Kevin Decker.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=33455
     6        Allows plugins to participate in accelerated compositing
     7       
     8        Change the testcase to make the embeds position: relative so that the behavior
     9        of the test is not affected by whether WebCore decides to put plugins into
     10        RenderLayers.
     11
     12        * platform/mac/plugins/embed-attributes-style-expected.checksum:
     13        * platform/mac/plugins/embed-attributes-style-expected.png:
     14        * platform/mac/plugins/embed-attributes-style-expected.txt:
     15        * plugins/embed-attributes-style.html:
     16
    1172010-01-11  Dirk Schulze  <krit@webkit.org>
    218
  • trunk/LayoutTests/platform/mac/plugins/embed-attributes-style-expected.checksum

    r38297 r53110  
    1 ced4b519232c0abe24f14dbc8db59581
     112f0362bcaeb2802b17760d15307b87e
  • trunk/LayoutTests/platform/mac/plugins/embed-attributes-style-expected.txt

    r52947 r53110  
    1313      RenderBlock {DIV} at (0,62) size 784x0
    1414      RenderBlock {DIV} at (0,62) size 784x104
    15         RenderEmbeddedObject {EMBED} at (0,0) size 50x100
    1615        RenderText {#text} at (50,86) size 122x18
    1716          text run at (50,86) width 4: " "
    1817          text run at (54,86) width 118: "valign top attribute"
    1918      RenderBlock {DIV} at (0,166) size 784x104
    20         RenderEmbeddedObject {EMBED} at (0,0) size 50x100
    2119        RenderText {#text} at (50,86) size 128x18
    2220          text run at (50,86) width 4: " "
    2321          text run at (54,86) width 124: "border 5px attribute"
    2422      RenderBlock {DIV} at (0,270) size 784x106
    25         RenderEmbeddedObject {EMBED} at (0,0) size 52x102 [border: (1px dashed #000000)]
    2623        RenderText {#text} at (52,88) size 102x18
    2724          text run at (52,88) width 4: " "
    2825          text run at (56,88) width 98: "hidden attribute"
     26layer at (8,70) size 50x100
     27  RenderEmbeddedObject {EMBED} at (0,0) size 50x100
     28layer at (8,174) size 50x100
     29  RenderEmbeddedObject {EMBED} at (0,0) size 50x100
     30layer at (8,278) size 52x102
     31  RenderEmbeddedObject {EMBED} at (0,0) size 52x102 [border: (1px dashed #000000)]
  • trunk/LayoutTests/plugins/embed-attributes-style.html

    r14069 r53110  
    33<style>
    44embed {
     5    position: relative;
    56    width: 50px;
    67    height: 100px;
  • trunk/WebCore/ChangeLog

    r53109 r53110  
     12010-01-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Reviewed by Kevin Decker.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=33455
     6        Allows plugins to participate in accelerated compositing
     7
     8        For plugins using the CoreAnimation rendering mode, host their CALayers in the
     9        accelerated compositing layer tree.
     10       
     11        This requires making normal flow RenderLayers for RenderEmbeddedObjects when they represent
     12        a plugin using this mode.
     13       
     14        * WebCore.base.exp: Export Node::setNeedsStyleRecalc() for use by WebKit.
     15        * WebCore.xcodeproj/project.pbxproj: Re-order files for sorting.
     16
     17        * rendering/RenderEmbeddedObject.h:
     18        * rendering/RenderEmbeddedObject.cpp:
     19        (WebCore::RenderEmbeddedObject::requiresLayer): Make a layer if the plugin is using
     20        accelerated compositing mode.
     21        (WebCore::RenderEmbeddedObject::allowsAcceleratedCompositing): Asks whether the plugin has
     22        a layer, via PluginWidget.
     23
     24        * rendering/RenderLayer.cpp:
     25        (WebCore::RenderLayer::shouldBeNormalFlowOnly):
     26        (WebCore::RenderLayer::isSelfPaintingLayer):
     27        RenderEmbeddedObjects should be normal flow layers, and self-painting layers.
     28       
     29        * rendering/RenderLayerBacking.cpp:
     30        (WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration):
     31        Parent the plugin's layer in the GraphicsLayer when updating the layer configuration.
     32       
     33        * rendering/RenderLayerCompositor.h:
     34        * rendering/RenderLayerCompositor.cpp:
     35        (WebCore::RenderLayerCompositor::requiresCompositingLayer):
     36        (WebCore::RenderLayerCompositor::requiresCompositingForPlugin):
     37        RenderEmbeddedObjects that allow accelerated compositing trip accelerated compositing mode
     38        for the page.
     39
    1402010-01-11  Andreas Kling  <andreas.kling@nokia.com>
    241
  • trunk/WebCore/WebCore.base.exp

    r53056 r53110  
    884884__ZNK7WebCore4Node18getSubresourceURLsERN3WTF11ListHashSetINS_4KURLENS_8KURLHashEEE
    885885__ZNK7WebCore4Node9nodeIndexEv
     886__ZN7WebCore4Node19setNeedsStyleRecalcENS_15StyleChangeTypeE
    886887__ZNK7WebCore4Page10pluginDataEv
    887888__ZNK7WebCore4Page34inLowQualityImageInterpolationModeEv
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r53086 r53110  
    1546215462                                BC77CEC70FF01CBE0070887B /* RenderDataGrid.cpp */,
    1546315463                                BC77CEB20FF017F20070887B /* RenderDataGrid.h */,
     15464                                0F5B7A5210F65D7A00376302 /* RenderEmbeddedObject.cpp */,
     15465                                0F5B7A5310F65D7A00376302 /* RenderEmbeddedObject.h */,
    1546415466                                A8EA73AF0A1900E300A8EF5F /* RenderFieldset.cpp */,
    1546515467                                A8EA73B00A1900E300A8EF5F /* RenderFieldset.h */,
     
    1551315515                                853CA9EE0AEEC657002372DC /* RenderPath.cpp */,
    1551415516                                853CA9EF0AEEC657002372DC /* RenderPath.h */,
    15515                                 0F5B7A5210F65D7A00376302 /* RenderEmbeddedObject.cpp */,
    15516                                 0F5B7A5310F65D7A00376302 /* RenderEmbeddedObject.h */,
    1551715517                                A871DFDE0A15376B00B12A68 /* RenderReplaced.cpp */,
    1551815518                                A871DFDF0A15376B00B12A68 /* RenderReplaced.h */,
  • trunk/WebCore/rendering/RenderEmbeddedObject.cpp

    r52947 r53110  
    3434#include "MIMETypeRegistry.h"
    3535#include "Page.h"
     36#include "PluginWidget.h"
    3637#include "RenderView.h"
    3738#include "RenderWidgetProtector.h"
     
    4243#endif
    4344
     45#if USE(ACCELERATED_COMPOSITING)
     46#include "PluginWidget.h"
     47#endif
     48
    4449namespace WebCore {
    4550
     
    5762        frameView()->removeWidgetToUpdate(this);
    5863}
     64
     65#if USE(ACCELERATED_COMPOSITING)
     66bool RenderEmbeddedObject::requiresLayer() const
     67{
     68    if (RenderPartObject::requiresLayer())
     69        return true;
     70   
     71    return allowsAcceleratedCompositing();
     72}
     73
     74bool RenderEmbeddedObject::allowsAcceleratedCompositing() const
     75{
     76    return widget() && widget()->isPluginWidget() && static_cast<PluginWidget*>(widget())->platformLayer();
     77}
     78#endif
    5979
    6080static bool isURLAllowed(Document* doc, const String& url)
  • trunk/WebCore/rendering/RenderEmbeddedObject.h

    r52947 r53110  
    3636    void updateWidget(bool onlyCreateNonNetscapePlugins);
    3737
     38#if USE(ACCELERATED_COMPOSITING)
     39    virtual bool allowsAcceleratedCompositing() const;
     40#endif
     41
    3842private:
    3943    virtual const char* renderName() const { return "RenderEmbeddedObject"; }
    4044    virtual bool isEmbeddedObject() const { return true; }
     45
     46#if USE(ACCELERATED_COMPOSITING)
     47    virtual bool requiresLayer() const;
     48#endif
    4149
    4250    virtual void layout();
  • trunk/WebCore/rendering/RenderLayer.cpp

    r52995 r53110  
    33033303bool RenderLayer::shouldBeNormalFlowOnly() const
    33043304{
    3305     return (renderer()->hasOverflowClip() || renderer()->hasReflection() || renderer()->hasMask() || renderer()->isVideo()) &&
     3305    return (renderer()->hasOverflowClip() || renderer()->hasReflection() || renderer()->hasMask() || renderer()->isVideo() || renderer()->isEmbeddedObject()) &&
    33063306           !renderer()->isPositioned() &&
    33073307           !renderer()->isRelPositioned() &&
     
    33123312bool RenderLayer::isSelfPaintingLayer() const
    33133313{
    3314     return !isNormalFlowOnly() || renderer()->hasReflection() || renderer()->hasMask() || renderer()->isTableRow() || renderer()->isVideo();
     3314    return !isNormalFlowOnly() || renderer()->hasReflection() || renderer()->hasMask() || renderer()->isTableRow() || renderer()->isVideo() || renderer()->isEmbeddedObject();
    33153315}
    33163316
  • trunk/WebCore/rendering/RenderLayerBacking.cpp

    r53034 r53110  
    4242#include "InspectorTimelineAgent.h"
    4343#include "KeyframeList.h"
     44#include "PluginWidget.h"
    4445#include "RenderBox.h"
    4546#include "RenderImage.h"
    4647#include "RenderLayerCompositor.h"
     48#include "RenderEmbeddedObject.h"
    4749#include "RenderVideo.h"
    4850#include "RenderView.h"
     
    197199    if (isDirectlyCompositedImage())
    198200        updateImageContents();
     201
     202    if (renderer()->isEmbeddedObject() && toRenderEmbeddedObject(renderer())->allowsAcceleratedCompositing()) {
     203        PluginWidget* pluginWidget = static_cast<PluginWidget*>(toRenderEmbeddedObject(renderer())->widget());
     204        m_graphicsLayer->setContentsToMedia(pluginWidget->platformLayer());
     205    }
    199206
    200207#if ENABLE(3D_CANVAS)   
  • trunk/WebCore/rendering/RenderLayerCompositor.cpp

    r52314 r53110  
    4040#include "Page.h"
    4141#include "RenderLayerBacking.h"
     42#include "RenderEmbeddedObject.h"
    4243#include "RenderVideo.h"
    4344#include "RenderView.h"
     
    5960
    6061namespace WebCore {
     62
     63using namespace HTMLNames;
    6164
    6265struct CompositingState {
     
    886889// static
    887890bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer) const
    888 {   
     891{
     892    RenderObject* renderer = layer->renderer();
    889893    // The root layer always has a compositing layer, but it may not have backing.
    890894    return (inCompositingMode() && layer->isRootLayer()) ||
    891              requiresCompositingForTransform(layer->renderer()) ||
    892              requiresCompositingForVideo(layer->renderer()) ||
    893              requiresCompositingForCanvas(layer->renderer()) ||
    894              layer->renderer()->style()->backfaceVisibility() == BackfaceVisibilityHidden ||
     895             requiresCompositingForTransform(renderer) ||
     896             requiresCompositingForVideo(renderer) ||
     897             requiresCompositingForCanvas(renderer) ||
     898             requiresCompositingForPlugin(renderer) ||
     899             renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden ||
    895900             clipsCompositingDescendants(layer) ||
    896              requiresCompositingForAnimation(layer->renderer());
     901             requiresCompositingForAnimation(renderer);
    897902}
    898903
     
    976981}
    977982
     983bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer) const
     984{
     985    return renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing();
     986}
     987
    978988bool RenderLayerCompositor::requiresCompositingForAnimation(RenderObject* renderer) const
    979989{
  • trunk/WebCore/rendering/RenderLayerCompositor.h

    r51476 r53110  
    174174    bool requiresCompositingForVideo(RenderObject*) const;
    175175    bool requiresCompositingForCanvas(RenderObject*) const;
     176    bool requiresCompositingForPlugin(RenderObject*) const;
    176177    bool requiresCompositingWhenDescendantsAreCompositing(RenderObject*) const;
    177178
  • trunk/WebKit/mac/ChangeLog

    r53046 r53110  
     12010-01-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Reviewed by Kevin Decker.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=33455
     6        Allows plugins to participate in accelerated compositing
     7
     8        * Plugins/Hosted/WebHostedNetscapePluginView.mm:
     9        (-[WebHostedNetscapePluginView createPlugin]):
     10        * Plugins/WebNetscapePluginView.mm:
     11        (-[WebNetscapePluginView createPlugin]): If accelerated compositing is
     12        available, don't use a layer-backed NSView for plugins. Instead, tickle the
     13        accelerated compositing code via setNeedsStyleRecalc(SyntheticStyleChange),
     14        which will parent the plugin's layer in the accelerated compositing layer
     15        tree.
     16
    1172010-01-09  Adam Barth  <abarth@webkit.org>
    218
  • trunk/WebKit/mac/Plugins/Hosted/WebHostedNetscapePluginView.mm

    r52942 r53110  
    117117    else {
    118118        _pluginLayer = WKMakeRenderLayer(_proxy->renderContextID());
    119         self.wantsLayer = YES;
     119
     120        if (accleratedCompositingEnabled)
     121            [self element]->setNeedsStyleRecalc(SyntheticStyleChange);
     122        else
     123            self.wantsLayer = YES;
    120124    }
    121125   
  • trunk/WebKit/mac/Plugins/WebNetscapePluginView.mm

    r52887 r53110  
    10901090        void *value = 0;
    10911091        if ([_pluginPackage.get() pluginFuncs]->getvalue(plugin, NPPVpluginCoreAnimationLayer, &value) == NPERR_NO_ERROR && value) {
    1092            
     1092
    10931093            // The plug-in gives us a retained layer.
    10941094            _pluginLayer.adoptNS((CALayer *)value);
    1095             [self setWantsLayer:YES];
     1095
     1096            BOOL accleratedCompositingEnabled = false;
     1097#if USE(ACCELERATED_COMPOSITING)
     1098            accleratedCompositingEnabled = [[[self webView] preferences] acceleratedCompositingEnabled];
     1099#endif
     1100            if (accleratedCompositingEnabled)
     1101                [self element]->setNeedsStyleRecalc(SyntheticStyleChange);
     1102            else
     1103                [self setWantsLayer:YES];
    10961104            LOG(Plugins, "%@ is using Core Animation drawing model with layer %@", _pluginPackage.get(), _pluginLayer.get());
    10971105        }
Note: See TracChangeset for help on using the changeset viewer.