Changeset 176798 in webkit
- Timestamp:
- Dec 4, 2014 9:05:12 AM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 added
- 32 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/CMakeLists.txt
r176696 r176798 1290 1290 css/ViewportStyleResolver.cpp 1291 1291 css/WebKitCSSFilterValue.cpp 1292 css/WebKitCSSResourceValue.cpp 1292 1293 css/CSSKeyframeRule.cpp 1293 1294 css/CSSKeyframesRule.cpp … … 2090 2091 platform/graphics/LayoutBoxExtent.cpp 2091 2092 platform/graphics/LayoutRect.cpp 2093 platform/graphics/MaskImageOperation.cpp 2092 2094 platform/graphics/MediaPlayer.cpp 2093 2095 platform/graphics/Path.cpp … … 2296 2298 rendering/RenderLayerCompositor.cpp 2297 2299 rendering/RenderLayerFilterInfo.cpp 2300 rendering/RenderLayerMaskImageInfo.cpp 2298 2301 rendering/RenderLayerModelObject.cpp 2299 2302 rendering/RenderLineBoxList.cpp -
trunk/Source/WebCore/ChangeLog
r176790 r176798 1 2014-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 1 181 2014-12-04 Commit Queue <commit-queue@webkit.org> 2 182 -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r176696 r176798 750 750 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> 751 751 </ClCompile> 752 <ClCompile Include="..\css\WebKitCSSResourceValue.cpp" /> 752 753 <ClCompile Include="..\DerivedSources.cpp"> 753 754 <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> … … 7583 7584 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild> 7584 7585 </ClCompile> 7586 <ClCompile Include="..\platform\graphics\MaskImageOperation.cpp" /> 7585 7587 <ClCompile Include="..\platform\graphics\OpenGLShims.cpp" /> 7586 7588 <ClCompile Include="..\platform\graphics\opengl\Extensions3DOpenGL.cpp" /> … … 7951 7953 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild> 7952 7954 </ClCompile> 7955 <ClCompile Include="..\rendering\RenderLayerMaskImageInfo.cpp" /> 7953 7956 <ClCompile Include="..\rendering\style\StyleCachedImageSet.cpp"> 7954 7957 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild> … … 18852 18855 <ClInclude Include="..\accessibility\AccessibilityNodeObject.h" /> 18853 18856 <ClInclude Include="..\css\CSSImageSetValue.h" /> 18857 <ClInclude Include="..\css\WebKitCSSResourceValue.h" /> 18854 18858 <ClInclude Include="..\ForwardingHeaders\bindings\ScriptFunctionCall.h" /> 18855 18859 <ClInclude Include="..\ForwardingHeaders\bindings\ScriptObject.h" /> … … 19408 19412 <ClInclude Include="..\platform\graphics\gstreamer\VideoTrackPrivateGStreamer.h" /> 19409 19413 <ClInclude Include="..\platform\graphics\gstreamer\WebKitWebSourceGStreamer.h" /> 19414 <ClInclude Include="..\platform\graphics\MaskImageOperation.h" /> 19410 19415 <ClInclude Include="..\platform\graphics\MediaPlayerPrivate.h" /> 19411 19416 <ClInclude Include="..\platform\graphics\OpenGLShims.h" /> … … 19539 19544 <ClInclude Include="..\platform\win\WebCoreInstanceHandle.h" /> 19540 19545 <ClInclude Include="..\rendering\HitTestLocation.h" /> 19546 <ClInclude Include="..\rendering\RenderLayerMaskImageInfo.h" /> 19541 19547 <ClInclude Include="..\rendering\style\StyleCachedImageSet.h" /> 19542 19548 <ClInclude Include="..\storage\StorageStrategy.h" /> -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters
r176696 r176798 7253 7253 <Filter>editing</Filter> 7254 7254 </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> 7255 7264 </ItemGroup> 7256 7265 <ItemGroup> … … 15242 15251 <ClInclude Include="..\platform\graphics\avfoundation\MediaTimeAVFoundation.h"> 15243 15252 <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> 15244 15262 </ClInclude> 15245 15263 </ItemGroup> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r176697 r176798 2237 2237 65FEA86909833ADE00BED4AB /* Page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FEA86809833ADE00BED4AB /* Page.cpp */; }; 2238 2238 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, ); }; }; 2239 2241 6C638895A96CCEE50C8C946C /* CachedResourceRequestInitiators.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C638893A96CCEE50C8C946C /* CachedResourceRequestInitiators.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2240 2242 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 */; }; 2241 2247 6CDDE8D01770BB220016E072 /* RegionOversetState.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C70A81417707C49009A446E /* RegionOversetState.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2242 2248 6E0E569B183BFFE600E0E8D5 /* FloatRoundedRect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E0E5699183BFFE600E0E8D5 /* FloatRoundedRect.cpp */; }; … … 9402 9408 65FEA86809833ADE00BED4AB /* Page.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Page.cpp; sourceTree = "<group>"; }; 9403 9409 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>"; }; 9404 9412 6C638893A96CCEE50C8C946C /* CachedResourceRequestInitiators.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CachedResourceRequestInitiators.h; sourceTree = "<group>"; }; 9405 9413 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>"; }; 9406 9416 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>"; }; 9407 9419 6E0E5699183BFFE600E0E8D5 /* FloatRoundedRect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FloatRoundedRect.cpp; sourceTree = "<group>"; }; 9408 9420 6E0E569A183BFFE600E0E8D5 /* FloatRoundedRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FloatRoundedRect.h; sourceTree = "<group>"; }; … … 20589 20601 141DC04D164834B900371E5A /* LayoutRect.h */, 20590 20602 141DC04E164834B900371E5A /* LayoutSize.h */, 20603 6C568CAE19DAFEA000430CA2 /* MaskImageOperation.cpp */, 20604 6C568CAF19DAFEA000430CA2 /* MaskImageOperation.h */, 20591 20605 E4B41E0C0CBF90BD00AF2ECE /* MediaPlayer.cpp */, 20592 20606 E4B41E0D0CBF90BD00AF2ECE /* MediaPlayer.h */, … … 22294 22308 3106036D14327D2E00ABF4BA /* WebKitCSSFilterValue.h */, 22295 22309 3106036E14327D2E00ABF4BA /* WebKitCSSFilterValue.idl */, 22310 6C6CCAAE19DC42B90043D5DB /* WebKitCSSResourceValue.cpp */, 22311 6C6CCAAF19DC42B90043D5DB /* WebKitCSSResourceValue.h */, 22296 22312 31288E6E0E3005D6003619AE /* CSSKeyframeRule.cpp */, 22297 22313 31288E6F0E3005D6003619AE /* CSSKeyframeRule.h */, … … 22448 22464 50D10D971545F5760096D288 /* RenderLayerFilterInfo.cpp */, 22449 22465 50D10D981545F5760096D288 /* RenderLayerFilterInfo.h */, 22466 6CBFE4A219EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp */, 22467 6CBFE4A319EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h */, 22450 22468 3C244FE5A375AC633F88BE6F /* RenderLayerModelObject.cpp */, 22451 22469 3C244FE4A375AC633F88BE6F /* RenderLayerModelObject.h */, … … 23431 23449 0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */, 23432 23450 49E912AD0EFAC906009D0CAF /* AnimationList.h in Headers */, 23451 6C568CB119DAFEA000430CA2 /* MaskImageOperation.h in Headers */, 23433 23452 0F580FAF149800D400FB5BD8 /* AnimationUtilities.h in Headers */, 23434 23453 93309DD7099E64920056E581 /* AppendNodeCommand.h in Headers */, … … 25443 25462 070E09191875EEFC003A1D3C /* MediaSession.h in Headers */, 25444 25463 07F944161864D046005D31CB /* MediaSessionManager.h in Headers */, 25464 6CBFE4A519EBF2D400CA2F9D /* RenderLayerMaskImageInfo.h in Headers */, 25445 25465 07638A991884487200E15A1B /* MediaSessionManagerIOS.h in Headers */, 25446 25466 CD3A495F17A9D01B00274E42 /* MediaSource.h in Headers */, … … 26046 26066 E44B4BB4141650D7002B1D8B /* SelectorChecker.h in Headers */, 26047 26067 432D3FE818A8658400D7DC03 /* SelectorCheckerTestFunctions.h in Headers */, 26068 6C6CCAB119DC42B90043D5DB /* WebKitCSSResourceValue.h in Headers */, 26048 26069 26B999971804D54200D01121 /* SelectorCompiler.h in Headers */, 26049 26070 415071581685067300C3C7B3 /* SelectorFilter.h in Headers */, … … 27754 27775 31C0FF4D0E4CEFDD007D6FE5 /* DOMWebKitTransitionEvent.mm in Sources */, 27755 27776 85C7F5E80AAFBAFB004014DD /* DOMWheelEvent.mm in Sources */, 27777 6C6CCAB019DC42B90043D5DB /* WebKitCSSResourceValue.cpp in Sources */, 27756 27778 1403B99809EB13AF00797C7F /* DOMWindow.cpp in Sources */, 27757 27779 FD677738195CAF3D0072E0D3 /* DOMWindowCSS.cpp in Sources */, … … 28980 29002 CDA98DD816025BEF00FEA3B1 /* MediaKeyMessageEvent.cpp in Sources */, 28981 29003 CD1B4A65160786AE00282DF9 /* MediaKeyNeededEvent.cpp in Sources */, 29004 6C568CB019DAFEA000430CA2 /* MaskImageOperation.cpp in Sources */, 28982 29005 CDA98E0D1603FE4A00FEA3B1 /* MediaKeys.cpp in Sources */, 28983 29006 CDA98E0E1603FE5800FEA3B1 /* MediaKeySession.cpp in Sources */, … … 29048 29071 85031B450A44EFC700F992E0 /* MouseEvent.cpp in Sources */, 29049 29072 93EB355F09E37FD600F43799 /* MouseEventWithHitTestResults.cpp in Sources */, 29073 6CBFE4A419EBF2D400CA2F9D /* RenderLayerMaskImageInfo.cpp in Sources */, 29050 29074 85031B470A44EFC700F992E0 /* MouseRelatedEvent.cpp in Sources */, 29051 29075 93309DFB099E64920056E581 /* MoveSelectionCommand.cpp in Sources */, -
trunk/Source/WebCore/css/CSSValue.cpp
r174300 r176798 55 55 #include "SVGPaint.h" 56 56 #include "WebKitCSSFilterValue.h" 57 #include "WebKitCSSResourceValue.h" 57 58 #include "WebKitCSSTransformValue.h" 58 59 … … 312 313 case SVGPaintClass: 313 314 return downcast<SVGPaint>(*this).customCSSText(); 315 case WebKitCSSResourceClass: 316 return downcast<WebKitCSSResourceValue>(*this).customCSSText(); 314 317 } 315 318 ASSERT_NOT_REACHED(); … … 423 426 case SVGPaintClass: 424 427 delete downcast<SVGPaint>(this); 428 return; 429 case WebKitCSSResourceClass: 430 delete downcast<WebKitCSSResourceValue>(this); 425 431 return; 426 432 } -
trunk/Source/WebCore/css/CSSValue.h
r175513 r176798 104 104 bool isSVGPaint() const { return m_classType == SVGPaintClass; } 105 105 bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; } 106 bool isWebKitCSSResourceValue() const { return m_classType == WebKitCSSResourceClass; } 106 107 107 108 bool isCSSOMSafe() const { return m_isCSSOMSafe; } … … 174 175 GridLineNamesClass, 175 176 #endif 177 WebKitCSSResourceClass 178 176 179 // Do not append non-list class types here. 177 180 }; -
trunk/Source/WebCore/css/StyleResolver.cpp
r176751 r176798 136 136 #include "WebKitCSSFilterValue.h" 137 137 #include "WebKitCSSRegionRule.h" 138 #include "WebKitCSSResourceValue.h" 138 139 #include "WebKitCSSTransformValue.h" 139 140 #include "WebKitFontFamilyNames.h" … … 237 238 m_pendingImageProperties.clear(); 238 239 m_filtersWithPendingSVGDocuments.clear(); 240 m_maskImagesWithPendingSVGDocuments.clear(); 239 241 m_cssToLengthConversionData = CSSToLengthConversionData(); 240 242 } … … 3460 3462 } 3461 3463 3464 bool 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 3462 3509 PassRefPtr<StyleImage> StyleResolver::loadPendingImage(const StylePendingImage& pendingImage, const ResourceLoaderOptions& options) 3463 3510 { -
trunk/Source/WebCore/css/StyleResolver.h
r176459 r176798 29 29 #include "InspectorCSSOMWrappers.h" 30 30 #include "LinkHash.h" 31 #include "MaskImageOperation.h" 31 32 #include "MediaQueryExp.h" 32 33 #include "RenderStyle.h" … … 238 239 239 240 bool createFilterOperations(CSSValue* inValue, FilterOperations& outOperations); 241 bool createMaskImageOperations(CSSValue* inValue, Vector<RefPtr<MaskImageOperation>>& outOperations); 240 242 void loadPendingSVGDocuments(); 241 243 … … 381 383 382 384 Vector<RefPtr<ReferenceFilterOperation>>& filtersWithPendingSVGDocuments() { return m_filtersWithPendingSVGDocuments; } 385 Vector<RefPtr<MaskImageOperation>>& maskImagesWithPendingSVGDocuments() { return m_maskImagesWithPendingSVGDocuments; } 383 386 384 387 void setLineHeightValue(CSSValue* value) { m_lineHeightValue = value; } … … 429 432 430 433 Vector<RefPtr<ReferenceFilterOperation>> m_filtersWithPendingSVGDocuments; 434 Vector<RefPtr<MaskImageOperation>> m_maskImagesWithPendingSVGDocuments; 431 435 432 436 CSSValue* m_lineHeightValue; -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp
r176772 r176798 757 757 } 758 758 759 void CachedResourceLoader::addCachedResource(CachedResource* resource) 760 { 761 m_documentResources.set(resource->url(), resource); 762 763 if (!memoryCache().add(resource)) 764 resource->setOwningCachedResourceLoader(this); 765 } 766 759 767 void CachedResourceLoader::loadDone(CachedResource* resource, bool shouldPerformPostLoadActions) 760 768 { -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.h
r176459 r176798 115 115 116 116 void removeCachedResource(CachedResource*) const; 117 void addCachedResource(CachedResource*); 117 118 118 119 void loadDone(CachedResource*, bool shouldPerformPostLoadActions = true); -
trunk/Source/WebCore/loader/cache/CachedSVGDocument.cpp
r175549 r176798 24 24 #include "CachedSVGDocument.h" 25 25 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" 26 33 #include "SharedBuffer.h" 27 34 … … 31 38 : CachedResource(request, SVGDocumentResource, sessionID) 32 39 , m_decoder(TextResourceDecoder::create("application/xml")) 40 , m_shouldCreateFrameForDocument(true) 41 , m_canReuseResource(true) 33 42 { 34 43 setAccept("image/svg+xml"); … … 52 61 { 53 62 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 } 57 74 } 58 75 CachedResource::finishLoading(data); -
trunk/Source/WebCore/loader/cache/CachedSVGDocument.h
r175549 r176798 37 37 38 38 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; }; 39 42 40 43 private: … … 46 49 RefPtr<SVGDocument> m_document; 47 50 RefPtr<TextResourceDecoder> m_decoder; 51 std::unique_ptr<Page> m_page; 52 bool m_shouldCreateFrameForDocument; 53 bool m_canReuseResource; 48 54 }; 49 55 -
trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.cpp
r173268 r176798 35 35 namespace WebCore { 36 36 37 CachedSVGDocumentReference::CachedSVGDocumentReference(const String& url )37 CachedSVGDocumentReference::CachedSVGDocumentReference(const String& url, CachedSVGDocumentClient* additionalDocumentClient, bool canReuseResource) 38 38 : m_url(url) 39 39 , m_document(0) 40 40 , m_loadRequested(false) 41 , m_additionalDocumentClient(additionalDocumentClient) 42 , m_canReuseResource(canReuseResource) 41 43 { 42 44 } … … 44 46 CachedSVGDocumentReference::~CachedSVGDocumentReference() 45 47 { 46 if (m_document) 48 if (m_document) { 47 49 m_document->removeClient(this); 50 51 if (m_additionalDocumentClient) 52 m_document->removeClient(m_additionalDocumentClient); 53 } 48 54 } 49 55 … … 57 63 request.setInitiator(cachedResourceRequestInitiators().css); 58 64 m_document = loader->requestSVGDocument(request); 59 if (m_document) 65 if (m_document) { 66 m_document->setCanReuse(m_canReuseResource); 60 67 m_document->addClient(this); 68 69 if (m_additionalDocumentClient) 70 m_document->addClient(m_additionalDocumentClient); 71 } 61 72 62 73 m_loadRequested = true; -
trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.h
r173268 r176798 38 38 class CachedSVGDocumentReference : public CachedSVGDocumentClient { 39 39 public: 40 CachedSVGDocumentReference(const String& );40 CachedSVGDocumentReference(const String& url, CachedSVGDocumentClient* additionalDocumentClient = nullptr, bool canReuseResource = true); 41 41 42 42 virtual ~CachedSVGDocumentReference(); … … 51 51 CachedResourceHandle<CachedSVGDocument> m_document; 52 52 bool m_loadRequested; 53 CachedSVGDocumentClient* m_additionalDocumentClient; 54 bool m_canReuseResource; 53 55 }; 54 56 -
trunk/Source/WebCore/page/FrameView.cpp
r176459 r176798 4383 4383 } 4384 4384 4385 bool FrameView::containsSVGDocument() const 4386 { 4387 if (frame().document()) 4388 return frame().document()->isSVGDocument(); 4389 4390 return false; 4391 } 4392 4385 4393 void FrameView::notifyWidgetsInAllFrames(WidgetNotification notification) 4386 4394 { -
trunk/Source/WebCore/page/FrameView.h
r176459 r176798 527 527 virtual bool isVerticalDocument() const override; 528 528 virtual bool isFlippedDocument() const override; 529 virtual bool containsSVGDocument() const override; 529 530 530 531 private: -
trunk/Source/WebCore/page/Page.cpp
r176696 r176798 30 30 #include "ContextMenuClient.h" 31 31 #include "ContextMenuController.h" 32 #include "DocumentLoader.h" 32 33 #include "DocumentMarkerController.h" 33 34 #include "DocumentStyleSheetCollection.h" … … 276 277 } 277 278 279 std::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 278 306 void Page::clearPreviousItemFromAllPages(HistoryItem* item) 279 307 { -
trunk/Source/WebCore/page/Page.h
r176696 r176798 108 108 109 109 typedef uint64_t LinkHash; 110 class SharedBuffer; 110 111 111 112 enum FindDirection { FindDirectionForward, FindDirectionBackward }; … … 125 126 126 127 WEBCORE_EXPORT uint64_t renderTreeSize() const; 128 129 static std::unique_ptr<Page> createPageFromBuffer(PageConfiguration&, const SharedBuffer*, const String& mimeType, bool canHaveScrollbars, bool transparent); 127 130 128 131 void setNeedsRecalcStyleInAllFrames(); -
trunk/Source/WebCore/platform/ScrollView.h
r174506 r176798 411 411 virtual bool isVerticalDocument() const { return true; } 412 412 virtual bool isFlippedDocument() const { return false; } 413 virtual bool containsSVGDocument() const { return false; } 413 414 414 415 // Called to update the scrollbars to accurately reflect the state of the view. -
trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp
r175210 r176798 1018 1018 } 1019 1019 1020 void RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatX(LayoutUnit xOffset)1020 void BackgroundImageGeometry::setNoRepeatX(LayoutUnit xOffset) 1021 1021 { 1022 1022 m_destRect.move(std::max<LayoutUnit>(xOffset, 0), 0); … … 1024 1024 m_destRect.setWidth(m_tileSize.width() + std::min<float>(xOffset, 0)); 1025 1025 } 1026 void RenderBoxModelObject::BackgroundImageGeometry::setNoRepeatY(LayoutUnit yOffset)1026 void BackgroundImageGeometry::setNoRepeatY(LayoutUnit yOffset) 1027 1027 { 1028 1028 m_destRect.move(0, std::max<LayoutUnit>(yOffset, 0)); … … 1031 1031 } 1032 1032 1033 void RenderBoxModelObject::BackgroundImageGeometry::useFixedAttachment(const LayoutPoint& attachmentPoint)1033 void BackgroundImageGeometry::useFixedAttachment(const LayoutPoint& attachmentPoint) 1034 1034 { 1035 1035 FloatPoint alignedPoint = attachmentPoint; … … 1037 1037 } 1038 1038 1039 void RenderBoxModelObject::BackgroundImageGeometry::clip(const LayoutRect& clipRect)1039 void BackgroundImageGeometry::clip(const LayoutRect& clipRect) 1040 1040 { 1041 1041 m_destRect.intersect(clipRect); 1042 1042 } 1043 1043 1044 LayoutPoint RenderBoxModelObject::BackgroundImageGeometry::relativePhase() const1044 LayoutPoint BackgroundImageGeometry::relativePhase() const 1045 1045 { 1046 1046 LayoutPoint phase = m_phase; -
trunk/Source/WebCore/rendering/RenderBoxModelObject.h
r175211 r176798 66 66 class StickyPositionViewportConstraints; 67 67 68 class BackgroundImageGeometry { 69 public: 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 105 private: 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 68 114 // This class is the base for all objects that adhere to the CSS box model as described 69 115 // at http://www.w3.org/TR/CSS21/box.html … … 210 256 211 257 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 };257 258 258 259 LayoutPoint adjustedPositionRelativeToOffsetParent(const LayoutPoint&) const; -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r176432 r176798 89 89 #include "RenderLayerCompositor.h" 90 90 #include "RenderLayerFilterInfo.h" 91 #include "RenderLayerMaskImageInfo.h" 91 92 #include "RenderMarquee.h" 92 93 #include "RenderMultiColumnFlowThread.h" … … 190 191 #endif 191 192 , m_hasFilterInfo(false) 193 , m_hasMaskImageInfo(false) 192 194 #if ENABLE(CSS_COMPOSITING) 193 195 , m_blendMode(BlendModeNormal) … … 256 258 257 259 FilterInfo::remove(*this); 260 MaskImageInfo::remove(*this); 258 261 259 262 // Child layers will be deleted by their corresponding render objects, so -
trunk/Source/WebCore/rendering/RenderLayer.h
r175716 r176798 1267 1267 1268 1268 bool m_hasFilterInfo : 1; 1269 unsigned m_hasMaskImageInfo : 1; 1269 1270 1270 1271 #if ENABLE(CSS_COMPOSITING) … … 1343 1344 1344 1345 class FilterInfo; 1346 class MaskImageInfo; 1345 1347 }; 1346 1348 -
trunk/Source/WebCore/rendering/style/FillLayer.cpp
r170774 r176798 29 29 30 30 RefPtr<StyleImage> image; 31 RefPtr<MaskImageOperation> maskImageOperation; 31 32 32 33 Length x; … … 75 76 FillLayer::FillLayer(const FillLayer& o) 76 77 : m_next(o.m_next ? std::make_unique<FillLayer>(*o.m_next) : nullptr) 78 , m_maskImageOperation(o.m_maskImageOperation) 77 79 , m_image(o.m_image) 78 80 , m_xPosition(o.m_xPosition) … … 117 119 118 120 m_image = o.m_image; 121 m_maskImageOperation = o.m_maskImageOperation; 119 122 m_xPosition = o.m_xPosition; 120 123 m_yPosition = o.m_yPosition; … … 154 157 // We do not check the "isSet" booleans for each property, since those are only used during initial construction 155 158 // 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 157 161 && m_backgroundXOrigin == o.m_backgroundXOrigin && m_backgroundYOrigin == o.m_backgroundYOrigin 158 162 && m_attachment == o.m_attachment && m_clip == o.m_clip && m_composite == o.m_composite … … 289 293 { 290 294 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()) { 292 296 layer->m_next = nullptr; 293 297 break; 294 298 } 295 299 } 300 } 301 302 bool FillLayer::hasNonEmptyMaskImage() const 303 { 304 if (hasMaskImage() && !maskImage()->isCSSValueNone()) 305 return true; 306 307 return (next() ? next()->hasNonEmptyMaskImage() : false); 296 308 } 297 309 … … 341 353 if (layer->m_image && !layer->m_image->isLoaded()) 342 354 return false; 355 356 if (layer->hasMaskImage() && !layer->maskImage()->isMaskLoaded()) 357 return false; 343 358 } 344 359 return true; -
trunk/Source/WebCore/rendering/style/FillLayer.h
r170774 r176798 28 28 #include "GraphicsTypes.h" 29 29 #include "LengthSize.h" 30 #include "MaskImageOperation.h" 30 31 #include "RenderStyleConstants.h" 31 32 #include "StyleImage.h" … … 68 69 ~FillLayer(); 69 70 71 const RefPtr<MaskImageOperation>& maskImage() const { return m_maskImageOperation; } 70 72 StyleImage* image() const { return m_image.get(); } 73 StyleImage* imageOrMaskImage() const { return hasMaskImage() ? maskImage()->image() : image(); } 71 74 const Length& xPosition() const { return m_xPosition; } 72 75 const Length& yPosition() const { return m_yPosition; } … … 102 105 bool isMaskSourceTypeSet() const { return m_maskSourceTypeSet; } 103 106 107 void setMaskImage(PassRefPtr<MaskImageOperation> maskImage) { m_maskImageOperation = maskImage; } 104 108 void setImage(PassRefPtr<StyleImage> image) { m_image = image; m_imageSet = true; } 105 109 void setXPosition(Length length) { m_xPosition = WTF::move(length); m_xPosSet = true; } … … 119 123 void setMaskSourceType(EMaskSourceType m) { m_maskSourceType = m; m_maskSourceTypeSet = true; } 120 124 125 void clearMaskImage() { m_maskImageOperation.clear(); } 121 126 void clearImage() { m_image.clear(); m_imageSet = false; } 122 127 void clearXPosition() { m_xPosSet = false; m_backgroundOriginSet = false; } … … 144 149 bool imagesAreLoaded() const; 145 150 bool hasImage() const; 151 bool hasMaskImage() const { return maskImage().get(); } 152 bool hasNonEmptyMaskImage() const; 146 153 bool hasFixedImage() const; 147 154 bool hasOpaqueImage(const RenderElement&) const; … … 176 183 std::unique_ptr<FillLayer> m_next; 177 184 185 RefPtr<MaskImageOperation> m_maskImageOperation; 178 186 RefPtr<StyleImage> m_image; 179 187 -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp
r175117 r176798 26 26 #include "Image.h" 27 27 #include "IntRect.h" 28 #include "RenderBoxModelObject.h" 28 29 #include "SVGRenderingContext.h" 29 30 … … 54 55 } 55 56 56 bool RenderSVGResourceMasker::apply Resource(RenderElement& renderer, const RenderStyle&, GraphicsContext*& context, unsigned short resourceMode)57 bool RenderSVGResourceMasker::applySVGMask(RenderElement& renderer, GraphicsContext*& context, bool applyClip) 57 58 { 58 59 ASSERT(context); 59 ASSERT_UNUSED(resourceMode, resourceMode == ApplyToDefaultMode);60 60 61 61 bool missingMaskerData = !m_masker.contains(&renderer); … … 76 76 return false; 77 77 78 if (!drawContentIntoMaskImage(maskerData, colorSpace, &renderer)) {78 if (!drawContentIntoMaskImage(maskerData, colorSpace, &renderer)) 79 79 maskerData->maskImage.reset(); 80 }81 80 } 82 81 … … 84 83 return false; 85 84 86 SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData); 85 if (applyClip) 86 SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData); 87 87 88 return true; 89 } 90 91 bool RenderSVGResourceMasker::applyResource(RenderElement& renderer, const RenderStyle&, GraphicsContext*& context, unsigned short resourceMode) 92 { 93 ASSERT_UNUSED(resourceMode, resourceMode == ApplyToDefaultMode); 94 return applySVGMask(renderer, context, true); 88 95 } 89 96 … … 128 135 } 129 136 137 void 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 130 165 void RenderSVGResourceMasker::calculateMaskContentRepaintRect() 131 166 { -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.h
r176180 r176798 46 46 virtual void removeClientFromCache(RenderElement&, bool markForInvalidation = true) override; 47 47 virtual bool applyResource(RenderElement&, const RenderStyle&, GraphicsContext*&, unsigned short resourceMode) override; 48 bool applySVGMask(RenderElement& renderer, GraphicsContext*&, bool applyClip); 48 49 virtual FloatRect resourceBoundingBox(const RenderObject&) override; 49 50 … … 52 53 53 54 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); 54 58 55 59 private: -
trunk/Source/WebCore/svg/SVGMaskElement.cpp
r171591 r176798 162 162 RenderPtr<RenderElement> SVGMaskElement::createElementRenderer(PassRef<RenderStyle> style) 163 163 { 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 173 void 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 183 void 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); 165 191 } 166 192 -
trunk/Source/WebCore/svg/SVGMaskElement.h
r173804 r176798 31 31 32 32 namespace WebCore { 33 34 class RenderLayer; 33 35 34 36 class SVGMaskElement final : public SVGElement, … … 37 39 public: 38 40 static PassRefPtr<SVGMaskElement> create(const QualifiedName&, Document&); 41 42 void addClientRenderLayer(RenderLayer*); 43 void removeClientRenderLayer(RenderLayer*); 39 44 40 45 private: … … 48 53 virtual void svgAttributeChanged(const QualifiedName&) override; 49 54 virtual void childrenChanged(const ChildChange&) override; 55 56 HashSet<RenderLayer*> m_clientLayers; 50 57 51 58 virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override; -
trunk/Source/WebCore/svg/SVGUseElement.cpp
r176459 r176798 993 993 994 994 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); 996 998 m_cachedDocument->addClient(this); 997 } 998 999 } 999 } 1000 } 1001 1002 } -
trunk/Source/WebCore/svg/graphics/SVGImage.cpp
r176499 r176798 345 345 m_chromeClient = std::make_unique<SVGImageChromeClient>(this); 346 346 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. 347 349 348 350 // FIXME: If this SVG ends up loading itself, we might leak the world. … … 352 354 // SVGImage objects, but we're safe now, because SVGImage can only be 353 355 // 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); 373 357 374 358 // Set the intrinsic size before a container size is available.
Note: See TracChangeset
for help on using the changeset viewer.