bool JSHTMLCollectionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) { JSHTMLCollection* jsHTMLCollection = static_cast<JSHTMLCollection*>(handle.get().asCell()); if (!isObservable(jsHTMLCollection)) return false; void* root = WebCore::root(jsHTMLCollection->impl()->base()); return visitor.containsOpaqueRoot(root); }
JSValue jsHTMLCollectionLength(ExecState* exec, JSValue slotBase, const Identifier&) { JSHTMLCollection* castedThis = static_cast<JSHTMLCollection*>(asObject(slotBase)); UNUSED_PARAM(exec); HTMLCollection* imp = static_cast<HTMLCollection*>(castedThis->impl()); JSValue result = jsNumber(imp->length()); return result; }
EncodedJSValue JSC_HOST_CALL jsHTMLCollectionPrototypeFunctionNamedItem(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSHTMLCollection::s_info)) return throwVMTypeError(exec); JSHTMLCollection* castedThis = static_cast<JSHTMLCollection*>(asObject(thisValue)); ASSERT_GC_OBJECT_INHERITS(castedThis, &JSHTMLCollection::s_info); return JSValue::encode(castedThis->namedItem(exec)); }
JSValue JSHTMLCollection::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSHTMLCollection* collection = jsCast<JSHTMLCollection*>(asObject(slotBase)); const AtomicString& name = propertyNameToAtomicString(propertyName); HTMLCollection* impl = collection->impl(); #if ENABLE(MICRODATA) if (impl->type() == ItemProperties) return toJS(exec, collection->globalObject(), static_cast<HTMLPropertiesCollection*>(impl)->propertyNodeList(name)); #endif return toJS(exec, collection->globalObject(), impl->namedItem(name)); }
JSValue JSC_HOST_CALL jsHTMLCollectionPrototypeFunctionTags(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args) { UNUSED_PARAM(args); if (!thisValue.isObject(&JSHTMLCollection::s_info)) return throwError(exec, TypeError); JSHTMLCollection* castedThisObj = static_cast<JSHTMLCollection*>(asObject(thisValue)); HTMLCollection* imp = static_cast<HTMLCollection*>(castedThisObj->impl()); const UString& name = args.at(0).toString(exec); JSC::JSValue result = toJS(exec, WTF::getPtr(imp->tags(name))); return result; }
// HTMLCollections are strange objects, they support both get and call, // so that document.forms.item(0) and document.forms(0) both work. static EncodedJSValue JSC_HOST_CALL callHTMLCollection(ExecState* exec) { if (exec->argumentCount() < 1) return JSValue::encode(jsUndefined()); // Do not use thisObj here. It can be the JSHTMLDocument, in the document.forms(i) case. JSHTMLCollection* jsCollection = static_cast<JSHTMLCollection*>(exec->callee()); HTMLCollection* collection = jsCollection->impl(); // Also, do we need the TypeError test here ? if (exec->argumentCount() == 1) { // Support for document.all(<index>) etc. bool ok; UString string = exec->argument(0).toString(exec); unsigned index = Identifier::toUInt32(string, ok); if (ok) return JSValue::encode(toJS(exec, jsCollection->globalObject(), collection->item(index))); // Support for document.images('<name>') etc. return JSValue::encode(getNamedItems(exec, jsCollection, Identifier(exec, string))); } // The second arg, if set, is the index of the item we want bool ok; UString string = exec->argument(0).toString(exec); unsigned index = Identifier::toUInt32(exec->argument(1).toString(exec), ok); if (ok) { String pstr = ustringToString(string); Node* node = collection->namedItem(pstr); while (node) { if (!index) return JSValue::encode(toJS(exec, jsCollection->globalObject(), node)); node = collection->nextNamedItem(pstr); --index; } } return JSValue::encode(jsUndefined()); }
// HTMLCollections are strange objects, they support both get and call, // so that document.forms.item(0) and document.forms(0) both work. static JSValue JSC_HOST_CALL callHTMLCollection(ExecState* exec, JSObject* function, JSValue, const ArgList& args) { if (args.size() < 1) return jsUndefined(); // Do not use thisObj here. It can be the JSHTMLDocument, in the document.forms(i) case. JSHTMLCollection* jsCollection = static_cast<JSHTMLCollection*>(function); HTMLCollection* collection = jsCollection->impl(); // Also, do we need the TypeError test here ? if (args.size() == 1) { // Support for document.all(<index>) etc. bool ok; UString string = args.at(0).toString(exec); unsigned index = string.toUInt32(&ok, false); if (ok) return toJS(exec, jsCollection->globalObject(), collection->item(index)); // Support for document.images('<name>') etc. return getNamedItems(exec, jsCollection, Identifier(exec, string)); } // The second arg, if set, is the index of the item we want bool ok; UString string = args.at(0).toString(exec); unsigned index = args.at(1).toString(exec).toUInt32(&ok, false); if (ok) { String pstr = string; Node* node = collection->namedItem(pstr); while (node) { if (!index) return toJS(exec, jsCollection->globalObject(), node); node = collection->nextNamedItem(pstr); --index; } } return jsUndefined(); }
JSValue* JSHTMLCollection::nameGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) { JSHTMLCollection* thisObj = static_cast<JSHTMLCollection*>(slot.slotBase()); return getNamedItems(exec, thisObj->impl(), propertyName); }
void JSHTMLCollectionOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context) { JSHTMLCollection* jsHTMLCollection = static_cast<JSHTMLCollection*>(handle.get().asCell()); DOMWrapperWorld* world = static_cast<DOMWrapperWorld*>(context); uncacheWrapper(world, jsHTMLCollection->impl(), jsHTMLCollection); }
JSValue JSHTMLCollection::indexGetter(ExecState* exec, JSValue slotBase, unsigned index) { JSHTMLCollection* thisObj = static_cast<JSHTMLCollection*>(asObject(slotBase)); ASSERT_GC_OBJECT_INHERITS(thisObj, &s_info); return toJS(exec, thisObj->globalObject(), static_cast<HTMLCollection*>(thisObj->impl())->item(index)); }
JSValue jsHTMLCollectionConstructor(ExecState* exec, JSValue slotBase, const Identifier&) { JSHTMLCollection* domObject = static_cast<JSHTMLCollection*>(asObject(slotBase)); return JSHTMLCollection::getConstructor(exec, domObject->globalObject()); }
JSValue JSHTMLCollection::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSHTMLCollection* collection = jsCast<JSHTMLCollection*>(asObject(slotBase)); const AtomicString& name = propertyNameToAtomicString(propertyName); return toJS(exec, collection->globalObject(), collection->impl()->namedItem(name)); }
JSValue JSHTMLCollection::indexGetter(ExecState* exec, const Identifier&, const PropertySlot& slot) { JSHTMLCollection* thisObj = static_cast<JSHTMLCollection*>(asObject(slot.slotBase())); return toJS(exec, static_cast<HTMLCollection*>(thisObj->impl())->item(slot.index())); }