bool WrapperOwner::get(JSContext* cx, HandleObject proxy, HandleValue receiver, HandleId id, MutableHandleValue vp) { ObjectId objId = idOf(proxy); JSVariant receiverVar; if (!toVariant(cx, receiver, &receiverVar)) return false; JSIDVariant idVar; if (!toJSIDVariant(cx, id, &idVar)) return false; AuxCPOWData* data = AuxCPOWDataOf(proxy); if (data->isDOMObject && idVar.type() == JSIDVariant::TnsString && idVar.get_nsString().EqualsLiteral("QueryInterface")) { // Handle QueryInterface on DOM Objects specially since we can assume // certain things about their implementation. RootedFunction qi(cx, JS_NewFunction(cx, CPOWDOMQI, 1, 0, "QueryInterface")); if (!qi) return false; vp.set(ObjectValue(*JS_GetFunctionObject(qi))); return true; } JSVariant val; ReturnStatus status; if (!SendGet(objId, receiverVar, idVar, &status, &val)) return ipcfail(cx); LOG_STACK(); if (!ok(cx, status)) return false; if (!fromVariant(cx, val, vp)) return false; if (idVar.type() == JSIDVariant::TnsString && idVar.get_nsString().EqualsLiteral("toString")) { RootedFunction toString(cx, JS_NewFunction(cx, CPOWToString, 0, 0, "toString")); if (!toString) return false; RootedObject toStringObj(cx, JS_GetFunctionObject(toString)); if (!JS_DefineProperty(cx, toStringObj, "__cpow__", vp, JSPROP_PERMANENT | JSPROP_READONLY)) return false; vp.set(ObjectValue(*toStringObj)); } return true; }
bool JavaScriptShared::fromJSIDVariant(JSContext* cx, const JSIDVariant& from, MutableHandleId to) { switch (from.type()) { case JSIDVariant::TSymbolVariant: { Symbol* sym = fromSymbolVariant(cx, from.get_SymbolVariant()); if (!sym) return false; to.set(SYMBOL_TO_JSID(sym)); return true; } case JSIDVariant::TnsString: return convertGeckoStringToId(cx, from.get_nsString(), to); case JSIDVariant::Tint32_t: to.set(INT_TO_JSID(from.get_int32_t())); return true; default: return false; } }