Reviewed by Darin Adler and Sam Weinig.
Onclick not fired for an element copied with cloneContents() or cloneNode()
https://bugs.webkit.org/show_bug.cgi?id=25130
The change here is that JS event listeners don't keep a reference to a global object from
where they were created, and instead take it as a parameter when parsing source code. Also,
the listener creation won't fail just because it happens for an element in a frameless
document.
Thus, moving nodes between documents no longer results in having incorrect registered
lazy event listeners on them.
Tests: fast/events/attribute-listener-cloned-from-frameless-doc-context-2.html
fast/events/attribute-listener-cloned-from-frameless-doc-context.html
fast/events/attribute-listener-cloned-from-frameless-doc.xhtml
fast/events/attribute-listener-extracted-from-frameless-doc-context-2.html
fast/events/attribute-listener-extracted-from-frameless-doc-context.html
* bindings/js/JSEventListener.cpp:
(WebCore::JSEventListener::JSEventListener): Don't take a reference to JSDOMGlobalObject.
(WebCore::JSEventListener::jsFunction): Take ScriptExecutionContext as a parameter for
getting to JSDOMGlobalObject. It's not used in base class, but is in JSLazyEventListner.
(WebCore::JSEventListener::markJSFunction): Don't mark the global object.
(WebCore::JSEventListener::handleEvent): Get global object from ScriptExecutionContext.
(WebCore::JSEventListener::reportError): Ditto.
* bindings/js/JSEventListener.h: (WebCore::JSEventListener::create): Don't keep a reference
to JSDOMGlobalObject.
* bindings/js/JSLazyEventListener.cpp: (WebCore::JSLazyEventListener::parseCode): Listener
creation was split between this function and ScriptEventListener; moved it here, as JS
global object can be different now.
* bindings/js/JSLazyEventListener.h: (WebCore::JSLazyEventListener::create): Keep source URL,
which can not be determined at parsing time.
* bindings/js/ScriptEventListener.cpp: (WebCore::createAttributeEventListener): Moved code
for listener creation to JSLazyEventListener. XSSAuditor code remains here, because tests
expect that errors are logged at document parsing time, and because I don't know what other
side effects moving it vould have.
* dom/EventListener.h: handleEvent() and reportError() now take ScriptExecutionContext,
because JSC needs a global context here.
* bindings/js/JSAbstractWorkerCustom.cpp:
(WebCore::JSAbstractWorker::addEventListener):
(WebCore::JSAbstractWorker::removeEventListener):
* bindings/js/JSDOMApplicationCacheCustom.cpp:
(WebCore::JSDOMApplicationCache::addEventListener):
(WebCore::JSDOMApplicationCache::removeEventListener):
* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::createJSAttributeEventListener):
* bindings/js/JSDOMWindowCustom.cpp:
(WebCore::JSDOMWindow::addEventListener):
(WebCore::JSDOMWindow::removeEventListener):
* bindings/js/JSEventSourceCustom.cpp:
(WebCore::JSEventSource::addEventListener):
(WebCore::JSEventSource::removeEventListener):
* bindings/js/JSMessagePortCustom.cpp:
(WebCore::JSMessagePort::addEventListener):
(WebCore::JSMessagePort::removeEventListener):
* bindings/js/JSNodeCustom.cpp:
(WebCore::JSNode::addEventListener):
(WebCore::JSNode::removeEventListener):
* bindings/js/JSSVGElementInstanceCustom.cpp:
(WebCore::JSSVGElementInstance::addEventListener):
(WebCore::JSSVGElementInstance::removeEventListener):
* bindings/js/JSWorkerContextCustom.cpp:
(WebCore::JSWorkerContext::addEventListener):
(WebCore::JSWorkerContext::removeEventListener):
* bindings/js/JSXMLHttpRequestCustom.cpp:
(WebCore::JSXMLHttpRequest::addEventListener):
(WebCore::JSXMLHttpRequest::removeEventListener):
* bindings/js/JSXMLHttpRequestUploadCustom.cpp:
(WebCore::JSXMLHttpRequestUpload::addEventListener):
(WebCore::JSXMLHttpRequestUpload::removeEventListener):
* bindings/objc/ObjCEventListener.h:
* bindings/objc/ObjCEventListener.mm:
(WebCore::ObjCEventListener::handleEvent):
* bindings/scripts/CodeGeneratorJS.pm:
* dom/EventTarget.cpp:
(WebCore::EventTarget::fireEventListeners):
* inspector/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::handleEvent):
* inspector/InspectorDOMAgent.h:
* inspector/InspectorDOMStorageResource.cpp:
(WebCore::InspectorDOMStorageResource::handleEvent):
* inspector/InspectorDOMStorageResource.h:
* loader/ImageDocument.cpp:
(WebCore::ImageEventListener::handleEvent):
* svg/animation/SVGSMILElement.cpp:
(WebCore::ConditionEventListener::handleEvent):
* workers/WorkerContext.cpp:
(WebCore::WorkerContext::reportException):
Don't pass global object to JSEventListener::create(), which no longer needs it.
Note that some of these functions still have an early return for null global object, which
can probably be removed in a later patch.
Pass ScriptExecutionContext to EventListener methods that now need it.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@48767 268f45cc-cd09-0410-ab3c-d52691b4dbfc
40 files changed