bool DedicatedWorkerGlobalScope::WrapGlobalObject(JSContext* aCx, JS::MutableHandle<JSObject*> aReflector) { mWorkerPrivate->AssertIsOnWorkerThread(); MOZ_ASSERT(!mWorkerPrivate->IsSharedWorker()); JS::CompartmentOptions options; mWorkerPrivate->CopyJSCompartmentOptions(options); const bool usesSystemPrincipal = mWorkerPrivate->UsesSystemPrincipal(); // Note that xpc::ShouldDiscardSystemSource() and // xpc::ExtraWarningsForSystemJS() read prefs that are cached on the main // thread. This is benignly racey. const bool discardSource = (usesSystemPrincipal || mWorkerPrivate->IsInPrivilegedApp()) && xpc::ShouldDiscardSystemSource(); const bool extraWarnings = usesSystemPrincipal && xpc::ExtraWarningsForSystemJS(); options.setDiscardSource(discardSource) .extraWarningsOverride().set(extraWarnings); return DedicatedWorkerGlobalScopeBinding_workers::Wrap(aCx, this, this, options, GetWorkerPrincipal(), true, aReflector); }
GlobalObject * JSRuntime::createSelfHostingGlobal(JSContext *cx) { MOZ_ASSERT(!cx->isExceptionPending()); MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); JS::CompartmentOptions options; options.setDiscardSource(true); options.setZone(JS::FreshZone); JSCompartment *compartment = NewCompartment(cx, nullptr, nullptr, options); if (!compartment) return nullptr; static const Class shgClass = { "self-hosting-global", JSCLASS_GLOBAL_FLAGS, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, JS_GlobalObjectTraceHook }; AutoCompartment ac(cx, compartment); Rooted<GlobalObject*> shg(cx, GlobalObject::createInternal(cx, &shgClass)); if (!shg) return nullptr; cx->runtime()->selfHostingGlobal_ = shg; compartment->isSelfHosting = true; compartment->isSystem = true; if (!GlobalObject::initSelfHostingBuiltins(cx, shg, intrinsic_functions)) return nullptr; JS_FireOnNewGlobalObject(cx, shg); return shg; }
bool JSRuntime::initSelfHosting(JSContext *cx) { JS_ASSERT(!selfHostingGlobal_); if (cx->runtime()->parentRuntime) { selfHostingGlobal_ = cx->runtime()->parentRuntime->selfHostingGlobal_; return true; } /* * Self hosted state can be accessed from threads for other runtimes * parented to this one, so cannot include state in the nursery. */ JS::AutoDisableGenerationalGC disable(cx->runtime()); JS::CompartmentOptions compartmentOptions; compartmentOptions.setDiscardSource(true); if (!(selfHostingGlobal_ = JS_NewGlobalObject(cx, &self_hosting_global_class, nullptr, JS::DontFireOnNewGlobalHook, compartmentOptions))) return false; JSAutoCompartment ac(cx, selfHostingGlobal_); Rooted<GlobalObject*> shg(cx, &selfHostingGlobal_->as<GlobalObject>()); selfHostingGlobal_->compartment()->isSelfHosting = true; selfHostingGlobal_->compartment()->isSystem = true; /* * During initialization of standard classes for the self-hosting global, * all self-hosted functions are ignored. Thus, we don't create cyclic * dependencies in the order of initialization. */ if (!GlobalObject::initStandardClasses(cx, shg)) return false; if (!JS_DefineFunctions(cx, shg, intrinsic_functions)) return false; JS_FireOnNewGlobalObject(cx, shg); CompileOptions options(cx); FillSelfHostingCompileOptions(options); /* * Set a temporary error reporter printing to stderr because it is too * early in the startup process for any other reporter to be registered * and we don't want errors in self-hosted code to be silently swallowed. */ JSErrorReporter oldReporter = JS_SetErrorReporter(cx->runtime(), selfHosting_ErrorReporter); RootedValue rv(cx); bool ok = false; char *filename = getenv("MOZ_SELFHOSTEDJS"); if (filename) { RootedScript script(cx); if (Compile(cx, shg, options, filename, &script)) ok = Execute(cx, script, *shg.get(), rv.address()); } else { uint32_t srcLen = GetRawScriptsSize(); const unsigned char *compressed = compressedSources; uint32_t compressedLen = GetCompressedSize(); ScopedJSFreePtr<char> src(selfHostingGlobal_->zone()->pod_malloc<char>(srcLen)); if (!src || !DecompressString(compressed, compressedLen, reinterpret_cast<unsigned char *>(src.get()), srcLen)) { return false; } ok = Evaluate(cx, shg, options, src, srcLen, &rv); } JS_SetErrorReporter(cx->runtime(), oldReporter); return ok; }