| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 V8Window::findInstanceInPrototypeChain(host, isolate); | 82 V8Window::findInstanceInPrototypeChain(host, isolate); |
| 83 if (window_wrapper.IsEmpty()) | 83 if (window_wrapper.IsEmpty()) |
| 84 return 0; | 84 return 0; |
| 85 return V8Window::toImpl(window_wrapper)->GetFrame(); | 85 return V8Window::toImpl(window_wrapper)->GetFrame(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 if (V8Location::wrapperTypeInfo.Equals(type)) | 88 if (V8Location::wrapperTypeInfo.Equals(type)) |
| 89 return V8Location::toImpl(host)->GetFrame(); | 89 return V8Location::toImpl(host)->GetFrame(); |
| 90 | 90 |
| 91 // This function can handle only those types listed above. | 91 // This function can handle only those types listed above. |
| 92 ASSERT_NOT_REACHED(); | 92 NOTREACHED(); |
| 93 return 0; | 93 return 0; |
| 94 } | 94 } |
| 95 | 95 |
| 96 static void ReportFatalErrorInMainThread(const char* location, | 96 static void ReportFatalErrorInMainThread(const char* location, |
| 97 const char* message) { | 97 const char* message) { |
| 98 int memory_usage_mb = Platform::Current()->ActualMemoryUsageMB(); | 98 int memory_usage_mb = Platform::Current()->ActualMemoryUsageMB(); |
| 99 DVLOG(1) << "V8 error: " << message << " (" << location | 99 DVLOG(1) << "V8 error: " << message << " (" << location |
| 100 << "). Current memory usage: " << memory_usage_mb << " MB"; | 100 << "). Current memory usage: " << memory_usage_mb << " MB"; |
| 101 CRASH(); | 101 CRASH(); |
| 102 } | 102 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 | 148 |
| 149 // NOTE: when editing this, please also edit the error messages we throw when | 149 // NOTE: when editing this, please also edit the error messages we throw when |
| 150 // the size is exceeded (see uses of the constant), which use the human-friendly | 150 // the size is exceeded (see uses of the constant), which use the human-friendly |
| 151 // "4KB" text. | 151 // "4KB" text. |
| 152 const size_t kWasmWireBytesLimit = 1 << 12; | 152 const size_t kWasmWireBytesLimit = 1 << 12; |
| 153 | 153 |
| 154 } // namespace | 154 } // namespace |
| 155 | 155 |
| 156 void V8Initializer::MessageHandlerInMainThread(v8::Local<v8::Message> message, | 156 void V8Initializer::MessageHandlerInMainThread(v8::Local<v8::Message> message, |
| 157 v8::Local<v8::Value> data) { | 157 v8::Local<v8::Value> data) { |
| 158 ASSERT(IsMainThread()); | 158 DCHECK(IsMainThread()); |
| 159 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 159 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 160 | 160 |
| 161 if (isolate->GetEnteredContext().IsEmpty()) | 161 if (isolate->GetEnteredContext().IsEmpty()) |
| 162 return; | 162 return; |
| 163 | 163 |
| 164 // If called during context initialization, there will be no entered context. | 164 // If called during context initialization, there will be no entered context. |
| 165 ScriptState* script_state = ScriptState::Current(isolate); | 165 ScriptState* script_state = ScriptState::Current(isolate); |
| 166 if (!script_state->ContextIsValid()) | 166 if (!script_state->ContextIsValid()) |
| 167 return; | 167 return; |
| 168 | 168 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 193 event->SetUnsanitizedMessage("Uncaught " + message_for_console); | 193 event->SetUnsanitizedMessage("Uncaught " + message_for_console); |
| 194 | 194 |
| 195 V8ErrorHandler::StoreExceptionOnErrorEventWrapper( | 195 V8ErrorHandler::StoreExceptionOnErrorEventWrapper( |
| 196 script_state, event, data, script_state->GetContext()->Global()); | 196 script_state, event, data, script_state->GetContext()->Global()); |
| 197 context->DispatchErrorEvent(event, access_control_status); | 197 context->DispatchErrorEvent(event, access_control_status); |
| 198 } | 198 } |
| 199 | 199 |
| 200 namespace { | 200 namespace { |
| 201 | 201 |
| 202 static RejectedPromises& RejectedPromisesOnMainThread() { | 202 static RejectedPromises& RejectedPromisesOnMainThread() { |
| 203 ASSERT(IsMainThread()); | 203 DCHECK(IsMainThread()); |
| 204 DEFINE_STATIC_LOCAL(RefPtr<RejectedPromises>, rejected_promises, | 204 DEFINE_STATIC_LOCAL(RefPtr<RejectedPromises>, rejected_promises, |
| 205 (RejectedPromises::Create())); | 205 (RejectedPromises::Create())); |
| 206 return *rejected_promises; | 206 return *rejected_promises; |
| 207 } | 207 } |
| 208 | 208 |
| 209 } // namespace | 209 } // namespace |
| 210 | 210 |
| 211 void V8Initializer::ReportRejectedPromisesOnMainThread() { | 211 void V8Initializer::ReportRejectedPromisesOnMainThread() { |
| 212 RejectedPromisesOnMainThread().ProcessQueue(); | 212 RejectedPromisesOnMainThread().ProcessQueue(); |
| 213 } | 213 } |
| 214 | 214 |
| 215 static void PromiseRejectHandler(v8::PromiseRejectMessage data, | 215 static void PromiseRejectHandler(v8::PromiseRejectMessage data, |
| 216 RejectedPromises& rejected_promises, | 216 RejectedPromises& rejected_promises, |
| 217 ScriptState* script_state) { | 217 ScriptState* script_state) { |
| 218 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { | 218 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { |
| 219 rejected_promises.HandlerAdded(data); | 219 rejected_promises.HandlerAdded(data); |
| 220 return; | 220 return; |
| 221 } | 221 } |
| 222 | 222 |
| 223 ASSERT(data.GetEvent() == v8::kPromiseRejectWithNoHandler); | 223 DCHECK_EQ(data.GetEvent(), v8::kPromiseRejectWithNoHandler); |
| 224 | 224 |
| 225 v8::Local<v8::Promise> promise = data.GetPromise(); | 225 v8::Local<v8::Promise> promise = data.GetPromise(); |
| 226 v8::Isolate* isolate = promise->GetIsolate(); | 226 v8::Isolate* isolate = promise->GetIsolate(); |
| 227 ExecutionContext* context = script_state->GetExecutionContext(); | 227 ExecutionContext* context = script_state->GetExecutionContext(); |
| 228 | 228 |
| 229 v8::Local<v8::Value> exception = data.GetValue(); | 229 v8::Local<v8::Value> exception = data.GetValue(); |
| 230 if (V8DOMWrapper::IsWrapper(isolate, exception)) { | 230 if (V8DOMWrapper::IsWrapper(isolate, exception)) { |
| 231 // Try to get the stack & location from a wrapped exception object (e.g. | 231 // Try to get the stack & location from a wrapped exception object (e.g. |
| 232 // DOMException). | 232 // DOMException). |
| 233 ASSERT(exception->IsObject()); | 233 DCHECK(exception->IsObject()); |
| 234 auto private_error = V8PrivateProperty::GetDOMExceptionError(isolate); | 234 auto private_error = V8PrivateProperty::GetDOMExceptionError(isolate); |
| 235 v8::Local<v8::Value> error = | 235 v8::Local<v8::Value> error = |
| 236 private_error.GetOrUndefined(exception.As<v8::Object>()); | 236 private_error.GetOrUndefined(exception.As<v8::Object>()); |
| 237 if (!error->IsUndefined()) | 237 if (!error->IsUndefined()) |
| 238 exception = error; | 238 exception = error; |
| 239 } | 239 } |
| 240 | 240 |
| 241 String error_message; | 241 String error_message; |
| 242 AccessControlStatus cors_status = kNotSharableCrossOrigin; | 242 AccessControlStatus cors_status = kNotSharableCrossOrigin; |
| 243 std::unique_ptr<SourceLocation> location; | 243 std::unique_ptr<SourceLocation> location; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 258 String message_for_console = | 258 String message_for_console = |
| 259 ExtractMessageForConsole(isolate, data.GetValue()); | 259 ExtractMessageForConsole(isolate, data.GetValue()); |
| 260 if (!message_for_console.IsEmpty()) | 260 if (!message_for_console.IsEmpty()) |
| 261 error_message = "Uncaught " + message_for_console; | 261 error_message = "Uncaught " + message_for_console; |
| 262 | 262 |
| 263 rejected_promises.RejectedWithNoHandler(script_state, data, error_message, | 263 rejected_promises.RejectedWithNoHandler(script_state, data, error_message, |
| 264 std::move(location), cors_status); | 264 std::move(location), cors_status); |
| 265 } | 265 } |
| 266 | 266 |
| 267 static void PromiseRejectHandlerInMainThread(v8::PromiseRejectMessage data) { | 267 static void PromiseRejectHandlerInMainThread(v8::PromiseRejectMessage data) { |
| 268 ASSERT(IsMainThread()); | 268 DCHECK(IsMainThread()); |
| 269 | 269 |
| 270 v8::Local<v8::Promise> promise = data.GetPromise(); | 270 v8::Local<v8::Promise> promise = data.GetPromise(); |
| 271 | 271 |
| 272 v8::Isolate* isolate = promise->GetIsolate(); | 272 v8::Isolate* isolate = promise->GetIsolate(); |
| 273 | 273 |
| 274 // TODO(ikilpatrick): Remove this check, extensions tests that use | 274 // TODO(ikilpatrick): Remove this check, extensions tests that use |
| 275 // extensions::ModuleSystemTest incorrectly don't have a valid script state. | 275 // extensions::ModuleSystemTest incorrectly don't have a valid script state. |
| 276 LocalDOMWindow* window = CurrentDOMWindow(isolate); | 276 LocalDOMWindow* window = CurrentDOMWindow(isolate); |
| 277 if (!window || !window->IsCurrentlyDisplayedInFrame()) | 277 if (!window || !window->IsCurrentlyDisplayedInFrame()) |
| 278 return; | 278 return; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 291 // Bail out if called during context initialization. | 291 // Bail out if called during context initialization. |
| 292 v8::Isolate* isolate = promise->GetIsolate(); | 292 v8::Isolate* isolate = promise->GetIsolate(); |
| 293 ScriptState* script_state = ScriptState::Current(isolate); | 293 ScriptState* script_state = ScriptState::Current(isolate); |
| 294 if (!script_state->ContextIsValid()) | 294 if (!script_state->ContextIsValid()) |
| 295 return; | 295 return; |
| 296 | 296 |
| 297 ExecutionContext* execution_context = script_state->GetExecutionContext(); | 297 ExecutionContext* execution_context = script_state->GetExecutionContext(); |
| 298 if (!execution_context) | 298 if (!execution_context) |
| 299 return; | 299 return; |
| 300 | 300 |
| 301 ASSERT(execution_context->IsWorkerGlobalScope()); | 301 DCHECK(execution_context->IsWorkerGlobalScope()); |
| 302 WorkerOrWorkletScriptController* script_controller = | 302 WorkerOrWorkletScriptController* script_controller = |
| 303 ToWorkerGlobalScope(execution_context)->ScriptController(); | 303 ToWorkerGlobalScope(execution_context)->ScriptController(); |
| 304 ASSERT(script_controller); | 304 DCHECK(script_controller); |
| 305 | 305 |
| 306 PromiseRejectHandler(data, *script_controller->GetRejectedPromises(), | 306 PromiseRejectHandler(data, *script_controller->GetRejectedPromises(), |
| 307 script_state); | 307 script_state); |
| 308 } | 308 } |
| 309 | 309 |
| 310 static void FailedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, | 310 static void FailedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, |
| 311 v8::AccessType type, | 311 v8::AccessType type, |
| 312 v8::Local<v8::Value> data) { | 312 v8::Local<v8::Value> data) { |
| 313 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 313 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 314 Frame* target = FindFrame(isolate, host, data); | 314 Frame* target = FindFrame(isolate, host, data); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 process_total += diff; | 438 process_total += diff; |
| 439 DCHECK_GE(process_total, 0) | 439 DCHECK_GE(process_total, 0) |
| 440 << "total amount = " << process_total << ", diff = " << diff; | 440 << "total amount = " << process_total << ", diff = " << diff; |
| 441 } | 441 } |
| 442 #endif | 442 #endif |
| 443 | 443 |
| 444 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(diff); | 444 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(diff); |
| 445 } | 445 } |
| 446 | 446 |
| 447 void V8Initializer::InitializeMainThread() { | 447 void V8Initializer::InitializeMainThread() { |
| 448 ASSERT(IsMainThread()); | 448 DCHECK(IsMainThread()); |
| 449 | 449 |
| 450 WTF::ArrayBufferContents::Initialize(AdjustAmountOfExternalAllocatedMemory); | 450 WTF::ArrayBufferContents::Initialize(AdjustAmountOfExternalAllocatedMemory); |
| 451 | 451 |
| 452 DEFINE_STATIC_LOCAL(ArrayBufferAllocator, array_buffer_allocator, ()); | 452 DEFINE_STATIC_LOCAL(ArrayBufferAllocator, array_buffer_allocator, ()); |
| 453 auto v8_extras_mode = RuntimeEnabledFeatures::experimentalV8ExtrasEnabled() | 453 auto v8_extras_mode = RuntimeEnabledFeatures::experimentalV8ExtrasEnabled() |
| 454 ? gin::IsolateHolder::kStableAndExperimentalV8Extras | 454 ? gin::IsolateHolder::kStableAndExperimentalV8Extras |
| 455 : gin::IsolateHolder::kStableV8Extras; | 455 : gin::IsolateHolder::kStableV8Extras; |
| 456 gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode, | 456 gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode, |
| 457 v8_extras_mode, &array_buffer_allocator); | 457 v8_extras_mode, &array_buffer_allocator); |
| 458 | 458 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 485 } | 485 } |
| 486 | 486 |
| 487 isolate->SetPromiseRejectCallback(PromiseRejectHandlerInMainThread); | 487 isolate->SetPromiseRejectCallback(PromiseRejectHandlerInMainThread); |
| 488 | 488 |
| 489 if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) { | 489 if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) { |
| 490 profiler->SetWrapperClassInfoProvider( | 490 profiler->SetWrapperClassInfoProvider( |
| 491 WrapperTypeInfo::kNodeClassId, &RetainedDOMInfo::CreateRetainedDOMInfo); | 491 WrapperTypeInfo::kNodeClassId, &RetainedDOMInfo::CreateRetainedDOMInfo); |
| 492 profiler->SetGetRetainerInfosCallback(&V8GCController::GetRetainerInfos); | 492 profiler->SetGetRetainerInfosCallback(&V8GCController::GetRetainerInfos); |
| 493 } | 493 } |
| 494 | 494 |
| 495 ASSERT(ThreadState::MainThreadState()); | 495 DCHECK(ThreadState::MainThreadState()); |
| 496 ThreadState::MainThreadState()->RegisterTraceDOMWrappers( | 496 ThreadState::MainThreadState()->RegisterTraceDOMWrappers( |
| 497 isolate, V8GCController::TraceDOMWrappers, | 497 isolate, V8GCController::TraceDOMWrappers, |
| 498 ScriptWrappableVisitor::InvalidateDeadObjectsInMarkingDeque, | 498 ScriptWrappableVisitor::InvalidateDeadObjectsInMarkingDeque, |
| 499 ScriptWrappableVisitor::PerformCleanup); | 499 ScriptWrappableVisitor::PerformCleanup); |
| 500 | 500 |
| 501 V8PerIsolateData::From(isolate)->SetThreadDebugger( | 501 V8PerIsolateData::From(isolate)->SetThreadDebugger( |
| 502 WTF::MakeUnique<MainThreadDebugger>(isolate)); | 502 WTF::MakeUnique<MainThreadDebugger>(isolate)); |
| 503 } | 503 } |
| 504 | 504 |
| 505 static void ReportFatalErrorInWorker(const char* location, | 505 static void ReportFatalErrorInWorker(const char* location, |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 v8::Isolate::kMessageLog); | 578 v8::Isolate::kMessageLog); |
| 579 isolate->SetFatalErrorHandler(ReportFatalErrorInWorker); | 579 isolate->SetFatalErrorHandler(ReportFatalErrorInWorker); |
| 580 | 580 |
| 581 uint32_t here; | 581 uint32_t here; |
| 582 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here) - | 582 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here) - |
| 583 kWorkerMaxStackSize); | 583 kWorkerMaxStackSize); |
| 584 isolate->SetPromiseRejectCallback(PromiseRejectHandlerInWorker); | 584 isolate->SetPromiseRejectCallback(PromiseRejectHandlerInWorker); |
| 585 } | 585 } |
| 586 | 586 |
| 587 } // namespace blink | 587 } // namespace blink |
| OLD | NEW |