diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index f792eafca54..f6fb42d0d38 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -412,6 +412,8 @@ js::AssertSameCompartment(JSObject *objA, JSObject *objB) JS_FRIEND_API(JSObject *) js::DefaultObjectForContextOrNull(JSContext *cx) { + if (cx->options().noDefaultCompartmentObject()) + return nullptr; return cx->maybeDefaultCompartmentObject(); } diff --git a/js/xpconnect/src/XPCJSContextStack.cpp b/js/xpconnect/src/XPCJSContextStack.cpp index 6aec91be18f..8429611b5b2 100644 --- a/js/xpconnect/src/XPCJSContextStack.cpp +++ b/js/xpconnect/src/XPCJSContextStack.cpp @@ -175,6 +175,7 @@ XPCJSContextStack::InitSafeJSContext() if (!mSafeJSContext) MOZ_CRASH(); JSAutoRequest req(mSafeJSContext); + ContextOptionsRef(mSafeJSContext).setNoDefaultCompartmentObject(true); JS_SetErrorReporter(mSafeJSContext, xpc::SystemErrorReporter); @@ -187,10 +188,6 @@ XPCJSContextStack::InitSafeJSContext() MOZ_CRASH(); JS_AddNamedObjectRoot(mSafeJSContext, &mSafeJSContextGlobal, "SafeJSContext global"); - // Make sure the context is associated with a proper compartment - // and not the default compartment. - js::SetDefaultObjectForContext(mSafeJSContext, mSafeJSContextGlobal); - // Note: make sure to set the private before calling // InitClasses nsRefPtr sp = new SandboxPrivate(principal, mSafeJSContextGlobal); diff --git a/js/xpconnect/src/nsCxPusher.cpp b/js/xpconnect/src/nsCxPusher.cpp index 15388993141..202115104b1 100644 --- a/js/xpconnect/src/nsCxPusher.cpp +++ b/js/xpconnect/src/nsCxPusher.cpp @@ -228,6 +228,7 @@ ThreadsafeAutoJSContext::operator JSContext*() const AutoSafeJSContext::AutoSafeJSContext(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_IN_IMPL) : AutoJSContext(true MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT) + , mAc(mCx, XPCJSRuntime::Get()->GetJSContextStack()->GetSafeJSContextGlobal()) { } diff --git a/js/xpconnect/src/nsCxPusher.h b/js/xpconnect/src/nsCxPusher.h index d6848050d2e..7b86e8bac3f 100644 --- a/js/xpconnect/src/nsCxPusher.h +++ b/js/xpconnect/src/nsCxPusher.h @@ -100,7 +100,6 @@ public: protected: AutoJSContext(bool aSafe MOZ_GUARD_OBJECT_NOTIFIER_PARAM); -private: // We need this Init() method because we can't use delegating constructor for // the moment. It is a C++11 feature and we do not require C++11 to be // supported to be able to compile Gecko. @@ -134,6 +133,8 @@ private: class MOZ_STACK_CLASS AutoSafeJSContext : public AutoJSContext { public: AutoSafeJSContext(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM); +private: + JSAutoCompartment mAc; }; /**