Bug 1072144 part 4. Add a WorkerRunnable::PreRun so that we can move worker global creation to it and always have an AutoEntryScript by the time we're evaluating the main worker script. r=khuey
This commit is contained in:
@@ -306,6 +306,9 @@ private:
|
||||
virtual bool
|
||||
IsDebuggerRunnable() const override;
|
||||
|
||||
virtual bool
|
||||
PreRun(WorkerPrivate* aWorkerPrivate) override;
|
||||
|
||||
virtual bool
|
||||
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override;
|
||||
|
||||
@@ -1723,6 +1726,41 @@ ScriptExecutorRunnable::IsDebuggerRunnable() const
|
||||
return mScriptLoader.mWorkerScriptType == DebuggerScript;
|
||||
}
|
||||
|
||||
bool
|
||||
ScriptExecutorRunnable::PreRun(WorkerPrivate* aWorkerPrivate)
|
||||
{
|
||||
aWorkerPrivate->AssertIsOnWorkerThread();
|
||||
|
||||
if (!mIsWorkerScript) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!aWorkerPrivate->GetJSContext()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(mFirstIndex == 0);
|
||||
MOZ_ASSERT(!mScriptLoader.mRv.Failed());
|
||||
|
||||
AutoJSAPI jsapi;
|
||||
jsapi.Init();
|
||||
jsapi.TakeOwnershipOfErrorReporting();
|
||||
|
||||
WorkerGlobalScope* globalScope =
|
||||
aWorkerPrivate->GetOrCreateGlobalScope(jsapi.cx());
|
||||
if (NS_WARN_IF(!globalScope)) {
|
||||
NS_WARNING("Failed to make global!");
|
||||
// There's no way to report the exception on jsapi right now, because there
|
||||
// is no way to even enter a compartment on this thread anymore. Just clear
|
||||
// the exception. We'll report some sort of error to our caller thread in
|
||||
// ShutdownScriptLoader.
|
||||
jsapi.ClearException();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ScriptExecutorRunnable::WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
{
|
||||
@@ -1745,32 +1783,11 @@ ScriptExecutorRunnable::WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
// If nothing else has failed, our ErrorResult better not be a failure either.
|
||||
MOZ_ASSERT(!mScriptLoader.mRv.Failed(), "Who failed it and why?");
|
||||
|
||||
JS::Rooted<JSObject*> global(aCx);
|
||||
|
||||
if (mIsWorkerScript) {
|
||||
WorkerGlobalScope* globalScope =
|
||||
aWorkerPrivate->GetOrCreateGlobalScope(aCx);
|
||||
if (NS_WARN_IF(!globalScope)) {
|
||||
NS_WARNING("Failed to make global!");
|
||||
// There's no way to report the exception on aCx right now, because there
|
||||
// is no way to even enter a compartment on this thread anymore. Just
|
||||
// clear the exception. We'll report some sort of error to our caller
|
||||
// thread in ShutdownScriptLoader.
|
||||
JS_ClearPendingException(aCx);
|
||||
return false;
|
||||
}
|
||||
|
||||
global.set(globalScope->GetWrapper());
|
||||
} else {
|
||||
// XXXbz Icky action at a distance... Would be better to capture this state
|
||||
// in mScriptLoader!
|
||||
global.set(JS::CurrentGlobalOrNull(aCx));
|
||||
}
|
||||
|
||||
// Slightly icky action at a distance, but there's no better place to stash
|
||||
// this value, really.
|
||||
JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx));
|
||||
MOZ_ASSERT(global);
|
||||
|
||||
JSAutoCompartment ac(aCx, global);
|
||||
|
||||
for (uint32_t index = mFirstIndex; index <= mLastIndex; index++) {
|
||||
ScriptLoadInfo& loadInfo = loadInfos.ElementAt(index);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user