diff --git a/js/jsd/jsd_high.cpp b/js/jsd/jsd_high.cpp index 3ed51fea88d..3a7bea446e3 100644 --- a/js/jsd/jsd_high.cpp +++ b/js/jsd/jsd_high.cpp @@ -37,10 +37,23 @@ void JSD_ASSERT_VALID_CONTEXT(JSDContext* jsdc) } #endif +/***************************************************************************/ +/* xpconnect related utility functions implemented in jsd_xpc.cpp */ + +extern void +global_finalize(JSFreeOp* fop, JSObject* obj); + +extern JSObject* +CreateJSDGlobal(JSContext *cx, JSClass *clasp); + +/***************************************************************************/ + + static JSClass global_class = { - "JSDGlobal", JSCLASS_GLOBAL_FLAGS, + "JSDGlobal", JSCLASS_GLOBAL_FLAGS | + JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, global_finalize }; static JSBool @@ -108,7 +121,7 @@ _newJSDContext(JSRuntime* jsrt, JS_BeginRequest(jsdc->dumbContext); JS_SetOptions(jsdc->dumbContext, JS_GetOptions(jsdc->dumbContext)); - jsdc->glob = JS_NewGlobalObject(jsdc->dumbContext, &global_class, NULL); + jsdc->glob = CreateJSDGlobal(jsdc->dumbContext, &global_class); if( ! jsdc->glob ) goto label_newJSDContext_failure; diff --git a/js/jsd/jsd_xpc.cpp b/js/jsd/jsd_xpc.cpp index 882f62cbb68..4f7c849a0d4 100644 --- a/js/jsd/jsd_xpc.cpp +++ b/js/jsd/jsd_xpc.cpp @@ -31,6 +31,8 @@ /* XXX DOM dependency */ #include "nsIScriptContext.h" #include "nsIJSContextStack.h" +#include "SandboxPrivate.h" +#include "nsJSPrincipals.h" /* * defining CAUTIOUS_SCRIPTHOOK makes jsds disable GC while calling out to the @@ -3434,6 +3436,36 @@ static const mozilla::Module kJSDModule = { NSMODULE_DEFN(JavaScript_Debugger) = &kJSDModule; +void +global_finalize(JSFreeOp *aFop, JSObject *aObj) +{ + nsIScriptObjectPrincipal *sop = + static_cast(js::GetObjectPrivate(aObj)); + MOZ_ASSERT(sop); + static_cast(sop)->ForgetGlobalObject(); + NS_IF_RELEASE(sop); +} + +JSObject * +CreateJSDGlobal(JSContext *aCx, JSClass *aClasp) +{ + nsresult rv; + nsCOMPtr nullPrin = do_CreateInstance("@mozilla.org/nullprincipal;1", &rv); + NS_ENSURE_SUCCESS(rv, nullptr); + + JSPrincipals *jsPrin = nsJSPrincipals::get(nullPrin); + JSObject *global = JS_NewGlobalObject(aCx, aClasp, jsPrin); + NS_ENSURE_TRUE(global, nullptr); + + // We have created a new global let's attach a private to it + // that implements nsIGlobalObject. + nsCOMPtr sbp = + new SandboxPrivate(nullPrin, global); + JS_SetPrivate(global, sbp.forget().get()); + + return global; +} + /******************************************************************************** ******************************************************************************** * graveyard