Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1277)

Unified Diff: Source/core/svg/SVGTextContentElement.cpp

Issue 112003003: [SVG] SVGLength{,List} migration to new SVG property impl. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebaselined Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/svg/SVGTextContentElement.cpp
diff --git a/Source/core/svg/SVGTextContentElement.cpp b/Source/core/svg/SVGTextContentElement.cpp
index 1c298456cae236d12d37961e6fe143ed4a0bec49..50cc7a988f36746f505b4dcd8b8c173d12961954 100644
--- a/Source/core/svg/SVGTextContentElement.cpp
+++ b/Source/core/svg/SVGTextContentElement.cpp
@@ -36,27 +36,37 @@
namespace WebCore {
-// Define custom animated property 'textLength'.
-const SVGPropertyInfo* SVGTextContentElement::textLengthPropertyInfo()
-{
- static const SVGPropertyInfo* s_propertyInfo = 0;
- if (!s_propertyInfo) {
- s_propertyInfo = new SVGPropertyInfo(AnimatedLength,
- PropertyIsReadWrite,
- SVGNames::textLengthAttr,
- SVGNames::textLengthAttr.localName(),
- &SVGTextContentElement::synchronizeTextLength,
- &SVGTextContentElement::lookupOrCreateTextLengthWrapper);
+// Animated property definitions
+
+// SVGTextContentElement's 'textLength' attribute needs special handling.
+// It should return getComputedTextLength() when textLength is not specified manually.
+class SVGAnimatedTextLength : public SVGAnimatedLength {
+public:
+ static PassRefPtr<SVGAnimatedTextLength> create(SVGTextContentElement* contextElement)
+ {
+ return adoptRef(new SVGAnimatedTextLength(contextElement));
}
- return s_propertyInfo;
-}
-// Animated property definitions
+ virtual SVGLengthTearOff* baseVal()
+ {
+ SVGTextContentElement* textContentElement = static_cast<SVGTextContentElement*>(contextElement());
pdr. 2014/01/07 06:42:53 Please use toSVGTextContentElement instead of a st
kouhei (in TOK) 2014/01/08 08:12:07 Done.
+ if (!textContentElement->textLengthIsSpecifiedByUser())
+ baseValue()->newValueSpecifiedUnits(LengthTypeNumber, textContentElement->getComputedTextLength());
+
+ return SVGAnimatedLength::baseVal();
+ }
+
+private:
+ SVGAnimatedTextLength(SVGTextContentElement* contextElement)
+ : SVGAnimatedLength(contextElement, SVGNames::textLengthAttr, SVGLength::create(LengthModeOther))
+ {
+ }
+};
+
DEFINE_ANIMATED_ENUMERATION(SVGTextContentElement, SVGNames::lengthAdjustAttr, LengthAdjust, lengthAdjust, SVGLengthAdjustType)
DEFINE_ANIMATED_BOOLEAN(SVGTextContentElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGTextContentElement)
- REGISTER_LOCAL_ANIMATED_PROPERTY(textLength)
REGISTER_LOCAL_ANIMATED_PROPERTY(lengthAdjust)
REGISTER_LOCAL_ANIMATED_PROPERTY(externalResourcesRequired)
REGISTER_PARENT_ANIMATED_PROPERTIES(SVGGraphicsElement)
@@ -64,41 +74,14 @@ END_REGISTER_ANIMATED_PROPERTIES
SVGTextContentElement::SVGTextContentElement(const QualifiedName& tagName, Document& document)
: SVGGraphicsElement(tagName, document)
- , m_textLength(LengthModeOther)
- , m_specifiedTextLength(LengthModeOther)
+ , m_textLength(SVGAnimatedTextLength::create(this))
+ , m_textLengthIsSpecifiedByUser(false)
, m_lengthAdjust(SVGLengthAdjustSpacing)
{
ScriptWrappable::init(this);
- registerAnimatedPropertiesForSVGTextContentElement();
-}
-
-void SVGTextContentElement::synchronizeTextLength(SVGElement* contextElement)
-{
- ASSERT(contextElement);
- SVGTextContentElement* ownerType = toSVGTextContentElement(contextElement);
- if (!ownerType->m_textLength.shouldSynchronize)
- return;
- AtomicString value(SVGPropertyTraits<SVGLength>::toString(ownerType->m_specifiedTextLength));
- ownerType->m_textLength.synchronize(ownerType, textLengthPropertyInfo()->attributeName, value);
-}
-
-PassRefPtr<SVGAnimatedProperty> SVGTextContentElement::lookupOrCreateTextLengthWrapper(SVGElement* contextElement)
-{
- ASSERT(contextElement);
- SVGTextContentElement* ownerType = toSVGTextContentElement(contextElement);
- return SVGAnimatedProperty::lookupOrCreateWrapper<SVGTextContentElement, SVGAnimatedLength, SVGLength>
- (ownerType, textLengthPropertyInfo(), ownerType->m_textLength.value);
-}
-
-PassRefPtr<SVGAnimatedLength> SVGTextContentElement::textLength()
-{
- DEFINE_STATIC_LOCAL(SVGLength, defaultTextLength, (LengthModeOther));
- if (m_specifiedTextLength == defaultTextLength)
- m_textLength.value.newValueSpecifiedUnits(LengthTypeNumber, getComputedTextLength(), ASSERT_NO_EXCEPTION);
-
- m_textLength.shouldSynchronize = true;
- return static_pointer_cast<SVGAnimatedLength>(lookupOrCreateTextLengthWrapper(this));
+ addToPropertyMap(m_textLength);
+ registerAnimatedPropertiesForSVGTextContentElement();
}
unsigned SVGTextContentElement::getNumberOfChars()
@@ -253,7 +236,9 @@ void SVGTextContentElement::parseAttribute(const QualifiedName& name, const Atom
if (propertyValue > 0)
setLengthAdjustBaseValue(propertyValue);
} else if (name == SVGNames::textLengthAttr) {
- m_textLength.value = SVGLength::construct(LengthModeOther, value, parseError, ForbidNegativeLengths);
+ m_textLength->setBaseValueAsString(value, ForbidNegativeLengths, parseError);
+ if (parseError == NoError)
+ m_textLengthIsSpecifiedByUser = true;
} else if (SVGExternalResourcesRequired::parseAttribute(name, value)) {
} else if (name.matches(XMLNames::spaceAttr)) {
} else
@@ -269,10 +254,10 @@ void SVGTextContentElement::svgAttributeChanged(const QualifiedName& attrName)
return;
}
- SVGElementInstance::InvalidationGuard invalidationGuard(this);
-
if (attrName == SVGNames::textLengthAttr)
pdr. 2014/01/07 06:42:53 Isn't this handled in parseAttribute(...)?
kouhei (in TOK) 2014/01/08 08:12:07 Done. Removed flag flip in parseAttribute().
- m_specifiedTextLength = m_textLength.value;
+ m_textLengthIsSpecifiedByUser = true;
+
+ SVGElementInstance::InvalidationGuard invalidationGuard(this);
if (RenderObject* renderer = this->renderer())
RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);

Powered by Google App Engine
This is Rietveld 408576698