/* 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; }
void BSONInfo::enumerate(JSContext* cx, JS::HandleObject obj, JS::AutoIdVector& properties) { auto holder = getHolder(obj); if (!holder) return; BSONObjIterator i(holder->_obj); ObjectWrapper o(cx, obj); JS::RootedValue val(cx); JS::RootedId id(cx); while (i.more()) { BSONElement e = i.next(); // TODO: when we get heterogenous set lookup, switch to StringData // rather than involving the temporary string if (holder->_removed.count(e.fieldName())) continue; ValueReader(cx, &val).fromStringData(e.fieldNameStringData()); if (!JS_ValueToId(cx, val, &id)) uasserted(ErrorCodes::JSInterpreterFailure, "Failed to invoke JS_ValueToId"); properties.append(id); } }
/* static */ bool WebIDLGlobalNameHash::NewEnumerateSystemGlobal( JSContext* aCx, JS::Handle<JSObject*> aObj, JS::AutoIdVector& aProperties, bool aEnumerableOnly) { MOZ_ASSERT(JS_IsGlobalObject(aObj)); if (!JS_NewEnumerateStandardClasses(aCx, aObj, aProperties, aEnumerableOnly)) { return false; } // All properties defined on our global are non-enumerable, so we can skip // remaining properties. if (aEnumerableOnly) { return true; } // Enumerate all entries & add enabled ones. for (size_t i = 0; i < sCount; ++i) { const WebIDLNameTableEntry& entry = sEntries[i]; if (!entry.mEnabled || entry.mEnabled(aCx, aObj)) { JSString* str = JS_AtomizeStringN(aCx, sNames + entry.mNameOffset, entry.mNameLength); if (!str || !aProperties.append(NON_INTEGER_ATOM_TO_JSID(str))) { 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; }
static bool EnumerateNames(JSContext *cx, JSObject *wrapper, uintN flags, js::AutoIdVector &props) { JSObject *holder = GetHolder(wrapper); JSObject *wnObject = GetWrappedNativeObjectFromHolder(holder); // Redirect access straight to the wrapper if we should be transparent. if (XrayUtils::IsTransparent(cx, wrapper)) { JSAutoEnterCompartment ac; if (!ac.enter(cx, wnObject)) return false; return js::GetPropertyNames(cx, wnObject, flags, &props); } if (WrapperFactory::IsPartiallyTransparent(wrapper)) { JS_ReportError(cx, "Not allowed to enumerate cross origin objects"); return false; } // Enumerate expando properties first. JSObject *expando = GetExpandoObject(holder); if (expando && !js::GetPropertyNames(cx, expando, flags, &props)) return false; // Force all native properties to be materialized onto the wrapped native. js::AutoIdVector wnProps(cx); { JSAutoEnterCompartment ac; if (!ac.enter(cx, wnObject)) return false; if (!js::GetPropertyNames(cx, wnObject, flags, &wnProps)) return false; } // Go through the properties we got and enumerate all native ones. for (size_t n = 0; n < wnProps.length(); ++n) { jsid id = wnProps[n]; JSBool hasProp; if (!JS_HasPropertyById(cx, wrapper, id, &hasProp)) return false; if (hasProp) props.append(id); } return true; }
/* static */ bool WebIDLGlobalNameHash::GetNames(JSContext* aCx, JS::Handle<JSObject*> aObj, NameType aNameType, JS::AutoIdVector& aNames) { // aObj is always a Window here, so GetProtoAndIfaceCache on it is safe. ProtoAndIfaceCache* cache = GetProtoAndIfaceCache(aObj); for (size_t i = 0; i < sCount; ++i) { const WebIDLNameTableEntry& entry = sEntries[i]; // If aNameType is not AllNames, only include things whose entry slot in the // ProtoAndIfaceCache is null. if ((aNameType == AllNames || !cache->HasEntryInSlot(entry.mConstructorId)) && (!entry.mEnabled || entry.mEnabled(aCx, aObj))) { JSString* str = JS_AtomizeStringN(aCx, sNames + entry.mNameOffset, entry.mNameLength); if (!str || !aNames.append(NON_INTEGER_ATOM_TO_JSID(str))) { return false; } } } return true; }