1/* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32#include "ScriptEventListener.h" 33 34#include "Attribute.h" 35#include "Document.h" 36#include "EventListener.h" 37#include "JSNode.h" 38#include "Frame.h" 39#include <runtime/JSLock.h> 40 41using namespace JSC; 42 43namespace WebCore { 44 45static const String& eventParameterName(bool isSVGEvent) 46{ 47 DEFINE_STATIC_LOCAL(const String, eventString, ("event")); 48 DEFINE_STATIC_LOCAL(const String, evtString, ("evt")); 49 return isSVGEvent ? evtString : eventString; 50} 51 52PassRefPtr<JSLazyEventListener> createAttributeEventListener(Node* node, Attribute* attr) 53{ 54 ASSERT(node); 55 ASSERT(attr); 56 if (attr->isNull()) 57 return 0; 58 59 int lineNumber = 1; 60 String sourceURL; 61 62 // FIXME: We should be able to provide accurate source information for frameless documents, too (e.g. for importing nodes from XMLHttpRequest.responseXML). 63 if (Frame* frame = node->document()->frame()) { 64 ScriptController* scriptController = frame->script(); 65 if (!scriptController->canExecuteScripts(AboutToExecuteScript)) 66 return 0; 67 68 lineNumber = scriptController->eventHandlerLineNumber(); 69 sourceURL = node->document()->url().string(); 70 } 71 72 return JSLazyEventListener::create(attr->localName().string(), eventParameterName(node->isSVGElement()), attr->value(), node, sourceURL, lineNumber, 0, mainThreadNormalWorld()); 73} 74 75PassRefPtr<JSLazyEventListener> createAttributeEventListener(Frame* frame, Attribute* attr) 76{ 77 if (!frame) 78 return 0; 79 80 ASSERT(attr); 81 if (attr->isNull()) 82 return 0; 83 84 int lineNumber = 1; 85 String sourceURL; 86 87 ScriptController* scriptController = frame->script(); 88 if (!scriptController->canExecuteScripts(AboutToExecuteScript)) 89 return 0; 90 91 lineNumber = scriptController->eventHandlerLineNumber(); 92 sourceURL = frame->document()->url().string(); 93 JSObject* wrapper = toJSDOMWindow(frame, mainThreadNormalWorld()); 94 return JSLazyEventListener::create(attr->localName().string(), eventParameterName(frame->document()->isSVGDocument()), attr->value(), 0, sourceURL, lineNumber, wrapper, mainThreadNormalWorld()); 95} 96 97String eventListenerHandlerBody(Document* document, EventListener* eventListener) 98{ 99 const JSEventListener* jsListener = JSEventListener::cast(eventListener); 100 if (!jsListener) 101 return ""; 102 JSC::JSObject* jsFunction = jsListener->jsFunction(document); 103 if (!jsFunction) 104 return ""; 105 return ustringToString(jsFunction->toString(scriptStateFromNode(jsListener->isolatedWorld(), document))); 106} 107 108bool eventListenerHandlerLocation(Document*, EventListener*, String&, int&) 109{ 110 // FIXME: Add support for getting function location. 111 return false; 112} 113 114} // namespace WebCore 115