#include "V8Document.h" #include "V8NamedNodeMap.h" #include "V8Node.h" #include "V8NodeList.h" namespace Arabica { namespace DOM { v8::Persistent V8Node::Tmpl; v8::Handle V8Node::nodeNameAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); return v8::String::New(privData->nativeObj->getNodeName().c_str()); } v8::Handle V8Node::nodeValueAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); return v8::String::New(privData->nativeObj->getNodeValue().c_str()); } void V8Node::nodeValueAttrSetter(v8::Local property, v8::Local value, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); v8::String::AsciiValue localNodeValue(value); privData->nativeObj->setNodeValue(*localNodeValue); } v8::Handle V8Node::nodeTypeAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); return v8::Integer::New(privData->nativeObj->getNodeType()); } v8::Handle V8Node::parentNodeAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); if (!privData->nativeObj->getParentNode()) return v8::Undefined(); Arabica::DOM::Node* arbaicaRet = new Arabica::DOM::Node(privData->nativeObj->getParentNode()); v8::Handle arbaicaRetCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8Node::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::childNodesAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); Arabica::DOM::NodeList* arbaicaRet = new Arabica::DOM::NodeList(privData->nativeObj->getChildNodes()); v8::Handle arbaicaRetCtor = V8NodeList::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8NodeList::V8NodeListPrivate* retPrivData = new V8NodeList::V8NodeListPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8NodeList::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::firstChildAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); if (!privData->nativeObj->getFirstChild()) return v8::Undefined(); Arabica::DOM::Node* arbaicaRet = new Arabica::DOM::Node(privData->nativeObj->getFirstChild()); v8::Handle arbaicaRetCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8Node::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::lastChildAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); if (!privData->nativeObj->getLastChild()) return v8::Undefined(); Arabica::DOM::Node* arbaicaRet = new Arabica::DOM::Node(privData->nativeObj->getLastChild()); v8::Handle arbaicaRetCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8Node::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::previousSiblingAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); if (!privData->nativeObj->getPreviousSibling()) return v8::Undefined(); Arabica::DOM::Node* arbaicaRet = new Arabica::DOM::Node(privData->nativeObj->getPreviousSibling()); v8::Handle arbaicaRetCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8Node::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::nextSiblingAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); if (!privData->nativeObj->getNextSibling()) return v8::Undefined(); Arabica::DOM::Node* arbaicaRet = new Arabica::DOM::Node(privData->nativeObj->getNextSibling()); v8::Handle arbaicaRetCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8Node::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::attributesAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); Arabica::DOM::NamedNodeMap* arbaicaRet = new Arabica::DOM::NamedNodeMap(privData->nativeObj->getAttributes()); v8::Handle arbaicaRetCtor = V8NamedNodeMap::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8NamedNodeMap::V8NamedNodeMapPrivate* retPrivData = new V8NamedNodeMap::V8NamedNodeMapPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8NamedNodeMap::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::ownerDocumentAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); if (!privData->nativeObj->getOwnerDocument()) return v8::Undefined(); Arabica::DOM::Document* arbaicaRet = new Arabica::DOM::Document(privData->nativeObj->getOwnerDocument()); v8::Handle arbaicaRetCtor = V8Document::getTmpl()->GetFunction(); v8::Persistent arbaicaRetObj = v8::Persistent::New(arbaicaRetCtor->NewInstance()); struct V8Document::V8DocumentPrivate* retPrivData = new V8Document::V8DocumentPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = arbaicaRet; arbaicaRetObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); arbaicaRetObj.MakeWeak(0, V8Document::jsDestructor); return arbaicaRetObj; } v8::Handle V8Node::namespaceURIAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); return v8::String::New(privData->nativeObj->getNamespaceURI().c_str()); } v8::Handle V8Node::prefixAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); return v8::String::New(privData->nativeObj->getPrefix().c_str()); } void V8Node::prefixAttrSetter(v8::Local property, v8::Local value, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); v8::String::AsciiValue localPrefix(value); privData->nativeObj->setPrefix(*localPrefix); } v8::Handle V8Node::localNameAttrGetter(v8::Local property, const v8::AccessorInfo& info) { v8::Local self = info.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); return v8::String::New(privData->nativeObj->getLocalName().c_str()); } v8::Handle V8Node::insertBeforeCallback(const v8::Arguments& args) { if (args.Length() < 2) throw V8Exception("Wrong number of arguments in insertBefore"); if (!((V8Node::hasInstance(args[0])) && (V8Node::hasInstance(args[1])))) throw V8Exception("Parameter mismatch while calling insertBefore"); v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); Arabica::DOM::Node* localNewChild = V8DOM::toClassPtr(args[0]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Node* localRefChild = V8DOM::toClassPtr(args[1]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Node* retVal = new Arabica::DOM::Node(privData->nativeObj->insertBefore(*localNewChild, *localRefChild)); v8::Handle retCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent retObj = v8::Persistent::New(retCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Node::jsDestructor); return retObj; } v8::Handle V8Node::replaceChildCallback(const v8::Arguments& args) { if (args.Length() < 2) throw V8Exception("Wrong number of arguments in replaceChild"); if (!((V8Node::hasInstance(args[0])) && (V8Node::hasInstance(args[1])))) throw V8Exception("Parameter mismatch while calling replaceChild"); v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); Arabica::DOM::Node* localNewChild = V8DOM::toClassPtr(args[0]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Node* localOldChild = V8DOM::toClassPtr(args[1]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Node* retVal = new Arabica::DOM::Node(privData->nativeObj->replaceChild(*localNewChild, *localOldChild)); v8::Handle retCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent retObj = v8::Persistent::New(retCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Node::jsDestructor); return retObj; } v8::Handle V8Node::removeChildCallback(const v8::Arguments& args) { if (args.Length() < 1) throw V8Exception("Wrong number of arguments in removeChild"); if (!(V8Node::hasInstance(args[0]))) throw V8Exception("Parameter mismatch while calling removeChild"); v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); Arabica::DOM::Node* localOldChild = V8DOM::toClassPtr(args[0]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Node* retVal = new Arabica::DOM::Node(privData->nativeObj->removeChild(*localOldChild)); v8::Handle retCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent retObj = v8::Persistent::New(retCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Node::jsDestructor); return retObj; } v8::Handle V8Node::appendChildCallback(const v8::Arguments& args) { if (args.Length() < 1) throw V8Exception("Wrong number of arguments in appendChild"); if (!(V8Node::hasInstance(args[0]))) throw V8Exception("Parameter mismatch while calling appendChild"); v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); Arabica::DOM::Node* localNewChild = V8DOM::toClassPtr(args[0]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Node* retVal = new Arabica::DOM::Node(privData->nativeObj->appendChild(*localNewChild)); v8::Handle retCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent retObj = v8::Persistent::New(retCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Node::jsDestructor); return retObj; } v8::Handle V8Node::hasChildNodesCallback(const v8::Arguments& args) { v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); bool retVal = privData->nativeObj->hasChildNodes(); return v8::Boolean::New(retVal); } v8::Handle V8Node::cloneNodeCallback(const v8::Arguments& args) { if (args.Length() < 1) throw V8Exception("Wrong number of arguments in cloneNode"); v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); bool localDeep = args[0]->ToBoolean()->BooleanValue(); Arabica::DOM::Node* retVal = new Arabica::DOM::Node(privData->nativeObj->cloneNode(localDeep)); v8::Handle retCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent retObj = v8::Persistent::New(retCtor->NewInstance()); struct V8Node::V8NodePrivate* retPrivData = new V8Node::V8NodePrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Node::jsDestructor); return retObj; } v8::Handle V8Node::normalizeCallback(const v8::Arguments& args) { v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); privData->nativeObj->normalize(); return v8::Undefined(); } v8::Handle V8Node::isSupportedCallback(const v8::Arguments& args) { if (args.Length() < 2) throw V8Exception("Wrong number of arguments in isSupported"); v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); v8::String::AsciiValue localFeature(args[0]); v8::String::AsciiValue localVersion(args[1]); bool retVal = privData->nativeObj->isSupported(*localFeature, *localVersion); return v8::Boolean::New(retVal); } v8::Handle V8Node::hasAttributesCallback(const v8::Arguments& args) { v8::Local self = args.Holder(); struct V8NodePrivate* privData = V8DOM::toClassPtr(self->GetInternalField(0)); bool retVal = privData->nativeObj->hasAttributes(); return v8::Boolean::New(retVal); } bool V8Node::hasInstance(v8::Handle value) { return getTmpl()->HasInstance(value); } } }