JSNamedNodesCollection.cpp [plain text]
#include "config.h"
#include "JSNamedNodesCollection.h"
#include "AtomicString.h"
#include "Element.h"
#include "JSNode.h"
#include "NamedNodeMap.h"
namespace WebCore {
using namespace JSC;
ASSERT_CLASS_FITS_IN_CELL(JSNamedNodesCollection);
const ClassInfo JSNamedNodesCollection::s_info = { "Collection", 0, 0, 0 };
JSNamedNodesCollection::JSNamedNodesCollection(ExecState* exec, const Vector<RefPtr<Node> >& nodes)
: DOMObject(getDOMStructure<JSNamedNodesCollection>(exec))
, m_nodes(new Vector<RefPtr<Node> >(nodes))
{
}
JSValue JSNamedNodesCollection::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSNamedNodesCollection* thisObj = static_cast<JSNamedNodesCollection*>(asObject(slot.slotBase()));
return jsNumber(exec, thisObj->m_nodes->size());
}
JSValue JSNamedNodesCollection::indexGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSNamedNodesCollection *thisObj = static_cast<JSNamedNodesCollection*>(asObject(slot.slotBase()));
return toJS(exec, (*thisObj->m_nodes)[slot.index()].get());
}
bool JSNamedNodesCollection::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
{
if (propertyName == exec->propertyNames().length) {
slot.setCustom(this, lengthGetter);
return true;
}
bool ok;
unsigned index = propertyName.toUInt32(&ok);
if (ok && index < m_nodes->size()) {
slot.setCustomIndex(this, index, indexGetter);
return true;
}
AtomicString atomicPropertyName = propertyName;
for (unsigned i = 0; i < m_nodes->size(); i++) {
Node* node = (*m_nodes)[i].get();
if (node->hasAttributes() && node->attributes()->id() == atomicPropertyName) {
slot.setCustomIndex(this, i, indexGetter);
return true;
}
}
return DOMObject::getOwnPropertySlot(exec, propertyName, slot);
}
}