JSObject * Wrapper::New(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent, Wrapper *handler) { JS_ASSERT(parent); AutoMarkInDeadZone amd(cx->zone()); RootedValue priv(cx, ObjectValue(*obj)); ProxyOptions options; options.setCallable(obj->isCallable()); return NewProxyObject(cx, handler, priv, proto, parent, options); }
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; }
js::NewProxyObject(JSContext* cx, const BaseProxyHandler* handler, HandleValue priv, JSObject* proto_, const ProxyOptions& options) { if (options.lazyProto()) { MOZ_ASSERT(!proto_); proto_ = TaggedProto::LazyProto; } return ProxyObject::New(cx, handler, priv, TaggedProto(proto_), options); }
/* 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>(); }