/* static */ bool DOMProxyHandler::AppendNamedPropertyIds(JSContext* cx, JS::Handle<JSObject*> proxy, nsTArray<nsString>& names, bool shadowPrototypeProperties, DOMProxyHandler* handler, JS::AutoIdVector& props) { for (uint32_t i = 0; i < names.Length(); ++i) { JS::Rooted<JS::Value> v(cx); if (!xpc::NonVoidStringToJsval(cx, names[i], v.address())) { return false; } JS::Rooted<jsid> id(cx); if (!JS_ValueToId(cx, v, id.address())) { return false; } if (shadowPrototypeProperties || !HasPropertyOnPrototype(cx, proxy, handler, id)) { if (!props.append(id)) { return false; } } } return true; }
bool DOMProxyHandler::AppendNamedPropertyIds(JSContext* cx, JSObject* proxy, nsTArray<nsString>& names, JS::AutoIdVector& props) { for (uint32_t i = 0; i < names.Length(); ++i) { JS::Value v; if (!xpc::NonVoidStringToJsval(cx, names[i], &v)) { return false; } jsid id; if (!JS_ValueToId(cx, v, &id)) { return false; } if (!HasPropertyOnPrototype(cx, proxy, this, id)) { if (!props.append(id)) { return false; } } } return true; }
bool WindowNamedPropertiesHandler::getOwnPropDescriptor(JSContext* aCx, JS::Handle<JSObject*> aProxy, JS::Handle<jsid> aId, bool /* unused */, JS::MutableHandle<JSPropertyDescriptor> aDesc) const { if (!JSID_IS_STRING(aId)) { // Nothing to do if we're resolving a non-string property. return true; } JS::Rooted<JSObject*> global(aCx, JS_GetGlobalForObject(aCx, aProxy)); if (HasPropertyOnPrototype(aCx, aProxy, aId)) { return true; } nsAutoJSString str; if (!str.init(aCx, JSID_TO_STRING(aId))) { return false; } // Grab the DOM window. nsGlobalWindow* win = GetWindowFromGlobal(global); if (win->Length() > 0) { nsCOMPtr<nsIDOMWindow> childWin = win->GetChildWindow(str); if (childWin && ShouldExposeChildWindow(str, childWin)) { // We found a subframe of the right name. Shadowing via |var foo| in // global scope is still allowed, since |var| only looks up |own| // properties. But unqualified shadowing will fail, per-spec. JS::Rooted<JS::Value> v(aCx); if (!WrapObject(aCx, childWin, &v)) { return false; } aDesc.object().set(aProxy); aDesc.value().set(v); aDesc.setAttributes(JSPROP_ENUMERATE); return true; } } // The rest of this function is for HTML documents only. nsCOMPtr<nsIHTMLDocument> htmlDoc = do_QueryInterface(win->GetExtantDoc()); if (!htmlDoc) { return true; } nsHTMLDocument* document = static_cast<nsHTMLDocument*>(htmlDoc.get()); Element* element = document->GetElementById(str); if (element) { JS::Rooted<JS::Value> v(aCx); if (!WrapObject(aCx, element, &v)) { return false; } aDesc.object().set(aProxy); aDesc.value().set(v); aDesc.setAttributes(JSPROP_ENUMERATE); return true; } nsWrapperCache* cache; nsISupports* result = document->ResolveName(str, &cache); if (!result) { return true; } JS::Rooted<JS::Value> v(aCx); if (!WrapObject(aCx, result, cache, nullptr, &v)) { return false; } aDesc.object().set(aProxy); aDesc.value().set(v); aDesc.setAttributes(JSPROP_ENUMERATE); return true; }