WebKit Bugzilla
Attachment 356728 Details for
Bug 191237
: Remove SVG properties tear-off objects
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
10-SVGPropertyRegistry
10-SVGPropertyRegistry.patch (text/plain), 21.78 KB, created by
Said Abou-Hallawa
on 2018-12-06 08:01:50 PST
(
hide
)
Description:
10-SVGPropertyRegistry
Filename:
MIME Type:
Creator:
Said Abou-Hallawa
Created:
2018-12-06 08:01:50 PST
Size:
21.78 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 683b3df7a19..3109e82884b 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,29 @@ >+2018-12-05 Said Abou-Hallawa <sabouhallawa@apple.com> >+ >+ Remove SVG properties tear-off objects >+ https://bugs.webkit.org/show_bug.cgi?id=191237 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ SVGPropertyRegistry is the a where an owner of SVGAnimatedProperty or >+ SVGProperty can register it and associate it with an attributeName. >+ >+ The owner has to define its OwnerType and its BaseTypes to the >+ SVGPropertyOwnerRegistry. This provides a hierarchy of SVGAccessors; all >+ of them are accessible by this owner. >+ >+ * WebCore.xcodeproj/project.pbxproj: >+ * svg/properties/SVGPropertyOwnerRegistry.h: Added. >+ (WebCore::SVGPropertyOwnerRegistry::SVGPropertyOwnerRegistry): >+ (WebCore::SVGPropertyOwnerRegistry::registerProperty): >+ (WebCore::SVGPropertyOwnerRegistry::enumerateRecursively): >+ (WebCore::SVGPropertyOwnerRegistry::isKnownAttribute): >+ (WebCore::SVGPropertyOwnerRegistry::isAnimatedLengthAttribute): >+ (WebCore::SVGPropertyOwnerRegistry::enumerateRecursivelyBaseTypes): >+ (WebCore::SVGPropertyOwnerRegistry::findAccessor): >+ (WebCore::SVGPropertyOwnerRegistry::findAttributeNameRecursively const): >+ * svg/properties/SVGPropertyRegistry.h: Added. >+ > 2018-12-04 Said Abou-Hallawa <sabouhallawa@apple.com> > > Remove SVG properties tear-off objects >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 38643f2a181..ca6599de79e 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -9376,6 +9376,8 @@ > 727AFED31A2EA6A0000442E8 /* EXTsRGB.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EXTsRGB.idl; sourceTree = "<group>"; }; > 72E417611A2E8D2F004C562A /* JSEXTsRGB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSEXTsRGB.cpp; sourceTree = "<group>"; }; > 72E417621A2E8D2F004C562A /* JSEXTsRGB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSEXTsRGB.h; sourceTree = "<group>"; }; >+ 72EF237721B834C20092076B /* SVGPropertyRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPropertyRegistry.h; sourceTree = "<group>"; }; >+ 72EF237921B834C30092076B /* SVGPropertyOwnerRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPropertyOwnerRegistry.h; sourceTree = "<group>"; }; > 72F1AD9F1A3904C300014E18 /* EXTFragDepth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EXTFragDepth.cpp; sourceTree = "<group>"; }; > 72F1ADA01A3904C300014E18 /* EXTFragDepth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EXTFragDepth.h; sourceTree = "<group>"; }; > 72F1ADA11A3904C300014E18 /* EXTFragDepth.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EXTFragDepth.idl; sourceTree = "<group>"; }; >@@ -15851,6 +15853,8 @@ > 72227A9121B6F5CD008EC3E4 /* SVGPropertyAnimatorCreator.h */, > 72227A7221B50901008EC3E4 /* SVGPropertyList.h */, > 72227A6C21B4B1F6008EC3E4 /* SVGPropertyOwner.h */, >+ 72EF237921B834C30092076B /* SVGPropertyOwnerRegistry.h */, >+ 72EF237721B834C20092076B /* SVGPropertyRegistry.h */, > 088A0E02126EF1DB00978F7A /* SVGPropertyTearOff.h */, > 088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */, > 0880F70D1282B46D00948505 /* SVGStaticListPropertyTearOff.h */, >diff --git a/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h b/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h >index 8b137891791..85fbf01f161 100644 >--- a/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h >+++ b/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h >@@ -1 +1,339 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ > >+#pragma once >+ >+#include "SVGAnimatedPropertyAccessorImpl.h" >+#include "SVGAnimatedPropertyPairAccessorImpl.h" >+#include "SVGPropertyAccessorImpl.h" >+#include "SVGPropertyRegistry.h" >+#include <wtf/HashMap.h> >+ >+namespace WebCore { >+ >+class SVGAnimator; >+ >+template<typename OwnerType, typename... BaseTypes> >+class SVGPropertyOwnerRegistry : public SVGPropertyRegistry { >+public: >+ SVGPropertyOwnerRegistry(OwnerType& owner) >+ : m_owner(owner) >+ { >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGStringList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGStringListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGTransformList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGTransformListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedBoolean> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedBooleanAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, typename EnumType, Ref<SVGAnimatedEnumeration> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedEnumerationAccessor<OwnerType, EnumType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedInteger> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedIntegerAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedNumber> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedNumberAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedRect> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedRectAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedString> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedStringAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedLength> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedLengthAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPreserveAspectRatio> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedPreserveAspectRatioAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedLengthList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedLengthListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedNumberList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedNumberListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPathSegList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedPathSegListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPointList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedPointListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedTransformList> OwnerType::*property> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedTransformListAccessor<OwnerType>::template singleton<property>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedInteger> OwnerType::*property1, Ref<SVGAnimatedInteger> OwnerType::*property2> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedIntegerPairAccessor<OwnerType>::template singleton<property1, property2>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedNumber> OwnerType::*property1, Ref<SVGAnimatedNumber> OwnerType::*property2> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedNumberPairAccessor<OwnerType>::template singleton<property1, property2>()); >+ } >+ >+ template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedAngle> OwnerType::*property1, Ref<SVGAnimatedOrientType> OwnerType::*property2> >+ static void registerProperty() >+ { >+ registerProperty(attributeName, SVGAnimatedAngleOrientAccessor<OwnerType>::template singleton<property1, property2>()); >+ } >+ >+ // Enumrate all the SVGAccessors recursively. The functor will be called and will >+ // be given the pair<QualifiedName, SVGAccessor> till the functor returns false. >+ template<typename Functor> >+ static bool enumerateRecursively(const Functor& functor) >+ { >+ for (const auto& entry : attributeNameToAccessorMap()) { >+ if (!functor(entry)) >+ return false; >+ } >+ return enumerateRecursivelyBaseTypes(functor); >+ } >+ >+ // Returns true if OwnerType owns a property whose name is attributeName. >+ static bool isKnownAttribute(const QualifiedName& attributeName) >+ { >+ return findAccessor(attributeName); >+ } >+ >+ // Returns true if OwnerType owns a property whose name is attributeName >+ // and its type is SVGAnimatedLength. >+ static bool isAnimatedLengthAttribute(const QualifiedName& attributeName) >+ { >+ if (const auto* accessor = findAccessor(attributeName)) >+ return accessor->isAnimatedLength(); >+ return false; >+ } >+ >+ QualifiedName propertyAttributeName(const SVGProperty& property) const override >+ { >+ QualifiedName attributeName = nullQName(); >+ enumerateRecursively([&](const auto& entry) -> bool { >+ if (!entry.value->matches(m_owner, property)) >+ return true; >+ attributeName = entry.key; >+ return false; >+ }); >+ return attributeName; >+ } >+ >+ QualifiedName animatedPropertyAttributeName(const SVGAnimatedProperty& animatedProperty) const override >+ { >+ QualifiedName attributeName = nullQName(); >+ enumerateRecursively([&](const auto& entry) -> bool { >+ if (!entry.value->matches(m_owner, animatedProperty)) >+ return true; >+ attributeName = entry.key; >+ return false; >+ }); >+ return attributeName; >+ } >+ >+ // Detach all the properties recursively from their OwnerTypes. >+ void detachAllProperties() const override >+ { >+ enumerateRecursively([&](const auto& entry) -> bool { >+ entry.value->detach(m_owner); >+ return true; >+ }); >+ } >+ >+ // Finds the property whose name is attributeName and returns the synchronize >+ // string through the associated SVGAccessor. >+ std::optional<String> synchronize(const QualifiedName& attributeName) const override >+ { >+ std::optional<String> value; >+ enumerateRecursively([&](const auto& entry) -> bool { >+ if (!entry.key.matches(attributeName)) >+ return true; >+ value = entry.value->synchronize(m_owner); >+ return false; >+ }); >+ return value; >+ } >+ >+ // Enumerate recursively the SVGAccessors of the OwnerType and all its BaseTypes. >+ // Collect all the pairs <AttributeName, String> only for the dirty properties. >+ HashMap<QualifiedName, String> synchronizeAllAttributes() const override >+ { >+ HashMap<QualifiedName, String> map; >+ enumerateRecursively([&](const auto& entry) -> bool { >+ if (auto string = entry.value->synchronize(m_owner)) >+ map.add(entry.key, *string); >+ return true; >+ }); >+ return map; >+ } >+ >+ // This is a virtual function because SVGElement will access it through the base class. >+ bool isAnimatedPropertyAttribute(const QualifiedName& attributeName) const override >+ { >+ bool isAnimatedPropertyAttribute = false; >+ enumerateRecursively([&attributeName, &isAnimatedPropertyAttribute](const auto& entry) -> bool { >+ if (!entry.key.matches(attributeName)) >+ return true; >+ isAnimatedPropertyAttribute = entry.value->isAnimatedProperty(); >+ return false; >+ }); >+ return isAnimatedPropertyAttribute; >+ } >+ >+ // This is a virtual function because SVGElement will access it through the base class. >+ bool isAnimatedStylePropertyAttribute(const QualifiedName& attributeName) const override >+ { >+ static NeverDestroyed<HashSet<QualifiedName::QualifiedNameImpl*>> animatedStyleAttributes = std::initializer_list<QualifiedName::QualifiedNameImpl*> { >+ SVGNames::cxAttr->impl(), >+ SVGNames::cyAttr->impl(), >+ SVGNames::rAttr->impl(), >+ SVGNames::rxAttr->impl(), >+ SVGNames::ryAttr->impl(), >+ SVGNames::heightAttr->impl(), >+ SVGNames::widthAttr->impl(), >+ SVGNames::xAttr->impl(), >+ SVGNames::yAttr->impl() >+ }; >+ return isAnimatedLengthAttribute(attributeName) && animatedStyleAttributes.get().contains(attributeName.impl()); >+ } >+ >+ // Creates an SVGAnimator for a given attributeName. >+ RefPtr<SVGAnimator> createAnimator(const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const override >+ { >+ RefPtr<SVGAnimator> animator; >+ enumerateRecursively([&](const auto& entry) -> bool { >+ if (!entry.key.matches(attributeName)) >+ return true; >+ animator = entry.value->createAnimator(m_owner, attributeName, animationMode, calcMode, isAccumulated, isAdditive); >+ return false; >+ }); >+ return animator; >+ } >+ >+ void appendAnimatedInstance(const QualifiedName& attributeName, RefPtr<SVGAnimator>& animator) const override >+ { >+ enumerateRecursively([&](const auto& entry) -> bool { >+ if (!entry.key.matches(attributeName)) >+ return true; >+ entry.value->appendAnimatedInstance(m_owner, animator); >+ return false; >+ }); >+ } >+ >+private: >+ // Singleton map for every OwnerType. >+ static HashMap<QualifiedName, const SVGAccessor<OwnerType>*>& attributeNameToAccessorMap() >+ { >+ static NeverDestroyed<HashMap<QualifiedName, const SVGAccessor<OwnerType>*>> attributeNameToAccessorMap; >+ return attributeNameToAccessorMap; >+ } >+ >+ static void registerProperty(const QualifiedName& attributeName, const SVGAccessor<OwnerType>& propertyAccessor) >+ { >+ attributeNameToAccessorMap().add(attributeName, &propertyAccessor); >+ } >+ >+ // This is a template function with parameter 'I' whose default value = 0. So you can call it without any parameter >+ // from enumerateRecursively(). It returns true and is enable_if<I == sizeof...(BaseTypes)>. So it is mainly for >+ // breaking the recursion. >+ template<typename Functor, size_t I = 0> >+ static typename std::enable_if<I == sizeof...(BaseTypes), bool>::type enumerateRecursivelyBaseTypes(const Functor&) { return true; } >+ >+ // This version of animatedTypesBaseTypes() is enable_if<I < sizeof...(BaseTypes)>. >+ template<typename Functor, size_t I = 0> >+ static typename std::enable_if<I < sizeof...(BaseTypes), bool>::type enumerateRecursivelyBaseTypes(const Functor& functor) >+ { >+ // Get the base type at index 'I' using std::tuple and std::tuple_element. >+ using BaseType = typename std::tuple_element<I, typename std::tuple<BaseTypes...>>::type; >+ if (!BaseType::PropertyRegistry::enumerateRecursively(functor)) >+ return false; >+ // BaseType does not want to break the recursion. So recurse to the next BaseType. >+ return enumerateRecursivelyBaseTypes<Functor, I + 1>(functor); >+ } >+ >+ static const SVGAccessor<OwnerType>* findAccessor(const QualifiedName& attributeName) >+ { >+ // Here we need to loop through the entries in the map and use matches() to compare them with attributeName. >+ // m_map.contains() uses QualifiedName::operator==() which compares the impl pointers only while matches() >+ // compares the contents if the impl pointers differ. >+ auto it = std::find_if(attributeNameToAccessorMap().begin(), attributeNameToAccessorMap().end(), [&attributeName](const auto& entry) -> bool { >+ return entry.key.matches(attributeName); >+ }); >+ return it != attributeNameToAccessorMap().end() ? it->value : nullptr; >+ } >+ >+ OwnerType& m_owner; >+}; >+ >+} >diff --git a/Source/WebCore/svg/properties/SVGPropertyRegistry.h b/Source/WebCore/svg/properties/SVGPropertyRegistry.h >index 8b137891791..6ebb2fa52c6 100644 >--- a/Source/WebCore/svg/properties/SVGPropertyRegistry.h >+++ b/Source/WebCore/svg/properties/SVGPropertyRegistry.h >@@ -1 +1,52 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ > >+#pragma once >+ >+#include "SVGAnimator.h" >+ >+namespace WebCore { >+ >+class SVGAnimatedProperty; >+class SVGProperty; >+ >+class SVGPropertyRegistry { >+public: >+ SVGPropertyRegistry() = default; >+ virtual ~SVGPropertyRegistry() = default; >+ >+ virtual void detachAllProperties() const = 0; >+ virtual QualifiedName propertyAttributeName(const SVGProperty&) const = 0; >+ virtual QualifiedName animatedPropertyAttributeName(const SVGAnimatedProperty&) const = 0; >+ virtual std::optional<String> synchronize(const QualifiedName&) const = 0; >+ virtual HashMap<QualifiedName, String> synchronizeAllAttributes() const = 0; >+ >+ virtual bool isAnimatedPropertyAttribute(const QualifiedName&) const = 0; >+ virtual bool isAnimatedStylePropertyAttribute(const QualifiedName&) const = 0; >+ virtual RefPtr<SVGAnimator> createAnimator(const QualifiedName&, AnimationMode, CalcMode, bool isAccumulated, bool isAdditive) const = 0; >+ virtual void appendAnimatedInstance(const QualifiedName& attributeName, RefPtr<SVGAnimator>&) const = 0; >+}; >+ >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 191237
:
353808
|
353812
|
353815
|
353817
|
353818
|
353820
|
353824
|
353825
|
355382
|
355386
|
355388
|
355393
|
355568
|
355574
|
355575
|
355577
|
355580
|
355582
|
355585
|
355666
|
355672
|
355693
|
355699
|
355711
|
355752
|
355777
|
355820
|
356333
|
356334
|
356338
|
356340
|
356342
|
356344
|
356346
|
356351
|
356352
|
356358
|
356360
|
356380
|
356497
|
356500
|
356507
|
356579
|
356607
|
356728
|
356729
|
356730
|
356731
|
356732
|
356733
|
356752
|
356810
|
356811
|
356879
|
356880
|
356881
|
356882
|
356883
|
356884
|
356885
|
356887
|
356888
|
356889
|
356892
|
356895
|
356896
|
359721
|
359735
|
359747
|
363581
|
363595
|
363613
|
363690
|
364172
|
364180
|
366512
|
366557
|
366636