// static XPCJSRuntime* XPCJSRuntime::newXPCJSRuntime(nsXPConnect* aXPConnect, nsIJSRuntimeService* aJSRuntimeService) { NS_PRECONDITION(aXPConnect,"bad param"); NS_PRECONDITION(aJSRuntimeService,"bad param"); XPCJSRuntime* self; self = new XPCJSRuntime(aXPConnect, aJSRuntimeService); if(self && self->GetJSRuntime() && self->GetContextMap() && self->GetWrappedJSMap() && self->GetWrappedJSClassMap() && self->GetIID2NativeInterfaceMap() && self->GetClassInfo2NativeSetMap() && self->GetNativeSetMap() && self->GetThisTranslatorMap() && self->GetNativeScriptableSharedMap() && self->GetDyingWrappedNativeProtoMap() && self->GetExplicitNativeWrapperMap() && self->GetMapLock()) { return self; } delete self; return nsnull; }
void xpc_PrintAllReferencesTo(void *p) { /* p must be a JS object */ XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance(); JS_DumpHeap(rt->GetJSRuntime(), stdout, nullptr, JSTRACE_OBJECT, p, 0x7fffffff, nullptr); }
/* attribute JSContext safeJSContext; */ NS_IMETHODIMP XPCJSContextStack::GetSafeJSContext(JSContext * *aSafeJSContext) { if(!mSafeJSContext) { #ifndef XPCONNECT_STANDALONE // Start by getting the principal holder and principal for this // context. If we can't manage that, don't bother with the rest. nsRefPtr<nsNullPrincipal> principal = new nsNullPrincipal(); nsCOMPtr<nsIScriptObjectPrincipal> sop; if(principal) { nsresult rv = principal->Init(); if(NS_SUCCEEDED(rv)) sop = new PrincipalHolder(principal); } if(!sop) { *aSafeJSContext = nsnull; return NS_ERROR_FAILURE; } #endif /* !XPCONNECT_STANDALONE */ JSRuntime *rt; XPCJSRuntime* xpcrt; nsXPConnect* xpc = nsXPConnect::GetXPConnect(); nsCOMPtr<nsIXPConnect> xpcholder(static_cast<nsIXPConnect*>(xpc)); if(xpc && (xpcrt = xpc->GetRuntime()) && (rt = xpcrt->GetJSRuntime())) { JSObject *glob; mSafeJSContext = JS_NewContext(rt, 8192); if(mSafeJSContext) { nsCString origin; principal->GetOrigin(getter_Copies(origin)); // scoped JS Request JSAutoRequest req(mSafeJSContext); JSCompartment *compartment; nsresult rv = xpc_CreateGlobalObject(mSafeJSContext, &global_class, origin, principal, &glob, &compartment); if(NS_FAILED(rv)) glob = nsnull; #ifndef XPCONNECT_STANDALONE if(glob) { // Make sure the context is associated with a proper compartment // and not the default compartment. JS_SetGlobalObject(mSafeJSContext, glob); // Note: make sure to set the private before calling // InitClasses nsIScriptObjectPrincipal* priv = nsnull; sop.swap(priv); if(!JS_SetPrivate(mSafeJSContext, glob, priv)) { // Drop the whole thing NS_RELEASE(priv); glob = nsnull; } } // After this point either glob is null and the // nsIScriptObjectPrincipal ownership is either handled by the // nsCOMPtr or dealt with, or we'll release in the finalize // hook. #endif if(glob && NS_FAILED(xpc->InitClasses(mSafeJSContext, glob))) { glob = nsnull; } } if(mSafeJSContext && !glob) { // Destroy the context outside the scope of JSAutoRequest that // uses the context in its destructor. JS_DestroyContext(mSafeJSContext); mSafeJSContext = nsnull; } // Save it off so we can destroy it later, even if // mSafeJSContext has been set to another context // via SetSafeJSContext. If we don't get here, // then mSafeJSContext must have been set via // SetSafeJSContext, and we're not responsible for // destroying the passed-in context. mOwnSafeJSContext = mSafeJSContext; } } *aSafeJSContext = mSafeJSContext; return mSafeJSContext ? NS_OK : NS_ERROR_UNEXPECTED; }
JSContext* XPCJSContextStack::GetSafeJSContext() { if (mSafeJSContext) return mSafeJSContext; // Start by getting the principal holder and principal for this // context. If we can't manage that, don't bother with the rest. nsRefPtr<nsNullPrincipal> principal = new nsNullPrincipal(); nsresult rv = principal->Init(); if (NS_FAILED(rv)) return NULL; nsCOMPtr<nsIScriptObjectPrincipal> sop = new PrincipalHolder(principal); nsRefPtr<nsXPConnect> xpc = nsXPConnect::GetXPConnect(); if (!xpc) return NULL; XPCJSRuntime* xpcrt = xpc->GetRuntime(); if (!xpcrt) return NULL; JSRuntime *rt = xpcrt->GetJSRuntime(); if (!rt) return NULL; mSafeJSContext = JS_NewContext(rt, 8192); if (!mSafeJSContext) return NULL; JSObject *glob; { // scoped JS Request JSAutoRequest req(mSafeJSContext); JS_SetErrorReporter(mSafeJSContext, mozJSLoaderErrorReporter); glob = xpc::CreateGlobalObject(mSafeJSContext, &global_class, principal); if (glob) { // Make sure the context is associated with a proper compartment // and not the default compartment. JS_SetGlobalObject(mSafeJSContext, glob); // Note: make sure to set the private before calling // InitClasses nsIScriptObjectPrincipal* priv = nullptr; sop.swap(priv); JS_SetPrivate(glob, priv); } // After this point either glob is null and the // nsIScriptObjectPrincipal ownership is either handled by the // nsCOMPtr or dealt with, or we'll release in the finalize // hook. if (glob && NS_FAILED(xpc->InitClasses(mSafeJSContext, glob))) { glob = nullptr; } } if (mSafeJSContext && !glob) { // Destroy the context outside the scope of JSAutoRequest that // uses the context in its destructor. JS_DestroyContext(mSafeJSContext); mSafeJSContext = nullptr; } // Save it off so we can destroy it later. mOwnSafeJSContext = mSafeJSContext; return mSafeJSContext; }
/* attribute JSContext safeJSContext; */ NS_IMETHODIMP XPCJSContextStack::GetSafeJSContext(JSContext * *aSafeJSContext) { if(!mSafeJSContext) { #ifndef XPCONNECT_STANDALONE // Start by getting the principal holder and principal for this // context. If we can't manage that, don't bother with the rest. nsCOMPtr<nsIPrincipal> principal = do_CreateInstance("@mozilla.org/nullprincipal;1"); nsCOMPtr<nsIScriptObjectPrincipal> sop; if(principal) { sop = new PrincipalHolder(principal); } if(!sop) { *aSafeJSContext = nsnull; return NS_ERROR_FAILURE; } #endif /* !XPCONNECT_STANDALONE */ JSRuntime *rt; XPCJSRuntime* xpcrt; nsXPConnect* xpc = nsXPConnect::GetXPConnect(); nsCOMPtr<nsIXPConnect> xpcholder(static_cast<nsIXPConnect*>(xpc)); if(xpc && (xpcrt = xpc->GetRuntime()) && (rt = xpcrt->GetJSRuntime())) { mSafeJSContext = JS_NewContext(rt, 8192); if(mSafeJSContext) { // scoped JS Request AutoJSRequestWithNoCallContext req(mSafeJSContext); JSObject *glob; glob = JS_NewObject(mSafeJSContext, &global_class, NULL, NULL); #ifndef XPCONNECT_STANDALONE if(glob) { // Note: make sure to set the private before calling // InitClasses nsIScriptObjectPrincipal* priv = nsnull; sop.swap(priv); if(!JS_SetPrivate(mSafeJSContext, glob, priv)) { // Drop the whole thing NS_RELEASE(priv); glob = nsnull; } } // After this point either glob is null and the // nsIScriptObjectPrincipal ownership is either handled by the // nsCOMPtr or dealt with, or we'll release in the finalize // hook. #endif if(!glob || NS_FAILED(xpc->InitClasses(mSafeJSContext, glob))) { // Explicitly end the request since we are about to kill // the JSContext that 'req' will try to use when it // goes out of scope. req.EndRequest(); JS_DestroyContext(mSafeJSContext); mSafeJSContext = nsnull; } // Save it off so we can destroy it later, even if // mSafeJSContext has been set to another context // via SetSafeJSContext. If we don't get here, // then mSafeJSContext must have been set via // SetSafeJSContext, and we're not responsible for // destroying the passed-in context. mOwnSafeJSContext = mSafeJSContext; } } } *aSafeJSContext = mSafeJSContext; return mSafeJSContext ? NS_OK : NS_ERROR_UNEXPECTED; }