-
ap@apple.com authored
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
ed84b35a