#include "core/svg/SVGImageElement.h"
-#include "CSSPropertyNames.h"
-#include "XLinkNames.h"
+#include "core/CSSPropertyNames.h"
+#include "core/XLinkNames.h"
#include "core/rendering/RenderImageResource.h"
#include "core/rendering/svg/RenderSVGImage.h"
-#include "core/rendering/svg/RenderSVGResource.h"
-#include "core/svg/SVGElementInstance.h"
-namespace WebCore {
-
-// Animated property definitions
-DEFINE_ANIMATED_STRING(SVGImageElement, XLinkNames::hrefAttr, Href, href)
-
-BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGImageElement)
- REGISTER_LOCAL_ANIMATED_PROPERTY(href)
- REGISTER_PARENT_ANIMATED_PROPERTIES(SVGGraphicsElement)
-END_REGISTER_ANIMATED_PROPERTIES
+namespace blink {
inline SVGImageElement::SVGImageElement(Document& document)
: SVGGraphicsElement(SVGNames::imageTag, document)
- , m_x(SVGAnimatedLength::create(this, SVGNames::xAttr, SVGLength::create(LengthModeWidth)))
- , m_y(SVGAnimatedLength::create(this, SVGNames::yAttr, SVGLength::create(LengthModeHeight)))
- , m_width(SVGAnimatedLength::create(this, SVGNames::widthAttr, SVGLength::create(LengthModeWidth)))
- , m_height(SVGAnimatedLength::create(this, SVGNames::heightAttr, SVGLength::create(LengthModeHeight)))
+ , SVGURIReference(this)
+ , m_x(SVGAnimatedLength::create(this, SVGNames::xAttr, SVGLength::create(LengthModeWidth), AllowNegativeLengths))
+ , m_y(SVGAnimatedLength::create(this, SVGNames::yAttr, SVGLength::create(LengthModeHeight), AllowNegativeLengths))
+ , m_width(SVGAnimatedLength::create(this, SVGNames::widthAttr, SVGLength::create(LengthModeWidth), ForbidNegativeLengths))
+ , m_height(SVGAnimatedLength::create(this, SVGNames::heightAttr, SVGLength::create(LengthModeHeight), ForbidNegativeLengths))
, m_preserveAspectRatio(SVGAnimatedPreserveAspectRatio::create(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create()))
- , m_imageLoader(this)
+ , m_imageLoader(SVGImageLoader::create(this))
+ , m_needsLoaderURIUpdate(true)
{
- ScriptWrappable::init(this);
-
addToPropertyMap(m_x);
addToPropertyMap(m_y);
addToPropertyMap(m_width);
addToPropertyMap(m_height);
-
addToPropertyMap(m_preserveAspectRatio);
- registerAnimatedPropertiesForSVGImageElement();
}
-PassRefPtr<SVGImageElement> SVGImageElement::create(Document& document)
+DEFINE_NODE_FACTORY(SVGImageElement)
+
+void SVGImageElement::trace(Visitor* visitor)
{
- return adoptRef(new SVGImageElement(document));
+ visitor->trace(m_imageLoader);
+ SVGGraphicsElement::trace(visitor);
}
bool SVGImageElement::currentFrameHasSingleSecurityOrigin() const
void SVGImageElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
{
- SVGParsingError parseError = NoError;
-
- if (!isSupportedAttribute(name))
- SVGGraphicsElement::parseAttribute(name, value);
- else if (name == SVGNames::xAttr)
- m_x->setBaseValueAsString(value, AllowNegativeLengths, parseError);
- else if (name == SVGNames::yAttr)
- m_y->setBaseValueAsString(value, AllowNegativeLengths, parseError);
- else if (name == SVGNames::widthAttr)
- m_width->setBaseValueAsString(value, ForbidNegativeLengths, parseError);
- else if (name == SVGNames::heightAttr)
- m_height->setBaseValueAsString(value, ForbidNegativeLengths, parseError);
- else if (name == SVGNames::preserveAspectRatioAttr) {
- m_preserveAspectRatio->setBaseValueAsString(value, parseError);
- } else if (SVGURIReference::parseAttribute(name, value)) {
- } else
- ASSERT_NOT_REACHED();
-
- reportAttributeParsingError(parseError, name, value);
+ parseAttributeNew(name, value);
}
void SVGImageElement::svgAttributeChanged(const QualifiedName& attrName)
return;
}
- SVGElementInstance::InvalidationGuard invalidationGuard(this);
+ SVGElement::InvalidationGuard invalidationGuard(this);
bool isLengthAttribute = attrName == SVGNames::xAttr
|| attrName == SVGNames::yAttr
updateRelativeLengthsInformation();
if (SVGURIReference::isKnownAttribute(attrName)) {
- m_imageLoader.updateFromElementIgnoringPreviousError();
+ if (inDocument())
+ imageLoader().updateFromElement(ImageLoader::UpdateIgnorePreviousError);
+ else
+ m_needsLoaderURIUpdate = true;
return;
}
if (isLengthAttribute) {
if (toRenderSVGImage(renderer)->updateImageViewport())
- RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
+ markForLayoutAndParentResourceInvalidation(renderer);
return;
}
if (attrName == SVGNames::preserveAspectRatioAttr) {
- RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
+ markForLayoutAndParentResourceInvalidation(renderer);
return;
}
bool SVGImageElement::haveLoadedRequiredResources()
{
- return !m_imageLoader.hasPendingActivity();
+ return !m_needsLoaderURIUpdate && !imageLoader().hasPendingActivity();
}
void SVGImageElement::attach(const AttachContext& context)
if (imageObj->imageResource()->hasImage())
return;
- imageObj->imageResource()->setImageResource(m_imageLoader.image());
+ imageObj->imageResource()->setImageResource(imageLoader().image());
}
}
SVGGraphicsElement::insertedInto(rootParent);
if (!rootParent->inDocument())
return InsertionDone;
- // Update image loader, as soon as we're living in the tree.
- // We can only resolve base URIs properly, after that!
- m_imageLoader.updateFromElement();
+
+ // We can only resolve base URIs properly after tree insertion - hence, URI mutations while
+ // detached are deferred until this point.
+ if (m_needsLoaderURIUpdate) {
+ imageLoader().updateFromElement(ImageLoader::UpdateIgnorePreviousError);
+ m_needsLoaderURIUpdate = false;
+ } else {
+ // A previous loader update may have failed to actually fetch the image if the document
+ // was inactive. In that case, force a re-update (but don't clear previous errors).
+ if (!imageLoader().image())
+ imageLoader().updateFromElement();
+ }
+
return InsertionDone;
}
const AtomicString SVGImageElement::imageSourceURL() const
{
- return AtomicString(hrefCurrentValue());
+ return AtomicString(hrefString());
}
void SVGImageElement::didMoveToNewDocument(Document& oldDocument)
{
- m_imageLoader.elementDidMoveToNewDocument();
+ imageLoader().elementDidMoveToNewDocument();
SVGGraphicsElement::didMoveToNewDocument(oldDocument);
}
-}
+} // namespace blink