<rdar://problem/
4003774> REGRESSION(125-181): JavaScript problems @ Yankee/Dixie quiz
Reworked how scopes are set up for event handlers to match other
browser. This includes the following changes:
- Special scope entries are set up at the time the event handler
is created, not at the time it fires.
- Special scope is only set up for event handlers set in the html
source through an html attribute, not for handlers set using
addEventHandler or setting JS properties like onclick through
JavaScript.
- Special scope is based on the DOM node on which the handler is
an attribute, not the event target.
This fixes the regression while allowing the fix to
<rdar://problem/
3798453> (DIG: getting variable with same name as
DOM element attribute gets attribute value instead) to keep
working correctly.
* khtml/ecma/kjs_events.cpp:
(JSEventListener::handleEvent):
(JSLazyEventListener::JSLazyEventListener):
(JSLazyEventListener::parseCode):
* khtml/ecma/kjs_events.h:
* khtml/ecma/kjs_proxy.cpp:
(KJSProxyImpl::createHTMLEventHandler):
* khtml/ecma/kjs_proxy.h:
* khtml/ecma/kjs_window.cpp:
(Window::getJSLazyEventListener):
* khtml/ecma/kjs_window.h:
* khtml/html/html_baseimpl.cpp:
(HTMLBodyElementImpl::parseHTMLAttribute):
(HTMLFrameElementImpl::parseHTMLAttribute):
(HTMLFrameSetElementImpl::parseHTMLAttribute):
* khtml/html/html_elementimpl.cpp:
(HTMLElementImpl::parseHTMLAttribute):
* khtml/html/html_formimpl.cpp:
(DOM::HTMLFormElementImpl::parseHTMLAttribute):
(DOM::HTMLButtonElementImpl::parseHTMLAttribute):
(DOM::HTMLInputElementImpl::parseHTMLAttribute):
(DOM::HTMLLabelElementImpl::parseHTMLAttribute):
(DOM::HTMLSelectElementImpl::parseHTMLAttribute):
(DOM::HTMLTextAreaElementImpl::parseHTMLAttribute):
* khtml/html/html_imageimpl.cpp:
(HTMLImageElementImpl::parseHTMLAttribute):
* khtml/html/html_objectimpl.cpp:
(HTMLObjectElementImpl::parseHTMLAttribute):
* khtml/khtml_part.cpp:
(KHTMLPart::createHTMLEventListener):
* khtml/khtml_part.h:
* khtml/xml/dom_docimpl.cpp:
(DocumentImpl::createHTMLEventListener):
* khtml/xml/dom_docimpl.h:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8731
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2005-03-01 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Vicki.
+
+ <rdar://problem/4003774> REGRESSION(125-181): JavaScript problems @ Yankee/Dixie quiz
+
+ Reworked how scopes are set up for event handlers to match other
+ browser. This includes the following changes:
+
+ - Special scope entries are set up at the time the event handler
+ is created, not at the time it fires.
+
+ - Special scope is only set up for event handlers set in the html
+ source through an html attribute, not for handlers set using
+ addEventHandler or setting JS properties like onclick through
+ JavaScript.
+
+ - Special scope is based on the DOM node on which the handler is
+ an attribute, not the event target.
+
+ This fixes the regression while allowing the fix to
+ <rdar://problem/3798453> (DIG: getting variable with same name as
+ DOM element attribute gets attribute value instead) to keep
+ working correctly.
+
+ * khtml/ecma/kjs_events.cpp:
+ (JSEventListener::handleEvent):
+ (JSLazyEventListener::JSLazyEventListener):
+ (JSLazyEventListener::parseCode):
+ * khtml/ecma/kjs_events.h:
+ * khtml/ecma/kjs_proxy.cpp:
+ (KJSProxyImpl::createHTMLEventHandler):
+ * khtml/ecma/kjs_proxy.h:
+ * khtml/ecma/kjs_window.cpp:
+ (Window::getJSLazyEventListener):
+ * khtml/ecma/kjs_window.h:
+ * khtml/html/html_baseimpl.cpp:
+ (HTMLBodyElementImpl::parseHTMLAttribute):
+ (HTMLFrameElementImpl::parseHTMLAttribute):
+ (HTMLFrameSetElementImpl::parseHTMLAttribute):
+ * khtml/html/html_elementimpl.cpp:
+ (HTMLElementImpl::parseHTMLAttribute):
+ * khtml/html/html_formimpl.cpp:
+ (DOM::HTMLFormElementImpl::parseHTMLAttribute):
+ (DOM::HTMLButtonElementImpl::parseHTMLAttribute):
+ (DOM::HTMLInputElementImpl::parseHTMLAttribute):
+ (DOM::HTMLLabelElementImpl::parseHTMLAttribute):
+ (DOM::HTMLSelectElementImpl::parseHTMLAttribute):
+ (DOM::HTMLTextAreaElementImpl::parseHTMLAttribute):
+ * khtml/html/html_imageimpl.cpp:
+ (HTMLImageElementImpl::parseHTMLAttribute):
+ * khtml/html/html_objectimpl.cpp:
+ (HTMLObjectElementImpl::parseHTMLAttribute):
+ * khtml/khtml_part.cpp:
+ (KHTMLPart::createHTMLEventListener):
+ * khtml/khtml_part.h:
+ * khtml/xml/dom_docimpl.cpp:
+ (DocumentImpl::createHTMLEventListener):
+ * khtml/xml/dom_docimpl.h:
+
2005-03-01 David Harrison <harrison@apple.com>
Reviewed by Chris.
using DOM::KeyboardEvent;
using DOM::EventImpl;
+using DOM::NodeImpl;
// -------------------------------------------------------------------------
List args;
args.append(getDOMEvent(exec,evt));
- // Add the event's target element to the scope
- // (and the document, and the form - see KJS::HTMLElement::eventHandlerScope)
- ScopeChain oldScope = listener.scope();
+ Window *window = static_cast<Window*>(win.imp());
+ // Set the event we're handling in the Window object
+ window->setCurrentEvent( &evt );
+ // ... and in the interpreter
+ interpreter->setCurrentEvent( &evt );
+
Object thisObj;
if (isWindowEvent) {
thisObj = win;
KJS::Interpreter::lock();
thisObj = Object::dynamicCast(getDOMNode(exec,evt.currentTarget()));
KJS::Interpreter::unlock();
- if ( !thisObj.isNull() ) {
- ScopeChain scope;
- KJS::Interpreter::lock();
- static_cast<DOMNode*>(thisObj.imp())->pushEventHandlerScope(exec, scope);
- KJS::Interpreter::unlock();
- scope.push(oldScope);
- listener.setScope( scope );
- }
}
- Window *window = static_cast<Window*>(win.imp());
- // Set the event we're handling in the Window object
- window->setCurrentEvent( &evt );
- // ... and in the interpreter
- interpreter->setCurrentEvent( &evt );
-
KJS::Interpreter::lock();
Value retval = listener.call(exec, thisObj, args);
KJS::Interpreter::unlock();
- listener.setScope( oldScope );
-
window->setCurrentEvent( 0 );
interpreter->setCurrentEvent( 0 );
#if APPLE_CHANGES
return listener;
}
-JSLazyEventListener::JSLazyEventListener(QString _code, const Object &_win, bool _html, int lineno)
- : JSEventListener(Object(), _win, _html),
+JSLazyEventListener::JSLazyEventListener(QString _code, const Object &_win, NodeImpl *_originalNode, int lineno)
+ : JSEventListener(Object(), _win, true),
code(_code),
parsed(false)
{
lineNumber = lineno;
+
+ // We don't retain the original node, because we assume it
+ // will stay alive as long as this handler object is around
+ // and we need to avoid a reference cycle. If JS transfers
+ // this handler to another node, parseCode will be called and
+ // then originalNode is no longer needed.
+
+ originalNode = _originalNode;
}
void JSLazyEventListener::handleEvent(DOM::Event &evt, bool isWindowEvent)
listener = constr.construct(exec, args, sourceURL, lineNumber); // ### is globalExec ok ?
KJS::Interpreter::unlock();
-
- if ( exec->hadException() ) {
+
+ if (exec->hadException()) {
exec->clearException();
// failed to parse, so let's just make this listener a no-op
listener = Object();
+ } else {
+ // Add the event's home element to the scope
+ // (and the document, and the form - see KJS::HTMLElement::eventHandlerScope)
+ ScopeChain scope = listener.scope();
+
+ KJS::Interpreter::lock();
+ Object thisObj = Object::dynamicCast(getDOMNode(exec, originalNode));
+ KJS::Interpreter::unlock();
+
+ if (!thisObj.isNull()) {
+ KJS::Interpreter::lock();
+ static_cast<DOMNode*>(thisObj.imp())->pushEventHandlerScope(exec, scope);
+ KJS::Interpreter::unlock();
+
+ listener.setScope(scope);
+ }
}
}
class JSLazyEventListener : public JSEventListener {
public:
- JSLazyEventListener(QString _code, const Object &_win, bool _html = false, int lineno = 0);
+ JSLazyEventListener(QString _code, const Object &_win, DOM::NodeImpl *node, int lineno = 0);
virtual void handleEvent(DOM::Event &evt, bool isWindowEvent);
Object listenerObj() const;
mutable QString code;
mutable bool parsed;
int lineNumber;
+ DOM::NodeImpl *originalNode;
};
virtual ~KJSProxyImpl();
virtual QVariant evaluate(QString filename, int baseLine, const QString&str, const DOM::Node &n);
virtual void clear();
- virtual DOM::EventListener *createHTMLEventHandler(QString sourceUrl, QString code);
+ virtual DOM::EventListener *createHTMLEventHandler(QString sourceUrl, QString code, DOM::NodeImpl *node);
virtual void finishedWithEvent(const DOM::Event &event);
virtual KJS::ScriptInterpreter *interpreter();
}
}
-DOM::EventListener *KJSProxyImpl::createHTMLEventHandler(QString sourceUrl, QString code)
+DOM::EventListener *KJSProxyImpl::createHTMLEventHandler(QString sourceUrl, QString code, DOM::NodeImpl *node)
{
#ifdef KJS_DEBUGGER
if (KJSDebugWin::instance())
#endif
initScript();
- return KJS::Window::retrieveWindow(m_part)->getJSLazyEventListener(code,true,m_handlerLineno);
+ return KJS::Window::retrieveWindow(m_part)->getJSLazyEventListener(code,node,m_handlerLineno);
}
void KJSProxyImpl::finishedWithEvent(const DOM::Event &event)
class Node;
class EventListener;
class Event;
+ class NodeImpl;
};
namespace KJS {
virtual ~KJSProxy() { }
virtual QVariant evaluate(QString filename, int baseLine, const QString &, const DOM::Node &n) = 0;
virtual void clear() = 0;
- virtual DOM::EventListener *createHTMLEventHandler(QString sourceUrl, QString code) = 0;
+ virtual DOM::EventListener *createHTMLEventHandler(QString sourceUrl, QString code, DOM::NodeImpl *node) = 0;
virtual void finishedWithEvent(const DOM::Event &event) = 0;
virtual KJS::Interpreter *interpreter() = 0;
return new JSEventListener(Object(listenerObject), Object(this), html);
}
-JSLazyEventListener *Window::getJSLazyEventListener(const QString& code, bool html, int lineNumber)
+JSLazyEventListener *Window::getJSLazyEventListener(const QString& code, DOM::NodeImpl *node, int lineNumber)
{
- return new JSLazyEventListener(code, Object(this), html, lineNumber);
+ return new JSLazyEventListener(code, Object(this), node, lineNumber);
}
void Window::clear( ExecState *exec )
BarInfo *statusbar(ExecState *exec) const;
BarInfo *toolbar(ExecState *exec) const;
JSEventListener *getJSEventListener(const Value &val, bool html = false);
- JSLazyEventListener *getJSLazyEventListener(const QString &code, bool html = false, int lineno = 0);
+ JSLazyEventListener *getJSLazyEventListener(const QString &code, DOM::NodeImpl *node, int lineno = 0);
void clear( ExecState *exec );
virtual UString toString(ExecState *exec) const;
}
case ATTR_ONLOAD:
getDocument()->setHTMLWindowEventListener(EventImpl::LOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONUNLOAD:
getDocument()->setHTMLWindowEventListener(EventImpl::UNLOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBLUR:
getDocument()->setHTMLWindowEventListener(EventImpl::BLUR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONFOCUS:
getDocument()->setHTMLWindowEventListener(EventImpl::FOCUS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONRESIZE:
getDocument()->setHTMLWindowEventListener(EventImpl::RESIZE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONSCROLL:
getDocument()->setHTMLWindowEventListener(EventImpl::SCROLL_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_NOSAVE:
break;
break;
case ATTR_ONLOAD:
setHTMLEventListener(EventImpl::LOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONUNLOAD:
setHTMLEventListener(EventImpl::UNLOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLElementImpl::parseHTMLAttribute(attr);
break;
case ATTR_ONLOAD:
setHTMLEventListener(EventImpl::LOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONUNLOAD:
setHTMLEventListener(EventImpl::UNLOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLElementImpl::parseHTMLAttribute(attr);
// standard events
case ATTR_ONCLICK:
setHTMLEventListener(EventImpl::KHTML_CLICK_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONCONTEXTMENU:
setHTMLEventListener(EventImpl::CONTEXTMENU_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDBLCLICK:
setHTMLEventListener(EventImpl::KHTML_DBLCLICK_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONMOUSEDOWN:
setHTMLEventListener(EventImpl::MOUSEDOWN_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONMOUSEMOVE:
setHTMLEventListener(EventImpl::MOUSEMOVE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONMOUSEOUT:
setHTMLEventListener(EventImpl::MOUSEOUT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONMOUSEOVER:
setHTMLEventListener(EventImpl::MOUSEOVER_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONMOUSEUP:
setHTMLEventListener(EventImpl::MOUSEUP_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONFOCUS:
setHTMLEventListener(EventImpl::DOMFOCUSIN_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONKEYDOWN:
setHTMLEventListener(EventImpl::KEYDOWN_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONKEYPRESS:
setHTMLEventListener(EventImpl::KEYPRESS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONKEYUP:
setHTMLEventListener(EventImpl::KEYUP_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONSCROLL:
setHTMLEventListener(EventImpl::SCROLL_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBEFORECUT:
setHTMLEventListener(EventImpl::BEFORECUT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONCUT:
setHTMLEventListener(EventImpl::CUT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBEFORECOPY:
setHTMLEventListener(EventImpl::BEFORECOPY_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONCOPY:
setHTMLEventListener(EventImpl::COPY_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBEFOREPASTE:
setHTMLEventListener(EventImpl::BEFOREPASTE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONPASTE:
setHTMLEventListener(EventImpl::PASTE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDRAGENTER:
setHTMLEventListener(EventImpl::DRAGENTER_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDRAGOVER:
setHTMLEventListener(EventImpl::DRAGOVER_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDRAGLEAVE:
setHTMLEventListener(EventImpl::DRAGLEAVE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDROP:
setHTMLEventListener(EventImpl::DROP_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDRAGSTART:
setHTMLEventListener(EventImpl::DRAGSTART_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDRAG:
setHTMLEventListener(EventImpl::DRAG_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONDRAGEND:
setHTMLEventListener(EventImpl::DRAGEND_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONSELECTSTART:
setHTMLEventListener(EventImpl::SELECTSTART_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
// other misc attributes
default:
break;
case ATTR_ONSUBMIT:
setHTMLEventListener(EventImpl::SUBMIT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONRESET:
setHTMLEventListener(EventImpl::RESET_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_NAME:
{
break;
case ATTR_ONFOCUS:
setHTMLEventListener(EventImpl::FOCUS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBLUR:
setHTMLEventListener(EventImpl::BLUR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLGenericFormElementImpl::parseHTMLAttribute(attr);
break;
case ATTR_ONFOCUS:
setHTMLEventListener(EventImpl::FOCUS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBLUR:
setHTMLEventListener(EventImpl::BLUR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONSELECT:
setHTMLEventListener(EventImpl::SELECT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONCHANGE:
setHTMLEventListener(EventImpl::CHANGE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONINPUT:
setHTMLEventListener(EventImpl::INPUT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
#if APPLE_CHANGES
// Search field and slider attributes all just cause updateFromElement to be called through style
// recalcing.
case ATTR_ONSEARCH:
setHTMLEventListener(EventImpl::SEARCH_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_RESULTS:
m_maxResults = !attr->isNull() ? attr->value().toInt() : -1;
{
case ATTR_ONFOCUS:
setHTMLEventListener(EventImpl::FOCUS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBLUR:
setHTMLEventListener(EventImpl::BLUR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLElementImpl::parseHTMLAttribute(attr);
break;
case ATTR_ONFOCUS:
setHTMLEventListener(EventImpl::FOCUS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBLUR:
setHTMLEventListener(EventImpl::BLUR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONCHANGE:
setHTMLEventListener(EventImpl::CHANGE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLGenericFormElementImpl::parseHTMLAttribute(attr);
break;
case ATTR_ONFOCUS:
setHTMLEventListener(EventImpl::FOCUS_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONBLUR:
setHTMLEventListener(EventImpl::BLUR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONSELECT:
setHTMLEventListener(EventImpl::SELECT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONCHANGE:
setHTMLEventListener(EventImpl::CHANGE_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLGenericFormElementImpl::parseHTMLAttribute(attr);
break;
case ATTR_ONABORT: // ### add support for this
setHTMLEventListener(EventImpl::ABORT_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONERROR:
setHTMLEventListener(EventImpl::ERROR_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONLOAD:
setHTMLEventListener(EventImpl::LOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_NOSAVE:
break;
break;
case ATTR_ONLOAD: // ### support load/unload on object elements
setHTMLEventListener(EventImpl::LOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONUNLOAD:
setHTMLEventListener(EventImpl::UNLOAD_EVENT,
- getDocument()->createHTMLEventListener(attr->value().string()));
+ getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
default:
HTMLElementImpl::parseHTMLAttribute( attr );
return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
}
-DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code )
+DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code, NodeImpl *node )
{
KJSProxy *proxy = jScript();
if (!proxy)
return 0;
- return proxy->createHTMLEventHandler( m_url.url(), code );
+ return proxy->createHTMLEventHandler( m_url.url(), code, node );
}
KHTMLPart *KHTMLPart::opener()
bool requestObject( khtml::ChildFrame *child, const KURL &url, const KParts::URLArgs &args = KParts::URLArgs() );
- DOM::EventListener *createHTMLEventListener( QString code );
+ DOM::EventListener *createHTMLEventListener( QString code, DOM::NodeImpl *node );
public:
DOM::DocumentImpl *xmlDocImpl() const;
return false;
}
-EventListener *DocumentImpl::createHTMLEventListener(QString code)
+EventListener *DocumentImpl::createHTMLEventListener(QString code, NodeImpl *node)
{
if (part()) {
- return part()->createHTMLEventListener(code);
+ return part()->createHTMLEventListener(code, node);
} else {
return NULL;
}
void removeWindowEventListener(int id, EventListener *listener, bool useCapture);
bool hasWindowEventListener(int id);
- EventListener *createHTMLEventListener(QString code);
+ EventListener *createHTMLEventListener(QString code, NodeImpl *node);
/**
* Searches through the document, starting from fromNode, for the next selectable element that comes after fromNode.