bool BaseDOMProxyHandler::getOwnPropertyDescriptor(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id, MutableHandle<PropertyDescriptor> desc) const { return getOwnPropDescriptor(cx, proxy, id, /* ignoreNamedProps = */ false, desc); }
bool DOMProxyHandler::set(JSContext *cx, Handle<JSObject*> proxy, Handle<JSObject*> receiver, Handle<jsid> id, bool strict, MutableHandle<JS::Value> vp) const { MOZ_ASSERT(!xpc::WrapperFactory::IsXrayWrapper(proxy), "Should not have a XrayWrapper here"); bool done; if (!setCustom(cx, proxy, id, vp, &done)) { return false; } if (done) { return true; } // Make sure to ignore our named properties when checking for own // property descriptors for a set. JS::Rooted<JSPropertyDescriptor> desc(cx); if (!getOwnPropDescriptor(cx, proxy, id, /* ignoreNamedProps = */ true, &desc)) { return false; } bool descIsOwn = desc.object() != nullptr; if (!desc.object()) { // Don't just use getPropertyDescriptor, unlike BaseProxyHandler::set, // because that would call getOwnPropertyDescriptor on ourselves. Instead, // directly delegate to the proto, if any. JS::Rooted<JSObject*> proto(cx); if (!js::GetObjectProto(cx, proxy, &proto)) { return false; } if (proto && !JS_GetPropertyDescriptorById(cx, proto, id, &desc)) { return false; } } return js::SetPropertyIgnoringNamedGetter(cx, this, proxy, receiver, id, &desc, descIsOwn, strict, vp); }
bool DOMProxyHandler::set(JSContext *cx, Handle<JSObject*> proxy, Handle<jsid> id, Handle<JS::Value> v, Handle<JS::Value> receiver, ObjectOpResult &result) const { MOZ_ASSERT(!xpc::WrapperFactory::IsXrayWrapper(proxy), "Should not have a XrayWrapper here"); bool done; if (!setCustom(cx, proxy, id, v, &done)) { return false; } if (done) { return result.succeed(); } // Make sure to ignore our named properties when checking for own // property descriptors for a set. JS::Rooted<PropertyDescriptor> ownDesc(cx); if (!getOwnPropDescriptor(cx, proxy, id, /* ignoreNamedProps = */ true, &ownDesc)) { return false; } return js::SetPropertyIgnoringNamedGetter(cx, proxy, id, v, receiver, ownDesc, result); }