NS_IMETHODIMP nsJSCID::CreateInstance(HandleValue iidval, JSContext* cx, uint8_t optionalArgc, MutableHandleValue retval) { if (!mDetails->IsValid()) return NS_ERROR_XPC_BAD_CID; if (NS_FAILED(nsXPConnect::SecurityManager()->CanCreateInstance(cx, mDetails->ID()))) { NS_ERROR("how are we not being called from chrome here?"); return NS_OK; } // If an IID was passed in then use it const nsID* iid = GetIIDArg(optionalArgc, iidval, cx); if (!iid) return NS_ERROR_XPC_BAD_IID; nsCOMPtr<nsIComponentManager> compMgr; nsresult rv = NS_GetComponentManager(getter_AddRefs(compMgr)); if (NS_FAILED(rv)) return NS_ERROR_UNEXPECTED; nsCOMPtr<nsISupports> inst; rv = compMgr->CreateInstance(mDetails->ID(), nullptr, *iid, getter_AddRefs(inst)); MOZ_ASSERT(NS_FAILED(rv) || inst, "component manager returned success, but instance is null!"); if (NS_FAILED(rv) || !inst) return NS_ERROR_XPC_CI_RETURNED_FAILURE; rv = nsContentUtils::WrapNative(cx, inst, iid, retval); if (NS_FAILED(rv) || retval.isPrimitive()) return NS_ERROR_XPC_CANT_CREATE_WN; return NS_OK; }
// Call WaiveXrayAndWrap when you have a JS object that you don't want to be // wrapped in an Xray wrapper. cx->compartment is the compartment that will be // using the returned object. If the object to be wrapped is already in the // correct compartment, then this returns the unwrapped object. bool WrapperFactory::WaiveXrayAndWrap(JSContext *cx, MutableHandleValue vp) { if (vp.isPrimitive()) return JS_WrapValue(cx, vp); RootedObject obj(cx, &vp.toObject()); if (!WaiveXrayAndWrap(cx, &obj)) return false; vp.setObject(*obj); return true; }