Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp

Issue 2010603002: Use SourceLocation when reporting runtime exceptions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2004243002
Patch Set: test fixes Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 10 matching lines...) Expand all
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE. 23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "bindings/core/v8/V8Initializer.h" 26 #include "bindings/core/v8/V8Initializer.h"
27 27
28 #include "bindings/core/v8/DOMWrapperWorld.h" 28 #include "bindings/core/v8/DOMWrapperWorld.h"
29 #include "bindings/core/v8/RejectedPromises.h" 29 #include "bindings/core/v8/RejectedPromises.h"
30 #include "bindings/core/v8/RetainedDOMInfo.h" 30 #include "bindings/core/v8/RetainedDOMInfo.h"
31 #include "bindings/core/v8/ScriptCallStack.h"
32 #include "bindings/core/v8/ScriptController.h" 31 #include "bindings/core/v8/ScriptController.h"
33 #include "bindings/core/v8/ScriptValue.h" 32 #include "bindings/core/v8/ScriptValue.h"
33 #include "bindings/core/v8/SourceLocation.h"
34 #include "bindings/core/v8/V8Binding.h" 34 #include "bindings/core/v8/V8Binding.h"
35 #include "bindings/core/v8/V8DOMException.h" 35 #include "bindings/core/v8/V8DOMException.h"
36 #include "bindings/core/v8/V8ErrorEvent.h" 36 #include "bindings/core/v8/V8ErrorEvent.h"
37 #include "bindings/core/v8/V8ErrorHandler.h" 37 #include "bindings/core/v8/V8ErrorHandler.h"
38 #include "bindings/core/v8/V8GCController.h" 38 #include "bindings/core/v8/V8GCController.h"
39 #include "bindings/core/v8/V8History.h" 39 #include "bindings/core/v8/V8History.h"
40 #include "bindings/core/v8/V8IdleTaskRunner.h" 40 #include "bindings/core/v8/V8IdleTaskRunner.h"
41 #include "bindings/core/v8/V8Location.h" 41 #include "bindings/core/v8/V8Location.h"
42 #include "bindings/core/v8/V8PerContextData.h" 42 #include "bindings/core/v8/V8PerContextData.h"
43 #include "bindings/core/v8/V8Window.h" 43 #include "bindings/core/v8/V8Window.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 return 0; 88 return 0;
89 } 89 }
90 90
91 static void reportFatalErrorInMainThread(const char* location, const char* messa ge) 91 static void reportFatalErrorInMainThread(const char* location, const char* messa ge)
92 { 92 {
93 int memoryUsageMB = Platform::current()->actualMemoryUsageMB(); 93 int memoryUsageMB = Platform::current()->actualMemoryUsageMB();
94 printf("V8 error: %s (%s). Current memory usage: %d MB\n", message, locatio n, memoryUsageMB); 94 printf("V8 error: %s (%s). Current memory usage: %d MB\n", message, locatio n, memoryUsageMB);
95 CRASH(); 95 CRASH();
96 } 96 }
97 97
98 static PassRefPtr<ScriptCallStack> extractCallStack(v8::Isolate* isolate, v8::Lo cal<v8::Message> message, int* const scriptId)
99 {
100 v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace();
101 RefPtr<ScriptCallStack> callStack = ScriptCallStack::create(isolate, stackTr ace);
102 *scriptId = message->GetScriptOrigin().ScriptID()->Value();
103 if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) {
104 int topScriptId = stackTrace->GetFrame(0)->GetScriptId();
105 if (topScriptId == *scriptId)
106 *scriptId = 0;
107 }
108 return callStack.release();
109 }
110
111 static String extractResourceName(v8::Local<v8::Message> message, const Executio nContext* context)
112 {
113 v8::Local<v8::Value> resourceName = message->GetScriptOrigin().ResourceName( );
114 bool shouldUseDocumentURL = context->isDocument() && (resourceName.IsEmpty() || !resourceName->IsString());
115 return shouldUseDocumentURL ? context->url() : toCoreString(resourceName.As< v8::String>());
116 }
117
118 static String extractMessageForConsole(v8::Isolate* isolate, v8::Local<v8::Value > data) 98 static String extractMessageForConsole(v8::Isolate* isolate, v8::Local<v8::Value > data)
119 { 99 {
120 if (V8DOMWrapper::isWrapper(isolate, data)) { 100 if (V8DOMWrapper::isWrapper(isolate, data)) {
121 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(data); 101 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(data);
122 const WrapperTypeInfo* type = toWrapperTypeInfo(obj); 102 const WrapperTypeInfo* type = toWrapperTypeInfo(obj);
123 if (V8DOMException::wrapperTypeInfo.isSubclass(type)) { 103 if (V8DOMException::wrapperTypeInfo.isSubclass(type)) {
124 DOMException* exception = V8DOMException::toImpl(obj); 104 DOMException* exception = V8DOMException::toImpl(obj);
125 if (exception && !exception->messageForConsole().isEmpty()) 105 if (exception && !exception->messageForConsole().isEmpty())
126 return exception->toStringForConsole(); 106 return exception->toStringForConsole();
127 } 107 }
128 } 108 }
129 return emptyString(); 109 return emptyString();
130 } 110 }
131 111
132 static ErrorEvent* createErrorEventFromMesssage(ScriptState* scriptState, v8::Lo cal<v8::Message> message, String resourceName)
133 {
134 String errorMessage = toCoreStringWithNullCheck(message->Get());
135 int lineNumber = 0;
136 int columnNumber = 0;
137 if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber)
138 && v8Call(message->GetStartColumn(scriptState->context()), columnNumber) )
139 ++columnNumber;
140 return ErrorEvent::create(errorMessage, resourceName, lineNumber, columnNumb er, &scriptState->world());
141 }
142
143 static void messageHandlerInMainThread(v8::Local<v8::Message> message, v8::Local <v8::Value> data) 112 static void messageHandlerInMainThread(v8::Local<v8::Message> message, v8::Local <v8::Value> data)
144 { 113 {
145 ASSERT(isMainThread()); 114 ASSERT(isMainThread());
146 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 115 v8::Isolate* isolate = v8::Isolate::GetCurrent();
147 116
148 // If called during context initialization, there will be no entered context . 117 // If called during context initialization, there will be no entered context .
149 ScriptState* scriptState = ScriptState::current(isolate); 118 ScriptState* scriptState = ScriptState::current(isolate);
150 if (!scriptState->contextIsValid()) 119 if (!scriptState->contextIsValid())
151 return; 120 return;
152 121
153 int scriptId = 0; 122 ExecutionContext* context = scriptState->getExecutionContext();
154 RefPtr<ScriptCallStack> callStack = extractCallStack(isolate, message, &scri ptId); 123 OwnPtr<SourceLocation> location = SourceLocation::fromMessage(isolate, messa ge, context);
155 124
156 AccessControlStatus accessControlStatus = NotSharableCrossOrigin; 125 AccessControlStatus accessControlStatus = NotSharableCrossOrigin;
157 if (message->IsOpaque()) 126 if (message->IsOpaque())
158 accessControlStatus = OpaqueResource; 127 accessControlStatus = OpaqueResource;
159 else if (message->IsSharedCrossOrigin()) 128 else if (message->IsSharedCrossOrigin())
160 accessControlStatus = SharableCrossOrigin; 129 accessControlStatus = SharableCrossOrigin;
161 130
162 ExecutionContext* context = scriptState->getExecutionContext(); 131 ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Ge t()), location->url(), location->lineNumber(), location->columnNumber(), &script State->world());
163 String resourceName = extractResourceName(message, context);
164 ErrorEvent* event = createErrorEventFromMesssage(scriptState, message, resou rceName);
165 132
166 String messageForConsole = extractMessageForConsole(isolate, data); 133 String messageForConsole = extractMessageForConsole(isolate, data);
167 if (!messageForConsole.isEmpty()) 134 if (!messageForConsole.isEmpty())
168 event->setUnsanitizedMessage("Uncaught " + messageForConsole); 135 event->setUnsanitizedMessage("Uncaught " + messageForConsole);
169 136
170 // This method might be called while we're creating a new context. In this c ase, we 137 // This method might be called while we're creating a new context. In this c ase, we
171 // avoid storing the exception object, as we can't create a wrapper during c ontext creation. 138 // avoid storing the exception object, as we can't create a wrapper during c ontext creation.
172 // FIXME: Can we even get here during initialization now that we bail out wh en GetEntered returns an empty handle? 139 // FIXME: Can we even get here during initialization now that we bail out wh en GetEntered returns an empty handle?
173 if (context->isDocument()) { 140 if (context->isDocument()) {
174 LocalFrame* frame = toDocument(context)->frame(); 141 LocalFrame* frame = toDocument(context)->frame();
175 if (frame && frame->script().existingWindowProxy(scriptState->world())) { 142 if (frame && frame->script().existingWindowProxy(scriptState->world())) {
176 V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event , data, scriptState->context()->Global()); 143 V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event , data, scriptState->context()->Global());
177 } 144 }
178 } 145 }
179 146
180 if (scriptState->world().isPrivateScriptIsolatedWorld()) { 147 if (scriptState->world().isPrivateScriptIsolatedWorld()) {
181 // We allow a private script to dispatch error events even in a EventDis patchForbiddenScope scope. 148 // We allow a private script to dispatch error events even in a EventDis patchForbiddenScope scope.
182 // Without having this ability, it's hard to debug the private script be cause syntax errors 149 // Without having this ability, it's hard to debug the private script be cause syntax errors
183 // in the private script are not reported to console (the private script just crashes silently). 150 // in the private script are not reported to console (the private script just crashes silently).
184 // Allowing error events in private scripts is safe because error events don't propagate to 151 // Allowing error events in private scripts is safe because error events don't propagate to
185 // other isolated worlds (which means that the error events won't fire a ny event listeners 152 // other isolated worlds (which means that the error events won't fire a ny event listeners
186 // in user's scripts). 153 // in user's scripts).
187 EventDispatchForbiddenScope::AllowUserAgentEvents allowUserAgentEvents; 154 EventDispatchForbiddenScope::AllowUserAgentEvents allowUserAgentEvents;
188 context->reportException(event, scriptId, callStack, accessControlStatus ); 155 context->reportException(event, std::move(location), accessControlStatus );
189 } else { 156 } else {
190 context->reportException(event, scriptId, callStack, accessControlStatus ); 157 context->reportException(event, std::move(location), accessControlStatus );
191 } 158 }
192 } 159 }
193 160
194 namespace { 161 namespace {
195 162
196 static RejectedPromises& rejectedPromisesOnMainThread() 163 static RejectedPromises& rejectedPromisesOnMainThread()
197 { 164 {
198 ASSERT(isMainThread()); 165 ASSERT(isMainThread());
199 DEFINE_STATIC_LOCAL(RefPtr<RejectedPromises>, rejectedPromises, (RejectedPro mises::create())); 166 DEFINE_STATIC_LOCAL(RefPtr<RejectedPromises>, rejectedPromises, (RejectedPro mises::create()));
200 return *rejectedPromises; 167 return *rejectedPromises;
201 } 168 }
202 169
203 } // namespace 170 } // namespace
204 171
205 void V8Initializer::reportRejectedPromisesOnMainThread() 172 void V8Initializer::reportRejectedPromisesOnMainThread()
206 { 173 {
207 rejectedPromisesOnMainThread().processQueue(); 174 rejectedPromisesOnMainThread().processQueue();
208 } 175 }
209 176
210 static void promiseRejectHandler(v8::PromiseRejectMessage data, RejectedPromises & rejectedPromises, const String& fallbackResourceName) 177 static void promiseRejectHandler(v8::PromiseRejectMessage data, RejectedPromises & rejectedPromises, ScriptState* scriptState)
211 { 178 {
212 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { 179 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) {
213 rejectedPromises.handlerAdded(data); 180 rejectedPromises.handlerAdded(data);
214 return; 181 return;
215 } 182 }
216 183
217 ASSERT(data.GetEvent() == v8::kPromiseRejectWithNoHandler); 184 ASSERT(data.GetEvent() == v8::kPromiseRejectWithNoHandler);
218 185
219 v8::Local<v8::Promise> promise = data.GetPromise(); 186 v8::Local<v8::Promise> promise = data.GetPromise();
220 v8::Isolate* isolate = promise->GetIsolate(); 187 v8::Isolate* isolate = promise->GetIsolate();
221 ScriptState* scriptState = ScriptState::current(isolate); 188 ExecutionContext* context = scriptState->getExecutionContext();
222 189
223 v8::Local<v8::Value> exception = data.GetValue(); 190 v8::Local<v8::Value> exception = data.GetValue();
224 if (V8DOMWrapper::isWrapper(isolate, exception)) { 191 if (V8DOMWrapper::isWrapper(isolate, exception)) {
225 // Try to get the stack & location from a wrapped exception object (e.g. DOMException). 192 // Try to get the stack & location from a wrapped exception object (e.g. DOMException).
226 ASSERT(exception->IsObject()); 193 ASSERT(exception->IsObject());
227 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(exception); 194 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(exception);
228 v8::Local<v8::Value> error = V8HiddenValue::getHiddenValue(scriptState, obj, V8HiddenValue::error(isolate)); 195 v8::Local<v8::Value> error = V8HiddenValue::getHiddenValue(scriptState, obj, V8HiddenValue::error(isolate));
229 if (!error.IsEmpty()) 196 if (!error.IsEmpty())
230 exception = error; 197 exception = error;
231 } 198 }
232 199
233 int scriptId = 0;
234 int lineNumber = 0;
235 int columnNumber = 0;
236 String resourceName = fallbackResourceName;
237 String errorMessage; 200 String errorMessage;
238 AccessControlStatus corsStatus = NotSharableCrossOrigin; 201 AccessControlStatus corsStatus = NotSharableCrossOrigin;
239 RefPtr<ScriptCallStack> callStack; 202 OwnPtr<SourceLocation> location;
240 203
241 v8::Local<v8::Message> message = v8::Exception::CreateMessage(isolate, excep tion); 204 v8::Local<v8::Message> message = v8::Exception::CreateMessage(isolate, excep tion);
242 if (!message.IsEmpty()) { 205 if (!message.IsEmpty()) {
243 V8StringResource<> v8ResourceName(message->GetScriptOrigin().ResourceNam e());
244 if (v8ResourceName.prepare())
245 resourceName = v8ResourceName;
246 scriptId = message->GetScriptOrigin().ScriptID()->Value();
247 if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber)
248 && v8Call(message->GetStartColumn(scriptState->context()), columnNum ber))
249 ++columnNumber;
250 // message->Get() can be empty here. https://crbug.com/450330 206 // message->Get() can be empty here. https://crbug.com/450330
251 errorMessage = toCoreStringWithNullCheck(message->Get()); 207 errorMessage = toCoreStringWithNullCheck(message->Get());
252 callStack = extractCallStack(isolate, message, &scriptId); 208 location = SourceLocation::fromMessage(isolate, message, context);
253 if (message->IsSharedCrossOrigin()) 209 if (message->IsSharedCrossOrigin())
254 corsStatus = SharableCrossOrigin; 210 corsStatus = SharableCrossOrigin;
211 } else {
212 location = SourceLocation::create(context->url().getString(), 0, 0, null ptr);
255 } 213 }
256 214
257 String messageForConsole = extractMessageForConsole(isolate, data.GetValue() ); 215 String messageForConsole = extractMessageForConsole(isolate, data.GetValue() );
258 if (!messageForConsole.isEmpty()) 216 if (!messageForConsole.isEmpty())
259 errorMessage = "Uncaught " + messageForConsole; 217 errorMessage = "Uncaught " + messageForConsole;
260 218
261 rejectedPromises.rejectedWithNoHandler(scriptState, data, errorMessage, reso urceName, scriptId, lineNumber, columnNumber, callStack, corsStatus); 219 rejectedPromises.rejectedWithNoHandler(scriptState, data, errorMessage, std: :move(location), corsStatus);
262 } 220 }
263 221
264 static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage data) 222 static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage data)
265 { 223 {
266 ASSERT(isMainThread()); 224 ASSERT(isMainThread());
267 225
268 v8::Local<v8::Promise> promise = data.GetPromise(); 226 v8::Local<v8::Promise> promise = data.GetPromise();
269 227
270 v8::Isolate* isolate = promise->GetIsolate(); 228 v8::Isolate* isolate = promise->GetIsolate();
271 229
272 // TODO(ikilpatrick): Remove this check, extensions tests that use 230 // TODO(ikilpatrick): Remove this check, extensions tests that use
273 // extensions::ModuleSystemTest incorrectly don't have a valid script state. 231 // extensions::ModuleSystemTest incorrectly don't have a valid script state.
274 LocalDOMWindow* window = currentDOMWindow(isolate); 232 LocalDOMWindow* window = currentDOMWindow(isolate);
275 if (!window || !window->isCurrentlyDisplayedInFrame()) 233 if (!window || !window->isCurrentlyDisplayedInFrame())
276 return; 234 return;
277 235
278 // Bail out if called during context initialization. 236 // Bail out if called during context initialization.
279 ScriptState* scriptState = ScriptState::current(isolate); 237 ScriptState* scriptState = ScriptState::current(isolate);
280 if (!scriptState->contextIsValid()) 238 if (!scriptState->contextIsValid())
281 return; 239 return;
282 240
283 promiseRejectHandler(data, rejectedPromisesOnMainThread(), scriptState->getE xecutionContext()->url()); 241 promiseRejectHandler(data, rejectedPromisesOnMainThread(), scriptState);
284 } 242 }
285 243
286 static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data) 244 static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data)
287 { 245 {
288 v8::Local<v8::Promise> promise = data.GetPromise(); 246 v8::Local<v8::Promise> promise = data.GetPromise();
289 247
290 // Bail out if called during context initialization. 248 // Bail out if called during context initialization.
291 v8::Isolate* isolate = promise->GetIsolate(); 249 v8::Isolate* isolate = promise->GetIsolate();
292 ScriptState* scriptState = ScriptState::current(isolate); 250 ScriptState* scriptState = ScriptState::current(isolate);
293 if (!scriptState->contextIsValid()) 251 if (!scriptState->contextIsValid())
294 return; 252 return;
295 253
296 ExecutionContext* executionContext = scriptState->getExecutionContext(); 254 ExecutionContext* executionContext = scriptState->getExecutionContext();
297 if (!executionContext) 255 if (!executionContext)
298 return; 256 return;
299 257
300 ASSERT(executionContext->isWorkerGlobalScope()); 258 ASSERT(executionContext->isWorkerGlobalScope());
301 WorkerOrWorkletScriptController* scriptController = toWorkerGlobalScope(exec utionContext)->scriptController(); 259 WorkerOrWorkletScriptController* scriptController = toWorkerGlobalScope(exec utionContext)->scriptController();
302 ASSERT(scriptController); 260 ASSERT(scriptController);
303 261
304 promiseRejectHandler(data, *scriptController->getRejectedPromises(), String( )); 262 promiseRejectHandler(data, *scriptController->getRejectedPromises(), scriptS tate);
305 } 263 }
306 264
307 static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8 ::AccessType type, v8::Local<v8::Value> data) 265 static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8 ::AccessType type, v8::Local<v8::Value> data)
308 { 266 {
309 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 267 v8::Isolate* isolate = v8::Isolate::GetCurrent();
310 Frame* target = findFrame(isolate, host, data); 268 Frame* target = findFrame(isolate, host, data);
311 if (!target) 269 if (!target)
312 return; 270 return;
313 DOMWindow* targetWindow = target->domWindow(); 271 DOMWindow* targetWindow = target->domWindow();
314 272
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 if (!scriptState->contextIsValid()) 391 if (!scriptState->contextIsValid())
434 return; 392 return;
435 393
436 // Exceptions that occur in error handler should be ignored since in that ca se 394 // Exceptions that occur in error handler should be ignored since in that ca se
437 // WorkerGlobalScope::reportException will send the exception to the worker object. 395 // WorkerGlobalScope::reportException will send the exception to the worker object.
438 if (perIsolateData->isReportingException()) 396 if (perIsolateData->isReportingException())
439 return; 397 return;
440 398
441 perIsolateData->setReportingException(true); 399 perIsolateData->setReportingException(true);
442 400
443 TOSTRING_VOID(V8StringResource<>, resourceName, message->GetScriptOrigin().R esourceName()); 401 ExecutionContext* context = scriptState->getExecutionContext();
444 ErrorEvent* event = createErrorEventFromMesssage(scriptState, message, resou rceName); 402 OwnPtr<SourceLocation> location = SourceLocation::fromMessage(isolate, messa ge, context);
445 403 ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Ge t()), location->url(), location->lineNumber(), location->columnNumber(), &script State->world());
446 int scriptId = 0;
447 RefPtr<ScriptCallStack> callStack = extractCallStack(isolate, message, &scri ptId);
448 404
449 AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCr ossOrigin : NotSharableCrossOrigin; 405 AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCr ossOrigin : NotSharableCrossOrigin;
450 406
451 // If execution termination has been triggered as part of constructing 407 // If execution termination has been triggered as part of constructing
452 // the error event from the v8::Message, quietly leave. 408 // the error event from the v8::Message, quietly leave.
453 if (!isolate->IsExecutionTerminating()) { 409 if (!isolate->IsExecutionTerminating()) {
454 V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event, da ta, scriptState->context()->Global()); 410 V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event, da ta, scriptState->context()->Global());
455 scriptState->getExecutionContext()->reportException(event, scriptId, cal lStack, corsStatus); 411 scriptState->getExecutionContext()->reportException(event, std::move(loc ation), corsStatus);
456 } 412 }
457 413
458 perIsolateData->setReportingException(false); 414 perIsolateData->setReportingException(false);
459 } 415 }
460 416
461 static const int kWorkerMaxStackSize = 500 * 1024; 417 static const int kWorkerMaxStackSize = 500 * 1024;
462 418
463 // This function uses a local stack variable to determine the isolate's stack li mit. AddressSanitizer may 419 // This function uses a local stack variable to determine the isolate's stack li mit. AddressSanitizer may
464 // relocate that local variable to a fake stack, which may lead to problems duri ng JavaScript execution. 420 // relocate that local variable to a fake stack, which may lead to problems duri ng JavaScript execution.
465 // Therefore we disable AddressSanitizer for V8Initializer::initializeWorker(). 421 // Therefore we disable AddressSanitizer for V8Initializer::initializeWorker().
466 NO_SANITIZE_ADDRESS 422 NO_SANITIZE_ADDRESS
467 void V8Initializer::initializeWorker(v8::Isolate* isolate) 423 void V8Initializer::initializeWorker(v8::Isolate* isolate)
468 { 424 {
469 initializeV8Common(isolate); 425 initializeV8Common(isolate);
470 426
471 isolate->AddMessageListener(messageHandlerInWorker); 427 isolate->AddMessageListener(messageHandlerInWorker);
472 isolate->SetFatalErrorHandler(reportFatalErrorInWorker); 428 isolate->SetFatalErrorHandler(reportFatalErrorInWorker);
473 429
474 uint32_t here; 430 uint32_t here;
475 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here - kWorkerMaxStackSi ze / sizeof(uint32_t*))); 431 isolate->SetStackLimit(reinterpret_cast<uintptr_t>(&here - kWorkerMaxStackSi ze / sizeof(uint32_t*)));
476 isolate->SetPromiseRejectCallback(promiseRejectHandlerInWorker); 432 isolate->SetPromiseRejectCallback(promiseRejectHandlerInWorker);
477 } 433 }
478 434
479 } // namespace blink 435 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698