Load event must be fired only for the SVG structurally external elements and the...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Oct 2019 18:29:11 +0000 (18:29 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Oct 2019 18:29:11 +0000 (18:29 +0000)
commit0a76f1a3560134d892ab876286240943e8d69dc1
tree6be1de7e0d4c3971bc80631e79908160abf3bb10
parentef8429f46ce278243cdc1cf49f84a9a6e6d6a572
Load event must be fired only for the SVG structurally external elements and the outermost SVG element
https://bugs.webkit.org/show_bug.cgi?id=203044

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-10-18
Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

* web-platform-tests/svg/geometry/svg-image-intrinsic-size-with-cssstyle-auto-expected.txt:
The timeout issues are now fixed. webkit.org/b/202013 will fix the other
failures.

* web-platform-tests/svg/images/20x20.png: Added.
Add an image which is referenced by these tests:
    web-platform-tests/svg/import/styling-pres-02-f-manual.svg
    web-platform-tests/svg/import/struct-use-01-t-manual.svg
    web-platform-tests/svg/import/interact-events-02-b-manual.svg

* web-platform-tests/svg/linking/scripted/href-script-element-expected.txt:

Source/WebCore:

The SVG1.1 spec for SVGLoad event is:
    https://www.w3.org/TR/SVG11/interact.html

The SVG2 spec for the load event is:
    https://www.w3.org/TR/SVG/changes.html#interact
    https://www.w3.org/TR/SVG/interact.html

SVG2 removes the SVGExternalResourcesRequired interface. It also simplifies
the rules for firing the load event and made them consistent with the HTML
specs. The plan is to remove SVGExternalResourcesRequired in a following
patch. This patch makes SVGExternalResourcesRequired have no effect on the
load event firing rules. It moves all the functionalities to SVGURIReference
as a step towards removing the SVGExternalResourcesRequired interface.

Test: svg/custom/image-load-event.html

* dom/Document.cpp:
(WebCore::Document::implicitClose):
Do not use the SVGLoad term. It has been removed from the specs.

* dom/ScriptElement.cpp:
(WebCore::ScriptElement::ScriptElement):
* dom/ScriptElement.h:
(WebCore::ScriptElement::errorOccurred const):
(WebCore::ScriptElement::setErrorOccurred):
Add a method to track the occurrence  of loading error. errorOccurred()
|| haveFiredLoadEvent() means no pending loading activity.

* svg/SVGDocumentExtensions.cpp:
(WebCore::SVGDocumentExtensions::dispatchLoadEventToOutermostSVGElements):
(WebCore::SVGDocumentExtensions::dispatchSVGLoadEventToOutermostSVGElements): Deleted.
* svg/SVGDocumentExtensions.h:
Do not use the SVGLoad term.

* svg/SVGElement.cpp:
(WebCore::SVGElement::sendLoadEventIfPossible):
(WebCore::SVGElement::loadEventTimerFired):
(WebCore::SVGElement::loadEventTimer):
(WebCore::SVGElement::finishParsingChildren):
(WebCore::SVGElement::sendSVGLoadEventIfPossible): Deleted.
(WebCore::SVGElement::sendSVGLoadEventIfPossibleAsynchronously): Deleted.
(WebCore::SVGElement::svgLoadEventTimerFired): Deleted.
(WebCore::SVGElement::svgLoadEventTimer): Deleted.
* svg/SVGElement.h:
finishParsingChildren() won't fire 'load' event anymore. The 'load' event
will be fired explicitly for the outermost SVG element from Document::implicitClose().

* svg/SVGExternalResourcesRequired.cpp:
(WebCore::SVGExternalResourcesRequired::svgAttributeChanged):
(WebCore::SVGExternalResourcesRequired::dispatchLoadEvent): Deleted.
(WebCore::SVGExternalResourcesRequired::insertedIntoDocument): Deleted.
(WebCore::SVGExternalResourcesRequired::finishParsingChildren): Deleted.
(WebCore::SVGExternalResourcesRequired::haveLoadedRequiredResources const): Deleted.
* svg/SVGExternalResourcesRequired.h:
(WebCore::SVGExternalResourcesRequired::setHaveFiredLoadEvent): Deleted.
(WebCore::SVGExternalResourcesRequired::isParserInserted const): Deleted.
(WebCore::SVGExternalResourcesRequired::haveFiredLoadEvent const): Deleted.
* svg/SVGImageElement.cpp:
(WebCore::SVGImageElement::haveLoadedRequiredResources):
* svg/SVGImageLoader.cpp:
(WebCore::SVGImageLoader::dispatchLoadEvent):
The value of externalResourcesRequired() no longer controls firing the
'load' event.

* svg/SVGScriptElement.cpp:
(WebCore::SVGScriptElement::SVGScriptElement):
(WebCore::SVGScriptElement::insertedIntoAncestor):
(WebCore::SVGScriptElement::dispatchErrorEvent):
(WebCore::SVGScriptElement::finishParsingChildren): Deleted.
* svg/SVGScriptElement.h:
dispatchErrorEvent() is now a virtual function. Let SVGScriptElement
overrides it so it can track when the loader finishes its activity.

* svg/SVGStyleElement.cpp:
(WebCore::SVGStyleElement::SVGStyleElement):
* svg/SVGStyleElement.h:

* svg/SVGURIReference.cpp:
(WebCore::SVGURIReference::contextElement const):
(WebCore::SVGURIReference::parseAttribute):
(WebCore::SVGURIReference::haveLoadedRequiredResources const):
(WebCore::SVGURIReference::dispatchLoadEvent):
* svg/SVGURIReference.h:
(WebCore::SVGURIReference::haveFiredLoadEvent const):
(WebCore::SVGURIReference::setHaveFiredLoadEvent):
(WebCore::SVGURIReference::errorOccurred const):
(WebCore::SVGURIReference::setErrorOccurred):
SVGURIReference will decide whether the 'load' event can be fired or not.

* svg/SVGUseElement.cpp:
(WebCore::SVGUseElement::SVGUseElement):
(WebCore::SVGUseElement::insertedIntoAncestor):
(WebCore::SVGUseElement::notifyFinished):
(WebCore::SVGUseElement::finishParsingChildren): Deleted.
(WebCore::SVGUseElement::isValid const): Deleted.
(WebCore::SVGUseElement::haveLoadedRequiredResources): Deleted.
(WebCore::SVGUseElement::setHaveFiredLoadEvent): Deleted.
(WebCore::SVGUseElement::haveFiredLoadEvent const): Deleted.
(WebCore::SVGUseElement::svgLoadEventTimer): Deleted.
* svg/SVGUseElement.h:
SVGUseElement needs to track firing the load event or error occurrence
the same way SVGImageElement and SVGScriptElement do.

LayoutTests:

* fast/dom/crash-moving-subtree-between-documents.html:
* fast/dom/focus-style-resolution.html:
* fast/html/marquee-reparent-check.html:
The SVGElement element should not fire "load" event. Set the HTML <body>
element's "onload" event handler to be the function which was set to the
SVGElement's "onload" event handler.

* svg/custom/image-load-event-expected.html: Added.
* svg/custom/image-load-event.html: Added.
Images with external resources or data URIs must fire load events once
the data is loaded or decoded.

* svg/custom/loadevents-async-expected.txt: Removed.
* svg/custom/loadevents-async.html: Removed.
* svg/custom/loadevents-capturing-expected.txt: Removed.
* svg/custom/loadevents-capturing.svg: Removed.
* svg/custom/loadevents-externalresourcesrequired-displaynone-expected.txt: Removed.
* svg/custom/loadevents-externalresourcesrequired-displaynone.svg: Removed.
* svg/custom/loadevents-externalresourcesrequired-expected.txt: Removed.
* svg/custom/loadevents-externalresourcesrequired.svg: Removed.
* svg/custom/loadevents-normal-displaynone-expected.txt: Removed.
* svg/custom/loadevents-normal-displaynone.svg: Removed.
* svg/custom/loadevents-normal-expected.txt: Removed.
* svg/custom/loadevents-normal.svg: Removed.
These tests were implementing the SVG1.1 SVGLoad event interactivity:
https://www.w3.org/TR/SVG11/interact.html where every SVG element had to
fire the SVGLoad event once it parsed its closing tag. SVG structurally
external elements were firing load events when the corresponding external
resources had finished loading but only if externalResourcesRequired = true.

* svg/dom/SVGScriptElement/script-load-and-error-events.svg:
This test had two wrong assumptions:
1) The SVG structurally external element fires a load event when parsing
the children finishes. Then they may fire another load or error event if
externalResourcesRequired = true.
2) The outermost SVG element will not fire its load event unless all the
children fires their load events correctly.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251290 268f45cc-cd09-0410-ab3c-d52691b4dbfc
43 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/crash-moving-subtree-between-documents.html
LayoutTests/fast/dom/focus-style-resolution.html
LayoutTests/fast/html/marquee-reparent-check.html
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/svg/geometry/svg-image-intrinsic-size-with-cssstyle-auto-expected.txt
LayoutTests/imported/w3c/web-platform-tests/svg/images/20x20.png [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/svg/linking/scripted/href-script-element-expected.txt
LayoutTests/svg/custom/image-load-event-expected.html [new file with mode: 0644]
LayoutTests/svg/custom/image-load-event.html [new file with mode: 0644]
LayoutTests/svg/custom/loadevents-async-expected.txt [deleted file]
LayoutTests/svg/custom/loadevents-async.html [deleted file]
LayoutTests/svg/custom/loadevents-capturing-expected.txt [deleted file]
LayoutTests/svg/custom/loadevents-capturing.svg [deleted file]
LayoutTests/svg/custom/loadevents-externalresourcesrequired-displaynone-expected.txt [deleted file]
LayoutTests/svg/custom/loadevents-externalresourcesrequired-displaynone.svg [deleted file]
LayoutTests/svg/custom/loadevents-externalresourcesrequired-expected.txt [deleted file]
LayoutTests/svg/custom/loadevents-externalresourcesrequired.svg [deleted file]
LayoutTests/svg/custom/loadevents-normal-displaynone-expected.txt [deleted file]
LayoutTests/svg/custom/loadevents-normal-displaynone.svg [deleted file]
LayoutTests/svg/custom/loadevents-normal-expected.txt [deleted file]
LayoutTests/svg/custom/loadevents-normal.svg [deleted file]
LayoutTests/svg/dom/SVGScriptElement/script-load-and-error-events.svg
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/ScriptElement.cpp
Source/WebCore/dom/ScriptElement.h
Source/WebCore/svg/SVGDocumentExtensions.cpp
Source/WebCore/svg/SVGDocumentExtensions.h
Source/WebCore/svg/SVGElement.cpp
Source/WebCore/svg/SVGElement.h
Source/WebCore/svg/SVGExternalResourcesRequired.cpp
Source/WebCore/svg/SVGExternalResourcesRequired.h
Source/WebCore/svg/SVGImageElement.cpp
Source/WebCore/svg/SVGImageLoader.cpp
Source/WebCore/svg/SVGScriptElement.cpp
Source/WebCore/svg/SVGScriptElement.h
Source/WebCore/svg/SVGStyleElement.cpp
Source/WebCore/svg/SVGStyleElement.h
Source/WebCore/svg/SVGURIReference.cpp
Source/WebCore/svg/SVGURIReference.h
Source/WebCore/svg/SVGUseElement.cpp
Source/WebCore/svg/SVGUseElement.h