OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde .org> | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde .org> |
3 * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2008 Apple Inc. All rights reserved. | 4 * Copyright (C) 2008 Apple Inc. All rights reserved. |
5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> | 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> |
6 * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> | 6 * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
829 const EventListenerVector& entry = element->getEventListeners(EventTypeN ames::load); | 829 const EventListenerVector& entry = element->getEventListeners(EventTypeN ames::load); |
830 for (size_t i = 0; i < entry.size(); ++i) { | 830 for (size_t i = 0; i < entry.size(); ++i) { |
831 if (entry[i].useCapture) | 831 if (entry[i].useCapture) |
832 return true; | 832 return true; |
833 } | 833 } |
834 } | 834 } |
835 | 835 |
836 return false; | 836 return false; |
837 } | 837 } |
838 | 838 |
839 void SVGElement::sendSVGLoadEventIfPossible(bool sendParentLoadEvents) | 839 bool SVGElement::sendSVGLoadEventIfPossible() |
840 { | 840 { |
841 RefPtrWillBeRawPtr<SVGElement> currentTarget = this; | 841 if (!haveLoadedRequiredResources()) |
842 while (currentTarget && currentTarget->haveLoadedRequiredResources()) { | 842 return false; |
843 RefPtrWillBeRawPtr<Element> parent = nullptr; | 843 if ((isStructurallyExternal() || isSVGSVGElement(*this)) && hasLoadListener( this)) |
844 if (sendParentLoadEvents) | 844 dispatchEvent(Event::create(EventTypeNames::load)); |
845 parent = currentTarget->parentOrShadowHostElement(); // save the nex t parent to dispatch too incase dispatching the event changes the tree | 845 return true; |
846 if (hasLoadListener(currentTarget.get()) | 846 } |
847 && (currentTarget->isStructurallyExternal() || isSVGSVGElement(*curr entTarget))) | |
848 currentTarget->dispatchEvent(Event::create(EventTypeNames::load)); | |
849 currentTarget = (parent && parent->isSVGElement()) ? static_pointer_cast <SVGElement>(parent) : nullptr; | |
850 SVGElement* element = currentTarget.get(); | |
851 if (!element || !element->isOutermostSVGSVGElement()) | |
852 continue; | |
853 | 847 |
854 // Consider <svg onload="foo()"><image xlink:href="foo.png" externalReso urcesRequired="true"/></svg>. | 848 void SVGElement::sendSVGLoadEventToSelfAndAncestorChainIfPossible() |
855 // If foo.png is not yet loaded, the first SVGLoad event will go to the <svg> element, sent through | 849 { |
856 // Document::implicitClose(). Then the SVGLoad event will fire for <imag e>, once its loaded. | 850 // Let Document::implicitClose() dispatch the 'load' to the outermost SVG ro ot. |
857 ASSERT(sendParentLoadEvents); | 851 if (isOutermostSVGSVGElement()) |
852 return; | |
858 | 853 |
859 // If the load event was not sent yet by Document::implicitClose(), but the <image> from the example | 854 // Save the next parent to dispatch to in case dispatching the event mutates the tree. |
860 // above, just appeared, don't send the SVGLoad event to the outermost < svg>, but wait for the document | 855 RefPtrWillBeRawPtr<Element> parent = parentOrShadowHostElement(); |
861 // to be "ready to render", first. | 856 if (!sendSVGLoadEventIfPossible()) |
862 if (!document().loadEventFinished()) | 857 return; |
863 break; | 858 |
864 } | 859 // If document/window 'load' has been sent already, then only deliver to |
860 // the element in question. | |
861 if (document().loadEventFinished()) | |
862 return; | |
863 | |
864 if (!parent || !parent->isSVGElement()) | |
865 return; | |
866 | |
867 static_pointer_cast<SVGElement>(parent)->sendSVGLoadEventToSelfAndAncestorCh ainIfPossible(); | |
pdr.
2014/07/10 03:48:15
Should this be toSVGElement(parent)->sendSVGLoadEv
fs
2014/07/10 08:32:50
Yeah, could be. Changed.
| |
865 } | 868 } |
866 | 869 |
867 void SVGElement::sendSVGLoadEventIfPossibleAsynchronously() | 870 void SVGElement::sendSVGLoadEventIfPossibleAsynchronously() |
868 { | 871 { |
869 svgLoadEventTimer()->startOneShot(0, FROM_HERE); | 872 svgLoadEventTimer()->startOneShot(0, FROM_HERE); |
870 } | 873 } |
871 | 874 |
872 void SVGElement::svgLoadEventTimerFired(Timer<SVGElement>*) | 875 void SVGElement::svgLoadEventTimerFired(Timer<SVGElement>*) |
873 { | 876 { |
874 sendSVGLoadEventIfPossible(); | 877 sendSVGLoadEventIfPossible(); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1211 Element::trace(visitor); | 1214 Element::trace(visitor); |
1212 } | 1215 } |
1213 | 1216 |
1214 const AtomicString& SVGElement::eventParameterName() | 1217 const AtomicString& SVGElement::eventParameterName() |
1215 { | 1218 { |
1216 DEFINE_STATIC_LOCAL(const AtomicString, evtString, ("evt", AtomicString::Con structFromLiteral)); | 1219 DEFINE_STATIC_LOCAL(const AtomicString, evtString, ("evt", AtomicString::Con structFromLiteral)); |
1217 return evtString; | 1220 return evtString; |
1218 } | 1221 } |
1219 | 1222 |
1220 } | 1223 } |
OLD | NEW |