diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index b16b542b5f5c..d851b683acef 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -429,6 +429,7 @@ static const nsConstructorFuncMapData kConstructorFuncMap[] = #undef NS_DEFINE_CONSTRUCTOR_FUNC_DATA nsIXPConnect *nsDOMClassInfo::sXPConnect = nullptr; +nsIScriptSecurityManager *nsDOMClassInfo::sSecMan = nullptr; bool nsDOMClassInfo::sIsInitialized = false; @@ -779,11 +780,19 @@ nsDOMClassInfo::Init() nsScriptNameSpaceManager *nameSpaceManager = GetNameSpaceManager(); NS_ENSURE_TRUE(nameSpaceManager, NS_ERROR_NOT_INITIALIZED); - NS_ADDREF(sXPConnect = nsContentUtils::XPConnect()); + nsresult rv = CallGetService(nsIXPConnect::GetCID(), &sXPConnect); + NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr elt = new nsEventListenerThisTranslator(); sXPConnect->SetFunctionThisTranslator(NS_GET_IID(nsIDOMEventListener), elt); + nsCOMPtr sm = + do_GetService("@mozilla.org/scriptsecuritymanager;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + sSecMan = sm; + NS_ADDREF(sSecMan); + AutoSafeJSContext cx; DOM_CLASSINFO_MAP_BEGIN(Window, nsIDOMWindow) @@ -1034,6 +1043,9 @@ nsDOMClassInfo::Init() RegisterExternalClasses(); + // Register new DOM bindings + mozilla::dom::Register(nameSpaceManager); + sIsInitialized = true; return NS_OK; @@ -1506,14 +1518,18 @@ nsDOMClassInfo::PostCreatePrototype(JSContext * cx, JSObject * aProto) nsIClassInfo * NS_GetDOMClassInfoInstance(nsDOMClassInfoID aID) { - MOZ_ASSERT(nsDOMClassInfo::sIsInitialized); - if (aID >= eDOMClassInfoIDCount) { NS_ERROR("Bad ID!"); return nullptr; } + if (!nsDOMClassInfo::sIsInitialized) { + nsresult rv = nsDOMClassInfo::Init(); + + NS_ENSURE_SUCCESS(rv, nullptr); + } + if (!sClassInfoData[aID].mCachedClassInfo) { nsDOMClassInfoData& data = sClassInfoData[aID]; @@ -1573,6 +1589,7 @@ nsDOMClassInfo::ShutDown() sWrappedJSObject_id = JSID_VOID; NS_IF_RELEASE(sXPConnect); + NS_IF_RELEASE(sSecMan); sIsInitialized = false; } diff --git a/dom/base/nsDOMClassInfo.h b/dom/base/nsDOMClassInfo.h index 77e353f7317a..39eea5c28162 100644 --- a/dom/base/nsDOMClassInfo.h +++ b/dom/base/nsDOMClassInfo.h @@ -96,7 +96,6 @@ public: static nsIClassInfo* GetClassInfoInstance(nsDOMClassInfoData* aData); - static nsresult Init(); static void ShutDown(); static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) @@ -128,6 +127,10 @@ public: { return sXPConnect; } + static nsIScriptSecurityManager *ScriptSecurityManager() + { + return sSecMan; + } protected: friend nsIClassInfo* NS_GetDOMClassInfoInstance(nsDOMClassInfoID aID); @@ -143,12 +146,14 @@ protected: return mData->mInterfacesBitmap; } + static nsresult Init(); static nsresult RegisterClassProtos(int32_t aDOMClassInfoID); static nsresult RegisterExternalClasses(); nsresult ResolveConstructor(JSContext *cx, JSObject *obj, JSObject **objp); static nsIXPConnect *sXPConnect; + static nsIScriptSecurityManager *sSecMan; // nsIXPCScriptable code static nsresult DefineStaticJSVals(JSContext *cx); diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp index 5c8f3b49e2fa..16499ed9ad12 100644 --- a/layout/build/nsLayoutStatics.cpp +++ b/layout/build/nsLayoutStatics.cpp @@ -180,20 +180,6 @@ nsLayoutStatics::Initialize() return rv; } - rv = nsDOMClassInfo::Init(); - if (NS_FAILED(rv)) { - NS_ERROR("Could not initialize nsDOMClassInfo"); - return rv; - } - - // Register new DOM bindings - nsScriptNameSpaceManager* nameSpaceManager = GetNameSpaceManager(); - if (!nameSpaceManager) { - NS_ERROR("Could not initialize nsScriptNameSpaceManager"); - return NS_ERROR_FAILURE; - } - mozilla::dom::Register(nameSpaceManager); - rv = nsAttrValue::Init(); if (NS_FAILED(rv)) { NS_ERROR("Could not initialize nsAttrValue");