#include "V8NodeSet.h" #include "V8Element.h" #include "V8Node.h" #include namespace uscxml { using namespace Arabica::DOM; using namespace Arabica::XPath; v8::Persistent V8NodeSet::Tmpl; v8::Handle V8NodeSet::indexGetter(uint32_t index, const v8::AccessorInfo &info) { v8::Local self = info.Holder(); NodeSet* nodeSet = V8DOM::toClassPtr >(self->GetInternalField(0)); V8DOM* dom = V8DOM::toClassPtr(self->GetInternalField(1)); (void)dom; if (nodeSet->size() >= index) { switch((*nodeSet)[index].getNodeType()) { case Node_base::ELEMENT_NODE: { v8::Handle elementCtor = V8Element::getTmpl()->GetFunction(); v8::Persistent elementObj = v8::Persistent::New(elementCtor->NewInstance()); Element* element = new Element((*nodeSet)[index]); elementObj->SetInternalField(0, V8DOM::toExternal(element)); elementObj->SetInternalField(1, self->GetInternalField(1)); elementObj.MakeWeak(0, V8Element::jsDestructor); return elementObj; } default: { v8::Handle nodeCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent nodeObj = v8::Persistent::New(nodeCtor->NewInstance()); Node* node = new Node((*nodeSet)[index]); nodeObj->SetInternalField(0, V8DOM::toExternal(node)); nodeObj->SetInternalField(1, self->GetInternalField(1)); nodeObj.MakeWeak(0, V8Node::jsDestructor); return nodeObj; } } } return v8::Undefined(); } v8::Handle V8NodeSet::lengthAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); V8DOM* dom = V8DOM::toClassPtr(self->GetInternalField(1)); (void)dom; NodeSet* nodeSet = V8DOM::toClassPtr >(self->GetInternalField(1)); return v8::Integer::New(nodeSet->size()); } }