diff --git a/xpinstall/src/nsJSInstallTriggerGlobal.cpp b/xpinstall/src/nsJSInstallTriggerGlobal.cpp index b0cd2e97071..723a558b4e6 100644 --- a/xpinstall/src/nsJSInstallTriggerGlobal.cpp +++ b/xpinstall/src/nsJSInstallTriggerGlobal.cpp @@ -196,20 +196,37 @@ InstallTriggerCheckLoadURIFromScript(JSContext *cx, const nsAString& uriStr) return rv; } +// +// Helper function to get native object +// +// This is our own version of JS_GetInstancePrivate() that in addition +// performs the delayed creation of the native InstallTrigger if necessary +// +static nsIDOMInstallTriggerGlobal* getTriggerNative(JSContext *cx, JSObject *obj) +{ + if (!JS_InstanceOf(cx, obj, &InstallTriggerGlobalClass, nsnull)) + return nsnull; + + nsIDOMInstallTriggerGlobal *native = (nsIDOMInstallTriggerGlobal*)JS_GetPrivate(cx, obj); + if (!native) { + // xpinstall script contexts delay creation of the native. + CreateNativeObject(cx, obj, &native); + } + return native; +} + // // Native method UpdateEnabled // PR_STATIC_CALLBACK(JSBool) InstallTriggerGlobalUpdateEnabled(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*) - JS_GetInstancePrivate(cx, obj, &InstallTriggerGlobalClass, 0); + nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); + if (!nativeThis) + return JS_FALSE; *rval = JSVAL_FALSE; - if (nsnull == nativeThis && (JS_FALSE == CreateNativeObject(cx, obj, &nativeThis)) ) - return JS_TRUE; - nsIScriptGlobalObject *globalObject = nsnull; nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx); if (scriptContext) @@ -230,15 +247,12 @@ InstallTriggerGlobalUpdateEnabled(JSContext *cx, JSObject *obj, uintN argc, jsva PR_STATIC_CALLBACK(JSBool) InstallTriggerGlobalInstall(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*) - JS_GetInstancePrivate(cx, obj, &InstallTriggerGlobalClass, 0); + nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); + if (!nativeThis) + return JS_FALSE; *rval = JSVAL_FALSE; - if (nsnull == nativeThis && (JS_FALSE == CreateNativeObject(cx, obj, &nativeThis)) ) - return JS_TRUE; - - // make sure XPInstall is enabled, return false if not nsIScriptGlobalObject *globalObject = nsnull; nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx); @@ -414,8 +428,9 @@ InstallTriggerGlobalInstall(JSContext *cx, JSObject *obj, uintN argc, jsval *arg PR_STATIC_CALLBACK(JSBool) InstallTriggerGlobalInstallChrome(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*) - JS_GetInstancePrivate(cx, obj, &InstallTriggerGlobalClass, 0); + nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); + if (!nativeThis) + return JS_FALSE; uint32 chromeType = NOT_CHROME; nsAutoString sourceURL; @@ -423,10 +438,6 @@ InstallTriggerGlobalInstallChrome(JSContext *cx, JSObject *obj, uintN argc, jsva *rval = JSVAL_FALSE; - if (nsnull == nativeThis && (JS_FALSE == CreateNativeObject(cx, obj, &nativeThis)) ) { - return JS_TRUE; - } - // get chromeType first, the update enabled check for skins skips whitelisting if (argc >=1) JS_ValueToECMAUint32(cx, argv[0], &chromeType); @@ -506,17 +517,15 @@ InstallTriggerGlobalInstallChrome(JSContext *cx, JSObject *obj, uintN argc, jsva PR_STATIC_CALLBACK(JSBool) InstallTriggerGlobalStartSoftwareUpdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*) - JS_GetInstancePrivate(cx, obj, &InstallTriggerGlobalClass, 0); + nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); + if (!nativeThis) + return JS_FALSE; PRBool nativeRet; PRInt32 flags = 0; *rval = JSVAL_FALSE; - if (nsnull == nativeThis && (JS_FALSE == CreateNativeObject(cx, obj, &nativeThis)) ) - return JS_TRUE; - // make sure XPInstall is enabled, return if not nsIScriptGlobalObject *globalObject = nsnull; nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx); @@ -595,8 +604,9 @@ InstallTriggerGlobalStartSoftwareUpdate(JSContext *cx, JSObject *obj, uintN argc PR_STATIC_CALLBACK(JSBool) InstallTriggerGlobalCompareVersion(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*) - JS_GetInstancePrivate(cx, obj, &InstallTriggerGlobalClass, 0); + nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); + if (!nativeThis) + return JS_FALSE; nsAutoString regname; nsAutoString version; @@ -606,10 +616,6 @@ InstallTriggerGlobalCompareVersion(JSContext *cx, JSObject *obj, uintN argc, jsv PRInt32 nativeRet = nsIDOMInstallTriggerGlobal::NOT_FOUND; *rval = INT_TO_JSVAL(nativeRet); - if (nsnull == nativeThis && (JS_FALSE == CreateNativeObject(cx, obj, &nativeThis)) ) - return JS_TRUE; - - // make sure XPInstall is enabled, return if not nsIScriptGlobalObject *globalObject = nsnull; nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx); @@ -696,8 +702,9 @@ InstallTriggerGlobalCompareVersion(JSContext *cx, JSObject *obj, uintN argc, jsv PR_STATIC_CALLBACK(JSBool) InstallTriggerGlobalGetVersion(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - nsIDOMInstallTriggerGlobal *nativeThis = (nsIDOMInstallTriggerGlobal*) - JS_GetInstancePrivate(cx, obj, &InstallTriggerGlobalClass, 0); + nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); + if (!nativeThis) + return JS_FALSE; nsAutoString regname; nsAutoString version; @@ -705,10 +712,6 @@ InstallTriggerGlobalGetVersion(JSContext *cx, JSObject *obj, uintN argc, jsval * // In case of error return a null value *rval = JSVAL_NULL; - if (nsnull == nativeThis && (JS_FALSE == CreateNativeObject(cx, obj, &nativeThis)) ) - return JS_TRUE; - - // make sure XPInstall is enabled, return if not nsIScriptGlobalObject *globalObject = nsnull; nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx);