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