Changeset 176798 in webkit


Ignore:
Timestamp:
Dec 4, 2014 9:05:12 AM (9 years ago)
Author:
stavila@adobe.com
Message:

[SVG Masking] Add support for referencing <mask> elements from -webkit-mask-image
https://bugs.webkit.org/show_bug.cgi?id=139092

Reviewed by Simon Fraser.

This patch improves the -webkit-mask-image property by allowing it to reference
a <mask> element defined in an inline or external SVG document.
Up until now, each image to be used as a mask consisted of a FillLayer object
whose m_image member represented the mask. Now, in order to accomodate
<mask> elements referenced by a fragment identifier (e.g. file.svg#mask1)
a new class was created (MaskImageOperation) and added as a member of the
FillLayer. As such, from now on, all FillLayer objects used for masking will
store the masking information in this new member.
When parsing the -webkit-mask-image property (or the -webkit-mask shorthand)
a new MaskImageOperation object is created for each image. If the value represents
an external URL, a pending SVG document will be created which will be loaded
during the phase that loads the pending resources. When the download is complete,
the MaskImageOperation is notified by the CachedSVGDocument class and checks if
the received download is a valid SVG and the requested fragment identifier
actually exists and identifies a <mask> element. If it does, that element's
renderer (of type RenderSVGResourceMasker) will be used when painting the mask layers.
Otherwise, the MaskImageOperation class will use the already downloaded data
buffer to create a CachedImage from it and use that instead, basically emulating
the previous behavior, when only images were accepted. This ensures that all existing
behavior, like painting entire SVGs, painting normal images (e.g. PNG/JPG), painting
generated images (e.g. linear-gradient) works as it did before.

No new tests required, this patch doesn't change any current functionality.
It only adds support for referencing <mask> elements for the -webkit-mask-image
property. This is sub-part 1 of the bigger patch https://bugs.webkit.org/show_bug.cgi?id=129682.

  • CMakeLists.txt:
  • WebCore.vcxproj/WebCore.vcxproj:
  • WebCore.vcxproj/WebCore.vcxproj.filters:
  • WebCore.xcodeproj/project.pbxproj:
  • css/CSSValue.cpp:

(WebCore::CSSValue::cssText):
(WebCore::CSSValue::destroy):

  • css/CSSValue.h:

(WebCore::CSSValue::isWebKitCSSResourceValue):

  • css/StyleResolver.cpp:

(WebCore::StyleResolver::State::clear):
(WebCore::StyleResolver::createMaskImageOperations):

  • css/StyleResolver.h:

(WebCore::StyleResolver::State::maskImagesWithPendingSVGDocuments):

  • css/WebKitCSSResourceValue.cpp: Added.

(WebCore::WebKitCSSResourceValue::WebKitCSSResourceValue):
(WebCore::WebKitCSSResourceValue::customCSSText):
(WebCore::WebKitCSSResourceValue::isCSSValueNone):

  • css/WebKitCSSResourceValue.h: Added.

(WebCore::WebKitCSSResourceValue::create):
(WebCore::WebKitCSSResourceValue::innerValue):

  • loader/cache/CachedResourceLoader.cpp:

(WebCore::CachedResourceLoader::addCachedResource):

  • loader/cache/CachedResourceLoader.h:
  • loader/cache/CachedSVGDocument.cpp:

(WebCore::CachedSVGDocument::CachedSVGDocument):
(WebCore::CachedSVGDocument::finishLoading):

  • loader/cache/CachedSVGDocument.h:
  • loader/cache/CachedSVGDocumentReference.cpp:

(WebCore::CachedSVGDocumentReference::CachedSVGDocumentReference):
(WebCore::CachedSVGDocumentReference::~CachedSVGDocumentReference):
(WebCore::CachedSVGDocumentReference::load):

  • loader/cache/CachedSVGDocumentReference.h:
  • page/FrameView.cpp:

(WebCore::FrameView::isSVGDocument):

  • page/FrameView.h:
  • page/Page.cpp:

(WebCore::Page::createPageFromBuffer):

  • page/Page.h:
  • platform/ScrollView.h:

(WebCore::ScrollView::isSVGDocument):

  • platform/graphics/MaskImageOperation.cpp: Added.

(WebCore::MaskImageOperation::create):
(WebCore::MaskImageOperation::MaskImageOperation):
(WebCore::MaskImageOperation::~MaskImageOperation):
(WebCore::MaskImageOperation::isCSSValueNone):
(WebCore::MaskImageOperation::cssValue):
(WebCore::MaskImageOperation::isMaskLoaded):
(WebCore::MaskImageOperation::setRenderLayerImageClient):
(WebCore::MaskImageOperation::addRendererImageClient):
(WebCore::MaskImageOperation::removeRendererImageClient):
(WebCore::MaskImageOperation::getOrCreateCachedSVGDocumentReference):
(WebCore::MaskImageOperation::notifyFinished): This is the method that gets called when the document has finished
downloading and checks if it can find a valid <mask> element.
(WebCore::MaskImageOperation::drawMask):
(WebCore::MaskImageOperation::getSVGMasker):

  • platform/graphics/MaskImageOperation.h: Added.
  • rendering/RenderBoxModelObject.cpp: The BackgroundImageGeometry class was moved out of RenderBoxModelObject in

order to be used as a parameter for other methods. This was necessary to avoid having methods with very many parameters.
(WebCore::BackgroundImageGeometry::setNoRepeatX):
(WebCore::BackgroundImageGeometry::setNoRepeatY):
(WebCore::BackgroundImageGeometry::useFixedAttachment):
(WebCore::BackgroundImageGeometry::clip):
(WebCore::BackgroundImageGeometry::relativePhase):
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatX): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatY): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::useFixedAttachment): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::clip): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::relativePhase): Deleted.

  • rendering/RenderBoxModelObject.h:

(WebCore::BackgroundImageGeometry::BackgroundImageGeometry):
(WebCore::BackgroundImageGeometry::destOrigin):
(WebCore::BackgroundImageGeometry::setDestOrigin):
(WebCore::BackgroundImageGeometry::destRect):
(WebCore::BackgroundImageGeometry::setDestRect):
(WebCore::BackgroundImageGeometry::phase):
(WebCore::BackgroundImageGeometry::setPhase):
(WebCore::BackgroundImageGeometry::tileSize):
(WebCore::BackgroundImageGeometry::setTileSize):
(WebCore::BackgroundImageGeometry::spaceSize):
(WebCore::BackgroundImageGeometry::setSpaceSize):
(WebCore::BackgroundImageGeometry::setPhaseX):
(WebCore::BackgroundImageGeometry::setPhaseY):
(WebCore::BackgroundImageGeometry::setHasNonLocalGeometry):
(WebCore::BackgroundImageGeometry::hasNonLocalGeometry):
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::BackgroundImageGeometry): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::destOrigin): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setDestOrigin): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::destRect): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setDestRect): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::phase): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setPhase): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::tileSize): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setTileSize): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::spaceSize): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setSpaceSize): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setPhaseX): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setPhaseY): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::setHasNonLocalGeometry): Deleted.
(WebCore::RenderBoxModelObject::BackgroundImageGeometry::hasNonLocalGeometry): Deleted.

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::~RenderLayer):

  • rendering/RenderLayer.h:
  • rendering/RenderLayerMaskImageInfo.cpp: Added.

(WebCore::RenderLayer::MaskImageInfo::layerToMaskMap): Returns a static map that links MaskImageInfo objects to RenderLayers.
(WebCore::RenderLayer::MaskImageInfo::getIfExists): Returns the MaskImageInfo associated with a specific RenderLayer.
(WebCore::RenderLayer::MaskImageInfo::get): Returns the MaskImageInfo associated with a specific RenderLayer (creates it if necessary).
(WebCore::RenderLayer::MaskImageInfo::remove): Removes the MaskImageInfo associated with a specific RenderLayer.
(WebCore::RenderLayer::MaskImageInfo::MaskImageInfo):
(WebCore::RenderLayer::MaskImageInfo::~MaskImageInfo):
(WebCore::RenderLayer::MaskImageInfo::notifyFinished): Gets called when the SVG document finished loading, triggers repaint.
(WebCore::RenderLayer::MaskImageInfo::imageChanged): Gets called when the image object changed, triggers repaint.
(WebCore::RenderLayer::MaskImageInfo::updateMaskImageClients): Goes through all mask layers and sets image/SVG clients.
Updates list of internal and external SVG references.
(WebCore::RenderLayer::MaskImageInfo::removeMaskImageClients): Removes all image/SVG clients and clears lists of internal and external SVG references.

  • rendering/RenderLayerMaskImageInfo.h: Added.
  • rendering/RenderObject.h:

(WebCore::RenderObject::isRenderSVGResourceMasker):

  • rendering/style/FillLayer.cpp:

