Fix for bug 510677 (Avoid XPCCallContext for WrapNativeToJSVal). r/sr=jst.

--HG--
extra : rebase_source : 647f360f5603a2f9ade579a9911ba51af1db91b5
This commit is contained in:
Peter Van der Beken 2009-08-14 21:00:24 +02:00
parent e20a909c30
commit 8b5c239aac
16 changed files with 190 additions and 176 deletions

View File

@ -108,6 +108,7 @@ class nsIDragSession;
class nsPIDOMWindow;
class nsPIDOMEventTarget;
class nsIPresShell;
class nsIXPConnectJSObjectHolder;
#ifdef MOZ_XTF
class nsIXTFService;
#endif
@ -1466,6 +1467,25 @@ public:
* method returns PR_TRUE, otherwise PR_FALSE.
*/
static PRBool CanAccessNativeAnon();
static nsresult WrapNative(JSContext *cx, JSObject *scope,
nsISupports *native, const nsIID* aIID, jsval *vp,
// If non-null aHolder will keep the jsval alive
// while there's a ref to it
nsIXPConnectJSObjectHolder** aHolder = nsnull,
PRBool aAllowWrapping = PR_FALSE);
// Same as the WrapNative above, but use this one if aIID is nsISupports' IID.
static nsresult WrapNative(JSContext *cx, JSObject *scope,
nsISupports *native, jsval *vp,
// If non-null aHolder will keep the jsval alive
// while there's a ref to it
nsIXPConnectJSObjectHolder** aHolder = nsnull,
PRBool aAllowWrapping = PR_FALSE)
{
return WrapNative(cx, scope, native, nsnull, vp, aHolder, aAllowWrapping);
}
private:
static PRBool InitializeEventTable();

View File

@ -166,6 +166,7 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_XTFSERVICE_CID);
#include "nsDOMDataTransfer.h"
#include "nsHtml5Module.h"
#include "nsPresContext.h"
#include "nsLayoutStatics.h"
#ifdef IBMBIDI
#include "nsIBidiKeyboard.h"
@ -5092,3 +5093,43 @@ nsContentUtils::DispatchXULCommand(nsIContent* aTarget,
PRBool dummy;
return target->DispatchEvent(event, &dummy);
}
// static
nsresult
nsContentUtils::WrapNative(JSContext *cx, JSObject *scope, nsISupports *native,
const nsIID* aIID, jsval *vp,
nsIXPConnectJSObjectHolder **aHolder,
PRBool aAllowWrapping)
{
if (!native) {
NS_ASSERTION(!aHolder || !*aHolder, "*aHolder should be null!");
*vp = JSVAL_NULL;
return NS_OK;
}
NS_ENSURE_TRUE(sXPConnect && sThreadJSContextStack, NS_ERROR_UNEXPECTED);
// Keep sXPConnect and sThreadJSContextStack alive.
nsLayoutStaticsRef layoutStaticsRef;
JSContext *topJSContext;
nsresult rv = sThreadJSContextStack->Peek(&topJSContext);
NS_ENSURE_SUCCESS(rv, rv);
PRBool push = topJSContext != cx;
if (push) {
rv = sThreadJSContextStack->Push(cx);
NS_ENSURE_SUCCESS(rv, rv);
}
rv = sXPConnect->WrapNativeToJSVal(cx, scope, native, aIID, aAllowWrapping,
vp, aHolder);
if (push) {
sThreadJSContextStack->Pop(nsnull);
}
return rv;
}

View File

