/* * Copyright (C) 2007 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "JSEventTargetNode.h" #include "AtomicString.h" #include "Event.h" #include "EventListener.h" #include "EventNames.h" #include "EventTargetNode.h" #include "JSEvent.h" #include "Node.h" #include "kjs_events.h" #include "kjs_window.h" #include "JSEventTargetNode.lut.h" namespace WebCore { using namespace KJS; using namespace EventNames; /* Source for JSEventTargetNodeTable @begin JSEventTargetNodeTable 50 onabort WebCore::JSEventTargetNode::OnAbort DontDelete onblur WebCore::JSEventTargetNode::OnBlur DontDelete onchange WebCore::JSEventTargetNode::OnChange DontDelete onclick WebCore::JSEventTargetNode::OnClick DontDelete oncontextmenu WebCore::JSEventTargetNode::OnContextMenu DontDelete ondblclick WebCore::JSEventTargetNode::OnDblClick DontDelete onbeforecut WebCore::JSEventTargetNode::OnBeforeCut DontDelete oncut WebCore::JSEventTargetNode::OnCut DontDelete onbeforecopy WebCore::JSEventTargetNode::OnBeforeCopy DontDelete oncopy WebCore::JSEventTargetNode::OnCopy DontDelete onbeforepaste WebCore::JSEventTargetNode::OnBeforePaste DontDelete onpaste WebCore::JSEventTargetNode::OnPaste DontDelete ondrag WebCore::JSEventTargetNode::OnDrag DontDelete ondragend WebCore::JSEventTargetNode::OnDragEnd DontDelete ondragenter WebCore::JSEventTargetNode::OnDragEnter DontDelete ondragleave WebCore::JSEventTargetNode::OnDragLeave DontDelete ondragover WebCore::JSEventTargetNode::OnDragOver DontDelete ondragstart WebCore::JSEventTargetNode::OnDragStart DontDelete ondrop WebCore::JSEventTargetNode::OnDrop DontDelete onerror WebCore::JSEventTargetNode::OnError DontDelete onfocus WebCore::JSEventTargetNode::OnFocus DontDelete oninput WebCore::JSEventTargetNode::OnInput DontDelete onkeydown WebCore::JSEventTargetNode::OnKeyDown DontDelete onkeypress WebCore::JSEventTargetNode::OnKeyPress DontDelete onkeyup WebCore::JSEventTargetNode::OnKeyUp DontDelete onload WebCore::JSEventTargetNode::OnLoad DontDelete onmousedown WebCore::JSEventTargetNode::OnMouseDown DontDelete onmousemove WebCore::JSEventTargetNode::OnMouseMove DontDelete onmouseout WebCore::JSEventTargetNode::OnMouseOut DontDelete onmouseover WebCore::JSEventTargetNode::OnMouseOver DontDelete onmouseup WebCore::JSEventTargetNode::OnMouseUp DontDelete onmousewheel WebCore::JSEventTargetNode::OnMouseWheel DontDelete onreset WebCore::JSEventTargetNode::OnReset DontDelete onresize WebCore::JSEventTargetNode::OnResize DontDelete onscroll WebCore::JSEventTargetNode::OnScroll DontDelete onsearch WebCore::JSEventTargetNode::OnSearch DontDelete onselect WebCore::JSEventTargetNode::OnSelect DontDelete onselectstart WebCore::JSEventTargetNode::OnSelectStart DontDelete onsubmit WebCore::JSEventTargetNode::OnSubmit DontDelete onunload WebCore::JSEventTargetNode::OnUnload DontDelete @end */ JSEventTargetNode::JSEventTargetNode(ExecState* exec, Node* n) : JSNode(exec, n) { setPrototype(JSEventTargetNodePrototype::self(exec)); } bool JSEventTargetNode::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) { return getStaticValueSlot(exec, &JSEventTargetNodeTable, this, propertyName, slot); } JSValue* JSEventTargetNode::getValueProperty(ExecState* exec, int token) const { switch (token) { case OnAbort: return getListener(abortEvent); case OnBlur: return getListener(blurEvent); case OnChange: return getListener(changeEvent); case OnClick: return getListener(clickEvent); case OnContextMenu: return getListener(contextmenuEvent); case OnDblClick: return getListener(dblclickEvent); case OnError: return getListener(errorEvent); case OnFocus: return getListener(focusEvent); case OnInput: return getListener(inputEvent); case OnKeyDown: return getListener(keydownEvent); case OnKeyPress: return getListener(keypressEvent); case OnKeyUp: return getListener(keyupEvent); case OnLoad: return getListener(loadEvent); case OnMouseDown: return getListener(mousedownEvent); case OnMouseMove: return getListener(mousemoveEvent); case OnMouseOut: return getListener(mouseoutEvent); case OnMouseOver: return getListener(mouseoverEvent); case OnMouseUp: return getListener(mouseupEvent); case OnMouseWheel: return getListener(mousewheelEvent); case OnBeforeCut: return getListener(beforecutEvent); case OnCut: return getListener(cutEvent); case OnBeforeCopy: return getListener(beforecopyEvent); case OnCopy: return getListener(copyEvent); case OnBeforePaste: return getListener(beforepasteEvent); case OnPaste: return getListener(pasteEvent); case OnDragEnter: return getListener(dragenterEvent); case OnDragOver: return getListener(dragoverEvent); case OnDragLeave: return getListener(dragleaveEvent); case OnDrop: return getListener(dropEvent); case OnDragStart: return getListener(dragstartEvent); case OnDrag: return getListener(dragEvent); case OnDragEnd: return getListener(dragendEvent); case OnReset: return getListener(resetEvent); case OnResize: return getListener(resizeEvent); case OnScroll: return getListener(scrollEvent); case OnSearch: return getListener(searchEvent); case OnSelect: return getListener(selectEvent); case OnSelectStart: return getListener(selectstartEvent); case OnSubmit: return getListener(submitEvent); case OnUnload: return getListener(unloadEvent); } return jsUndefined(); } void JSEventTargetNode::put(ExecState* exec, const Identifier& propertyName, JSValue* value, int attr) { lookupPut(exec, propertyName, value, attr, &JSEventTargetNodeTable, this); } void JSEventTargetNode::putValueProperty(ExecState* exec, int token, JSValue* value, int /*attr*/) { switch (token) { case OnAbort: setListener(exec, abortEvent, value); break; case OnBlur: setListener(exec, blurEvent, value); break; case OnChange: setListener(exec, changeEvent, value); break; case OnClick: setListener(exec, clickEvent, value); break; case OnContextMenu: setListener(exec, contextmenuEvent, value); break; case OnDblClick: setListener(exec, dblclickEvent, value); break; case OnError: setListener(exec, errorEvent, value); break; case OnFocus: setListener(exec, focusEvent, value); break; case OnInput: setListener(exec, inputEvent, value); break; case OnKeyDown: setListener(exec, keydownEvent, value); break; case OnKeyPress: setListener(exec, keypressEvent, value); break; case OnKeyUp: setListener(exec, keyupEvent, value); break; case OnLoad: setListener(exec, loadEvent, value); break; case OnMouseDown: setListener(exec, mousedownEvent, value); break; case OnMouseMove: setListener(exec, mousemoveEvent, value); break; case OnMouseOut: setListener(exec, mouseoutEvent, value); break; case OnMouseOver: setListener(exec, mouseoverEvent, value); break; case OnMouseUp: setListener(exec, mouseupEvent, value); break; case OnMouseWheel: setListener(exec, mousewheelEvent, value); break; case OnBeforeCut: setListener(exec, beforecutEvent, value); break; case OnCut: setListener(exec, cutEvent, value); break; case OnBeforeCopy: setListener(exec, beforecopyEvent, value); break; case OnCopy: setListener(exec, copyEvent, value); break; case OnBeforePaste: setListener(exec, beforepasteEvent, value); break; case OnPaste: setListener(exec, pasteEvent, value); break; case OnDragEnter: setListener(exec, dragenterEvent, value); break; case OnDragOver: setListener(exec, dragoverEvent, value); break; case OnDragLeave: setListener(exec, dragleaveEvent, value); break; case OnDrop: setListener(exec, dropEvent, value); break; case OnDragStart: setListener(exec, dragstartEvent, value); break; case OnDrag: setListener(exec, dragEvent, value); break; case OnDragEnd: setListener(exec, dragendEvent, value); break; case OnReset: setListener(exec, resetEvent, value); break; case OnResize: setListener(exec, resizeEvent, value); break; case OnScroll: setListener(exec, scrollEvent, value); break; case OnSearch: setListener(exec, searchEvent, value); break; case OnSelect: setListener(exec, selectEvent, value); break; case OnSelectStart: setListener(exec, selectstartEvent, value); break; case OnSubmit: setListener(exec, submitEvent, value); break; case OnUnload: setListener(exec, unloadEvent, value); break; } } void JSEventTargetNode::setListener(ExecState* exec, const AtomicString &eventType, JSValue* func) const { EventTargetNodeCast(impl())->setHTMLEventListener(eventType, KJS::Window::retrieveActive(exec)->findOrCreateJSEventListener(func, true)); } JSValue* JSEventTargetNode::getListener(const AtomicString& eventType) const { EventListener* listener = EventTargetNodeCast(impl())->getHTMLEventListener(eventType); JSEventListener* jsListener = static_cast(listener); if (jsListener && jsListener->listenerObj()) return jsListener->listenerObj(); return jsNull(); } void JSEventTargetNode::pushEventHandlerScope(ExecState*, ScopeChain&) const { } /* @begin JSEventTargetNodePrototypeTable 5 # from the EventTarget interface addEventListener WebCore::JSEventTargetNode::AddEventListener DontDelete|Function 3 removeEventListener WebCore::JSEventTargetNode::RemoveEventListener DontDelete|Function 3 dispatchEvent WebCore::JSEventTargetNode::DispatchEvent DontDelete|Function 1 @end */ KJS_IMPLEMENT_PROTOTYPE_FUNCTION(JSEventTargetNodePrototypeFunction) KJS_IMPLEMENT_PROTOTYPE("EventTargetNode", JSEventTargetNodePrototype, JSEventTargetNodePrototypeFunction) JSValue* JSEventTargetNodePrototypeFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args) { if (!thisObj->inherits(&JSEventTargetNode::info)) return throwError(exec, TypeError); DOMExceptionTranslator exception(exec); JSEventTargetNode* jsNode = static_cast(thisObj); EventTargetNode* node = static_cast(jsNode->impl()); switch (id) { case JSEventTargetNode::AddEventListener: { JSEventListener* listener = Window::retrieveActive(exec)->findOrCreateJSEventListener(args[1]); if (listener) node->addEventListener(args[0]->toString(exec), listener,args[2]->toBoolean(exec)); return jsUndefined(); } case JSEventTargetNode::RemoveEventListener: { JSEventListener* listener = Window::retrieveActive(exec)->findJSEventListener(args[1]); if (listener) node->removeEventListener(args[0]->toString(exec), listener,args[2]->toBoolean(exec)); return jsUndefined(); } case JSEventTargetNode::DispatchEvent: return jsBoolean(node->dispatchEvent(toEvent(args[0]), exception)); } return jsUndefined(); } EventTargetNode* toEventTargetNode(JSValue* val) { if (!val || !val->isObject(&JSEventTargetNode::info)) return 0; return static_cast(static_cast(val)->impl()); } } // namespace WebCore