| 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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 } // namespace | 196 } // namespace |
| 197 | 197 |
| 198 void V8Initializer::reportRejectedPromisesOnMainThread() | 198 void V8Initializer::reportRejectedPromisesOnMainThread() |
| 199 { | 199 { |
| 200 rejectedPromisesOnMainThread().processQueue(); | 200 rejectedPromisesOnMainThread().processQueue(); |
| 201 } | 201 } |
| 202 | 202 |
| 203 static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage data) | 203 static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage data) |
| 204 { | 204 { |
| 205 ASSERT(isMainThread()); | 205 ASSERT(isMainThread()); |
| 206 if (data.GetEvent() != v8::kPromiseRejectWithNoHandler) | 206 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { |
| 207 rejectedPromisesOnMainThread().handlerAdded(data); |
| 207 return; | 208 return; |
| 209 } |
| 210 |
| 211 ASSERT(data.GetEvent() == v8::kPromiseRejectWithNoHandler); |
| 212 |
| 208 v8::Handle<v8::Promise> promise = data.GetPromise(); | 213 v8::Handle<v8::Promise> promise = data.GetPromise(); |
| 209 | 214 |
| 210 v8::Isolate* isolate = promise->GetIsolate(); | 215 v8::Isolate* isolate = promise->GetIsolate(); |
| 211 // There is no entered window during microtask callbacks from V8, | 216 // There is no entered window during microtask callbacks from V8, |
| 212 // thus we call toDOMWindow() instead of enteredDOMWindow(). | 217 // thus we call toDOMWindow() instead of enteredDOMWindow(). |
| 213 LocalDOMWindow* window = currentDOMWindow(isolate); | 218 LocalDOMWindow* window = currentDOMWindow(isolate); |
| 214 if (!window || !window->isCurrentlyDisplayedInFrame()) | 219 if (!window || !window->isCurrentlyDisplayedInFrame()) |
| 215 return; | 220 return; |
| 216 | 221 |
| 217 v8::Handle<v8::Value> exception = data.GetValue(); | 222 v8::Handle<v8::Value> exception = data.GetValue(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 242 } else if (!exception.IsEmpty() && exception->IsInt32()) { | 247 } else if (!exception.IsEmpty() && exception->IsInt32()) { |
| 243 // For Smi's the message would be empty. | 248 // For Smi's the message would be empty. |
| 244 errorMessage = "Uncaught " + String::number(exception.As<v8::Integer>()-
>Value()); | 249 errorMessage = "Uncaught " + String::number(exception.As<v8::Integer>()-
>Value()); |
| 245 } | 250 } |
| 246 | 251 |
| 247 String messageForConsole = extractMessageForConsole(isolate, data.GetValue()
); | 252 String messageForConsole = extractMessageForConsole(isolate, data.GetValue()
); |
| 248 if (!messageForConsole.isEmpty()) | 253 if (!messageForConsole.isEmpty()) |
| 249 errorMessage = "Uncaught " + messageForConsole; | 254 errorMessage = "Uncaught " + messageForConsole; |
| 250 | 255 |
| 251 ScriptState* scriptState = ScriptState::current(isolate); | 256 ScriptState* scriptState = ScriptState::current(isolate); |
| 252 rejectedPromisesOnMainThread().add(scriptState, data, errorMessage, resource
Name, scriptId, lineNumber, columnNumber, callStack); | 257 rejectedPromisesOnMainThread().rejectedWithNoHandler(scriptState, data, erro
rMessage, resourceName, scriptId, lineNumber, columnNumber, callStack); |
| 253 } | 258 } |
| 254 | 259 |
| 255 static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data) | 260 static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data) |
| 256 { | 261 { |
| 257 if (data.GetEvent() != v8::kPromiseRejectWithNoHandler) | |
| 258 return; | |
| 259 | |
| 260 v8::Handle<v8::Promise> promise = data.GetPromise(); | 262 v8::Handle<v8::Promise> promise = data.GetPromise(); |
| 261 | 263 |
| 262 // Bail out if called during context initialization. | 264 // Bail out if called during context initialization. |
| 263 v8::Isolate* isolate = promise->GetIsolate(); | 265 v8::Isolate* isolate = promise->GetIsolate(); |
| 264 ScriptState* scriptState = ScriptState::current(isolate); | 266 ScriptState* scriptState = ScriptState::current(isolate); |
| 265 if (!scriptState->contextIsValid()) | 267 if (!scriptState->contextIsValid()) |
| 266 return; | 268 return; |
| 267 | 269 |
| 268 ExecutionContext* executionContext = scriptState->executionContext(); | 270 ExecutionContext* executionContext = scriptState->executionContext(); |
| 269 if (!executionContext) | 271 if (!executionContext) |
| 270 return; | 272 return; |
| 271 | 273 |
| 272 ASSERT(executionContext->isWorkerGlobalScope()); | 274 ASSERT(executionContext->isWorkerGlobalScope()); |
| 273 WorkerScriptController* scriptController = toWorkerGlobalScope(executionCont
ext)->script(); | 275 WorkerScriptController* scriptController = toWorkerGlobalScope(executionCont
ext)->script(); |
| 274 ASSERT(scriptController); | 276 ASSERT(scriptController); |
| 275 | 277 |
| 278 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { |
| 279 scriptController->rejectedPromises()->handlerAdded(data); |
| 280 return; |
| 281 } |
| 282 |
| 283 ASSERT(data.GetEvent() == v8::kPromiseRejectWithNoHandler); |
| 284 |
| 276 int scriptId = 0; | 285 int scriptId = 0; |
| 277 int lineNumber = 0; | 286 int lineNumber = 0; |
| 278 int columnNumber = 0; | 287 int columnNumber = 0; |
| 279 String resourceName; | 288 String resourceName; |
| 280 String errorMessage; | 289 String errorMessage; |
| 281 | 290 |
| 282 v8::Handle<v8::Message> message = v8::Exception::CreateMessage(data.GetValue
()); | 291 v8::Handle<v8::Message> message = v8::Exception::CreateMessage(data.GetValue
()); |
| 283 if (!message.IsEmpty()) { | 292 if (!message.IsEmpty()) { |
| 284 TOSTRING_VOID(V8StringResource<>, resourceName, message->GetScriptOrigin
().ResourceName()); | 293 TOSTRING_VOID(V8StringResource<>, resourceName, message->GetScriptOrigin
().ResourceName()); |
| 285 scriptId = message->GetScriptOrigin().ScriptID()->Value(); | 294 scriptId = message->GetScriptOrigin().ScriptID()->Value(); |
| 286 if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber) | 295 if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber) |
| 287 && v8Call(message->GetStartColumn(scriptState->context()), columnNum
ber)) | 296 && v8Call(message->GetStartColumn(scriptState->context()), columnNum
ber)) |
| 288 ++columnNumber; | 297 ++columnNumber; |
| 289 // message->Get() can be empty here. https://crbug.com/450330 | 298 // message->Get() can be empty here. https://crbug.com/450330 |
| 290 errorMessage = toCoreStringWithNullCheck(message->Get()); | 299 errorMessage = toCoreStringWithNullCheck(message->Get()); |
| 291 } | 300 } |
| 292 scriptController->rejectedPromises()->add(scriptState, data, errorMessage, r
esourceName, scriptId, lineNumber, columnNumber, nullptr); | 301 scriptController->rejectedPromises()->rejectedWithNoHandler(scriptState, dat
a, errorMessage, resourceName, scriptId, lineNumber, columnNumber, nullptr); |
| 293 } | 302 } |
| 294 | 303 |
| 295 static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8
::AccessType type, v8::Local<v8::Value> data) | 304 static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8
::AccessType type, v8::Local<v8::Value> data) |
| 296 { | 305 { |
| 297 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 306 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 298 Frame* target = findFrame(host, data, isolate); | 307 Frame* target = findFrame(host, data, isolate); |
| 299 if (!target) | 308 if (!target) |
| 300 return; | 309 return; |
| 301 DOMWindow* targetWindow = target->domWindow(); | 310 DOMWindow* targetWindow = target->domWindow(); |
| 302 | 311 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 | 470 |
| 462 v8::V8::AddMessageListener(messageHandlerInWorker); | 471 v8::V8::AddMessageListener(messageHandlerInWorker); |
| 463 v8::V8::SetFatalErrorHandler(reportFatalErrorInWorker); | 472 v8::V8::SetFatalErrorHandler(reportFatalErrorInWorker); |
| 464 | 473 |
| 465 uint32_t here; | 474 uint32_t here; |
| 466 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here - kWorkerMaxStackSi
ze / sizeof(uint32_t*))); | 475 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here - kWorkerMaxStackSi
ze / sizeof(uint32_t*))); |
| 467 isolate->SetPromiseRejectCallback(promiseRejectHandlerInWorker); | 476 isolate->SetPromiseRejectCallback(promiseRejectHandlerInWorker); |
| 468 } | 477 } |
| 469 | 478 |
| 470 } // namespace blink | 479 } // namespace blink |
| OLD | NEW |