Diff
Modified: trunk/LayoutTests/ChangeLog (110710 => 110711)
--- trunk/LayoutTests/ChangeLog 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/ChangeLog 2012-03-14 16:59:16 UTC (rev 110711)
@@ -1,3 +1,28 @@
+2012-03-14 Nikolas Zimmermann <[email protected]>
+
+ Make SVGUseElement respect & support externalResourcesRequired
+ https://bugs.webkit.org/show_bug.cgi?id=81109
+
+ Reviewed by Rob Buis.
+
+ Fix flakiness of new external <use> tests introduced in r110676.
+
+ * platform/mac/svg/batik/masking/maskRegions-expected.png:
+ * platform/mac/svg/dynamic-updates/SVGUseElement-dom-href2-attr-expected.png:
+ * platform/mac/svg/dynamic-updates/SVGUseElement-svgdom-href2-prop-expected.png:
+ * svg/dynamic-updates/SVGUseElement-dom-href2-attr-expected.txt:
+ * svg/dynamic-updates/SVGUseElement-svgdom-href2-prop-expected.txt:
+ * svg/dynamic-updates/script-tests/SVGUseElement-dom-href1-attr.js:
+ (repaintTest):
+ * svg/dynamic-updates/script-tests/SVGUseElement-dom-href2-attr.js:
+ (repaintTest):
+ (externalLoadDone):
+ * svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href1-prop.js:
+ (repaintTest):
+ * svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href2-prop.js:
+ (repaintTest):
+ (externalLoadDone):
+
2012-03-14 Jessie Berlin <[email protected]>
Mac WK2: editing/pasteboard/dataTransfer-setData-getData.html fails
Modified: trunk/LayoutTests/platform/mac/svg/batik/masking/maskRegions-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/svg/dynamic-updates/SVGUseElement-dom-href2-attr-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/svg/dynamic-updates/SVGUseElement-svgdom-href2-prop-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/svg/dynamic-updates/SVGUseElement-dom-href2-attr-expected.txt (110710 => 110711)
--- trunk/LayoutTests/svg/dynamic-updates/SVGUseElement-dom-href2-attr-expected.txt 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/svg/dynamic-updates/SVGUseElement-dom-href2-attr-expected.txt 2012-03-14 16:59:16 UTC (rev 110711)
@@ -5,7 +5,6 @@
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-PASS useElement.getAttributeNS('http://www.w3.org/1999/xlink', 'href') is "../custom/resources/rgb.svg#R"
PASS useElement.getAttributeNS('http://www.w3.org/1999/xlink', 'href') is "#MyRect"
PASS successfullyParsed is true
Modified: trunk/LayoutTests/svg/dynamic-updates/SVGUseElement-svgdom-href2-prop-expected.txt (110710 => 110711)
--- trunk/LayoutTests/svg/dynamic-updates/SVGUseElement-svgdom-href2-prop-expected.txt 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/svg/dynamic-updates/SVGUseElement-svgdom-href2-prop-expected.txt 2012-03-14 16:59:16 UTC (rev 110711)
@@ -5,7 +5,6 @@
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-PASS useElement.href.baseVal is "../custom/resources/rgb.svg#R"
PASS useElement.href.baseVal is "#MyRect"
PASS successfullyParsed is true
Modified: trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-dom-href1-attr.js (110710 => 110711)
--- trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-dom-href1-attr.js 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-dom-href1-attr.js 2012-03-14 16:59:16 UTC (rev 110711)
@@ -10,6 +10,8 @@
var useElement = createSVGElement("use");
useElement.setAttribute("x", "10");
useElement.setAttribute("y", "10");
+useElement.setAttribute("externalResourcesRequired", "true");
+useElement.setAttribute("onload", "completeTest()");
useElement.setAttributeNS(xlinkNS, "xlink:href", "#MyRect");
var rectElement = createSVGElement("rect");
@@ -31,8 +33,6 @@
function repaintTest() {
useElement.setAttributeNS(xlinkNS, "xlink:href", "../custom/resources/rgb.svg#G");
shouldBeEqualToString("useElement.getAttributeNS('" + xlinkNS + "', 'href')", "../custom/resources/rgb.svg#G");
-
- completeTest();
}
var successfullyParsed = true;
Modified: trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-dom-href2-attr.js (110710 => 110711)
--- trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-dom-href2-attr.js 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-dom-href2-attr.js 2012-03-14 16:59:16 UTC (rev 110711)
@@ -1,4 +1,4 @@
-// [Name] SVGUseElement-dom-href1-attr.js
+// [Name] SVGUseElement-dom-href2-attr.js
// [Expected rendering result] A use element first with an external then with an internal referenced document - and a series of PASS messages
description("Tests dynamic updates of the 'href' attribute of the SVGUseElement object")
@@ -10,7 +10,8 @@
var useElement = createSVGElement("use");
useElement.setAttribute("x", "10");
useElement.setAttribute("y", "10");
-useElement.setAttributeNS(xlinkNS, "xlink:href", "../custom/resources/rgb.svg#R");
+useElement.setAttribute("externalResourcesRequired", "true");
+useElement.setAttribute("onload", "externalLoadDone()");
var rectElement = createSVGElement("rect");
rectElement.setAttribute("id", "MyRect");
@@ -21,14 +22,16 @@
rectElement.setAttribute("fill", "green");
defsElement.appendChild(rectElement);
-defsElement.appendChild(useElement);
rootSVGElement.setAttribute("height", "200");
rootSVGElement.appendChild(useElement);
-shouldBeEqualToString("useElement.getAttributeNS('" + xlinkNS + "', 'href')", "../custom/resources/rgb.svg#R");
+function repaintTest() {
+ // Start loading external resource, wait for it, then switch back to internal.
+ useElement.setAttributeNS(xlinkNS, "xlink:href", "../custom/resources/rgb.svg#R");
+}
-function repaintTest() {
+function externalLoadDone() {
useElement.setAttributeNS(xlinkNS, "xlink:href", "#MyRect");
shouldBeEqualToString("useElement.getAttributeNS('" + xlinkNS + "', 'href')", "#MyRect");
Modified: trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href1-prop.js (110710 => 110711)
--- trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href1-prop.js 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href1-prop.js 2012-03-14 16:59:16 UTC (rev 110711)
@@ -10,6 +10,8 @@
var useElement = createSVGElement("use");
useElement.setAttribute("x", "10");
useElement.setAttribute("y", "10");
+useElement.setAttribute("externalResourcesRequired", "true");
+useElement.setAttribute("onload", "completeTest()");
useElement.setAttributeNS(xlinkNS, "xlink:href", "#MyRect");
var rectElement = createSVGElement("rect");
@@ -31,8 +33,6 @@
function repaintTest() {
useElement.href.baseVal = "../custom/resources/rgb.svg#G";
shouldBeEqualToString("useElement.href.baseVal", "../custom/resources/rgb.svg#G");
-
- completeTest();
}
var successfullyParsed = true;
Modified: trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href2-prop.js (110710 => 110711)
--- trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href2-prop.js 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/LayoutTests/svg/dynamic-updates/script-tests/SVGUseElement-svgdom-href2-prop.js 2012-03-14 16:59:16 UTC (rev 110711)
@@ -10,7 +10,8 @@
var useElement = createSVGElement("use");
useElement.setAttribute("x", "10");
useElement.setAttribute("y", "10");
-useElement.setAttributeNS(xlinkNS, "xlink:href", "../custom/resources/rgb.svg#R");
+useElement.setAttribute("externalResourcesRequired", "true");
+useElement.setAttribute("onload", "externalLoadDone()");
var rectElement = createSVGElement("rect");
rectElement.setAttribute("id", "MyRect");
@@ -21,14 +22,16 @@
rectElement.setAttribute("fill", "green");
defsElement.appendChild(rectElement);
-defsElement.appendChild(useElement);
rootSVGElement.setAttribute("height", "200");
rootSVGElement.appendChild(useElement);
-shouldBeEqualToString("useElement.href.baseVal", "../custom/resources/rgb.svg#R");
+function repaintTest() {
+ // Start loading external resource, wait for it, then switch back to internal.
+ useElement.setAttributeNS(xlinkNS, "xlink:href", "../custom/resources/rgb.svg#R");
+}
-function repaintTest() {
+function externalLoadDone() {
useElement.href.baseVal = "#MyRect";
shouldBeEqualToString("useElement.href.baseVal", "#MyRect");
Modified: trunk/Source/WebCore/ChangeLog (110710 => 110711)
--- trunk/Source/WebCore/ChangeLog 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/ChangeLog 2012-03-14 16:59:16 UTC (rev 110711)
@@ -1,3 +1,67 @@
+2012-03-14 Nikolas Zimmermann <[email protected]>
+
+ Make SVGUseElement respect & support externalResourcesRequired
+ https://bugs.webkit.org/show_bug.cgi?id=81109
+
+ Reviewed by Rob Buis.
+
+ Generalize the existing externalResourcesRequired support from SVGScriptElement
+ into SVGExternalResourcesRequired, so it can be shared with SVGUseElement, which
+ was lacking proper externalResourcesRequired support.
+
+ <use xlink:href="" _onload_="alert('hi')" externalResourcesRequired="true"/>
+ The onload handler now fires _after_ the external resources loaded, making it possible
+ to write reliable tests that switch from internal to external resources or the other
+ way around. Converted the new tests in svg/dynamic-updates/SVGUseElement* to listen
+ to SVGLoad events, to make them reliable.
+
+ We may be able to generalize this to cover SVGImageElement as well (the only other class which
+ is currently supporting externalResourcesRequired - but that's more involved, so I left it TODO).
+
+ Covered by existing tests and the changes to the new SVGUseElement tests.
+
+ * svg/SVGElement.h:
+ (SVGElement): Make haveLoadedRequiredResources() public so SVGExternalResourcesRequired can call it.
+ * svg/SVGExternalResourcesRequired.cpp: Refactored code from SVGScriptElement, 1:1 copies w/o changes.
+ (WebCore::SVGExternalResourcesRequired::handleAttributeChange):
+ (WebCore::SVGExternalResourcesRequired::dispatchLoadEvent):
+ (WebCore::SVGExternalResourcesRequired::insertedIntoDocument):
+ (WebCore::SVGExternalResourcesRequired::finishParsingChildren):
+ (WebCore::SVGExternalResourcesRequired::haveLoadedRequiredResources):
+ * svg/SVGExternalResourcesRequired.h: Add new virtual functions, that must be available in classes that inherit from SVGExternalResourcesRequired.
+ (WebCore::SVGExternalResourcesRequired::setHaveFiredLoadEvent):
+ (WebCore::SVGExternalResourcesRequired::isParserInserted):
+ (WebCore::SVGExternalResourcesRequired::haveFiredLoadEvent):
+ * svg/SVGScriptElement.cpp: Refactored externalResourcesRequired handling into SVGExternalResourcesRequired.
+ (WebCore::SVGScriptElement::svgAttributeChanged):
+ (WebCore::SVGScriptElement::insertedIntoDocument):
+ (WebCore::SVGScriptElement::finishParsingChildren):
+ * svg/SVGScriptElement.h: Ditto.
+ (WebCore::SVGScriptElement::haveLoadedRequiredResources):
+ (WebCore::SVGScriptElement::dispatchLoadEvent):
+ (WebCore::SVGScriptElement::setHaveFiredLoadEvent):
+ (WebCore::SVGScriptElement::isParserInserted):
+ (WebCore::SVGScriptElement::haveFiredLoadEvent):
+ * svg/SVGTests.cpp: Fix obvious typo, that leads to an assertion. Always return true if we know the attributeName.
+ (WebCore::SVGTests::handleAttributeChange):
+ * svg/SVGTests.h:
+ * svg/SVGTextPathElement.cpp:
+ (WebCore::SVGTextPathElement::insertedIntoDocument): Remove ambigous call warning.
+ * svg/SVGUseElement.cpp: Support externalResourcesRequired="true/false" + dynamic changes of it. Covered by existing tests.
+ (WebCore::SVGUseElement::SVGUseElement):
+ (WebCore::SVGUseElement::create):
+ (WebCore::SVGUseElement::insertedIntoDocument):
+ (WebCore::SVGUseElement::svgAttributeChanged):
+ (WebCore::SVGUseElement::notifyFinished):
+ (WebCore::SVGUseElement::finishParsingChildren):
+ (WebCore):
+ * svg/SVGUseElement.h: Ditto.
+ (WebCore::SVGUseElement::haveLoadedRequiredResources):
+ (WebCore::SVGUseElement::setHaveFiredLoadEvent):
+ (WebCore::SVGUseElement::isParserInserted):
+ (WebCore::SVGUseElement::haveFiredLoadEvent):
+ * svg/svgtags.in: Pass "bool wasInsertedByParser" to SVGUseElement constructor.
+
2012-03-14 Andrew Lo <[email protected]>
[BlackBerry] Implement REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR using AnimationFrameRateController
Modified: trunk/Source/WebCore/svg/SVGElement.h (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGElement.h 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGElement.h 2012-03-14 16:59:16 UTC (rev 110711)
@@ -110,6 +110,8 @@
StylePropertySet* animatedSMILStyleProperties() const;
StylePropertySet* ensureAnimatedSMILStyleProperties();
+ virtual bool haveLoadedRequiredResources();
+
protected:
SVGElement(const QualifiedName&, Document*, ConstructionType = CreateSVGElement);
@@ -136,7 +138,6 @@
void mapInstanceToElement(SVGElementInstance*);
void removeInstanceMapping(SVGElementInstance*);
- virtual bool haveLoadedRequiredResources();
};
struct SVGAttributeHashTranslator {
Modified: trunk/Source/WebCore/svg/SVGExternalResourcesRequired.cpp (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGExternalResourcesRequired.cpp 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGExternalResourcesRequired.cpp 2012-03-14 16:59:16 UTC (rev 110711)
@@ -48,6 +48,76 @@
supportedAttributes.add(SVGNames::externalResourcesRequiredAttr);
}
+bool SVGExternalResourcesRequired::handleAttributeChange(SVGElement* targetElement, const QualifiedName& attrName)
+{
+ ASSERT(targetElement);
+ if (!isKnownAttribute(attrName))
+ return false;
+ if (!targetElement->inDocument())
+ return true;
+
+ // Handle dynamic updates of the 'externalResourcesRequired' attribute. Only possible case: changing from 'true' to 'false'
+ // causes an immediate dispatch of the SVGLoad event. If the attribute value was 'false' before inserting the script element
+ // in the document, the SVGLoad event has already been dispatched.
+ if (!externalResourcesRequiredBaseValue() && !haveFiredLoadEvent() && !isParserInserted()) {
+ setHaveFiredLoadEvent(true);
+ ASSERT(targetElement->haveLoadedRequiredResources());
+
+ targetElement->sendSVGLoadEventIfPossible();
+ }
+
+ return true;
}
+void SVGExternalResourcesRequired::dispatchLoadEvent(SVGElement* targetElement)
+{
+ bool externalResourcesRequired = externalResourcesRequiredBaseValue();
+
+ if (isParserInserted())
+ ASSERT(externalResourcesRequired != haveFiredLoadEvent());
+ else if (haveFiredLoadEvent())
+ return;
+
+ // HTML and SVG differ completely in the 'onload' event handling of <script> elements.
+ // HTML fires the 'load' event after it sucessfully loaded a remote resource, otherwise an error event.
+ // SVG fires the SVGLoad event immediately after parsing the <script> element, if externalResourcesRequired
+ // is set to 'false', otherwise it dispatches the 'SVGLoad' event just after loading the remote resource.
+ if (!externalResourcesRequired)
+ return;
+
+ ASSERT(!haveFiredLoadEvent());
+
+ // Dispatch SVGLoad event
+ setHaveFiredLoadEvent(true);
+ ASSERT(targetElement->haveLoadedRequiredResources());
+
+ targetElement->sendSVGLoadEventIfPossible();
+}
+
+void SVGExternalResourcesRequired::insertedIntoDocument(SVGElement* targetElement)
+{
+ if (isParserInserted())
+ return;
+
+ // Eventually send SVGLoad event now for the dynamically inserted script element.
+ if (externalResourcesRequiredBaseValue())
+ return;
+ setHaveFiredLoadEvent(true);
+ targetElement->sendSVGLoadEventIfPossible();
+}
+
+void SVGExternalResourcesRequired::finishParsingChildren()
+{
+ // A SVGLoad event has been fired by SVGElement::finishParsingChildren.
+ if (!externalResourcesRequiredBaseValue())
+ setHaveFiredLoadEvent(true);
+}
+
+bool SVGExternalResourcesRequired::haveLoadedRequiredResources() const
+{
+ return !externalResourcesRequiredBaseValue() || haveFiredLoadEvent();
+}
+
+}
+
#endif // ENABLE(SVG)
Modified: trunk/Source/WebCore/svg/SVGExternalResourcesRequired.h (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGExternalResourcesRequired.h 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGExternalResourcesRequired.h 2012-03-14 16:59:16 UTC (rev 110711)
@@ -42,9 +42,21 @@
bool parseAttribute(Attribute*);
bool isKnownAttribute(const QualifiedName&);
void addSupportedAttributes(HashSet<QualifiedName>&);
+ bool handleAttributeChange(SVGElement*, const QualifiedName&);
protected:
+ // These types look a bit awkward, but have to match the generic types of the SVGAnimatedProperty macros.
virtual void setExternalResourcesRequiredBaseValue(const bool&) = 0;
+ virtual bool& externalResourcesRequiredBaseValue() const = 0;
+
+ virtual void setHaveFiredLoadEvent(bool) { }
+ virtual bool isParserInserted() const { return false; }
+ virtual bool haveFiredLoadEvent() const { return false; }
+
+ void dispatchLoadEvent(SVGElement*);
+ void insertedIntoDocument(SVGElement*);
+ void finishParsingChildren();
+ bool haveLoadedRequiredResources() const;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/svg/SVGScriptElement.cpp (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGScriptElement.cpp 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGScriptElement.cpp 2012-03-14 16:59:16 UTC (rev 110711)
@@ -111,18 +111,8 @@
return;
}
- if (SVGExternalResourcesRequired::isKnownAttribute(attrName)) {
- // Handle dynamic updates of the 'externalResourcesRequired' attribute. Only possible case: changing from 'true' to 'false'
- // causes an immediate dispatch of the SVGLoad event. If the attribute value was 'false' before inserting the script element
- // in the document, the SVGLoad event has already been dispatched.
- if (!externalResourcesRequiredBaseValue() && !haveFiredLoadEvent() && !isParserInserted()) {
- setHaveFiredLoadEvent(true);
- ASSERT(haveLoadedRequiredResources());
-
- sendSVGLoadEventIfPossible();
- }
+ if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName))
return;
- }
ASSERT_NOT_REACHED();
}
@@ -131,15 +121,7 @@
{
SVGElement::insertedIntoDocument();
ScriptElement::insertedIntoDocument();
-
- if (isParserInserted())
- return;
-
- // Eventually send SVGLoad event now for the dynamically inserted script element
- if (!externalResourcesRequiredBaseValue()) {
- setHaveFiredLoadEvent(true);
- sendSVGLoadEventIfPossible();
- }
+ SVGExternalResourcesRequired::insertedIntoDocument(this);
}
void SVGScriptElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
@@ -156,10 +138,7 @@
void SVGScriptElement::finishParsingChildren()
{
SVGElement::finishParsingChildren();
-
- // A SVGLoad event has been fired by SVGElement::finishParsingChildren.
- if (!externalResourcesRequiredBaseValue())
- setHaveFiredLoadEvent(true);
+ SVGExternalResourcesRequired::finishParsingChildren();
}
String SVGScriptElement::type() const
@@ -179,11 +158,6 @@
addSubresourceURL(urls, document()->completeURL(href()));
}
-bool SVGScriptElement::haveLoadedRequiredResources()
-{
- return !externalResourcesRequiredBaseValue() || haveFiredLoadEvent();
-}
-
String SVGScriptElement::sourceAttributeValue() const
{
return href();
@@ -229,34 +203,6 @@
return hasAttribute(XLinkNames::hrefAttr);
}
-void SVGScriptElement::dispatchLoadEvent()
-{
- bool externalResourcesRequired = externalResourcesRequiredBaseValue();
-
- if (isParserInserted())
- ASSERT(externalResourcesRequired != haveFiredLoadEvent());
- else if (haveFiredLoadEvent()) {
- // If we've already fired an load event and externalResourcesRequired is set to 'true'
- // externalResourcesRequired has been modified while loading the <script>. Don't dispatch twice.
- if (externalResourcesRequired)
- return;
- }
-
- // HTML and SVG differ completly in the 'onload' event handling of <script> elements.
- // HTML fires the 'load' event after it sucessfully loaded a remote resource, otherwhise an error event.
- // SVG fires the SVGLoad event immediately after parsing the <script> element, if externalResourcesRequired
- // is set to 'false', otherwhise it dispatches the 'SVGLoad' event just after loading the remote resource.
- if (externalResourcesRequired) {
- ASSERT(!haveFiredLoadEvent());
-
- // Dispatch SVGLoad event
- setHaveFiredLoadEvent(true);
- ASSERT(haveLoadedRequiredResources());
-
- sendSVGLoadEventIfPossible();
- }
-}
-
PassRefPtr<Element> SVGScriptElement::cloneElementWithoutAttributesAndChildren()
{
return adoptRef(new SVGScriptElement(tagQName(), document(), false, alreadyStarted()));
Modified: trunk/Source/WebCore/svg/SVGScriptElement.h (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGScriptElement.h 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGScriptElement.h 2012-03-14 16:59:16 UTC (rev 110711)
@@ -55,7 +55,7 @@
virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
- virtual bool haveLoadedRequiredResources();
+ virtual bool haveLoadedRequiredResources() { return SVGExternalResourcesRequired::haveLoadedRequiredResources(); }
virtual String sourceAttributeValue() const;
virtual String charsetAttributeValue() const;
@@ -67,10 +67,15 @@
virtual bool deferAttributeValue() const;
virtual bool hasSourceAttribute() const;
- virtual void dispatchLoadEvent();
+ virtual void dispatchLoadEvent() { SVGExternalResourcesRequired::dispatchLoadEvent(this); }
virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren();
+ // SVGExternalResourcesRequired
+ virtual void setHaveFiredLoadEvent(bool haveFiredLoadEvent) { ScriptElement::setHaveFiredLoadEvent(haveFiredLoadEvent); }
+ virtual bool isParserInserted() const { return ScriptElement::isParserInserted(); }
+ virtual bool haveFiredLoadEvent() const { return ScriptElement::haveFiredLoadEvent(); }
+
BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGScriptElement)
DECLARE_ANIMATED_STRING(Href, href)
DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
Modified: trunk/Source/WebCore/svg/SVGTests.cpp (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGTests.cpp 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGTests.cpp 2012-03-14 16:59:16 UTC (rev 110711)
@@ -145,19 +145,18 @@
|| attrName == SVGNames::systemLanguageAttr;
}
-bool SVGTests::handleAttributeChange(const SVGElement* targetElement, const QualifiedName& attrName)
+bool SVGTests::handleAttributeChange(SVGElement* targetElement, const QualifiedName& attrName)
{
+ ASSERT(targetElement);
if (!isKnownAttribute(attrName))
return false;
if (!targetElement->inDocument())
- return false;
- SVGElement* svgElement = const_cast<SVGElement*>(targetElement);
- ASSERT(svgElement);
- bool valid = svgElement->isValid();
- if (valid && !svgElement->attached())
- svgElement->attach();
- if (!valid && svgElement->attached())
- svgElement->detach();
+ return true;
+ bool valid = targetElement->isValid();
+ if (valid && !targetElement->attached())
+ targetElement->attach();
+ if (!valid && targetElement->attached())
+ targetElement->detach();
return true;
}
Modified: trunk/Source/WebCore/svg/SVGTests.h (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGTests.h 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGTests.h 2012-03-14 16:59:16 UTC (rev 110711)
@@ -45,7 +45,7 @@
bool isKnownAttribute(const QualifiedName&);
void addSupportedAttributes(HashSet<QualifiedName>&);
- bool handleAttributeChange(const SVGElement*, const QualifiedName&);
+ bool handleAttributeChange(SVGElement*, const QualifiedName&);
static SVGAttributeToPropertyMap& attributeToPropertyMap();
Modified: trunk/Source/WebCore/svg/SVGTextPathElement.cpp (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGTextPathElement.cpp 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGTextPathElement.cpp 2012-03-14 16:59:16 UTC (rev 110711)
@@ -141,7 +141,7 @@
void SVGTextPathElement::insertedIntoDocument()
{
- SVGTextContentElement::insertedIntoDocument();
+ SVGStyledElement::insertedIntoDocument();
String id;
Element* targetElement = SVGURIReference::targetElementFromIRIString(href(), document(), &id);
Modified: trunk/Source/WebCore/svg/SVGUseElement.cpp (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGUseElement.cpp 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGUseElement.cpp 2012-03-14 16:59:16 UTC (rev 110711)
@@ -80,12 +80,14 @@
REGISTER_PARENT_ANIMATED_PROPERTIES(SVGTests)
END_REGISTER_ANIMATED_PROPERTIES
-inline SVGUseElement::SVGUseElement(const QualifiedName& tagName, Document* document)
+inline SVGUseElement::SVGUseElement(const QualifiedName& tagName, Document* document, bool wasInsertedByParser)
: SVGStyledTransformableElement(tagName, document)
, m_x(LengthModeWidth)
, m_y(LengthModeHeight)
, m_width(LengthModeWidth)
, m_height(LengthModeHeight)
+ , m_wasInsertedByParser(wasInsertedByParser)
+ , m_haveFiredLoadEvent(false)
, m_needsShadowTreeRecreation(false)
{
ASSERT(hasTagName(SVGNames::useTag));
@@ -94,10 +96,10 @@
setHasCustomWillOrDidRecalcStyle();
}
-PassRefPtr<SVGUseElement> SVGUseElement::create(const QualifiedName& tagName, Document* document)
+PassRefPtr<SVGUseElement> SVGUseElement::create(const QualifiedName& tagName, Document* document, bool wasInsertedByParser)
{
// Always build a #shadow-root for SVGUseElement.
- RefPtr<SVGUseElement> use = adoptRef(new SVGUseElement(tagName, document));
+ RefPtr<SVGUseElement> use = adoptRef(new SVGUseElement(tagName, document, wasInsertedByParser));
use->ensureShadowRoot();
return use.release();
}
@@ -180,6 +182,7 @@
ASSERT(!m_targetElementInstance || !isWellFormedDocument(document()));
ASSERT(!hasPendingResources() || !isWellFormedDocument(document()));
buildPendingResource();
+ SVGExternalResourcesRequired::insertedIntoDocument(this);
}
void SVGUseElement::removedFromDocument()
@@ -230,6 +233,9 @@
if (SVGTests::handleAttributeChange(this, attrName))
return;
+ if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName))
+ return;
+
if (SVGURIReference::isKnownAttribute(attrName)) {
bool isExternalReference = isExternalURIReference(href(), document());
if (isExternalReference) {
@@ -911,12 +917,16 @@
return static_cast<SVGStyledElement*>(element)->hasRelativeLengths();
}
-void SVGUseElement::notifyFinished(CachedResource*)
+void SVGUseElement::notifyFinished(CachedResource* resource)
{
if (!inDocument())
return;
invalidateShadowTree();
+ if (resource->errorOccurred())
+ dispatchEvent(Event::create(eventNames().errorEvent, false, false));
+ else if (!resource->wasCanceled())
+ SVGExternalResourcesRequired::dispatchLoadEvent(this);
}
bool SVGUseElement::cachedDocumentIsStillLoading()
@@ -939,6 +949,12 @@
return false;
}
+void SVGUseElement::finishParsingChildren()
+{
+ SVGStyledTransformableElement::finishParsingChildren();
+ SVGExternalResourcesRequired::finishParsingChildren();
}
+}
+
#endif // ENABLE(SVG)
Modified: trunk/Source/WebCore/svg/SVGUseElement.h (110710 => 110711)
--- trunk/Source/WebCore/svg/SVGUseElement.h 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/SVGUseElement.h 2012-03-14 16:59:16 UTC (rev 110711)
@@ -43,7 +43,7 @@
public SVGURIReference,
public CachedSVGDocumentClient {
public:
- static PassRefPtr<SVGUseElement> create(const QualifiedName&, Document*);
+ static PassRefPtr<SVGUseElement> create(const QualifiedName&, Document*, bool wasInsertedByParser);
virtual ~SVGUseElement();
SVGElementInstance* instanceRoot();
@@ -54,7 +54,7 @@
RenderObject* rendererClipChild() const;
private:
- SVGUseElement(const QualifiedName&, Document*);
+ SVGUseElement(const QualifiedName&, Document*, bool wasInsertedByParser);
virtual bool isValid() const { return SVGTests::isValid(); }
virtual bool supportsFocus() const { return true; }
@@ -76,6 +76,9 @@
void buildShadowAndInstanceTree(SVGElement* target);
void detachInstance();
+ virtual bool haveLoadedRequiredResources() { return SVGExternalResourcesRequired::haveLoadedRequiredResources(); }
+
+ virtual void finishParsingChildren();
virtual bool selfHasRelativeLengths() const;
// Instance tree handling
@@ -115,6 +118,13 @@
virtual void synchronizeRequiredExtensions() { SVGTests::synchronizeRequiredExtensions(this); }
virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
+ // SVGExternalResourcesRequired
+ virtual void setHaveFiredLoadEvent(bool haveFiredLoadEvent) { m_haveFiredLoadEvent = haveFiredLoadEvent; }
+ virtual bool isParserInserted() const { return m_wasInsertedByParser; }
+ virtual bool haveFiredLoadEvent() const { return m_haveFiredLoadEvent; }
+
+ bool m_wasInsertedByParser;
+ bool m_haveFiredLoadEvent;
bool m_needsShadowTreeRecreation;
RefPtr<SVGElementInstance> m_targetElementInstance;
CachedResourceHandle<CachedSVGDocument> m_cachedDocument;
Modified: trunk/Source/WebCore/svg/svgtags.in (110710 => 110711)
--- trunk/Source/WebCore/svg/svgtags.in 2012-03-14 16:32:40 UTC (rev 110710)
+++ trunk/Source/WebCore/svg/svgtags.in 2012-03-14 16:59:16 UTC (rev 110711)
@@ -93,7 +93,7 @@
title
tref interfaceName=SVGTRefElement
tspan interfaceName=SVGTSpanElement
-use
+use constructorNeedsCreatedByParser
view
#if ENABLE_SVG_FONTS
vkern interfaceName=SVGVKernElement