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