JSObject* WrapperOwner::fromRemoteObjectVariant(JSContext* cx, const RemoteObject& objVar) { ObjectId objId = ObjectId::deserialize(objVar.serializedId()); RootedObject obj(cx, findCPOWById(objId)); if (!obj) { // All CPOWs live in the privileged junk scope. RootedObject junkScope(cx, xpc::PrivilegedJunkScope()); JSAutoRealm ar(cx, junkScope); RootedValue v(cx, UndefinedValue()); // We need to setLazyProto for the getPrototype/getPrototypeIfOrdinary // hooks. ProxyOptions options; options.setLazyProto(true); obj = NewProxyObject(cx, &CPOWProxyHandler::singleton, v, nullptr, options); if (!obj) return nullptr; if (!cpows_.add(objId, obj)) return nullptr; nextCPOWNumber_ = objId.serialNumber() + 1; // Incref once we know the decref will be called. incref(); AuxCPOWData* aux = new AuxCPOWData(objId, objVar.isCallable(), objVar.isConstructor(), objVar.isDOMObject(), objVar.objectTag()); SetProxyReservedSlot(obj, 0, PrivateValue(this)); SetProxyReservedSlot(obj, 1, PrivateValue(aux)); } if (!JS_WrapObject(cx, &obj)) return nullptr; return obj; }
/* static */ ModuleNamespaceObject* ModuleNamespaceObject::create(JSContext* cx, HandleModuleObject module) { RootedValue priv(cx, ObjectValue(*module)); ProxyOptions options; options.setLazyProto(true); RootedObject object(cx, NewProxyObject(cx, &proxyHandler, priv, nullptr, options)); if (!object) return nullptr; RootedId funName(cx, INTERNED_STRING_TO_JSID(cx, cx->names().Symbol_iterator_fun)); RootedFunction enumerateFun(cx); enumerateFun = JS::GetSelfHostedFunction(cx, "ModuleNamespaceEnumerate", funName, 0); if (!enumerateFun) return nullptr; SetProxyExtra(object, ProxyHandler::EnumerateFunctionSlot, ObjectValue(*enumerateFun)); return &object->as<ModuleNamespaceObject>(); }