OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "core/inspector/ScriptArguments.h" | 51 #include "core/inspector/ScriptArguments.h" |
52 #include "core/workers/WorkerGlobalScope.h" | 52 #include "core/workers/WorkerGlobalScope.h" |
53 #include "platform/EventDispatchForbiddenScope.h" | 53 #include "platform/EventDispatchForbiddenScope.h" |
54 #include "platform/RuntimeEnabledFeatures.h" | 54 #include "platform/RuntimeEnabledFeatures.h" |
55 #include "platform/TraceEvent.h" | 55 #include "platform/TraceEvent.h" |
56 #include "platform/v8_inspector/public/ConsoleTypes.h" | 56 #include "platform/v8_inspector/public/ConsoleTypes.h" |
57 #include "public/platform/Platform.h" | 57 #include "public/platform/Platform.h" |
58 #include "public/platform/WebScheduler.h" | 58 #include "public/platform/WebScheduler.h" |
59 #include "public/platform/WebThread.h" | 59 #include "public/platform/WebThread.h" |
60 #include "wtf/AddressSanitizer.h" | 60 #include "wtf/AddressSanitizer.h" |
61 #include "wtf/PtrUtil.h" | |
62 #include "wtf/RefPtr.h" | 61 #include "wtf/RefPtr.h" |
63 #include "wtf/text/WTFString.h" | 62 #include "wtf/text/WTFString.h" |
64 #include "wtf/typed_arrays/ArrayBufferContents.h" | 63 #include "wtf/typed_arrays/ArrayBufferContents.h" |
65 #include <memory> | |
66 #include <v8-debug.h> | 64 #include <v8-debug.h> |
67 #include <v8-profiler.h> | 65 #include <v8-profiler.h> |
68 | 66 |
69 namespace blink { | 67 namespace blink { |
70 | 68 |
71 static Frame* findFrame(v8::Isolate* isolate, v8::Local<v8::Object> host, v8::Lo
cal<v8::Value> data) | 69 static Frame* findFrame(v8::Isolate* isolate, v8::Local<v8::Object> host, v8::Lo
cal<v8::Value> data) |
72 { | 70 { |
73 const WrapperTypeInfo* type = WrapperTypeInfo::unwrap(data); | 71 const WrapperTypeInfo* type = WrapperTypeInfo::unwrap(data); |
74 | 72 |
75 if (V8Window::wrapperTypeInfo.equals(type)) { | 73 if (V8Window::wrapperTypeInfo.equals(type)) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 | 116 |
119 if (isolate->GetEnteredContext().IsEmpty()) | 117 if (isolate->GetEnteredContext().IsEmpty()) |
120 return; | 118 return; |
121 | 119 |
122 // If called during context initialization, there will be no entered context
. | 120 // If called during context initialization, there will be no entered context
. |
123 ScriptState* scriptState = ScriptState::current(isolate); | 121 ScriptState* scriptState = ScriptState::current(isolate); |
124 if (!scriptState->contextIsValid()) | 122 if (!scriptState->contextIsValid()) |
125 return; | 123 return; |
126 | 124 |
127 ExecutionContext* context = scriptState->getExecutionContext(); | 125 ExecutionContext* context = scriptState->getExecutionContext(); |
128 std::unique_ptr<SourceLocation> location = SourceLocation::fromMessage(isola
te, message, context); | 126 OwnPtr<SourceLocation> location = SourceLocation::fromMessage(isolate, messa
ge, context); |
129 | 127 |
130 AccessControlStatus accessControlStatus = NotSharableCrossOrigin; | 128 AccessControlStatus accessControlStatus = NotSharableCrossOrigin; |
131 if (message->IsOpaque()) | 129 if (message->IsOpaque()) |
132 accessControlStatus = OpaqueResource; | 130 accessControlStatus = OpaqueResource; |
133 else if (message->IsSharedCrossOrigin()) | 131 else if (message->IsSharedCrossOrigin()) |
134 accessControlStatus = SharableCrossOrigin; | 132 accessControlStatus = SharableCrossOrigin; |
135 | 133 |
136 ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Ge
t()), std::move(location), &scriptState->world()); | 134 ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Ge
t()), std::move(location), &scriptState->world()); |
137 | 135 |
138 String messageForConsole = extractMessageForConsole(isolate, data); | 136 String messageForConsole = extractMessageForConsole(isolate, data); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 // Try to get the stack & location from a wrapped exception object (e.g.
DOMException). | 195 // Try to get the stack & location from a wrapped exception object (e.g.
DOMException). |
198 ASSERT(exception->IsObject()); | 196 ASSERT(exception->IsObject()); |
199 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(exception); | 197 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(exception); |
200 v8::Local<v8::Value> error = V8HiddenValue::getHiddenValue(scriptState,
obj, V8HiddenValue::error(isolate)); | 198 v8::Local<v8::Value> error = V8HiddenValue::getHiddenValue(scriptState,
obj, V8HiddenValue::error(isolate)); |
201 if (!error.IsEmpty()) | 199 if (!error.IsEmpty()) |
202 exception = error; | 200 exception = error; |
203 } | 201 } |
204 | 202 |
205 String errorMessage; | 203 String errorMessage; |
206 AccessControlStatus corsStatus = NotSharableCrossOrigin; | 204 AccessControlStatus corsStatus = NotSharableCrossOrigin; |
207 std::unique_ptr<SourceLocation> location; | 205 OwnPtr<SourceLocation> location; |
208 | 206 |
209 v8::Local<v8::Message> message = v8::Exception::CreateMessage(isolate, excep
tion); | 207 v8::Local<v8::Message> message = v8::Exception::CreateMessage(isolate, excep
tion); |
210 if (!message.IsEmpty()) { | 208 if (!message.IsEmpty()) { |
211 // message->Get() can be empty here. https://crbug.com/450330 | 209 // message->Get() can be empty here. https://crbug.com/450330 |
212 errorMessage = toCoreStringWithNullCheck(message->Get()); | 210 errorMessage = toCoreStringWithNullCheck(message->Get()); |
213 location = SourceLocation::fromMessage(isolate, message, context); | 211 location = SourceLocation::fromMessage(isolate, message, context); |
214 if (message->IsSharedCrossOrigin()) | 212 if (message->IsSharedCrossOrigin()) |
215 corsStatus = SharableCrossOrigin; | 213 corsStatus = SharableCrossOrigin; |
216 } else { | 214 } else { |
217 location = SourceLocation::create(context->url().getString(), 0, 0, null
ptr); | 215 location = SourceLocation::create(context->url().getString(), 0, 0, null
ptr); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 | 355 |
358 initializeV8Common(isolate); | 356 initializeV8Common(isolate); |
359 | 357 |
360 isolate->SetFatalErrorHandler(reportFatalErrorInMainThread); | 358 isolate->SetFatalErrorHandler(reportFatalErrorInMainThread); |
361 isolate->AddMessageListener(messageHandlerInMainThread); | 359 isolate->AddMessageListener(messageHandlerInMainThread); |
362 isolate->SetFailedAccessCheckCallbackFunction(failedAccessCheckCallbackInMai
nThread); | 360 isolate->SetFailedAccessCheckCallbackFunction(failedAccessCheckCallbackInMai
nThread); |
363 isolate->SetAllowCodeGenerationFromStringsCallback(codeGenerationCheckCallba
ckInMainThread); | 361 isolate->SetAllowCodeGenerationFromStringsCallback(codeGenerationCheckCallba
ckInMainThread); |
364 | 362 |
365 if (RuntimeEnabledFeatures::v8IdleTasksEnabled()) { | 363 if (RuntimeEnabledFeatures::v8IdleTasksEnabled()) { |
366 WebScheduler* scheduler = Platform::current()->currentThread()->schedule
r(); | 364 WebScheduler* scheduler = Platform::current()->currentThread()->schedule
r(); |
367 V8PerIsolateData::enableIdleTasks(isolate, wrapUnique(new V8IdleTaskRunn
er(scheduler))); | 365 V8PerIsolateData::enableIdleTasks(isolate, adoptPtr(new V8IdleTaskRunner
(scheduler))); |
368 } | 366 } |
369 | 367 |
370 isolate->SetPromiseRejectCallback(promiseRejectHandlerInMainThread); | 368 isolate->SetPromiseRejectCallback(promiseRejectHandlerInMainThread); |
371 | 369 |
372 if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) | 370 if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) |
373 profiler->SetWrapperClassInfoProvider(WrapperTypeInfo::NodeClassId, &Ret
ainedDOMInfo::createRetainedDOMInfo); | 371 profiler->SetWrapperClassInfoProvider(WrapperTypeInfo::NodeClassId, &Ret
ainedDOMInfo::createRetainedDOMInfo); |
374 | 372 |
375 ASSERT(ThreadState::mainThreadState()); | 373 ASSERT(ThreadState::mainThreadState()); |
376 ThreadState::mainThreadState()->addInterruptor(wrapUnique(new V8IsolateInter
ruptor(isolate))); | 374 ThreadState::mainThreadState()->addInterruptor(adoptPtr(new V8IsolateInterru
ptor(isolate))); |
377 if (RuntimeEnabledFeatures::traceWrappablesEnabled()) { | 375 if (RuntimeEnabledFeatures::traceWrappablesEnabled()) { |
378 ThreadState::mainThreadState()->registerTraceDOMWrappers(isolate, | 376 ThreadState::mainThreadState()->registerTraceDOMWrappers(isolate, |
379 V8GCController::traceDOMWrappers, | 377 V8GCController::traceDOMWrappers, |
380 ScriptWrappableVisitor::invalidateDeadObjectsInMarkingDeque); | 378 ScriptWrappableVisitor::invalidateDeadObjectsInMarkingDeque); |
381 } else { | 379 } else { |
382 ThreadState::mainThreadState()->registerTraceDOMWrappers(isolate, | 380 ThreadState::mainThreadState()->registerTraceDOMWrappers(isolate, |
383 V8GCController::traceDOMWrappers, | 381 V8GCController::traceDOMWrappers, |
384 nullptr); | 382 nullptr); |
385 } | 383 } |
386 | 384 |
387 V8PerIsolateData::from(isolate)->setThreadDebugger(wrapUnique(new MainThread
Debugger(isolate))); | 385 V8PerIsolateData::from(isolate)->setThreadDebugger(adoptPtr(new MainThreadDe
bugger(isolate))); |
388 } | 386 } |
389 | 387 |
390 void V8Initializer::shutdownMainThread() | 388 void V8Initializer::shutdownMainThread() |
391 { | 389 { |
392 ASSERT(isMainThread()); | 390 ASSERT(isMainThread()); |
393 v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate(); | 391 v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate(); |
394 V8PerIsolateData::willBeDestroyed(isolate); | 392 V8PerIsolateData::willBeDestroyed(isolate); |
395 V8PerIsolateData::destroy(isolate); | 393 V8PerIsolateData::destroy(isolate); |
396 } | 394 } |
397 | 395 |
(...skipping 14 matching lines...) Expand all Loading... |
412 return; | 410 return; |
413 | 411 |
414 // Exceptions that occur in error handler should be ignored since in that ca
se | 412 // Exceptions that occur in error handler should be ignored since in that ca
se |
415 // WorkerGlobalScope::reportException will send the exception to the worker
object. | 413 // WorkerGlobalScope::reportException will send the exception to the worker
object. |
416 if (perIsolateData->isReportingException()) | 414 if (perIsolateData->isReportingException()) |
417 return; | 415 return; |
418 | 416 |
419 perIsolateData->setReportingException(true); | 417 perIsolateData->setReportingException(true); |
420 | 418 |
421 ExecutionContext* context = scriptState->getExecutionContext(); | 419 ExecutionContext* context = scriptState->getExecutionContext(); |
422 std::unique_ptr<SourceLocation> location = SourceLocation::fromMessage(isola
te, message, context); | 420 OwnPtr<SourceLocation> location = SourceLocation::fromMessage(isolate, messa
ge, context); |
423 ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Ge
t()), std::move(location), &scriptState->world()); | 421 ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Ge
t()), std::move(location), &scriptState->world()); |
424 | 422 |
425 AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCr
ossOrigin : NotSharableCrossOrigin; | 423 AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCr
ossOrigin : NotSharableCrossOrigin; |
426 | 424 |
427 // If execution termination has been triggered as part of constructing | 425 // If execution termination has been triggered as part of constructing |
428 // the error event from the v8::Message, quietly leave. | 426 // the error event from the v8::Message, quietly leave. |
429 if (!isolate->IsExecutionTerminating()) { | 427 if (!isolate->IsExecutionTerminating()) { |
430 V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event, da
ta, scriptState->context()->Global()); | 428 V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event, da
ta, scriptState->context()->Global()); |
431 scriptState->getExecutionContext()->reportException(event, corsStatus); | 429 scriptState->getExecutionContext()->reportException(event, corsStatus); |
432 } | 430 } |
(...skipping 13 matching lines...) Expand all Loading... |
446 | 444 |
447 isolate->AddMessageListener(messageHandlerInWorker); | 445 isolate->AddMessageListener(messageHandlerInWorker); |
448 isolate->SetFatalErrorHandler(reportFatalErrorInWorker); | 446 isolate->SetFatalErrorHandler(reportFatalErrorInWorker); |
449 | 447 |
450 uint32_t here; | 448 uint32_t here; |
451 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here - kWorkerMaxStackSi
ze / sizeof(uint32_t*))); | 449 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here - kWorkerMaxStackSi
ze / sizeof(uint32_t*))); |
452 isolate->SetPromiseRejectCallback(promiseRejectHandlerInWorker); | 450 isolate->SetPromiseRejectCallback(promiseRejectHandlerInWorker); |
453 } | 451 } |
454 | 452 |
455 } // namespace blink | 453 } // namespace blink |
OLD | NEW |