#include "V8Document.h" #include "V8Element.h" #include "V8XPathResult.h" namespace uscxml { using namespace Arabica::DOM; using namespace Arabica::XPath; v8::Persistent V8Document::Tmpl; v8::Handle V8Document::createElementCallback(const v8::Arguments& args) { ASSERT_ARGS1(args, IsString); v8::String::AsciiValue tagName(args[0]); v8::Local self = args.Holder(); Document* doc = V8DOM::toClassPtr >(self->GetInternalField(0)); V8DOM* dom = V8DOM::toClassPtr(self->GetInternalField(1)); (void)dom; Element* element = new Element(doc->createElement(*tagName)); v8::Handle elemCtor = V8Element::getTmpl()->GetFunction(); v8::Persistent elemObj = v8::Persistent::New(elemCtor->NewInstance()); elemObj->SetInternalField(0, V8DOM::toExternal(element)); elemObj->SetInternalField(1, self->GetInternalField(1)); elemObj.MakeWeak(0, V8Element::jsDestructor); return elemObj; } v8::Handle V8Document::evaluateCallback(const v8::Arguments& args) { ASSERT_ARGS1(args, IsString); v8::String::AsciiValue xpathExpr(args[0]); v8::Local self = args.Holder(); Document* doc = V8DOM::toClassPtr >(self->GetInternalField(0)); V8DOM* dom = V8DOM::toClassPtr(self->GetInternalField(1)); (void)dom; Node* context; if (args.Length() > 1) { context = V8DOM::toClassPtr >(args[1]->ToObject()->GetInternalField(0)); } else { context = doc; } XPathValue* xpathValue = new XPathValue(dom->xpath->evaluate(*xpathExpr, *context)); v8::Handle xpathResultCtor = V8XPathResult::getTmpl()->GetFunction(); v8::Persistent xpathResultObj = v8::Persistent::New(xpathResultCtor->NewInstance()); xpathResultObj->SetInternalField(0, V8DOM::toExternal(xpathValue)); xpathResultObj->SetInternalField(1, self->GetInternalField(1)); xpathResultObj.MakeWeak(0, V8XPathResult::jsDestructor); return xpathResultObj; } }