(WebCore::FillLayer::FillLayer):
(WebCore::FillLayer::operator=):
(WebCore::FillLayer::operator==):
(WebCore::FillLayer::cullEmptyLayers):
(WebCore::FillLayer::hasNonEmptyMaskImage):
(WebCore::FillLayer::imagesAreLoaded):

  • rendering/style/FillLayer.h:

(WebCore::FillLayer::maskImage):
(WebCore::FillLayer::imageOrMaskImage):
(WebCore::FillLayer::setMaskImage):
(WebCore::FillLayer::clearMaskImage):
(WebCore::FillLayer::hasMaskImage):

  • rendering/svg/RenderSVGResourceMasker.cpp:

(WebCore::RenderSVGResourceMasker::applySVGMask):
(WebCore::RenderSVGResourceMasker::applyResource):
(WebCore::RenderSVGResourceMasker::drawMaskForRenderer):

  • rendering/svg/RenderSVGResourceMasker.h:
  • svg/SVGMaskElement.cpp:

(WebCore::SVGMaskElement::createElementRenderer):
(WebCore::SVGMaskElement::addClientRenderLayer):
(WebCore::SVGMaskElement::removeClientRenderLayer):

  • svg/SVGMaskElement.h:
  • svg/SVGUseElement.cpp:

(WebCore::SVGUseElement::setCachedDocument):

  • svg/graphics/SVGImage.cpp:

(WebCore::SVGImage::dataChanged):

