summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-01-10 22:42:42 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-01-10 22:42:42 (GMT)
commit7aa7095d17a180d663cd9647c31d99d97c1dca4f (patch)
tree460bc3a67f0adc3199bec9f22ee15a102263eb4c /src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp
parentda1032ffbff229ce2ca9a83d47522ff45c90ba23 (diff)
downloaduscxml-7aa7095d17a180d663cd9647c31d99d97c1dca4f.zip
uscxml-7aa7095d17a180d663cd9647c31d99d97c1dca4f.tar.gz
uscxml-7aa7095d17a180d663cd9647c31d99d97c1dca4f.tar.bz2
Major changes - see details
- Dynamic SceneGraph ML - V8 DOM for ecmascript datamodel - New heartbeat invoker - Fixed various bugs
Diffstat (limited to 'src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp')
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp b/src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp
new file mode 100644
index 0000000..31372ed
--- /dev/null
+++ b/src/uscxml/plugins/datamodel/ecmascript/v8/dom/V8Document.cpp
@@ -0,0 +1,59 @@
+#include "V8Document.h"
+#include "V8Element.h"
+#include "V8XPathResult.h"
+
+namespace uscxml {
+
+using namespace Arabica::DOM;
+using namespace Arabica::XPath;
+
+v8::Persistent<v8::FunctionTemplate> V8Document::Tmpl;
+
+v8::Handle<v8::Value> V8Document::createElementCallback(const v8::Arguments& args) {
+ ASSERT_ARGS1(args, IsString);
+ v8::String::AsciiValue tagName(args[0]);
+
+ v8::Local<v8::Object> self = args.Holder();
+ Document<std::string>* doc = V8DOM::toClassPtr<Document<std::string> >(self->GetInternalField(0));
+ V8DOM* dom = V8DOM::toClassPtr<V8DOM>(self->GetInternalField(1)); (void)dom;
+
+ Element<std::string>* element = new Element<std::string>(doc->createElement(*tagName));
+
+ v8::Handle<v8::Function> elemCtor = V8Element::getTmpl()->GetFunction();
+ v8::Persistent<v8::Object> elemObj = v8::Persistent<v8::Object>::New(elemCtor->NewInstance());
+
+ elemObj->SetInternalField(0, V8DOM::toExternal(element));
+ elemObj->SetInternalField(1, self->GetInternalField(1));
+
+ elemObj.MakeWeak(0, V8Element::jsDestructor);
+ return elemObj;
+}
+
+v8::Handle<v8::Value> V8Document::evaluateCallback(const v8::Arguments& args) {
+ ASSERT_ARGS1(args, IsString);
+ v8::String::AsciiValue xpathExpr(args[0]);
+
+ v8::Local<v8::Object> self = args.Holder();
+ Document<std::string>* doc = V8DOM::toClassPtr<Document<std::string> >(self->GetInternalField(0));
+ V8DOM* dom = V8DOM::toClassPtr<V8DOM>(self->GetInternalField(1)); (void)dom;
+
+ Node<std::string>* context;
+ if (args.Length() > 1) {
+ context = V8DOM::toClassPtr<Node<std::string> >(args[1]->ToObject()->GetInternalField(0));
+ } else {
+ context = doc;
+ }
+
+ XPathValue<std::string>* xpathValue = new XPathValue<std::string>(dom->xpath->evaluate(*xpathExpr, *context));
+
+ v8::Handle<v8::Function> xpathResultCtor = V8XPathResult::getTmpl()->GetFunction();
+ v8::Persistent<v8::Object> xpathResultObj = v8::Persistent<v8::Object>::New(xpathResultCtor->NewInstance());
+
+ xpathResultObj->SetInternalField(0, V8DOM::toExternal(xpathValue));
+ xpathResultObj->SetInternalField(1, self->GetInternalField(1));
+
+ xpathResultObj.MakeWeak(0, V8XPathResult::jsDestructor);
+ return xpathResultObj;
+}
+
+} \ No newline at end of file