1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * are met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *    documentation and/or other materials provided with the distribution.
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE.
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "config.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8Initializer.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
29f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "V8ErrorEvent.h"
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "V8History.h"
31926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "V8Location.h"
32521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "V8Window.h"
33e6d4491e48613634a83c1957c72759da80987961Ben Murdoch#include "bindings/v8/DOMWrapperWorld.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptCallStackFactory.h"
35e6d4491e48613634a83c1957c72759da80987961Ben Murdoch#include "bindings/v8/ScriptController.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptProfiler.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8Binding.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8GCController.h"
39f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "bindings/v8/V8HiddenPropertyName.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8PerContextData.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "core/dom/ExceptionCode.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
44e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/page/ConsoleTypes.h"
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/page/ContentSecurityPolicy.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DOMWindow.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/MemoryUsageSupport.h"
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include <v8-debug.h>
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/RefPtr.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h"
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace WebCore {
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static Frame* findFrame(v8::Local<v8::Object> host, v8::Local<v8::Value> data, v8::Isolate* isolate)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WrapperTypeInfo* type = WrapperTypeInfo::unwrap(data);
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
59521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (V8Window::info.equals(type)) {
60521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        v8::Handle<v8::Object> windowWrapper = host->FindInstanceInPrototypeChain(V8Window::GetTemplate(isolate, worldTypeInMainThread(isolate)));
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (windowWrapper.IsEmpty())
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return 0;
63521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return V8Window::toNative(windowWrapper)->frame();
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (V8History::info.equals(type))
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return V8History::toNative(host)->frame();
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (V8Location::info.equals(type))
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return V8Location::toNative(host)->frame();
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // This function can handle only those types listed above.
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_NOT_REACHED();
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void reportFatalErrorInMainThread(const char* location, const char* message)
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int memoryUsageMB = MemoryUsageSupport::actualMemoryUsageMB();
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    printf("V8 error: %s (%s).  Current memory usage: %d MB\n", message, location, memoryUsageMB);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    CRASH();
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void messageHandlerInMainThread(v8::Handle<v8::Message> message, v8::Handle<v8::Value> data)
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
8681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    DOMWindow* firstWindow = firstDOMWindow();
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!firstWindow->isCurrentlyDisplayedInFrame())
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String errorMessage = toWebCoreString(message->Get());
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::Handle<v8::StackTrace> stackTrace = message->GetStackTrace();
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<ScriptCallStack> callStack;
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Currently stack trace is only collected when inspector is open.
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0)
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        callStack = createScriptCallStack(stackTrace, ScriptCallStack::maxCallStackSizeToCapture);
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::Handle<v8::Value> resourceName = message->GetScriptResourceName();
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shouldUseDocumentURL = resourceName.IsEmpty() || !resourceName->IsString();
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String resource = shouldUseDocumentURL ? firstWindow->document()->url() : toWebCoreString(resourceName);
101f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    RefPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, resource, message->GetLineNumber(), message->GetStartColumn());
102e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
103e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    // messageHandlerInMainThread can be called while we're creating a new context.
104e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    // Since we cannot create a wrapper in the intermediate timing, we need to skip
105e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    // creating a wrapper for |event|.
106e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    DOMWrapperWorld* world = DOMWrapperWorld::current();
107e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    Frame* frame = firstWindow->document()->frame();
108e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    if (world && frame && frame->script()->existingWindowShell(world)) {
109e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        v8::Local<v8::Value> wrappedEvent = toV8(event.get(), v8::Handle<v8::Object>(), v8::Isolate::GetCurrent());
110e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        if (!wrappedEvent.IsEmpty()) {
111e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            ASSERT(wrappedEvent->IsObject());
112e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            v8::Local<v8::Object>::Cast(wrappedEvent)->SetHiddenValue(V8HiddenPropertyName::error(), data);
113e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        }
114f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
11523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin;
11623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    firstWindow->document()->reportException(event.release(), callStack, corsStatus);
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8::AccessType type, v8::Local<v8::Value> data)
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Frame* target = findFrame(host, data, v8::Isolate::GetCurrent());
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!target)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1247757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    DOMWindow* targetWindow = target->domWindow();
1250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
12683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    setDOMException(SecurityError, targetWindow->crossDomainAccessErrorMessage(activeDOMWindow()), v8::Isolate::GetCurrent());
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
129e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic bool codeGenerationCheckCallbackInMainThread(v8::Local<v8::Context> context)
130e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
131e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (ScriptExecutionContext* scriptExecutionContext = toScriptExecutionContext(context)) {
132e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (ContentSecurityPolicy* policy = toDocument(scriptExecutionContext)->contentSecurityPolicy())
133e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return policy->allowEval(ScriptState::forContext(context));
134e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
135e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return false;
136e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
137e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void initializeV8Common()
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::AddGCPrologueCallback(V8GCController::gcPrologue);
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::AddGCEpilogueCallback(V8GCController::gcEpilogue);
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::IgnoreOutOfMemoryException();
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::Debug::SetLiveEditEnabled(false);
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void V8Initializer::initializeMainThreadIfNeeded(v8::Isolate* isolate)
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isMainThread());
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static bool initialized = false;
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (initialized)
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialized = true;
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initializeV8Common();
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::SetFatalErrorHandler(reportFatalErrorInMainThread);
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::AddMessageListener(messageHandlerInMainThread);
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::SetFailedAccessCheckCallbackFunction(failedAccessCheckCallbackInMainThread);
161e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    v8::V8::SetAllowCodeGenerationFromStringsCallback(codeGenerationCheckCallbackInMainThread);
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScriptProfiler::initialize();
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    V8PerIsolateData::ensureInitialized(isolate);
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void reportFatalErrorInWorker(const char* location, const char* message)
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: We temporarily deal with V8 internal error situations such as out-of-memory by crashing the worker.
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    CRASH();
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void messageHandlerInWorker(v8::Handle<v8::Message> message, v8::Handle<v8::Value> data)
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static bool isReportingException = false;
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Exceptions that occur in error handler should be ignored since in that case
176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // WorkerGlobalScope::reportException will send the exception to the worker object.
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isReportingException)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isReportingException = true;
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // During the frame teardown, there may not be a valid context.
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ScriptExecutionContext* context = getScriptExecutionContext()) {
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        String errorMessage = toWebCoreString(message->Get());
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        String sourceURL = toWebCoreString(message->GetScriptResourceName());
185f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        RefPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, sourceURL, message->GetLineNumber(), message->GetStartColumn());
186f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        v8::Local<v8::Value> wrappedEvent = toV8(event.get(), v8::Handle<v8::Object>(), v8::Isolate::GetCurrent());
187f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!wrappedEvent.IsEmpty()) {
188f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            ASSERT(wrappedEvent->IsObject());
189f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            v8::Local<v8::Object>::Cast(wrappedEvent)->SetHiddenValue(V8HiddenPropertyName::error(), data);
190f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        }
19123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin;
19223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        context->reportException(event.release(), 0, corsStatus);
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isReportingException = false;
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const int kWorkerMaxStackSize = 500 * 1024;
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void V8Initializer::initializeWorker(v8::Isolate* isolate)
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initializeV8Common();
203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::AddMessageListener(messageHandlerInWorker);
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::V8::SetFatalErrorHandler(reportFatalErrorInWorker);
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::ResourceConstraints resourceConstraints;
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uint32_t here;
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    resourceConstraints.set_stack_limit(&here - kWorkerMaxStackSize / sizeof(uint32_t*));
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    v8::SetResourceConstraints(&resourceConstraints);
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    V8PerIsolateData::ensureInitialized(isolate);
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} // namespace WebCore
216