void SVGScriptElement::dispatchLoadEvent() { bool externalResourcesRequired = externalResourcesRequiredBaseValue(); if (m_data.createdByParser()) ASSERT(externalResourcesRequired != m_data.haveFiredLoadEvent()); else if (m_data.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(!m_data.haveFiredLoadEvent()); // Dispatch SVGLoad event m_data.setHaveFiredLoadEvent(true); ASSERT(haveLoadedRequiredResources()); sendSVGLoadEventIfPossible(); } }
void SVGScriptElement::finishParsingChildren() { ScriptElement::finishParsingChildren(m_data, sourceAttributeValue()); SVGElement::finishParsingChildren(); // A SVGLoad event has been fired by SVGElement::finishParsingChildren. if (!externalResourcesRequiredBaseValue()) m_data.setHaveFiredLoadEvent(true); }
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 SVGScriptElement::insertedIntoDocument() { SVGElement::insertedIntoDocument(); ScriptElement::insertedIntoDocument(m_data, sourceAttributeValue()); if (m_data.createdByParser()) return; // Eventually send SVGLoad event now for the dynamically inserted script element if (!externalResourcesRequiredBaseValue()) { m_data.setHaveFiredLoadEvent(true); sendSVGLoadEventIfPossible(); } }
void SVGScriptElement::svgAttributeChanged(const QualifiedName& attrName) { SVGElement::svgAttributeChanged(attrName); if (SVGURIReference::isKnownAttribute(attrName)) handleSourceAttribute(m_data, href()); else 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() && !m_data.haveFiredLoadEvent() && !m_data.createdByParser()) { m_data.setHaveFiredLoadEvent(true); ASSERT(haveLoadedRequiredResources()); sendSVGLoadEventIfPossible(); } } }
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(); }
bool SVGImageElement::haveLoadedRequiredResources() { return !externalResourcesRequiredBaseValue() || m_imageLoader.haveFiredLoadEvent(); }
bool SVGScriptElement::haveLoadedRequiredResources() { return !externalResourcesRequiredBaseValue() || m_data.haveFiredLoadEvent(); }
bool SVGImageElement::haveLoadedRequiredResources() { return !externalResourcesRequiredBaseValue() || !m_imageLoader.hasPendingActivity(); }
bool SVGExternalResourcesRequired::haveLoadedRequiredResources() const { return !externalResourcesRequiredBaseValue() || haveFiredLoadEvent(); }
void SVGExternalResourcesRequired::finishParsingChildren() { // A SVGLoad event has been fired by SVGElement::finishParsingChildren. if (!externalResourcesRequiredBaseValue()) setHaveFiredLoadEvent(true); }