| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2009, 2012 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 are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 #include "core/workers/SharedWorkerGlobalScope.h" | 47 #include "core/workers/SharedWorkerGlobalScope.h" |
| 48 #include "core/workers/WorkerGlobalScope.h" | 48 #include "core/workers/WorkerGlobalScope.h" |
| 49 #include "core/workers/WorkerObjectProxy.h" | 49 #include "core/workers/WorkerObjectProxy.h" |
| 50 #include "core/workers/WorkerThread.h" | 50 #include "core/workers/WorkerThread.h" |
| 51 #include "platform/heap/ThreadState.h" | 51 #include "platform/heap/ThreadState.h" |
| 52 #include "public/platform/Platform.h" | 52 #include "public/platform/Platform.h" |
| 53 #include <v8.h> | 53 #include <v8.h> |
| 54 | 54 |
| 55 namespace blink { | 55 namespace blink { |
| 56 | 56 |
| 57 class WorkerScriptController::WorkerGlobalScopeExecutionState final { | 57 class WorkerScriptController::ExecutionState final { |
| 58 STACK_ALLOCATED(); | 58 STACK_ALLOCATED(); |
| 59 public: | 59 public: |
| 60 explicit WorkerGlobalScopeExecutionState(WorkerScriptController* controller) | 60 explicit ExecutionState(WorkerScriptController* controller) |
| 61 : hadException(false) | 61 : hadException(false) |
| 62 , lineNumber(0) | 62 , lineNumber(0) |
| 63 , columnNumber(0) | 63 , columnNumber(0) |
| 64 , m_controller(controller) | 64 , m_controller(controller) |
| 65 , m_outerState(controller->m_globalScopeExecutionState) | 65 , m_outerState(controller->m_executionState) |
| 66 { | 66 { |
| 67 m_controller->m_globalScopeExecutionState = this; | 67 m_controller->m_executionState = this; |
| 68 } | 68 } |
| 69 | 69 |
| 70 ~WorkerGlobalScopeExecutionState() | 70 ~ExecutionState() |
| 71 { | 71 { |
| 72 m_controller->m_globalScopeExecutionState = m_outerState; | 72 m_controller->m_executionState = m_outerState; |
| 73 } | 73 } |
| 74 | 74 |
| 75 DEFINE_INLINE_TRACE() | 75 DEFINE_INLINE_TRACE() |
| 76 { | 76 { |
| 77 visitor->trace(m_errorEventFromImportedScript); | 77 visitor->trace(m_errorEventFromImportedScript); |
| 78 visitor->trace(m_controller); | 78 visitor->trace(m_controller); |
| 79 } | 79 } |
| 80 | 80 |
| 81 bool hadException; | 81 bool hadException; |
| 82 String errorMessage; | 82 String errorMessage; |
| 83 int lineNumber; | 83 int lineNumber; |
| 84 int columnNumber; | 84 int columnNumber; |
| 85 String sourceURL; | 85 String sourceURL; |
| 86 ScriptValue exception; | 86 ScriptValue exception; |
| 87 RefPtrWillBeMember<ErrorEvent> m_errorEventFromImportedScript; | 87 RefPtrWillBeMember<ErrorEvent> m_errorEventFromImportedScript; |
| 88 | 88 |
| 89 // A WorkerGlobalScopeExecutionState context is stack allocated by | 89 // A ExecutionState context is stack allocated by |
| 90 // WorkerScriptController::evaluate(), with the contoller using it | 90 // WorkerScriptController::evaluate(), with the contoller using it |
| 91 // during script evaluation. To handle nested evaluate() uses, | 91 // during script evaluation. To handle nested evaluate() uses, |
| 92 // WorkerGlobalScopeExecutionStates are chained together; | 92 // ExecutionStates are chained together; |
| 93 // |m_outerState| keeps a pointer to the context object one level out | 93 // |m_outerState| keeps a pointer to the context object one level out |
| 94 // (or 0, if outermost.) Upon return from evaluate(), the | 94 // (or 0, if outermost.) Upon return from evaluate(), the |
| 95 // WorkerScriptController's WorkerGlobalScopeExecutionState is popped | 95 // WorkerScriptController's ExecutionState is popped and the previous one |
| 96 // and the previous one restored (see above dtor.) | 96 // restored (see above dtor.) |
| 97 // | 97 // |
| 98 // With Oilpan, |m_outerState| isn't traced. It'll be "up the stack" | 98 // With Oilpan, |m_outerState| isn't traced. It'll be "up the stack" |
| 99 // and its fields will be traced when scanning the stack. | 99 // and its fields will be traced when scanning the stack. |
| 100 RawPtrWillBeMember<WorkerScriptController> m_controller; | 100 RawPtrWillBeMember<WorkerScriptController> m_controller; |
| 101 WorkerGlobalScopeExecutionState* m_outerState; | 101 ExecutionState* m_outerState; |
| 102 }; | 102 }; |
| 103 | 103 |
| 104 PassOwnPtrWillBeRawPtr<WorkerScriptController> WorkerScriptController::create(Wo
rkerGlobalScope* workerGlobalScope, v8::Isolate* isolate) | 104 PassOwnPtrWillBeRawPtr<WorkerScriptController> WorkerScriptController::create(Wo
rkerGlobalScope* workerGlobalScope, v8::Isolate* isolate) |
| 105 { | 105 { |
| 106 return adoptPtrWillBeNoop(new WorkerScriptController(workerGlobalScope, isol
ate)); | 106 return adoptPtrWillBeNoop(new WorkerScriptController(workerGlobalScope, isol
ate)); |
| 107 } | 107 } |
| 108 | 108 |
| 109 WorkerScriptController::WorkerScriptController(WorkerGlobalScope* workerGlobalSc
ope, v8::Isolate* isolate) | 109 WorkerScriptController::WorkerScriptController(WorkerGlobalScope* workerGlobalSc
ope, v8::Isolate* isolate) |
| 110 : m_workerGlobalScope(workerGlobalScope) | 110 : m_workerGlobalScope(workerGlobalScope) |
| 111 , m_executionForbidden(false) | 111 , m_executionForbidden(false) |
| 112 , m_executionScheduledToTerminate(false) | 112 , m_executionScheduledToTerminate(false) |
| 113 , m_rejectedPromises(RejectedPromises::create()) | 113 , m_rejectedPromises(RejectedPromises::create()) |
| 114 , m_globalScopeExecutionState(0) | 114 , m_executionState(0) |
| 115 { | 115 { |
| 116 ASSERT(isolate); | 116 ASSERT(isolate); |
| 117 m_world = DOMWrapperWorld::create(isolate, WorkerWorldId); | 117 m_world = DOMWrapperWorld::create(isolate, WorkerWorldId); |
| 118 } | 118 } |
| 119 | 119 |
| 120 WorkerScriptController::~WorkerScriptController() | 120 WorkerScriptController::~WorkerScriptController() |
| 121 { | 121 { |
| 122 ASSERT(!m_rejectedPromises); | 122 ASSERT(!m_rejectedPromises); |
| 123 } | 123 } |
| 124 | 124 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 if (v8Call(V8ScriptRunner::compileScript(script, fileName, String(), scriptS
tartPosition, isolate(), cacheHandler, SharableCrossOrigin, v8CacheOptions), com
piledScript, block)) | 198 if (v8Call(V8ScriptRunner::compileScript(script, fileName, String(), scriptS
tartPosition, isolate(), cacheHandler, SharableCrossOrigin, v8CacheOptions), com
piledScript, block)) |
| 199 maybeResult = V8ScriptRunner::runCompiledScript(isolate(), compiledScrip
t, m_workerGlobalScope); | 199 maybeResult = V8ScriptRunner::runCompiledScript(isolate(), compiledScrip
t, m_workerGlobalScope); |
| 200 | 200 |
| 201 if (!block.CanContinue()) { | 201 if (!block.CanContinue()) { |
| 202 forbidExecution(); | 202 forbidExecution(); |
| 203 return ScriptValue(); | 203 return ScriptValue(); |
| 204 } | 204 } |
| 205 | 205 |
| 206 if (block.HasCaught()) { | 206 if (block.HasCaught()) { |
| 207 v8::Local<v8::Message> message = block.Message(); | 207 v8::Local<v8::Message> message = block.Message(); |
| 208 m_globalScopeExecutionState->hadException = true; | 208 m_executionState->hadException = true; |
| 209 m_globalScopeExecutionState->errorMessage = toCoreString(message->Get())
; | 209 m_executionState->errorMessage = toCoreString(message->Get()); |
| 210 if (v8Call(message->GetLineNumber(m_scriptState->context()), m_globalSco
peExecutionState->lineNumber) | 210 if (v8Call(message->GetLineNumber(m_scriptState->context()), m_execution
State->lineNumber) |
| 211 && v8Call(message->GetStartColumn(m_scriptState->context()), m_globa
lScopeExecutionState->columnNumber)) { | 211 && v8Call(message->GetStartColumn(m_scriptState->context()), m_execu
tionState->columnNumber)) { |
| 212 ++m_globalScopeExecutionState->columnNumber; | 212 ++m_executionState->columnNumber; |
| 213 } else { | 213 } else { |
| 214 m_globalScopeExecutionState->lineNumber = 0; | 214 m_executionState->lineNumber = 0; |
| 215 m_globalScopeExecutionState->columnNumber = 0; | 215 m_executionState->columnNumber = 0; |
| 216 } | 216 } |
| 217 | 217 |
| 218 TOSTRING_DEFAULT(V8StringResource<>, sourceURL, message->GetScriptOrigin
().ResourceName(), ScriptValue()); | 218 TOSTRING_DEFAULT(V8StringResource<>, sourceURL, message->GetScriptOrigin
().ResourceName(), ScriptValue()); |
| 219 m_globalScopeExecutionState->sourceURL = sourceURL; | 219 m_executionState->sourceURL = sourceURL; |
| 220 m_globalScopeExecutionState->exception = ScriptValue(m_scriptState.get()
, block.Exception()); | 220 m_executionState->exception = ScriptValue(m_scriptState.get(), block.Exc
eption()); |
| 221 block.Reset(); | 221 block.Reset(); |
| 222 } else { | 222 } else { |
| 223 m_globalScopeExecutionState->hadException = false; | 223 m_executionState->hadException = false; |
| 224 } | 224 } |
| 225 | 225 |
| 226 v8::Local<v8::Value> result; | 226 v8::Local<v8::Value> result; |
| 227 if (!maybeResult.ToLocal(&result) || result->IsUndefined()) | 227 if (!maybeResult.ToLocal(&result) || result->IsUndefined()) |
| 228 return ScriptValue(); | 228 return ScriptValue(); |
| 229 | 229 |
| 230 return ScriptValue(m_scriptState.get(), result); | 230 return ScriptValue(m_scriptState.get(), result); |
| 231 } | 231 } |
| 232 | 232 |
| 233 bool WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, RefPtr
WillBeRawPtr<ErrorEvent>* errorEvent, CachedMetadataHandler* cacheHandler, V8Cac
heOptions v8CacheOptions) | 233 bool WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, RefPtr
WillBeRawPtr<ErrorEvent>* errorEvent, CachedMetadataHandler* cacheHandler, V8Cac
heOptions v8CacheOptions) |
| 234 { | 234 { |
| 235 if (isExecutionForbidden()) | 235 if (isExecutionForbidden()) |
| 236 return false; | 236 return false; |
| 237 | 237 |
| 238 WorkerGlobalScopeExecutionState state(this); | 238 ExecutionState state(this); |
| 239 evaluate(sourceCode.source(), sourceCode.url().string(), sourceCode.startPos
ition(), cacheHandler, v8CacheOptions); | 239 evaluate(sourceCode.source(), sourceCode.url().string(), sourceCode.startPos
ition(), cacheHandler, v8CacheOptions); |
| 240 if (isExecutionForbidden()) | 240 if (isExecutionForbidden()) |
| 241 return false; | 241 return false; |
| 242 if (state.hadException) { | 242 if (state.hadException) { |
| 243 if (errorEvent) { | 243 if (errorEvent) { |
| 244 if (state.m_errorEventFromImportedScript) { | 244 if (state.m_errorEventFromImportedScript) { |
| 245 // Propagate inner error event outwards. | 245 // Propagate inner error event outwards. |
| 246 *errorEvent = state.m_errorEventFromImportedScript.release(); | 246 *errorEvent = state.m_errorEventFromImportedScript.release(); |
| 247 return false; | 247 return false; |
| 248 } | 248 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 } | 294 } |
| 295 | 295 |
| 296 void WorkerScriptController::disableEval(const String& errorMessage) | 296 void WorkerScriptController::disableEval(const String& errorMessage) |
| 297 { | 297 { |
| 298 m_disableEvalPending = errorMessage; | 298 m_disableEvalPending = errorMessage; |
| 299 } | 299 } |
| 300 | 300 |
| 301 void WorkerScriptController::rethrowExceptionFromImportedScript(PassRefPtrWillBe
RawPtr<ErrorEvent> errorEvent, ExceptionState& exceptionState) | 301 void WorkerScriptController::rethrowExceptionFromImportedScript(PassRefPtrWillBe
RawPtr<ErrorEvent> errorEvent, ExceptionState& exceptionState) |
| 302 { | 302 { |
| 303 const String& errorMessage = errorEvent->message(); | 303 const String& errorMessage = errorEvent->message(); |
| 304 if (m_globalScopeExecutionState) | 304 if (m_executionState) |
| 305 m_globalScopeExecutionState->m_errorEventFromImportedScript = errorEvent
; | 305 m_executionState->m_errorEventFromImportedScript = errorEvent; |
| 306 exceptionState.rethrowV8Exception(V8ThrowException::createGeneralError(isola
te(), errorMessage)); | 306 exceptionState.rethrowV8Exception(V8ThrowException::createGeneralError(isola
te(), errorMessage)); |
| 307 } | 307 } |
| 308 | 308 |
| 309 DEFINE_TRACE(WorkerScriptController) | 309 DEFINE_TRACE(WorkerScriptController) |
| 310 { | 310 { |
| 311 visitor->trace(m_workerGlobalScope); | 311 visitor->trace(m_workerGlobalScope); |
| 312 visitor->trace(m_rejectedPromises); | 312 visitor->trace(m_rejectedPromises); |
| 313 } | 313 } |
| 314 | 314 |
| 315 } // namespace blink | 315 } // namespace blink |
| OLD | NEW |