1/* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * Copyright (C) 2013 Apple Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include "config.h" 33 34#include "JSErrorHandler.h" 35 36#include "Document.h" 37#include "ErrorEvent.h" 38#include "Event.h" 39#include "EventNames.h" 40#include "JSEvent.h" 41#include "JSMainThreadExecState.h" 42#include <runtime/JSLock.h> 43#include <runtime/VMEntryScope.h> 44#include <wtf/Ref.h> 45 46using namespace JSC; 47 48namespace WebCore { 49 50JSErrorHandler::JSErrorHandler(JSObject* function, JSObject* wrapper, bool isAttribute, DOMWrapperWorld& world) 51 : JSEventListener(function, wrapper, isAttribute, world) 52{ 53} 54 55JSErrorHandler::~JSErrorHandler() 56{ 57} 58 59void JSErrorHandler::handleEvent(ScriptExecutionContext* scriptExecutionContext, Event* event) 60{ 61 62 if (event->eventInterface() != ErrorEventInterfaceType) 63 return JSEventListener::handleEvent(scriptExecutionContext, event); 64 65 ASSERT(scriptExecutionContext); 66 if (!scriptExecutionContext) 67 return; 68 69 ErrorEvent* errorEvent = toErrorEvent(event); 70 71 JSLockHolder lock(scriptExecutionContext->vm()); 72 73 JSObject* jsFunction = this->jsFunction(scriptExecutionContext); 74 if (!jsFunction) 75 return; 76 77 JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(scriptExecutionContext, isolatedWorld()); 78 if (!globalObject) 79 return; 80 81 ExecState* exec = globalObject->globalExec(); 82 83 CallData callData; 84 CallType callType = jsFunction->methodTable()->getCallData(jsFunction, callData); 85 86 if (callType != CallTypeNone) { 87 Ref<JSErrorHandler> protectedctor(*this); 88 89 Event* savedEvent = globalObject->currentEvent(); 90 globalObject->setCurrentEvent(event); 91 92 MarkedArgumentBuffer args; 93 args.append(jsStringWithCache(exec, errorEvent->message())); 94 args.append(jsStringWithCache(exec, errorEvent->filename())); 95 args.append(jsNumber(errorEvent->lineno())); 96 args.append(jsNumber(errorEvent->colno())); 97 98 VM& vm = globalObject->vm(); 99 VMEntryScope entryScope(vm, vm.entryScope ? vm.entryScope->globalObject() : globalObject); 100 101 JSValue exception; 102 JSValue returnValue = scriptExecutionContext->isDocument() 103 ? JSMainThreadExecState::call(exec, jsFunction, callType, callData, globalObject, args, &exception) 104 : JSC::call(exec, jsFunction, callType, callData, globalObject, args, &exception); 105 106 globalObject->setCurrentEvent(savedEvent); 107 108 if (exception) 109 reportException(exec, exception); 110 else { 111 if (returnValue.isTrue()) 112 event->preventDefault(); 113 } 114 } 115} 116 117} // namespace WebCore 118