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