@ -832,17 +832,13 @@ nsEventListenerManager::RegisterScriptEventListener(nsIScriptContext *aContext,
if (aContext->GetScriptTypeID() == nsIProgrammingLanguage::JAVASCRIPT) {
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
rv = nsContentUtils::XPConnect()->
WrapNative(cx, (JSObject *)aScope, aObject, NS_GET_IID(nsISupports),
getter_AddRefs(holder));
jsval v;
rv = nsContentUtils::WrapNative(cx, (JSObject *)aScope, aObject, &v,
getter_AddRefs(holder));
NS_ENSURE_SUCCESS(rv, rv);
JSObject *jsobj = nsnull;
rv = holder->GetJSObject(&jsobj);
NS_ENSURE_SUCCESS(rv, rv);
rv = nsContentUtils::GetSecurityManager()->
CheckPropertyAccess(cx, jsobj,
CheckPropertyAccess(cx, JSVAL_TO_OBJECT(v),
"EventTarget",
sAddListenerID,
nsIXPCSecurityManager::ACCESS_SET_PROPERTY);

View File

@ -224,22 +224,13 @@ nsHTMLScriptEventHandler::Invoke(nsISupports *aTargetObject,
// wrap the target object...
JSContext *cx = (JSContext *)scriptContext->GetNativeContext();
JSObject *scriptObject = nsnull;
JSObject *scope = sgo->GetGlobalJSObject();
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
nsContentUtils::XPConnect()->WrapNative(cx, scope,
aTargetObject,
NS_GET_IID(nsISupports),
getter_AddRefs(holder));
if (holder) {
holder->GetJSObject(&scriptObject);
}
// Fail if wrapping the native object failed...
if (!scriptObject) {
return NS_ERROR_FAILURE;
}
jsval v;
rv = nsContentUtils::WrapNative(cx, scope, aTargetObject, &v,
getter_AddRefs(holder));
NS_ENSURE_SUCCESS(rv, rv);
// Build up the array of argument names...
//
@ -277,7 +268,7 @@ nsHTMLScriptEventHandler::Invoke(nsISupports *aTargetObject,
void* funcObject = nsnull;
NS_NAMED_LITERAL_CSTRING(funcName, "anonymous");
rv = scriptContext->CompileFunction(scriptObject,
rv = scriptContext->CompileFunction(JSVAL_TO_OBJECT(v),
funcName, // method name
argc, // no of arguments
args, // argument names

View File

@ -1089,17 +1089,15 @@ nsXBLBinding::ChangeDocument(nsIDocument* aOldDocument, nsIDocument* aNewDocumen
pusher.Push(cx);
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
nsresult rv = nsContentUtils::XPConnect()->
WrapNative(cx, global->GetGlobalJSObject(),
mBoundElement, NS_GET_IID(nsISupports),
getter_AddRefs(wrapper));
jsval v;
nsresult rv =
nsContentUtils::WrapNative(cx, global->GetGlobalJSObject(),
mBoundElement, &v,
getter_AddRefs(wrapper));
if (NS_FAILED(rv))
return;
JSObject* scriptObject = nsnull;
rv = wrapper->GetJSObject(&scriptObject);
if (NS_FAILED(rv))
return;
JSObject* scriptObject = JSVAL_TO_OBJECT(v);
// XXX Stay in sync! What if a layered binding has an
// <interface>?!

View File

@ -131,20 +131,16 @@ nsXBLProtoImpl::InitTargetObjects(nsXBLPrototypeBinding* aBinding,
JSContext* jscontext = (JSContext*)aContext->GetNativeContext();
JSObject* global = sgo->GetGlobalJSObject();
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
rv = nsContentUtils::XPConnect()->WrapNative(jscontext, global,
aBoundElement,
NS_GET_IID(nsISupports),
getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
JSObject * object = nsnull;
rv = wrapper->GetJSObject(&object);
jsval v;
rv = nsContentUtils::WrapNative(jscontext, global, aBoundElement, &v,
getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
// All of the above code was just obtaining the bound element's script object and its immediate
// concrete base class. We need to alter the object so that our concrete class is interposed
// between the object and its base class. We become the new base class of the object, and the
// object's old base class becomes the new class' base class.
rv = aBinding->InitClass(mClassName, jscontext, global, object,
rv = aBinding->InitClass(mClassName, jscontext, global, JSVAL_TO_OBJECT(v),
aTargetClassObject);
if (NS_FAILED(rv))
return rv;

View File

@ -295,16 +295,13 @@ nsXBLProtoImplAnonymousMethod::Execute(nsIContent* aBoundElement)
JSObject* globalObject = global->GetGlobalJSObject();
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
jsval v;
nsresult rv =
nsContentUtils::XPConnect()->WrapNative(cx, globalObject,
aBoundElement,
NS_GET_IID(nsISupports),
getter_AddRefs(wrapper));
nsContentUtils::WrapNative(cx, globalObject, aBoundElement, &v,
getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
JSObject* thisObject;
rv = wrapper->GetJSObject(&thisObject);
NS_ENSURE_SUCCESS(rv, rv);
JSObject* thisObject = JSVAL_TO_OBJECT(v);
JSAutoRequest ar(cx);

View File

@ -1397,31 +1397,23 @@ nsXULTemplateBuilder::InitHTMLTemplateRoot()
JSAutoRequest ar(jscontext);
nsIXPConnect *xpc = nsContentUtils::XPConnect();
JSObject* jselement = nsnull;
jsval v;
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
rv = xpc->WrapNative(jscontext, scope, mRoot, NS_GET_IID(nsIDOMElement),
getter_AddRefs(wrapper));
rv = nsContentUtils::WrapNative(jscontext, scope, mRoot,
&NS_GET_IID(nsIDOMElement), &v,
getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
rv = wrapper->GetJSObject(&jselement);
NS_ENSURE_SUCCESS(rv, rv);
JSObject* jselement = JSVAL_TO_OBJECT(v);
if (mDB) {
// database
rv = xpc->WrapNative(jscontext, scope, mDB,
NS_GET_IID(nsIRDFCompositeDataSource),
getter_AddRefs(wrapper));
jsval jsdatabase;
rv = nsContentUtils::WrapNative(jscontext, scope, mDB,
&NS_GET_IID(nsIRDFCompositeDataSource),
&jsdatabase, getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
JSObject* jsobj;
rv = wrapper->GetJSObject(&jsobj);
NS_ENSURE_SUCCESS(rv, rv);
jsval jsdatabase = OBJECT_TO_JSVAL(jsobj);
PRBool ok;
ok = JS_SetProperty(jscontext, jselement, "database", &jsdatabase);
NS_ASSERTION(ok, "unable to set database property");
@ -1431,19 +1423,14 @@ nsXULTemplateBuilder::InitHTMLTemplateRoot()
{
// builder
jsval jsbuilder;
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
rv = xpc->WrapNative(jscontext, jselement,
static_cast<nsIXULTemplateBuilder*>(this),
NS_GET_IID(nsIXULTemplateBuilder),
getter_AddRefs(wrapper));
rv = nsContentUtils::WrapNative(jscontext, jselement,
static_cast<nsIXULTemplateBuilder*>(this),
&NS_GET_IID(nsIXULTemplateBuilder),
&jsbuilder, getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
JSObject* jsobj;
rv = wrapper->GetJSObject(&jsobj);
NS_ENSURE_SUCCESS(rv, rv);
jsval jsbuilder = OBJECT_TO_JSVAL(jsobj);
PRBool ok;
ok = JS_SetProperty(jscontext, jselement, "builder", &jsbuilder);
if (! ok)

View File

@ -1648,27 +1648,6 @@ nsDOMClassInfo::DefineStaticJSVals(JSContext *cx)
return NS_OK;
}
// static
nsresult
nsDOMClassInfo::WrapNative(JSContext *cx, JSObject *scope, nsISupports *native,
const nsIID* aIID, PRBool aAllowWrapping, jsval *vp,
nsIXPConnectJSObjectHolder **aHolder)
{
if (!native) {
NS_ASSERTION(!aHolder || !*aHolder, "*aHolder should be null!");
*vp = JSVAL_NULL;
return NS_OK;
}
NS_ENSURE_TRUE(sXPConnect, NS_ERROR_UNEXPECTED);
return sXPConnect->WrapNativeToJSVal(cx, ::JS_GetGlobalForObject(cx, scope),
native, aIID, aAllowWrapping, vp,
aHolder);
}
static nsresult
CreateExceptionFromResult(JSContext *cx, nsresult aResult)
{

View File

@ -48,6 +48,7 @@
#include "nsIScriptContext.h"
#include "nsDOMJSUtils.h" // for GetScriptContextFromJSContext
#include "nsIScriptGlobalObject.h"
#include "nsContentUtils.h"
class nsIDOMWindow;
class nsIDOMNSHTMLOptionCollection;
@ -137,7 +138,11 @@ public:
PRBool aAllowWrapping, jsval *vp,
// If non-null aHolder will keep the jsval alive
// while there's a ref to it
nsIXPConnectJSObjectHolder** aHolder = nsnull);
nsIXPConnectJSObjectHolder** aHolder = nsnull)
{
return nsContentUtils::WrapNative(cx, scope, native, aIID, vp, aHolder,
aAllowWrapping);
}
// Same as the WrapNative above, but use this one if aIID is nsISupports' IID.
static nsresult WrapNative(JSContext *cx, JSObject *scope,

View File

@ -1679,6 +1679,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
nsCOMPtr<nsIDOMChromeWindow> thisChrome =
do_QueryInterface(static_cast<nsIDOMWindow *>(this));
nsCOMPtr<nsIXPConnectJSObjectHolder> navigatorHolder;
jsval nav;
PRBool isChrome = PR_FALSE;
@ -1757,9 +1758,9 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
nsIDOMNavigator* navigator =
static_cast<nsIDOMNavigator*>(mNavigator.get());
xpc->WrapNative(cx, currentInner->mJSObject, navigator,
NS_GET_IID(nsIDOMNavigator),
getter_AddRefs(navigatorHolder));
nsContentUtils::WrapNative(cx, currentInner->mJSObject, navigator,
&NS_GET_IID(nsIDOMNavigator), &nav,
getter_AddRefs(navigatorHolder));
}
}
@ -1983,12 +1984,10 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
if (navigatorHolder &&
st_id == nsIProgrammingLanguage::JAVASCRIPT) {
// Restore window.navigator onto the new inner window.
JSObject *nav;
JSAutoRequest ar(cx);
navigatorHolder->GetJSObject(&nav);
::JS_DefineProperty(cx, newInnerWindow->mJSObject, "navigator",
OBJECT_TO_JSVAL(nav), nsnull, nsnull,
nav, nsnull, nsnull,
JSPROP_ENUMERATE | JSPROP_PERMANENT |
JSPROP_READONLY);
@ -2000,7 +1999,8 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
static_cast<nsIDOMNavigator*>(mNavigator);
xpc->
ReparentWrappedNativeIfFound(cx, nav, newInnerWindow->mJSObject,
ReparentWrappedNativeIfFound(cx, JSVAL_TO_OBJECT(nav),
newInnerWindow->mJSObject,
navigator,
getter_AddRefs(navigatorHolder));
}

View File

@ -1893,12 +1893,7 @@ nsJSContext::JSObjectFromInterface(nsISupports* aTarget, void *aScope, JSObject
// later.
nsresult rv;
jsval v;
rv = nsContentUtils::XPConnect()->WrapNativeToJSVal(mContext,
(JSObject *)aScope,
aTarget,
&NS_GET_IID(nsISupports),
PR_FALSE,
&v, nsnull);
rv = nsContentUtils::WrapNative(mContext, (JSObject *)aScope, aTarget, &v);
NS_ENSURE_SUCCESS(rv, rv);
#ifdef NS_DEBUG
@ -2551,9 +2546,9 @@ nsJSContext::InitContext(nsIScriptGlobalObject *aGlobalObject)
nsCOMPtr<nsIClassInfo> ci(do_QueryInterface(aGlobalObject));
if (ci) {
rv = xpc->WrapNative(mContext, global, aGlobalObject,
NS_GET_IID(nsISupports),
getter_AddRefs(holder));
jsval v;
rv = nsContentUtils::WrapNative(mContext, global, aGlobalObject, &v,
getter_AddRefs(holder));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIXPConnectWrappedNative> wrapper(do_QueryInterface(holder));
@ -2699,15 +2694,11 @@ nsJSContext::ConvertSupportsTojsvals(nsISupports *aArgs,
"Don't pass nsISupportsPrimitives - use nsIVariant!");
#endif
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
rv = xpc->WrapNative(mContext, (JSObject *)aScope, arg,
NS_GET_IID(nsISupports),
getter_AddRefs(wrapper));
jsval v;
rv = nsContentUtils::WrapNative(mContext, (JSObject *)aScope, arg,
&v, getter_AddRefs(wrapper));
if (NS_SUCCEEDED(rv)) {
JSObject *obj;
rv = wrapper->GetJSObject(&obj);
if (NS_SUCCEEDED(rv)) {
*thisval = OBJECT_TO_JSVAL(obj);
}
*thisval = v;
}
}
}
@ -2906,20 +2897,14 @@ nsJSContext::AddSupportsPrimitiveTojsvals(nsISupports *aArg, jsval *aArgv)
AutoFree iidGuard(iid); // Free iid upon destruction.
nsresult rv;
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
rv = xpc->WrapNative(cx, ::JS_GetGlobalObject(cx), data,
*iid, getter_AddRefs(wrapper));
jsval v;
nsresult rv = nsContentUtils::WrapNative(cx, ::JS_GetGlobalObject(cx),
data, iid, &v,
getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
JSObject *obj;
rv = wrapper->GetJSObject(&obj);
NS_ENSURE_SUCCESS(rv, rv);
*aArgv = OBJECT_TO_JSVAL(obj);
*aArgv = v;
break;
}

View File

@ -310,24 +310,17 @@ nsDOMWorkerFunctions::NewXMLHttpRequest(JSContext* aCx,
return JS_FALSE;
}
nsIXPConnect* xpc = nsContentUtils::XPConnect();
nsCOMPtr<nsIXPConnectJSObjectHolder> xhrWrapped;
rv = xpc->WrapNative(aCx, aObj, static_cast<nsIXMLHttpRequest*>(xhr),
NS_GET_IID(nsISupports), getter_AddRefs(xhrWrapped));
jsval v;
rv = nsContentUtils::WrapNative(aCx, aObj,
static_cast<nsIXMLHttpRequest*>(xhr), &v,
getter_AddRefs(xhrWrapped));
if (NS_FAILED(rv)) {
JS_ReportError(aCx, "Failed to wrap XMLHttpRequest!");
return JS_FALSE;
}
JSObject* xhrJSObj;
rv = xhrWrapped->GetJSObject(&xhrJSObj);
if (NS_FAILED(rv)) {
JS_ReportError(aCx, "Failed to get JSObject from wrapper!");
return JS_FALSE;
}
*aRval = OBJECT_TO_JSVAL(xhrJSObj);
*aRval = v;
return JS_TRUE;
}
@ -377,24 +370,16 @@ nsDOMWorkerFunctions::NewWorker(JSContext* aCx,
return JS_FALSE;
}
nsIXPConnect* xpc = nsContentUtils::XPConnect();
nsCOMPtr<nsIXPConnectJSObjectHolder> workerWrapped;
rv = xpc->WrapNative(aCx, aObj, static_cast<nsIWorker*>(newWorker),
NS_GET_IID(nsISupports), getter_AddRefs(workerWrapped));
jsval v;
rv = nsContentUtils::WrapNative(aCx, aObj, static_cast<nsIWorker*>(newWorker),
&v, getter_AddRefs(workerWrapped));
if (NS_FAILED(rv)) {
JS_ReportError(aCx, "Failed to wrap new worker!");
return JS_FALSE;
}
JSObject* workerJSObj;
rv = workerWrapped->GetJSObject(&workerJSObj);
if (NS_FAILED(rv)) {
JS_ReportError(aCx, "Failed to get JSObject from wrapper!");
return JS_FALSE;
}
*aRval = OBJECT_TO_JSVAL(workerJSObj);
*aRval = v;
return JS_TRUE;
}
@ -1214,12 +1199,11 @@ nsDOMWorker::InitializeInternal(nsIScriptGlobalObject* aOwner,
NS_ASSERTION(!mGlobal, "Already got a global?!");
nsIXPConnect* xpc = nsContentUtils::XPConnect();
nsCOMPtr<nsIXPConnectJSObjectHolder> thisWrapped;
nsresult rv = xpc->WrapNative(aCx, aObj, static_cast<nsIWorker*>(this),
NS_GET_IID(nsISupports),
getter_AddRefs(thisWrapped));
jsval v;
nsresult rv = nsContentUtils::WrapNative(aCx, aObj,
static_cast<nsIWorker*>(this), &v,
getter_AddRefs(thisWrapped));
NS_ENSURE_SUCCESS(rv, rv);
NS_ASSERTION(mWrappedNative, "Post-create hook should have set this!");

View File

@ -467,6 +467,9 @@ interface nsIXPConnect : nsISupports
* asking for an nsISupports wrapper.
* If aAllowWrapper, then the returned value will be wrapped in the proper
* type of security wrapper on top of the XPCWrappedNative (if needed).
* This method doesn't push aJSContext on the context stack, so the caller
* is required to push it if the top of the context stack is not equal to
* aJSContext.
*/
void
wrapNativeToJSVal(in JSContextPtr aJSContext,

View File

@ -1197,6 +1197,30 @@ nsXPConnect::InitClassesWithNewWrappedGlobal(JSContext * aJSContext,
return NS_OK;
}
static nsresult
NativeInterface2JSObject(XPCLazyCallContext & lccx,
JSObject * aScope,
nsISupports *aCOMObj,
const nsIID * aIID,
PRBool aAllowWrapping,
jsval *aVal,
nsIXPConnectJSObjectHolder **aHolder)
{
nsresult rv;
if(!XPCConvert::NativeInterface2JSObject(lccx, aVal, aHolder, aCOMObj, aIID,
nsnull, nsnull, aScope,
aAllowWrapping, OBJ_IS_NOT_GLOBAL,
&rv))
return rv;
#ifdef DEBUG
NS_ASSERTION(!XPCNativeWrapper::IsNativeWrapper(JSVAL_TO_OBJECT(*aVal)),
"Shouldn't be returning a native wrapper here");
#endif
return NS_OK;
}
/* nsIXPConnectJSObjectHolder wrapNative (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsISupports aCOMObj, in nsIIDRef aIID); */
NS_IMETHODIMP
nsXPConnect::WrapNative(JSContext * aJSContext,
@ -1206,10 +1230,18 @@ nsXPConnect::WrapNative(JSContext * aJSContext,
nsIXPConnectJSObjectHolder **aHolder)
{
NS_ASSERTION(aHolder, "bad param");
NS_ASSERTION(aJSContext, "bad param");
NS_ASSERTION(aScope, "bad param");
NS_ASSERTION(aCOMObj, "bad param");
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
if(!ccx.IsValid())
return UnexpectedFailure(NS_ERROR_FAILURE);
XPCLazyCallContext lccx(ccx);
jsval v;
return WrapNativeToJSVal(aJSContext, aScope, aCOMObj, &aIID, PR_FALSE,
&v, aHolder);
return NativeInterface2JSObject(lccx, aScope, aCOMObj, &aIID, PR_FALSE, &v,
aHolder);
}
/* void wrapNativeToJSVal (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsISupports aCOMObj, in nsIIDPtr aIID, out JSVal aVal, out nsIXPConnectJSObjectHolder aHolder); */
@ -1229,23 +1261,10 @@ nsXPConnect::WrapNativeToJSVal(JSContext * aJSContext,
if(aHolder)
*aHolder = nsnull;
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
if(!ccx.IsValid())
return UnexpectedFailure(NS_ERROR_FAILURE);
XPCLazyCallContext lccx(ccx);
XPCLazyCallContext lccx(NATIVE_CALLER, aJSContext);
nsresult rv;
if(!XPCConvert::NativeInterface2JSObject(ccx, aVal, aHolder, aCOMObj, aIID,
nsnull, nsnull, aScope, aAllowWrapping,
OBJ_IS_NOT_GLOBAL, &rv))
return rv;
#ifdef DEBUG
NS_ASSERTION(!XPCNativeWrapper::IsNativeWrapper(JSVAL_TO_OBJECT(*aVal)),
"Shouldn't be returning a native wrapper here");
#endif
return NS_OK;
return NativeInterface2JSObject(lccx, aScope, aCOMObj, aIID, aAllowWrapping,
aVal, aHolder);
}
/* void wrapJS (in JSContextPtr aJSContext, in JSObjectPtr aJSObj, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */

View File

@ -61,4 +61,17 @@ private:
static void Shutdown();
};
class nsLayoutStaticsRef
{
public:
nsLayoutStaticsRef()
{
nsLayoutStatics::AddRef();
}
~nsLayoutStaticsRef()
{
nsLayoutStatics::Release();
}
};
#endif // nsLayoutStatics_h__