From 985487f28e94ba11c41db0de917070d5a65d50a2 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 18 Dec 2011 11:08:04 +0100 Subject: [PATCH] Bug 705344 - Use IDL for Components.(utils.)lookupMethod; r=bholley --- js/xpconnect/idl/xpccomponents.idl | 15 +++-- js/xpconnect/src/XPCComponents.cpp | 104 ++++++++--------------------- 2 files changed, 35 insertions(+), 84 deletions(-) diff --git a/js/xpconnect/idl/xpccomponents.idl b/js/xpconnect/idl/xpccomponents.idl index 973169eded18..52612ee8d6d9 100644 --- a/js/xpconnect/idl/xpccomponents.idl +++ b/js/xpconnect/idl/xpccomponents.idl @@ -1,6 +1,5 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * ***** BEGIN LICENSE BLOCK ***** +/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version @@ -153,7 +152,7 @@ interface ScheduledGCCallback : nsISupports /** * interface of Components.utils */ -[scriptable, uuid(1fbd5d17-707f-4874-9635-59ad2438caf0)] +[scriptable, uuid(d41d626c-c222-4c38-ba5f-6499baff3b11)] interface nsIXPCComponents_Utils : nsISupports { @@ -182,7 +181,8 @@ interface nsIXPCComponents_Utils : nsISupports * replaced in the content JS code. This method is not recommended for * any other use. */ - void lookupMethod(); + [implicit_jscontext] + jsval lookupMethod(in jsval obj, in jsval name); readonly attribute nsIXPCComponents_utils_Sandbox Sandbox; @@ -347,7 +347,7 @@ interface nsIXPCComponents_Utils : nsISupports /** * interface of JavaScript's 'Components' object */ -[scriptable, uuid(155809f1-71f1-47c5-be97-d812ba560405)] +[scriptable, uuid(9d654574-cb2c-4bd0-a0fd-c10443fe2135)] interface nsIXPCComponents : nsISupports { readonly attribute nsIXPCComponents_Interfaces interfaces; @@ -369,7 +369,8 @@ interface nsIXPCComponents : nsISupports * (But are you sure you really want this method any more? * See http://developer-test.mozilla.org/en/docs/XPCNativeWrapper ) */ - [deprecated] void lookupMethod(); + [deprecated,implicit_jscontext] + jsval lookupMethod(in jsval obj, in jsval name); /* @deprecated Use Components.utils.reportError instead. */ [deprecated] void reportError(); diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp index ed247c36ca76..895dc1e5deaf 100644 --- a/js/xpconnect/src/XPCComponents.cpp +++ b/js/xpconnect/src/XPCComponents.cpp @@ -2608,91 +2608,43 @@ nsXPCComponents_Utils::GetSandbox(nsIXPCComponents_utils_Sandbox **aSandbox) /* void lookupMethod (); */ NS_IMETHODIMP -nsXPCComponents_Utils::LookupMethod() +nsXPCComponents_Utils::LookupMethod(const JS::Value& object, + const JS::Value& name, + JSContext *cx, + JS::Value *retval) { - nsresult rv; - - nsCOMPtr xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); - if (NS_FAILED(rv)) - return NS_ERROR_FAILURE; - - // get the xpconnect native call context - nsAXPCNativeCallContext *cc = nsnull; - xpc->GetCurrentNativeCallContext(&cc); - if (!cc) - return NS_ERROR_FAILURE; - -// Check disabled until deprecated Components.lookupMethod removed. -#undef CHECK_FOR_INDIRECT_CALL -#ifdef CHECK_FOR_INDIRECT_CALL - // verify that we are being called from JS (i.e. the current call is - // to this object - though we don't verify that it is to this exact method) - nsCOMPtr callee; - cc->GetCallee(getter_AddRefs(callee)); - if (!callee || callee.get() != - static_cast - (static_cast(this))) - return NS_ERROR_FAILURE; -#endif - - // Get JSContext of current call - JSContext* cx; - rv = cc->GetJSContext(&cx); - if (NS_FAILED(rv) || !cx) - return NS_ERROR_FAILURE; - JSAutoRequest ar(cx); - // get place for return value - jsval *retval = nsnull; - rv = cc->GetRetValPtr(&retval); - if (NS_FAILED(rv) || !retval) - return NS_ERROR_FAILURE; - - // get argc and argv and verify arg count - PRUint32 argc; - rv = cc->GetArgc(&argc); - if (NS_FAILED(rv)) - return NS_ERROR_FAILURE; - - if (argc < 2) - return NS_ERROR_XPC_NOT_ENOUGH_ARGS; - - jsval* argv; - rv = cc->GetArgvPtr(&argv); - if (NS_FAILED(rv) || !argv) - return NS_ERROR_FAILURE; - // first param must be a JSObject - if (JSVAL_IS_PRIMITIVE(argv[0])) + if (JSVAL_IS_PRIMITIVE(object)) return NS_ERROR_XPC_BAD_CONVERT_JS; - JSObject* obj = JSVAL_TO_OBJECT(argv[0]); + JSObject* obj = JSVAL_TO_OBJECT(object); while (obj && !js::IsWrapper(obj) && !IS_WRAPPER_CLASS(js::GetObjectClass(obj))) obj = JS_GetPrototype(cx, obj); if (!obj) return NS_ERROR_XPC_BAD_CONVERT_JS; - argv[0] = OBJECT_TO_JSVAL(obj); - rv = nsXPConnect::GetXPConnect()->GetJSObjectOfWrapper(cx, obj, &obj); + JSObject* unwrappedObject; + nsresult rv = nsXPConnect::GetXPConnect()->GetJSObjectOfWrapper(cx, obj, &unwrappedObject); if (NS_FAILED(rv)) return rv; - obj = JS_ObjectToInnerObject(cx, obj); - if (!obj) + unwrappedObject = JS_ObjectToInnerObject(cx, unwrappedObject); + if (!unwrappedObject) return NS_ERROR_XPC_BAD_CONVERT_JS; // second param must be a string - if (!JSVAL_IS_STRING(argv[1])) + if (!JSVAL_IS_STRING(name)) return NS_ERROR_XPC_BAD_CONVERT_JS; - // Make sure the name (argv[1]) that we use for looking up the - // method/property is atomized. - + // Make sure the name that we use for looking up the method/property is + // atomized. jsid name_id; - if (!JS_ValueToId(cx, argv[1], &name_id) || - !JS_IdToValue(cx, name_id, &argv[1])) + JS::Value dummy; + if (!JS_ValueToId(cx, name, &name_id) || + !JS_IdToValue(cx, name_id, &dummy)) return NS_ERROR_XPC_BAD_CONVERT_JS; // this will do verification and the method lookup for us @@ -2701,7 +2653,7 @@ nsXPCComponents_Utils::LookupMethod() // XPCWrappedNative. This means no deep wrapping, unfortunately, but we // can't keep track of both the underlying function and the // XPCNativeWrapper at once in a single parent slot... - XPCCallContext inner_cc(JS_CALLER, cx, obj, nsnull, name_id); + XPCCallContext inner_cc(JS_CALLER, cx, unwrappedObject, nsnull, name_id); // was our jsobject really a wrapped native at all? XPCWrappedNative* wrapper = inner_cc.GetWrapper(); @@ -2721,9 +2673,7 @@ nsXPCComponents_Utils::LookupMethod() jsval funval; // get (and perhaps lazily create) the member's cloned function - if (!member->NewFunctionObject(inner_cc, iface, - JSVAL_TO_OBJECT(argv[0]), - &funval)) + if (!member->NewFunctionObject(inner_cc, iface, obj, &funval)) return NS_ERROR_XPC_BAD_CONVERT_JS; NS_ASSERTION(JS_ValueToFunction(inner_cc, funval), @@ -2731,9 +2681,6 @@ nsXPCComponents_Utils::LookupMethod() // Stick the function in the return value. This roots it. *retval = funval; - - // Tell XPConnect that we returned the function through the call context. - cc->SetReturnValueWasSet(true); return NS_OK; } @@ -4347,17 +4294,20 @@ nsXPCComponents::AttachNewComponentsObject(XPCCallContext& ccx, } /* void lookupMethod (); */ -NS_IMETHODIMP nsXPCComponents::LookupMethod() +NS_IMETHODIMP +nsXPCComponents::LookupMethod(const JS::Value& object, + const JS::Value& name, + JSContext *cx, + JS::Value *retval) { - nsresult rv; - nsCOMPtr utils; - NS_WARNING("Components.lookupMethod deprecated, use Components.utils.lookupMethod"); - rv = GetUtils(getter_AddRefs(utils)); + + nsCOMPtr utils; + nsresult rv = GetUtils(getter_AddRefs(utils)); if (NS_FAILED(rv)) return rv; - return utils->LookupMethod(); + return utils->LookupMethod(object, name, cx, retval); } /* void reportError (); */