// static JSObject* DOMProxyHandler::EnsureExpandoObject(JSContext* cx, JSObject* obj) { NS_ASSERTION(IsDOMProxy(obj), "expected a DOM proxy object"); JSObject* expando = GetExpandoObject(obj); if (!expando) { expando = JS_NewObjectWithGivenProto(cx, nullptr, nullptr, js::GetObjectParent(obj)); if (!expando) { return NULL; } XPCWrappedNativeScope* scope = xpc::GetObjectScope(obj); if (!scope->RegisterDOMExpandoObject(obj)) { return NULL; } nsWrapperCache* cache; CallQueryInterface(UnwrapDOMObject<nsISupports>(obj), &cache); cache->SetPreservingWrapper(true); js::SetProxyExtra(obj, JSPROXYSLOT_EXPANDO, ObjectValue(*expando)); } return expando; }
// static JSObject* DOMProxyHandler::GetAndClearExpandoObject(JSObject* obj) { JSObject* expando = GetExpandoObject(obj); XPCWrappedNativeScope* scope = xpc::GetObjectScope(obj); scope->RemoveDOMExpandoObject(obj); js::SetProxyExtra(obj, JSPROXYSLOT_EXPANDO, UndefinedValue()); return expando; }
bool DOMProxyHandler::delete_(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id, JS::ObjectOpResult &result) const { JS::Rooted<JSObject*> expando(cx); if (!xpc::WrapperFactory::IsXrayWrapper(proxy) && (expando = GetExpandoObject(proxy))) { return JS_DeletePropertyById(cx, expando, id, result); } return result.succeed(); }
bool DOMProxyHandler::delete_(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id, bool* bp) { JS::Rooted<JSObject*> expando(cx); if (!xpc::WrapperFactory::IsXrayWrapper(proxy) && (expando = GetExpandoObject(proxy))) { return JS_DeletePropertyById2(cx, expando, id, bp); } *bp = true; return true; }
bool DOMProxyHandler::delete_(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id, bool* bp) { JSBool b = true; JSObject* expando; if (!xpc::WrapperFactory::IsXrayWrapper(proxy) && (expando = GetExpandoObject(proxy))) { Value v; if (!JS_DeletePropertyById2(cx, expando, id, &v) || !JS_ValueToBoolean(cx, v, &b)) { return false; } } *bp = !!b; return true; }