Location:
trunk/Source/WebCore
Files:
6 added
32 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r176696 r176798  
    12901290    css/ViewportStyleResolver.cpp
    12911291    css/WebKitCSSFilterValue.cpp
     1292    css/WebKitCSSResourceValue.cpp
    12921293    css/CSSKeyframeRule.cpp
    12931294    css/CSSKeyframesRule.cpp
     
    20902091    platform/graphics/LayoutBoxExtent.cpp
    20912092    platform/graphics/LayoutRect.cpp
     2093    platform/graphics/MaskImageOperation.cpp
    20922094    platform/graphics/MediaPlayer.cpp
    20932095    platform/graphics/Path.cpp
     
    22962298    rendering/RenderLayerCompositor.cpp
    22972299    rendering/RenderLayerFilterInfo.cpp
     2300    rendering/RenderLayerMaskImageInfo.cpp
    22982301    rendering/RenderLayerModelObject.cpp
    22992302    rendering/RenderLineBoxList.cpp
  • trunk/Source/WebCore/ChangeLog

    r176790 r176798  
     12014-12-04  Radu Stavila  <stavila@adobe.com>
     2
     3        [SVG Masking] Add support for referencing <mask> elements from -webkit-mask-image
     4        https://bugs.webkit.org/show_bug.cgi?id=139092
     5
     6        Reviewed by Simon Fraser.
     7
     8        This patch improves the -webkit-mask-image property by allowing it to reference
     9        a <mask> element defined in an inline or external SVG document.
     10        Up until now, each image to be used as a mask consisted of a FillLayer object
     11        whose m_image member represented the mask. Now, in order to accomodate
     12        <mask> elements referenced by a fragment identifier (e.g. file.svg#mask1)
     13        a new class was created (MaskImageOperation) and added as a member of the
     14        FillLayer. As such, from now on, all FillLayer objects used for masking will
     15        store the masking information in this new member.
     16        When parsing the -webkit-mask-image property (or the -webkit-mask shorthand)
     17        a new MaskImageOperation object is created for each image. If the value represents
     18        an external URL, a pending SVG document will be created which will be loaded
     19        during the phase that loads the pending resources. When the download is complete,
     20        the MaskImageOperation is notified by the CachedSVGDocument class and checks if
     21        the received download is a valid SVG and the requested fragment identifier
     22        actually exists and identifies a <mask> element. If it does, that element's
     23        renderer (of type RenderSVGResourceMasker) will be used when painting the mask layers.
     24        Otherwise, the MaskImageOperation class will use the already downloaded data
     25        buffer to create a CachedImage from it and use that instead, basically emulating
     26        the previous behavior, when only images were accepted. This ensures that all existing
     27        behavior, like painting entire SVGs, painting normal images (e.g. PNG/JPG), painting
     28        generated images (e.g. linear-gradient) works as it did before.
     29
     30        No new tests required, this patch doesn't change any current functionality.
     31        It only adds support for referencing <mask> elements for the -webkit-mask-image
     32        property. This is sub-part 1 of the bigger patch https://bugs.webkit.org/show_bug.cgi?id=129682.
     33
     34        * CMakeLists.txt:
     35        * WebCore.vcxproj/WebCore.vcxproj:
     36        * WebCore.vcxproj/WebCore.vcxproj.filters:
     37        * WebCore.xcodeproj/project.pbxproj:
     38        * css/CSSValue.cpp:
     39        (WebCore::CSSValue::cssText):
     40        (WebCore::CSSValue::destroy):
     41        * css/CSSValue.h:
     42        (WebCore::CSSValue::isWebKitCSSResourceValue):
     43        * css/StyleResolver.cpp:
     44        (WebCore::StyleResolver::State::clear):
     45        (WebCore::StyleResolver::createMaskImageOperations):
     46        * css/StyleResolver.h:
     47        (WebCore::StyleResolver::State::maskImagesWithPendingSVGDocuments):
     48        * css/WebKitCSSResourceValue.cpp: Added.
     49        (WebCore::WebKitCSSResourceValue::WebKitCSSResourceValue):
     50        (WebCore::WebKitCSSResourceValue::customCSSText):
     51        (WebCore::WebKitCSSResourceValue::isCSSValueNone):
     52        * css/WebKitCSSResourceValue.h: Added.
     53        (WebCore::WebKitCSSResourceValue::create):
     54        (WebCore::WebKitCSSResourceValue::innerValue):
     55        * loader/cache/CachedResourceLoader.cpp:
     56        (WebCore::CachedResourceLoader::addCachedResource):
     57        * loader/cache/CachedResourceLoader.h:
     58        * loader/cache/CachedSVGDocument.cpp:
     59        (WebCore::CachedSVGDocument::CachedSVGDocument):
     60        (WebCore::CachedSVGDocument::finishLoading):
     61        * loader/cache/CachedSVGDocument.h:
     62        * loader/cache/CachedSVGDocumentReference.cpp:
     63        (WebCore::CachedSVGDocumentReference::CachedSVGDocumentReference):
     64        (WebCore::CachedSVGDocumentReference::~CachedSVGDocumentReference):
     65        (WebCore::CachedSVGDocumentReference::load):
     66        * loader/cache/CachedSVGDocumentReference.h:
     67        * page/FrameView.cpp:
     68        (WebCore::FrameView::isSVGDocument):
     69        * page/FrameView.h:
     70        * page/Page.cpp:
     71        (WebCore::Page::createPageFromBuffer):
     72        * page/Page.h:
     73        * platform/ScrollView.h:
     74        (WebCore::ScrollView::isSVGDocument):
     75        * platform/graphics/MaskImageOperation.cpp: Added.
     76        (WebCore::MaskImageOperation::create):
     77        (WebCore::MaskImageOperation::MaskImageOperation):
     78        (WebCore::MaskImageOperation::~MaskImageOperation):
     79        (WebCore::MaskImageOperation::isCSSValueNone):
     80        (WebCore::MaskImageOperation::cssValue):
     81        (WebCore::MaskImageOperation::isMaskLoaded):
     82        (WebCore::MaskImageOperation::setRenderLayerImageClient):
     83        (WebCore::MaskImageOperation::addRendererImageClient):
     84        (WebCore::MaskImageOperation::removeRendererImageClient):
     85        (WebCore::MaskImageOperation::getOrCreateCachedSVGDocumentReference):
     86        (WebCore::MaskImageOperation::notifyFinished): This is the method that gets called when the document has finished
     87        downloading and checks if it can find a valid <mask> element.
     88        (WebCore::MaskImageOperation::drawMask):
     89        (WebCore::MaskImageOperation::getSVGMasker):
     90        * platform/graphics/MaskImageOperation.h: Added.
     91        * rendering/RenderBoxModelObject.cpp: The BackgroundImageGeometry class was moved out of RenderBoxModelObject in
     92        order to be used as a parameter for other methods. This was necessary to avoid having methods with very many parameters.
     93        (WebCore::BackgroundImageGeometry::setNoRepeatX):
     94        (WebCore::BackgroundImageGeometry::setNoRepeatY):
     95        (WebCore::BackgroundImageGeometry::useFixedAttachment):
     96        (WebCore::BackgroundImageGeometry::clip):
     97        (WebCore::BackgroundImageGeometry::relativePhase):
     98        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatX): Deleted.
     99        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatY): Deleted.
     100        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::useFixedAttachment): Deleted.
     101        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::clip): Deleted.
     102        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::relativePhase): Deleted.
     103        * rendering/RenderBoxModelObject.h:
     104        (WebCore::BackgroundImageGeometry::BackgroundImageGeometry):
     105        (WebCore::BackgroundImageGeometry::destOrigin):
     106        (WebCore::BackgroundImageGeometry::setDestOrigin):
     107        (WebCore::BackgroundImageGeometry::destRect):
     108        (WebCore::BackgroundImageGeometry::setDestRect):
     109        (WebCore::BackgroundImageGeometry::phase):
     110        (WebCore::BackgroundImageGeometry::setPhase):
     111        (WebCore::BackgroundImageGeometry::tileSize):
     112        (WebCore::BackgroundImageGeometry::setTileSize):
     113        (WebCore::BackgroundImageGeometry::spaceSize):
     114        (WebCore::BackgroundImageGeometry::setSpaceSize):
     115        (WebCore::BackgroundImageGeometry::setPhaseX):
     116        (WebCore::BackgroundImageGeometry::setPhaseY):
     117        (WebCore::BackgroundImageGeometry::setHasNonLocalGeometry):
     118        (WebCore::BackgroundImageGeometry::hasNonLocalGeometry):
     119        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::BackgroundImageGeometry): Deleted.
     120        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::destOrigin): Deleted.
     121        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setDestOrigin): Deleted.
     122        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::destRect): Deleted.
     123        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setDestRect): Deleted.
     124        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::phase): Deleted.
     125        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setPhase): Deleted.
     126        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::tileSize): Deleted.
     127        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setTileSize): Deleted.
     128        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::spaceSize): Deleted.
     129        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setSpaceSize): Deleted.
     130        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setPhaseX): Deleted.
     131        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setPhaseY): Deleted.
     132        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::setHasNonLocalGeometry): Deleted.
     133        (WebCore::RenderBoxModelObject::BackgroundImageGeometry::hasNonLocalGeometry): Deleted.
     134        * rendering/RenderLayer.cpp:
     135        (WebCore::RenderLayer::RenderLayer):
     136        (WebCore::RenderLayer::~RenderLayer):
     137        * rendering/RenderLayer.h:
     138        * rendering/RenderLayerMaskImageInfo.cpp: Added.
     139        (WebCore::RenderLayer::MaskImageInfo::layerToMaskMap): Returns a static map that links MaskImageInfo objects to RenderLayers.
     140        (WebCore::RenderLayer::MaskImageInfo::getIfExists): Returns the MaskImageInfo associated with a specific RenderLayer.
     141        (WebCore::RenderLayer::MaskImageInfo::get): Returns the MaskImageInfo associated with a specific RenderLayer (creates it if necessary).
     142        (WebCore::RenderLayer::MaskImageInfo::remove): Removes the MaskImageInfo associated with a specific RenderLayer.
     143        (WebCore::RenderLayer::MaskImageInfo::MaskImageInfo):
     144        (WebCore::RenderLayer::MaskImageInfo::~MaskImageInfo):
     145        (WebCore::RenderLayer::MaskImageInfo::notifyFinished): Gets called when the SVG document finished loading, triggers repaint.
     146        (WebCore::RenderLayer::MaskImageInfo::imageChanged): Gets called when the image object changed, triggers repaint.
     147        (WebCore::RenderLayer::MaskImageInfo::updateMaskImageClients): Goes through all mask layers and sets image/SVG clients.
     148        Updates list of internal and external SVG references.
     149        (WebCore::RenderLayer::MaskImageInfo::removeMaskImageClients): Removes all image/SVG clients and clears lists of internal and external SVG references.
     150        * rendering/RenderLayerMaskImageInfo.h: Added.
     151        * rendering/RenderObject.h:
     152        (WebCore::RenderObject::isRenderSVGResourceMasker):
     153        * rendering/style/FillLayer.cpp:
     154        (WebCore::FillLayer::FillLayer):
     155        (WebCore::FillLayer::operator=):
     156        (WebCore::FillLayer::operator==):
     157        (WebCore::FillLayer::cullEmptyLayers):
     158        (WebCore::FillLayer::hasNonEmptyMaskImage):
     159        (WebCore::FillLayer::imagesAreLoaded):
     160        * rendering/style/FillLayer.h:
     161        (WebCore::FillLayer::maskImage):
     162        (WebCore::FillLayer::imageOrMaskImage):
     163        (WebCore::FillLayer::setMaskImage):
     164        (WebCore::FillLayer::clearMaskImage):
     165        (WebCore::FillLayer::hasMaskImage):
     166        * rendering/svg/RenderSVGResourceMasker.cpp:
     167        (WebCore::RenderSVGResourceMasker::applySVGMask):
     168        (WebCore::RenderSVGResourceMasker::applyResource):
     169        (WebCore::RenderSVGResourceMasker::drawMaskForRenderer):
     170        * rendering/svg/RenderSVGResourceMasker.h:
     171        * svg/SVGMaskElement.cpp:
     172        (WebCore::SVGMaskElement::createElementRenderer):
     173        (WebCore::SVGMaskElement::addClientRenderLayer):
     174        (WebCore::SVGMaskElement::removeClientRenderLayer):
     175        * svg/SVGMaskElement.h:
     176        * svg/SVGUseElement.cpp:
     177        (WebCore::SVGUseElement::setCachedDocument):
     178        * svg/graphics/SVGImage.cpp:
     179        (WebCore::SVGImage::dataChanged):
     180
    11812014-12-04  Commit Queue  <commit-queue@webkit.org>
    2182
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r176696 r176798  
    750750      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
    751751    </ClCompile>
     752    <ClCompile Include="..\css\WebKitCSSResourceValue.cpp" />
    752753    <ClCompile Include="..\DerivedSources.cpp">
    753754      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     
    75837584      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
    75847585    </ClCompile>
     7586    <ClCompile Include="..\platform\graphics\MaskImageOperation.cpp" />
    75857587    <ClCompile Include="..\platform\graphics\OpenGLShims.cpp" />
    75867588    <ClCompile Include="..\platform\graphics\opengl\Extensions3DOpenGL.cpp" />
     
    79517953      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
    79527954    </ClCompile>
     7955    <ClCompile Include="..\rendering\RenderLayerMaskImageInfo.cpp" />
    79537956    <ClCompile Include="..\rendering\style\StyleCachedImageSet.cpp">
    79547957      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>
     
    1885218855    <ClInclude Include="..\accessibility\AccessibilityNodeObject.h" />
    1885318856    <ClInclude Include="..\css\CSSImageSetValue.h" />
     18857    <ClInclude Include="..\css\WebKitCSSResourceValue.h" />
    1885418858    <ClInclude Include="..\ForwardingHeaders\bindings\ScriptFunctionCall.h" />
    1885518859    <ClInclude Include="..\ForwardingHeaders\bindings\ScriptObject.h" />
     
    1940819412    <ClInclude Include="..\platform\graphics\gstreamer\VideoTrackPrivateGStreamer.h" />
    1940919413    <ClInclude Include="..\platform\graphics\gstreamer\WebKitWebSourceGStreamer.h" />
     19414    <ClInclude Include="..\platform\graphics\MaskImageOperation.h" />
    1941019415    <ClInclude Include="..\platform\graphics\MediaPlayerPrivate.h" />
    1941119416    <ClInclude Include="..\platform\graphics\OpenGLShims.h" />
     
    1953919544    <ClInclude Include="..\platform\win\WebCoreInstanceHandle.h" />
    1954019545    <ClInclude Include="..\rendering\HitTestLocation.h" />
     19546    <ClInclude Include="..\rendering\RenderLayerMaskImageInfo.h" />
    1954119547    <ClInclude Include="..\rendering\style\StyleCachedImageSet.h" />
    1954219548    <ClInclude Include="..\storage\StorageStrategy.h" />
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters

    r176696 r176798  
    72537253      <Filter>editing</Filter>
    72547254    </ClCompile>
     7255    <ClCompile Include="..\platform\graphics\MaskImageOperation.cpp">
     7256      <Filter>platform\graphics</Filter>
     7257    </ClCompile>
     7258    <ClCompile Include="..\rendering\RenderLayerMaskImageInfo.cpp">
     7259      <Filter>rendering</Filter>
     7260    </ClCompile>
     7261    <ClCompile Include="..\css\WebKitCSSResourceValue.cpp">
     7262      <Filter>css</Filter>
     7263    </ClCompile>
    72557264  </ItemGroup>
    72567265  <ItemGroup>
     
    1524215251    <ClInclude Include="..\platform\graphics\avfoundation\MediaTimeAVFoundation.h">
    1524315252      <Filter>platform\graphics\avfoundation</Filter>
     15253    </ClInclude>
     15254        <ClInclude Include="..\platform\graphics\MaskImageOperation.h">
     15255      <Filter>platform\graphics</Filter>
     15256    </ClInclude>
     15257    <ClInclude Include="..\rendering\RenderLayerMaskImageInfo.h">
     15258      <Filter>rendering</Filter>
     15259    </ClInclude>
     15260    <ClInclude Include="..\css\WebKitCSSResourceValue.h">
     15261      <Filter>css</Filter>
    1524415262    </ClInclude>
    1524515263  </ItemGroup>
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r176697 r176798  
    22372237                65FEA86909833ADE00BED4AB /* Page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FEA86809833ADE00BED4AB /* Page.cpp */; };
    22382238                6B3480940EEF50D400AC1B41 /* NativeImagePtr.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3480920EEF50D400AC1B41 /* NativeImagePtr.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2239                6C568CB019DAFEA000430CA2 /* MaskImageOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6C568CAE19DAFEA000430CA2 /* MaskImageOperation.cpp */; };
     2240                6C568CB119DAFEA000430CA2 /* MaskImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C568CAF19DAFEA000430CA2 /* MaskImageOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
    22392241                6C638895A96CCEE50C8C946C /* CachedResourceRequestInitiators.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C638893A96CCEE50C8C946C /* CachedResourceRequestInitiators.h */; settings = {ATTRIBUTES = (Private, ); }; };
    22402242                6C638896A96CCEE50C8C946C /* CachedResourceRequestInitiators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6C638894A96CCEE50C8C946C /* CachedResourceRequestInitiators.cpp */; };
     2243                6C6CCAB019DC42B90043D5DB /* WebKitCSSResourceValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6C6CCAAE19DC42B90043D5DB /* WebKitCSSResourceValue.cpp */; };
     2244                6C6CCAB119DC42B90043D5DB /* WebKitCSSResourceValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C6CCAAF19DC42B90043D5DB /* WebKitCSSResourceValue.h */; };
     2245                6CBFE4A419EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */; };
     2246                6CBFE4A519EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */; };
    22412247                6CDDE8D01770BB220016E072 /* RegionOversetState.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C70A81417707C49009A446E /* RegionOversetState.h */; settings = {ATTRIBUTES = (Private, ); }; };
    22422248                6E0E569B183BFFE600E0E8D5 /* FloatRoundedRect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E0E5699183BFFE600E0E8D5 /* FloatRoundedRect.cpp */; };
     
    94029408                65FEA86809833ADE00BED4AB /* Page.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Page.cpp; sourceTree = "<group>"; };
    94039409                6B3480920EEF50D400AC1B41 /* NativeImagePtr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NativeImagePtr.h; sourceTree = "<group>"; };
     9410                6C568CAE19DAFEA000430CA2 /* MaskImageOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MaskImageOperation.cpp; sourceTree = "<group>"; };
     9411                6C568CAF19DAFEA000430CA2 /* MaskImageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MaskImageOperation.h; sourceTree = "<group>"; };
    94049412                6C638893A96CCEE50C8C946C /* CachedResourceRequestInitiators.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CachedResourceRequestInitiators.h; sourceTree = "<group>"; };
    94059413                6C638894A96CCEE50C8C946C /* CachedResourceRequestInitiators.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CachedResourceRequestInitiators.cpp; sourceTree = "<group>"; };
     9414                6C6CCAAE19DC42B90043D5DB /* WebKitCSSResourceValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebKitCSSResourceValue.cpp; sourceTree = "<group>"; };
     9415                6C6CCAAF19DC42B90043D5DB /* WebKitCSSResourceValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitCSSResourceValue.h; sourceTree = "<group>"; };
    94069416                6C70A81417707C49009A446E /* RegionOversetState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegionOversetState.h; sourceTree = "<group>"; };
     9417                6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderLayerMaskImageInfo.cpp; sourceTree = "<group>"; };
     9418                6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderLayerMaskImageInfo.h; sourceTree = "<group>"; };
    94079419                6E0E5699183BFFE600E0E8D5 /* FloatRoundedRect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FloatRoundedRect.cpp; sourceTree = "<group>"; };
    94089420                6E0E569A183BFFE600E0E8D5 /* FloatRoundedRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FloatRoundedRect.h; sourceTree = "<group>"; };
     
    2058920601                                141DC04D164834B900371E5A /* LayoutRect.h */,
    2059020602                                141DC04E164834B900371E5A /* LayoutSize.h */,
     20603                                6C568CAE19DAFEA000430CA2 /* MaskImageOperation.cpp */,
     20604                                6C568CAF19DAFEA000430CA2 /* MaskImageOperation.h */,
    2059120605                                E4B41E0C0CBF90BD00AF2ECE /* MediaPlayer.cpp */,
    2059220606                                E4B41E0D0CBF90BD00AF2ECE /* MediaPlayer.h */,
     
    2229422308                                3106036D14327D2E00ABF4BA /* WebKitCSSFilterValue.h */,
    2229522309                                3106036E14327D2E00ABF4BA /* WebKitCSSFilterValue.idl */,
     22310                                6C6CCAAE19DC42B90043D5DB /* WebKitCSSResourceValue.cpp */,
     22311                                6C6CCAAF19DC42B90043D5DB /* WebKitCSSResourceValue.h */,
    2229622312                                31288E6E0E3005D6003619AE /* CSSKeyframeRule.cpp */,
    2229722313                                31288E6F0E3005D6003619AE /* CSSKeyframeRule.h */,
     
    2244822464                                50D10D971545F5760096D288 /* RenderLayerFilterInfo.cpp */,
    2244922465                                50D10D981545F5760096D288 /* RenderLayerFilterInfo.h */,
     22466                                6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */,
     22467                                6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */,
    2245022468                                3C244FE5A375AC633F88BE6F /* RenderLayerModelObject.cpp */,
    2245122469                                3C244FE4A375AC633F88BE6F /* RenderLayerModelObject.h */,
     
    2343123449                                0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */,
    2343223450                                49E912AD0EFAC906009D0CAF /* AnimationList.h in Headers */,
     23451                                6C568CB119DAFEA000430CA2 /* MaskImageOperation.h in Headers */,
    2343323452                                0F580FAF149800D400FB5BD8 /* AnimationUtilities.h in Headers */,
    2343423453                                93309DD7099E64920056E581 /* AppendNodeCommand.h in Headers */,
     
    2544325462                                070E09191875EEFC003A1D3C /* MediaSession.h in Headers */,
    2544425463                                07F944161864D046005D31CB /* MediaSessionManager.h in Headers */,
     25464                                6CBFE4A519EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h in Headers */,
    2544525465                                07638A991884487200E15A1B /* MediaSessionManagerIOS.h in Headers */,
    2544625466                                CD3A495F17A9D01B00274E42 /* MediaSource.h in Headers */,
     
    2604626066                                E44B4BB4141650D7002B1D8B /* SelectorChecker.h in Headers */,
    2604726067                                432D3FE818A8658400D7DC03 /* SelectorCheckerTestFunctions.h in Headers */,
     26068                                6C6CCAB119DC42B90043D5DB /* WebKitCSSResourceValue.h in Headers */,
    2604826069                                26B999971804D54200D01121 /* SelectorCompiler.h in Headers */,
    2604926070                                415071581685067300C3C7B3 /* SelectorFilter.h in Headers */,
     
    2775427775                                31C0FF4D0E4CEFDD007D6FE5 /* DOMWebKitTransitionEvent.mm in Sources */,
    2775527776                                85C7F5E80AAFBAFB004014DD /* DOMWheelEvent.mm in Sources */,
     27777                                6C6CCAB019DC42B90043D5DB /* WebKitCSSResourceValue.cpp in Sources */,
    2775627778                                1403B99809EB13AF00797C7F /* DOMWindow.cpp in Sources */,
    2775727779                                FD677738195CAF3D0072E0D3 /* DOMWindowCSS.cpp in Sources */,
     
    2898029002                                CDA98DD816025BEF00FEA3B1 /* MediaKeyMessageEvent.cpp in Sources */,
    2898129003                                CD1B4A65160786AE00282DF9 /* MediaKeyNeededEvent.cpp in Sources */,
     29004                                6C568CB019DAFEA000430CA2 /* MaskImageOperation.cpp in Sources */,
    2898229005                                CDA98E0D1603FE4A00FEA3B1 /* MediaKeys.cpp in Sources */,
    2898329006                                CDA98E0E1603FE5800FEA3B1 /* MediaKeySession.cpp in Sources */,
     
    2904829071                                85031B450A44EFC700F992E0 /* MouseEvent.cpp in Sources */,
    2904929072                                93EB355F09E37FD600F43799 /* MouseEventWithHitTestResults.cpp in Sources */,
     29073                                6CBFE4A419EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp in Sources */,
    2905029074                                85031B470A44EFC700F992E0 /* MouseRelatedEvent.cpp in Sources */,
    2905129075                                93309DFB099E64920056E581 /* MoveSelectionCommand.cpp in Sources */,
  • trunk/Source/WebCore/css/CSSValue.cpp

    r174300 r176798  
    5555#include "SVGPaint.h"
    5656#include "WebKitCSSFilterValue.h"
     57#include "WebKitCSSResourceValue.h"
    5758#include "WebKitCSSTransformValue.h"
    5859
     
    312313    case SVGPaintClass:
    313314        return downcast<SVGPaint>(*this).customCSSText();
     315    case WebKitCSSResourceClass:
     316        return downcast<WebKitCSSResourceValue>(*this).customCSSText();
    314317    }
    315318    ASSERT_NOT_REACHED();
     
    423426    case SVGPaintClass:
    424427        delete downcast<SVGPaint>(this);
     428        return;
     429    case WebKitCSSResourceClass:
     430        delete downcast<WebKitCSSResourceValue>(this);
    425431        return;
    426432    }
  • trunk/Source/WebCore/css/CSSValue.h

    r175513 r176798  
    104104    bool isSVGPaint() const { return m_classType == SVGPaintClass; }
    105105    bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
     106    bool isWebKitCSSResourceValue() const { return m_classType == WebKitCSSResourceClass; }
    106107
    107108    bool isCSSOMSafe() const { return m_isCSSOMSafe; }
     
    174175        GridLineNamesClass,
    175176#endif
     177        WebKitCSSResourceClass
     178
    176179        // Do not append non-list class types here.
    177180    };
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r176751 r176798  
    136136#include "WebKitCSSFilterValue.h"
    137137#include "WebKitCSSRegionRule.h"
     138#include "WebKitCSSResourceValue.h"
    138139#include "WebKitCSSTransformValue.h"
    139140#include "WebKitFontFamilyNames.h"
     
    237238    m_pendingImageProperties.clear();
    238239    m_filtersWithPendingSVGDocuments.clear();
     240    m_maskImagesWithPendingSVGDocuments.clear();
    239241    m_cssToLengthConversionData = CSSToLengthConversionData();
    240242}
     
    34603462}
    34613463
     3464bool StyleResolver::createMaskImageOperations(CSSValue* inValue, Vector<RefPtr<MaskImageOperation>>& outOperations)
     3465{
     3466    ASSERT(outOperations.isEmpty());
     3467    if (!inValue)
     3468        return false;
     3469
     3470    ASSERT(is<CSSValueList>(*inValue));
     3471
     3472    for (auto& currValue : downcast<CSSValueList>(*inValue)) {
     3473        if (!is<WebKitCSSResourceValue>(currValue.get()))
     3474            continue;
     3475       
     3476        WebKitCSSResourceValue& maskImageValue = downcast<WebKitCSSResourceValue>(currValue.get());
     3477        RefPtr<CSSValue> maskInnerValue = maskImageValue.innerValue();
     3478        RefPtr<MaskImageOperation> newMaskImage;
     3479       
     3480        if (is<CSSPrimitiveValue>(maskInnerValue.get())) {
     3481            RefPtr<CSSPrimitiveValue> primitiveValue = downcast<CSSPrimitiveValue>(maskInnerValue.get());
     3482            if (primitiveValue->isValueID() && primitiveValue->getValueID() == CSSValueNone)
     3483                newMaskImage = MaskImageOperation::create();
     3484            else {
     3485                String cssUrl = primitiveValue->getStringValue();
     3486                URL url = m_state.document().completeURL(cssUrl);
     3487               
     3488                bool isExternalDocument = (SVGURIReference::isExternalURIReference(cssUrl, m_state.document()));
     3489                newMaskImage = MaskImageOperation::create(&maskImageValue, cssUrl, url.fragmentIdentifier(), isExternalDocument, m_state.document().cachedResourceLoader());
     3490                if (isExternalDocument)
     3491                    m_state.maskImagesWithPendingSVGDocuments().append(newMaskImage);
     3492            }
     3493        } else {
     3494            RefPtr<StyleImage> image = styleImage(CSSPropertyWebkitMaskImage, *maskInnerValue);
     3495            if (image.get())
     3496                newMaskImage = MaskImageOperation::create(image);
     3497        }
     3498
     3499        // If we didn't get a valid value, use None so we keep the correct number and order of masks.
     3500        if (!newMaskImage.get())
     3501            newMaskImage = MaskImageOperation::create();
     3502
     3503        outOperations.append(newMaskImage);
     3504    }
     3505
     3506    return true;
     3507}
     3508
    34623509PassRefPtr<StyleImage> StyleResolver::loadPendingImage(const StylePendingImage& pendingImage, const ResourceLoaderOptions& options)
    34633510{
  • trunk/Source/WebCore/css/StyleResolver.h

    r176459 r176798  
    2929#include "InspectorCSSOMWrappers.h"
    3030#include "LinkHash.h"
     31#include "MaskImageOperation.h"
    3132#include "MediaQueryExp.h"
    3233#include "RenderStyle.h"
     
    238239
    239240    bool createFilterOperations(CSSValue* inValue, FilterOperations& outOperations);
     241    bool createMaskImageOperations(CSSValue* inValue, Vector<RefPtr<MaskImageOperation>>& outOperations);
    240242    void loadPendingSVGDocuments();
    241243
     
    381383
    382384        Vector<RefPtr<ReferenceFilterOperation>>& filtersWithPendingSVGDocuments() { return m_filtersWithPendingSVGDocuments; }
     385        Vector<RefPtr<MaskImageOperation>>& maskImagesWithPendingSVGDocuments() { return m_maskImagesWithPendingSVGDocuments; }
    383386
    384387        void setLineHeightValue(CSSValue* value) { m_lineHeightValue = value; }
     
    429432
    430433        Vector<RefPtr<ReferenceFilterOperation>> m_filtersWithPendingSVGDocuments;
     434        Vector<RefPtr<MaskImageOperation>> m_maskImagesWithPendingSVGDocuments;
    431435
    432436        CSSValue* m_lineHeightValue;
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r176772 r176798  
    757757}
    758758
     759void CachedResourceLoader::addCachedResource(CachedResource* resource)
     760{
     761    m_documentResources.set(resource->url(), resource);
     762
     763    if (!memoryCache().add(resource))
     764        resource->setOwningCachedResourceLoader(this);
     765}
     766
    759767void CachedResourceLoader::loadDone(CachedResource* resource, bool shouldPerformPostLoadActions)
    760768{
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.h

    r176459 r176798  
    115115
    116116    void removeCachedResource(CachedResource*) const;
     117    void addCachedResource(CachedResource*);
    117118
    118119    void loadDone(CachedResource*, bool shouldPerformPostLoadActions = true);
  • trunk/Source/WebCore/loader/cache/CachedSVGDocument.cpp

    r175549 r176798  
    2424#include "CachedSVGDocument.h"
    2525
     26#include "DocumentLoader.h"
     27#include "EmptyClients.h"
     28#include "FrameView.h"
     29#include "MainFrame.h"
     30#include "Page.h"
     31#include "PageConfiguration.h"
     32#include "Settings.h"
    2633#include "SharedBuffer.h"
    2734
     
    3138    : CachedResource(request, SVGDocumentResource, sessionID)
    3239    , m_decoder(TextResourceDecoder::create("application/xml"))
     40    , m_shouldCreateFrameForDocument(true)
     41    , m_canReuseResource(true)
    3342{
    3443    setAccept("image/svg+xml");
     
    5261{
    5362    if (data) {
    54         // We don't need to create a new frame because the new document belongs to the parent UseElement.
    55         m_document = SVGDocument::create(nullptr, response().url());
    56         m_document->setContent(m_decoder->decodeAndFlush(data->data(), data->size()));
     63        // In certain situations (like the scenario when this document belongs to an UseElement) we don't need to create a frame.
     64        if (m_shouldCreateFrameForDocument) {
     65            PageConfiguration pageConfiguration;
     66            fillWithEmptyClients(pageConfiguration);
     67           
     68            m_page = Page::createPageFromBuffer(pageConfiguration, data, "image/svg+xml", false, true);
     69            m_document = downcast<SVGDocument>(m_page->mainFrame().document());
     70        } else {
     71            m_document = SVGDocument::create(nullptr, response().url());
     72            m_document->setContent(m_decoder->decodeAndFlush(data->data(), data->size()));
     73        }
    5774    }
    5875    CachedResource::finishLoading(data);
  • trunk/Source/WebCore/loader/cache/CachedSVGDocument.h

    r175549 r176798  
    3737
    3838    SVGDocument* document() const { return m_document.get(); }
     39    void setShouldCreateFrameForDocument(bool shouldCreate) { m_shouldCreateFrameForDocument = shouldCreate; }
     40    virtual bool canReuse(const ResourceRequest&) const override { return m_canReuseResource; }
     41    void setCanReuse(bool canReuseResource) { m_canReuseResource = canReuseResource; };
    3942
    4043private:
     
    4649    RefPtr<SVGDocument> m_document;
    4750    RefPtr<TextResourceDecoder> m_decoder;
     51    std::unique_ptr<Page> m_page;
     52    bool m_shouldCreateFrameForDocument;
     53    bool m_canReuseResource;
    4854};
    4955
  • trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.cpp

    r173268 r176798  
    3535namespace WebCore {
    3636
    37 CachedSVGDocumentReference::CachedSVGDocumentReference(const String& url)
     37CachedSVGDocumentReference::CachedSVGDocumentReference(const String& url, CachedSVGDocumentClient* additionalDocumentClient, bool canReuseResource)
    3838    : m_url(url)
    3939    , m_document(0)
    4040    , m_loadRequested(false)
     41    , m_additionalDocumentClient(additionalDocumentClient)
     42    , m_canReuseResource(canReuseResource)
    4143{
    4244}
     
    4446CachedSVGDocumentReference::~CachedSVGDocumentReference()
    4547{
    46     if (m_document)
     48    if (m_document) {
    4749        m_document->removeClient(this);
     50       
     51        if (m_additionalDocumentClient)
     52            m_document->removeClient(m_additionalDocumentClient);
     53    }
    4854}
    4955
     
    5763    request.setInitiator(cachedResourceRequestInitiators().css);
    5864    m_document = loader->requestSVGDocument(request);
    59     if (m_document)
     65    if (m_document) {
     66        m_document->setCanReuse(m_canReuseResource);
    6067        m_document->addClient(this);
     68       
     69        if (m_additionalDocumentClient)
     70            m_document->addClient(m_additionalDocumentClient);
     71    }
    6172
    6273    m_loadRequested = true;
  • trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.h

    r173268 r176798  
    3838class CachedSVGDocumentReference : public CachedSVGDocumentClient {
    3939public:
    40     CachedSVGDocumentReference(const String&);
     40    CachedSVGDocumentReference(const String& url, CachedSVGDocumentClient* additionalDocumentClient = nullptr, bool canReuseResource = true);
    4141
    4242    virtual ~CachedSVGDocumentReference();
     
    5151    CachedResourceHandle<CachedSVGDocument> m_document;
    5252    bool m_loadRequested;
     53    CachedSVGDocumentClient* m_additionalDocumentClient;
     54    bool m_canReuseResource;
    5355};
    5456
  • trunk/Source/WebCore/page/FrameView.cpp

    r176459 r176798  
    43834383}
    43844384
     4385bool FrameView::containsSVGDocument() const
     4386{
     4387    if (frame().document())
     4388        return frame().document()->isSVGDocument();
     4389   
     4390    return false;
     4391}
     4392
    43854393void FrameView::notifyWidgetsInAllFrames(WidgetNotification notification)
    43864394{
  • trunk/Source/WebCore/page/FrameView.h

    r176459 r176798  
    527527    virtual bool isVerticalDocument() const override;
    528528    virtual bool isFlippedDocument() const override;
     529    virtual bool containsSVGDocument() const override;
    529530
    530531private:
  • trunk/Source/WebCore/page/Page.cpp

    r176696 r176798  
    3030#include "ContextMenuClient.h"
    3131#include "ContextMenuController.h"
     32#include "DocumentLoader.h"
    3233#include "DocumentMarkerController.h"
    3334#include "DocumentStyleSheetCollection.h"
     
    276277}
    277278
     279std::unique_ptr<Page> Page::createPageFromBuffer(PageConfiguration& pageConfiguration, const SharedBuffer* buffer, const String& mimeType, bool canHaveScrollbars, bool transparent)
     280{
     281    ASSERT(buffer);
     282   
     283    std::unique_ptr<Page> newPage = std::make_unique<Page>(pageConfiguration);
     284    newPage->settings().setMediaEnabled(false);
     285    newPage->settings().setScriptEnabled(false);
     286    newPage->settings().setPluginsEnabled(false);
     287   
     288    Frame& frame = newPage->mainFrame();
     289    frame.setView(FrameView::create(frame));
     290    frame.init();
     291    FrameLoader& loader = frame.loader();
     292    loader.forceSandboxFlags(SandboxAll);
     293   
     294    frame.view()->setCanHaveScrollbars(canHaveScrollbars);
     295    frame.view()->setTransparent(transparent);
     296   
     297    ASSERT(loader.activeDocumentLoader()); // DocumentLoader should have been created by frame->init().
     298    loader.activeDocumentLoader()->writer().setMIMEType(mimeType);
     299    loader.activeDocumentLoader()->writer().begin(URL()); // create the empty document
     300    loader.activeDocumentLoader()->writer().addData(buffer->data(), buffer->size());
     301    loader.activeDocumentLoader()->writer().end();
     302   
     303    return newPage;
     304}
     305
    278306void Page::clearPreviousItemFromAllPages(HistoryItem* item)
    279307{
  • trunk/Source/WebCore/page/Page.h

    r176696 r176798  
    108108
    109109typedef uint64_t LinkHash;
     110class SharedBuffer;
    110111
    111112enum FindDirection { FindDirectionForward, FindDirectionBackward };
     
    125126
    126127    WEBCORE_EXPORT uint64_t renderTreeSize() const;
     128   
     129    static std::unique_ptr<Page> createPageFromBuffer(PageConfiguration&, const SharedBuffer*, const String& mimeType, bool canHaveScrollbars, bool transparent);
    127130
    128131    void setNeedsRecalcStyleInAllFrames();
  • trunk/Source/WebCore/platform/ScrollView.h

    r174506 r176798  
    411411    virtual bool isVerticalDocument() const { return true; }
    412412    virtual bool isFlippedDocument() const { return false; }
     413    virtual bool containsSVGDocument() const { return false; }
    413414
    414415    // Called to update the scrollbars to accurately reflect the state of the view.
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r175210 r176798  
    10181018}
    10191019
    1020 void RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatX(LayoutUnit xOffset)
     1020void BackgroundImageGeometry::setNoRepeatX(LayoutUnit xOffset)
    10211021{
    10221022    m_destRect.move(std::max<LayoutUnit>(xOffset, 0), 0);
     
    10241024    m_destRect.setWidth(m_tileSize.width() + std::min<float>(xOffset, 0));
    10251025}
    1026 void RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatY(LayoutUnit yOffset)
     1026void BackgroundImageGeometry::setNoRepeatY(LayoutUnit yOffset)
    10271027{
    10281028    m_destRect.move(0, std::max<LayoutUnit>(yOffset, 0));
     
    10311031}
    10321032
    1033 void RenderBoxModelObject::BackgroundImageGeometry::useFixedAttachment(const LayoutPoint& attachmentPoint)
     1033void BackgroundImageGeometry::useFixedAttachment(const LayoutPoint& attachmentPoint)
    10341034{
    10351035    FloatPoint alignedPoint = attachmentPoint;
     
    10371037}
    10381038
    1039 void RenderBoxModelObject::BackgroundImageGeometry::clip(const LayoutRect& clipRect)
     1039void BackgroundImageGeometry::clip(const LayoutRect& clipRect)
    10401040{
    10411041    m_destRect.intersect(clipRect);
    10421042}
    10431043
    1044 LayoutPoint RenderBoxModelObject::BackgroundImageGeometry::relativePhase() const
     1044LayoutPoint BackgroundImageGeometry::relativePhase() const
    10451045{
    10461046    LayoutPoint phase = m_phase;
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.h

    r175211 r176798  
    6666class StickyPositionViewportConstraints;
    6767
     68class BackgroundImageGeometry {
     69public:
     70    BackgroundImageGeometry()
     71        : m_hasNonLocalGeometry(false)
     72    { }
     73
     74    LayoutPoint destOrigin() const { return m_destOrigin; }
     75    void setDestOrigin(const LayoutPoint& destOrigin) { m_destOrigin = destOrigin; }
     76   
     77    LayoutRect destRect() const { return m_destRect; }
     78    void setDestRect(const LayoutRect& destRect) { m_destRect = destRect; }
     79   
     80    // Returns the phase relative to the destination rectangle.
     81    LayoutPoint relativePhase() const;
     82   
     83    LayoutPoint phase() const { return m_phase; }
     84    void setPhase(const LayoutPoint& phase) { m_phase = phase; }
     85   
     86    LayoutSize tileSize() const { return m_tileSize; }
     87    void setTileSize(const LayoutSize& tileSize) { m_tileSize = tileSize; }
     88   
     89    LayoutSize spaceSize() const { return m_space; }
     90    void setSpaceSize(const LayoutSize& space) { m_space = space; }
     91   
     92    void setPhaseX(LayoutUnit  x) { m_phase.setX(x); }
     93    void setPhaseY(LayoutUnit y) { m_phase.setY(y); }
     94   
     95    void setNoRepeatX(LayoutUnit xOffset);
     96    void setNoRepeatY(LayoutUnit yOffset);
     97   
     98    void useFixedAttachment(const LayoutPoint& attachmentPoint);
     99   
     100    void clip(const LayoutRect&);
     101   
     102    void setHasNonLocalGeometry(bool hasNonLocalGeometry = true) { m_hasNonLocalGeometry = hasNonLocalGeometry; }
     103    bool hasNonLocalGeometry() const { return m_hasNonLocalGeometry; }
     104   
     105private:
     106    LayoutRect m_destRect;
     107    LayoutPoint m_destOrigin;
     108    LayoutPoint m_phase;
     109    LayoutSize m_tileSize;
     110    LayoutSize m_space;
     111    bool m_hasNonLocalGeometry; // Has background-attachment: fixed. Implies that we can't always cheaply compute destRect.
     112};
     113
    68114// This class is the base for all objects that adhere to the CSS box model as described
    69115// at http://www.w3.org/TR/CSS21/box.html
     
    210256
    211257    virtual void willBeDestroyed() override;
    212 
    213     class BackgroundImageGeometry {
    214     public:
    215         BackgroundImageGeometry()
    216             : m_hasNonLocalGeometry(false)
    217         { }
    218         LayoutPoint destOrigin() const { return m_destOrigin; }
    219         void setDestOrigin(const LayoutPoint& destOrigin) { m_destOrigin = destOrigin; }
    220        
    221         LayoutRect destRect() const { return m_destRect; }
    222         void setDestRect(const LayoutRect& destRect) { m_destRect = destRect; }
    223 
    224         // Returns the phase relative to the destination rectangle.
    225         LayoutPoint relativePhase() const;
    226        
    227         LayoutPoint phase() const { return m_phase; }
    228         void setPhase(const LayoutPoint& phase) { m_phase = phase; }
    229 
    230         LayoutSize tileSize() const { return m_tileSize; }
    231         void setTileSize(const LayoutSize& tileSize) { m_tileSize = tileSize; }
    232 
    233         LayoutSize spaceSize() const { return m_space; }
    234         void setSpaceSize(const LayoutSize& space) { m_space = space; }
    235 
    236         void setPhaseX(LayoutUnit  x) { m_phase.setX(x); }
    237         void setPhaseY(LayoutUnit y) { m_phase.setY(y); }
    238        
    239         void setNoRepeatX(LayoutUnit xOffset);
    240         void setNoRepeatY(LayoutUnit yOffset);
    241        
    242         void useFixedAttachment(const LayoutPoint& attachmentPoint);
    243        
    244         void clip(const LayoutRect&);
    245        
    246         void setHasNonLocalGeometry(bool hasNonLocalGeometry = true) { m_hasNonLocalGeometry = hasNonLocalGeometry; }
    247         bool hasNonLocalGeometry() const { return m_hasNonLocalGeometry; }
    248 
    249     private:
    250         LayoutRect m_destRect;
    251         LayoutPoint m_destOrigin;
    252         LayoutPoint m_phase;
    253         LayoutSize m_tileSize;
    254         LayoutSize m_space;
    255         bool m_hasNonLocalGeometry; // Has background-attachment: fixed. Implies that we can't always cheaply compute destRect.
    256     };
    257258
    258259    LayoutPoint adjustedPositionRelativeToOffsetParent(const LayoutPoint&) const;
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r176432 r176798  
    8989#include "RenderLayerCompositor.h"
    9090#include "RenderLayerFilterInfo.h"
     91#include "RenderLayerMaskImageInfo.h"
    9192#include "RenderMarquee.h"
    9293#include "RenderMultiColumnFlowThread.h"
     
    190191#endif
    191192    , m_hasFilterInfo(false)
     193    , m_hasMaskImageInfo(false)
    192194#if ENABLE(CSS_COMPOSITING)
    193195    , m_blendMode(BlendModeNormal)
     
    256258
    257259    FilterInfo::remove(*this);
     260    MaskImageInfo::remove(*this);
    258261
    259262    // Child layers will be deleted by their corresponding render objects, so
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r175716 r176798  
    12671267
    12681268    bool m_hasFilterInfo : 1;
     1269    unsigned m_hasMaskImageInfo : 1;
    12691270
    12701271#if ENABLE(CSS_COMPOSITING)
     
    13431344
    13441345    class FilterInfo;
     1346    class MaskImageInfo;
    13451347};
    13461348
  • trunk/Source/WebCore/rendering/style/FillLayer.cpp

    r170774 r176798  
    2929
    3030    RefPtr<StyleImage> image;
     31    RefPtr<MaskImageOperation> maskImageOperation;
    3132
    3233    Length x;
     
    7576FillLayer::FillLayer(const FillLayer& o)
    7677    : m_next(o.m_next ? std::make_unique<FillLayer>(*o.m_next) : nullptr)
     78    , m_maskImageOperation(o.m_maskImageOperation)
    7779    , m_image(o.m_image)
    7880    , m_xPosition(o.m_xPosition)
     
    117119
    118120    m_image = o.m_image;
     121    m_maskImageOperation = o.m_maskImageOperation;
    119122    m_xPosition = o.m_xPosition;
    120123    m_yPosition = o.m_yPosition;
     
    154157    // We do not check the "isSet" booleans for each property, since those are only used during initial construction
    155158    // to propagate patterns into layers. All layer comparisons happen after values have all been filled in anyway.
    156     return StyleImage::imagesEquivalent(m_image.get(), o.m_image.get()) && m_xPosition == o.m_xPosition && m_yPosition == o.m_yPosition
     159    return StyleImage::imagesEquivalent(m_image.get(), o.m_image.get()) && m_maskImageOperation == o.m_maskImageOperation
     160        && m_xPosition == o.m_xPosition && m_yPosition == o.m_yPosition
    157161        && m_backgroundXOrigin == o.m_backgroundXOrigin && m_backgroundYOrigin == o.m_backgroundYOrigin
    158162        && m_attachment == o.m_attachment && m_clip == o.m_clip && m_composite == o.m_composite
     
    289293{
    290294    for (FillLayer* layer = this; layer; layer = layer->m_next.get()) {
    291         if (layer->m_next && !layer->m_next->isImageSet()) {
     295        if (layer->m_next && !layer->m_next->isImageSet() && !layer->m_next->hasMaskImage()) {
    292296            layer->m_next = nullptr;
    293297            break;
    294298        }
    295299    }
     300}
     301
     302bool FillLayer::hasNonEmptyMaskImage() const
     303{
     304    if (hasMaskImage() && !maskImage()->isCSSValueNone())
     305        return true;
     306   
     307    return (next() ? next()->hasNonEmptyMaskImage() : false);
    296308}
    297309
     
    341353        if (layer->m_image && !layer->m_image->isLoaded())
    342354            return false;
     355       
     356        if (layer->hasMaskImage() && !layer->maskImage()->isMaskLoaded())
     357            return false;
    343358    }
    344359    return true;
  • trunk/Source/WebCore/rendering/style/FillLayer.h

    r170774 r176798  
    2828#include "GraphicsTypes.h"
    2929#include "LengthSize.h"
     30#include "MaskImageOperation.h"
    3031#include "RenderStyleConstants.h"
    3132#include "StyleImage.h"
     
    6869    ~FillLayer();
    6970
     71    const RefPtr<MaskImageOperation>& maskImage() const { return m_maskImageOperation; }
    7072    StyleImage* image() const { return m_image.get(); }
     73    StyleImage* imageOrMaskImage() const { return hasMaskImage() ? maskImage()->image() : image(); }
    7174    const Length& xPosition() const { return m_xPosition; }
    7275    const Length& yPosition() const { return m_yPosition; }
     
    102105    bool isMaskSourceTypeSet() const { return m_maskSourceTypeSet; }
    103106
     107    void setMaskImage(PassRefPtr<MaskImageOperation> maskImage) { m_maskImageOperation = maskImage; }
    104108    void setImage(PassRefPtr<StyleImage> image) { m_image = image; m_imageSet = true; }
    105109    void setXPosition(Length length) { m_xPosition = WTF::move(length); m_xPosSet = true; }
     
    119123    void setMaskSourceType(EMaskSourceType m) { m_maskSourceType = m; m_maskSourceTypeSet = true; }
    120124
     125    void clearMaskImage() { m_maskImageOperation.clear(); }
    121126    void clearImage() { m_image.clear(); m_imageSet = false; }
    122127    void clearXPosition() { m_xPosSet = false; m_backgroundOriginSet = false; }
     
    144149    bool imagesAreLoaded() const;
    145150    bool hasImage() const;
     151    bool hasMaskImage() const { return maskImage().get(); }
     152    bool hasNonEmptyMaskImage() const;
    146153    bool hasFixedImage() const;
    147154    bool hasOpaqueImage(const RenderElement&) const;
     
    176183    std::unique_ptr<FillLayer> m_next;
    177184
     185    RefPtr<MaskImageOperation> m_maskImageOperation;
    178186    RefPtr<StyleImage> m_image;
    179187
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp

    r175117 r176798  
    2626#include "Image.h"
    2727#include "IntRect.h"
     28#include "RenderBoxModelObject.h"
    2829#include "SVGRenderingContext.h"
    2930
     
    5455}
    5556
    56 bool RenderSVGResourceMasker::applyResource(RenderElement& renderer, const RenderStyle&, GraphicsContext*& context, unsigned short resourceMode)
     57bool RenderSVGResourceMasker::applySVGMask(RenderElement& renderer, GraphicsContext*& context, bool applyClip)
    5758{
    5859    ASSERT(context);
    59     ASSERT_UNUSED(resourceMode, resourceMode == ApplyToDefaultMode);
    6060
    6161    bool missingMaskerData = !m_masker.contains(&renderer);
     
    7676            return false;
    7777
    78         if (!drawContentIntoMaskImage(maskerData, colorSpace, &renderer)) {
     78        if (!drawContentIntoMaskImage(maskerData, colorSpace, &renderer))
    7979            maskerData->maskImage.reset();
    80         }
    8180    }
    8281
     
    8483        return false;
    8584
    86     SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData);
     85    if (applyClip)
     86        SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData);
     87
    8788    return true;
     89}
     90
     91bool RenderSVGResourceMasker::applyResource(RenderElement& renderer, const RenderStyle&, GraphicsContext*& context, unsigned short resourceMode)
     92{
     93    ASSERT_UNUSED(resourceMode, resourceMode == ApplyToDefaultMode);
     94    return applySVGMask(renderer, context, true);
    8895}
    8996
     
    128135}
    129136
     137void RenderSVGResourceMasker::drawMaskForRenderer(RenderElement& renderer, const BackgroundImageGeometry& geometry, GraphicsContext* context, CompositeOperator compositeOp)
     138{
     139    if (context->paintingDisabled())
     140        return;
     141
     142    if (!applySVGMask(renderer, context, false))
     143        return;
     144
     145    MaskerData* maskerData = maskerDataForRenderer(renderer);
     146    ASSERT(maskerData);
     147
     148    FloatRect oneTileRect;
     149    FloatSize actualTileSize(geometry.tileSize().width() + geometry.spaceSize().width(), geometry.tileSize().height() + geometry.spaceSize().height());
     150    oneTileRect.setX(geometry.destRect().x() + fmodf(fmodf(-geometry.relativePhase().x(), actualTileSize.width()) - actualTileSize.width(), actualTileSize.width()));
     151    oneTileRect.setY(geometry.destRect().y() + fmodf(fmodf(-geometry.relativePhase().y(), actualTileSize.height()) - actualTileSize.height(), actualTileSize.height()));
     152    oneTileRect.setSize(geometry.tileSize());
     153   
     154    FloatSize intrinsicTileSize = maskerData->maskImage->logicalSize();
     155    FloatSize scale(geometry.tileSize().width() / intrinsicTileSize.width(), geometry.tileSize().height() / intrinsicTileSize.height());
     156   
     157    FloatRect visibleSrcRect;
     158    visibleSrcRect.setX((geometry.destRect().x() - oneTileRect.x()) / scale.width());
     159    visibleSrcRect.setY((geometry.destRect().y() - oneTileRect.y()) / scale.height());
     160    visibleSrcRect.setWidth(geometry.destRect().width() / scale.width());
     161    visibleSrcRect.setHeight(geometry.destRect().height() / scale.height());
     162    context->drawImageBuffer(maskerData->maskImage.get(), ColorSpaceDeviceRGB, geometry.destRect(), visibleSrcRect, compositeOp);
     163}
     164
    130165void RenderSVGResourceMasker::calculateMaskContentRepaintRect()
    131166{
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.h

    r176180 r176798  
    4646    virtual void removeClientFromCache(RenderElement&, bool markForInvalidation = true) override;
    4747    virtual bool applyResource(RenderElement&, const RenderStyle&, GraphicsContext*&, unsigned short resourceMode) override;
     48    bool applySVGMask(RenderElement& renderer, GraphicsContext*&, bool applyClip);
    4849    virtual FloatRect resourceBoundingBox(const RenderObject&) override;
    4950
     
    5253
    5354    virtual RenderSVGResourceType resourceType() const override { return MaskerResourceType; }
     55
     56    MaskerData* maskerDataForRenderer(RenderObject& renderer) { return m_masker.get(&renderer); }
     57    void drawMaskForRenderer(RenderElement& renderer, const BackgroundImageGeometry&, GraphicsContext*, CompositeOperator);
    5458
    5559private:
  • trunk/Source/WebCore/svg/SVGMaskElement.cpp

    r171591 r176798  
    162162RenderPtr<RenderElement> SVGMaskElement::createElementRenderer(PassRef<RenderStyle> style)
    163163{
    164     return createRenderer<RenderSVGResourceMasker>(*this, WTF::move(style));
     164    RenderPtr<RenderElement> maskRenderer = createRenderer<RenderSVGResourceMasker>(*this, WTF::move(style));
     165   
     166    // Pass along existing render layer clients.
     167    for (auto* clientLayer : m_clientLayers)
     168        static_cast<RenderSVGResourceMasker*>(maskRenderer.get())->addClientRenderLayer(clientLayer);
     169   
     170    return maskRenderer;
     171}
     172
     173void SVGMaskElement::addClientRenderLayer(RenderLayer* client)
     174{
     175    ASSERT(client);
     176    m_clientLayers.add(client);
     177   
     178    // Pass it along to the renderer.
     179    if (renderer())
     180        static_cast<RenderSVGResourceMasker*>(renderer())->addClientRenderLayer(client);
     181}
     182
     183void SVGMaskElement::removeClientRenderLayer(RenderLayer* client)
     184{
     185    ASSERT(client);
     186    m_clientLayers.remove(client);
     187   
     188    // Pass it along to the renderer.
     189    if (renderer())
     190        static_cast<RenderSVGResourceMasker*>(renderer())->removeClientRenderLayer(client);
    165191}
    166192
  • trunk/Source/WebCore/svg/SVGMaskElement.h

    r173804 r176798  
    3131
    3232namespace WebCore {
     33   
     34class RenderLayer;
    3335
    3436class SVGMaskElement final : public SVGElement,
     
    3739public:
    3840    static PassRefPtr<SVGMaskElement> create(const QualifiedName&, Document&);
     41
     42    void addClientRenderLayer(RenderLayer*);
     43    void removeClientRenderLayer(RenderLayer*);
    3944
    4045private:
     
    4853    virtual void svgAttributeChanged(const QualifiedName&) override;
    4954    virtual void childrenChanged(const ChildChange&) override;
     55
     56    HashSet<RenderLayer*> m_clientLayers;
    5057
    5158    virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
  • trunk/Source/WebCore/svg/SVGUseElement.cpp

    r176459 r176798  
    993993
    994994    m_cachedDocument = cachedDocument;
    995     if (m_cachedDocument)
     995    if (m_cachedDocument) {
     996        // We don't need the SVG document to create a new frame because the new document belongs to the parent UseElement.
     997        m_cachedDocument->setShouldCreateFrameForDocument(false);
    996998        m_cachedDocument->addClient(this);
    997 }
    998 
    999 }
     999    }
     1000}
     1001
     1002}
  • trunk/Source/WebCore/svg/graphics/SVGImage.cpp

    r176499 r176798  
    345345        m_chromeClient = std::make_unique<SVGImageChromeClient>(this);
    346346        pageConfiguration.chromeClient = m_chromeClient.get();
     347        bool canHaveScrollbars = false; // SVG Images will always synthesize a viewBox, if it's not available, and thus never see scrollbars.
     348        bool transparent = true; // SVG Images are transparent.
    347349
    348350        // FIXME: If this SVG ends up loading itself, we might leak the world.
     
    352354        // SVGImage objects, but we're safe now, because SVGImage can only be
    353355        // loaded by a top-level document.
    354         m_page = std::make_unique<Page>(pageConfiguration);
    355         m_page->settings().setMediaEnabled(false);
    356         m_page->settings().setScriptEnabled(false);
    357         m_page->settings().setPluginsEnabled(false);
    358 
    359         Frame& frame = m_page->mainFrame();
    360         frame.setView(FrameView::create(frame));
    361         frame.init();
    362         FrameLoader& loader = frame.loader();
    363         loader.forceSandboxFlags(SandboxAll);
    364 
    365         frame.view()->setCanHaveScrollbars(false); // SVG Images will always synthesize a viewBox, if it's not available, and thus never see scrollbars.
    366         frame.view()->setTransparent(true); // SVG Images are transparent.
    367 
    368         ASSERT(loader.activeDocumentLoader()); // DocumentLoader should have been created by frame->init().
    369         loader.activeDocumentLoader()->writer().setMIMEType("image/svg+xml");
    370         loader.activeDocumentLoader()->writer().begin(URL()); // create the empty document
    371         loader.activeDocumentLoader()->writer().addData(data()->data(), data()->size());
    372         loader.activeDocumentLoader()->writer().end();
     356        m_page = Page::createPageFromBuffer(pageConfiguration, data(), "image/svg+xml", canHaveScrollbars, transparent);
    373357
    374358        // Set the intrinsic size before a container size is available.
Note: See TracChangeset for help on using the changeset viewer.