v8::Handle<v8::Value> V8Document::importNodeCallback(const v8::Arguments& args) { if (args.Length() < 2) throw V8Exception("Wrong number of arguments in importNode"); if (!(V8Node::hasInstance(args[0]))) throw V8Exception("Parameter mismatch while calling importNode"); v8::Local<v8::Object> self = args.Holder(); struct V8DocumentPrivate* privData = V8DOM::toClassPtr<V8DocumentPrivate >(self->GetInternalField(0)); Arabica::DOM::Node<std::string>* localImportedNode = V8DOM::toClassPtr<V8Node::V8NodePrivate >(args[0]->ToObject()->GetInternalField(0))->nativeObj; bool localDeep = args[1]->ToBoolean()->BooleanValue(); Arabica::DOM::Node<std::string>* retVal = new Arabica::DOM::Node<std::string>(privData->nativeObj->importNode(*localImportedNode, localDeep)); v8::Handle<v8::Function> retCtor = V8Node::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::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<v8::Value> V8ArrayBuffer::constructor(const v8::Arguments& args) { if (!args.IsConstructCall()) return v8::ThrowException(v8::String::New("Cannot call constructor as function")); uscxml::ArrayBuffer* localInstance = NULL; if (false) { } else if (args.Length() == 1 && args[0]->IsUint32()) { unsigned long localLength = args[0]->ToNumber()->Uint32Value(); localInstance = new uscxml::ArrayBuffer(localLength); } if (!localInstance) { throw V8Exception("Parameter mismatch while calling constructor for ArrayBuffer"); return v8::Undefined(); } v8::Handle<v8::Function> retCtor = V8ArrayBuffer::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8ArrayBuffer::V8ArrayBufferPrivate* retPrivData = new V8ArrayBuffer::V8ArrayBufferPrivate(); retPrivData->nativeObj = localInstance; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8ArrayBuffer::jsDestructor); return retObj; }
v8::Handle<v8::Value> V8DOMImplementation::createDocumentCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8DOMImplementationPrivate* privData = V8DOM::toClassPtr<V8DOMImplementationPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 3 && args[0]->IsString() && args[1]->IsString() && args[2]->IsObject() && V8DocumentType::hasInstance(args[2])) { v8::String::AsciiValue localNamespaceURI(args[0]); v8::String::AsciiValue localQualifiedName(args[1]); Arabica::DOM::DocumentType<std::string>* localDoctype = V8DOM::toClassPtr<V8DocumentType::V8DocumentTypePrivate >(args[2]->ToObject()->GetInternalField(0))->nativeObj; Arabica::DOM::Document<std::string>* retVal = new Arabica::DOM::Document<std::string>(privData->nativeObj->createDocument(*localNamespaceURI, *localQualifiedName, *localDoctype)); v8::Handle<v8::Function> retCtor = V8Document::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8Document::V8DocumentPrivate* retPrivData = new V8Document::V8DocumentPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Document::jsDestructor); return retObj; } throw V8Exception("Parameter mismatch while calling createDocument"); return v8::Undefined(); }
v8::Handle<v8::Value> V8XPathResult::asStringCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8XPathResultPrivate* privData = V8DOM::toClassPtr<V8XPathResultPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 0) { std::string retVal = privData->nativeObj->asString(); return v8::String::New(retVal.c_str()); } throw V8Exception("Parameter mismatch while calling asString"); return v8::Undefined(); }
v8::Handle<v8::Value> V8CharacterData::appendDataCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8CharacterDataPrivate* privData = V8DOM::toClassPtr<V8CharacterDataPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 1 && args[0]->IsString()) { v8::String::AsciiValue localArg(args[0]); privData->nativeObj->appendData(*localArg); return v8::Undefined(); } throw V8Exception("Parameter mismatch while calling appendData"); return v8::Undefined(); }
v8::Handle<v8::Value> V8ArrayBuffer::isViewCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8ArrayBufferPrivate* privData = V8DOM::toClassPtr<V8ArrayBufferPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 1 && true) { void* localValue = v8::External::Unwrap(args[0]->ToObject()->GetInternalField(0)); bool retVal = privData->nativeObj->isView(localValue); return v8::Boolean::New(retVal); } throw V8Exception("Parameter mismatch while calling isView"); return v8::Undefined(); }
v8::Handle<v8::Value> V8ArrayBuffer::sliceCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8ArrayBufferPrivate* privData = V8DOM::toClassPtr<V8ArrayBufferPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 2 && args[0]->IsInt32() && args[1]->IsInt32()) { long localBegin = args[0]->ToNumber()->Int32Value(); long localEnd = args[1]->ToNumber()->Int32Value(); uscxml::ArrayBuffer* retVal = new uscxml::ArrayBuffer(privData->nativeObj->slice(localBegin, localEnd)); v8::Handle<v8::Function> retCtor = V8ArrayBuffer::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8ArrayBuffer::V8ArrayBufferPrivate* retPrivData = new V8ArrayBuffer::V8ArrayBufferPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8ArrayBuffer::jsDestructor); return retObj; } else if (args.Length() == 1 && args[0]->IsInt32()) { long localBegin = args[0]->ToNumber()->Int32Value(); uscxml::ArrayBuffer* retVal = new uscxml::ArrayBuffer(privData->nativeObj->slice(localBegin)); v8::Handle<v8::Function> retCtor = V8ArrayBuffer::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8ArrayBuffer::V8ArrayBufferPrivate* retPrivData = new V8ArrayBuffer::V8ArrayBufferPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8ArrayBuffer::jsDestructor); return retObj; } throw V8Exception("Parameter mismatch while calling slice"); return v8::Undefined(); }
v8::Handle<v8::Value> V8CharacterData::insertDataCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8CharacterDataPrivate* privData = V8DOM::toClassPtr<V8CharacterDataPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 2 && args[0]->IsUint32() && args[1]->IsString()) { unsigned long localOffset = args[0]->ToNumber()->Uint32Value(); v8::String::AsciiValue localArg(args[1]); privData->nativeObj->insertData(localOffset, *localArg); return v8::Undefined(); } throw V8Exception("Parameter mismatch while calling insertData"); return v8::Undefined(); }
v8::Handle<v8::Value> V8DOMImplementation::hasFeatureCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8DOMImplementationPrivate* privData = V8DOM::toClassPtr<V8DOMImplementationPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 2 && args[0]->IsString() && args[1]->IsString()) { v8::String::AsciiValue localFeature(args[0]); v8::String::AsciiValue localVersion(args[1]); bool retVal = privData->nativeObj->hasFeature(*localFeature, *localVersion); return v8::Boolean::New(retVal); } throw V8Exception("Parameter mismatch while calling hasFeature"); return v8::Undefined(); }
v8::Handle<v8::Value> V8Document::createElementCallback(const v8::Arguments& args) { if (args.Length() < 1) throw V8Exception("Wrong number of arguments in createElement"); v8::Local<v8::Object> self = args.Holder(); struct V8DocumentPrivate* privData = V8DOM::toClassPtr<V8DocumentPrivate >(self->GetInternalField(0)); v8::String::AsciiValue localTagName(args[0]); Arabica::DOM::Element<std::string>* retVal = new Arabica::DOM::Element<std::string>(privData->nativeObj->createElement(*localTagName)); v8::Handle<v8::Function> retCtor = V8Element::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8Element::V8ElementPrivate* retPrivData = new V8Element::V8ElementPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Element::jsDestructor); return retObj; }
v8::Handle<v8::Value> V8Text::splitTextCallback(const v8::Arguments& args) { if (args.Length() < 1) throw V8Exception("Wrong number of arguments in splitText"); v8::Local<v8::Object> self = args.Holder(); struct V8TextPrivate* privData = V8DOM::toClassPtr<V8TextPrivate >(self->GetInternalField(0)); unsigned long localOffset = args[0]->ToNumber()->Uint32Value(); Arabica::DOM::Text<std::string>* retVal = new Arabica::DOM::Text<std::string>(privData->nativeObj->splitText(localOffset)); v8::Handle<v8::Function> retCtor = V8Text::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8Text::V8TextPrivate* retPrivData = new V8Text::V8TextPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8Text::jsDestructor); return retObj; }
v8::Handle<v8::Value> V8XPathResult::asNodeSetCallback(const v8::Arguments& args) { v8::Local<v8::Object> self = args.Holder(); struct V8XPathResultPrivate* privData = V8DOM::toClassPtr<V8XPathResultPrivate >(self->GetInternalField(0)); if (false) { } else if (args.Length() == 0) { Arabica::XPath::NodeSet<std::string>* retVal = new Arabica::XPath::NodeSet<std::string>(privData->nativeObj->asNodeSet()); v8::Handle<v8::Function> retCtor = V8NodeSet::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); struct V8NodeSet::V8NodeSetPrivate* retPrivData = new V8NodeSet::V8NodeSetPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8NodeSet::jsDestructor); return retObj; } throw V8Exception("Parameter mismatch while calling asNodeSet"); return v8::Undefined(); }
JSValueRef JSCDocument::evaluateCustomCallback(JSContextRef ctx, JSObjectRef function, JSObjectRef object, size_t argumentCount, const JSValueRef* arguments, JSValueRef* exception) { struct JSCDocumentPrivate* privData = (struct JSCDocumentPrivate*)JSObjectGetPrivate(object); if (!privData->dom || !privData->dom->xpath) return JSValueMakeUndefined(ctx); if (argumentCount < 1) { std::string errorMsg = "Wrong number of arguments in evaluate"; JSStringRef string = JSStringCreateWithUTF8CString(errorMsg.c_str()); JSValueRef exceptionString = JSValueMakeString(ctx, string); JSStringRelease(string); *exception = JSValueToObject(ctx, exceptionString, NULL); return JSValueMakeUndefined(ctx); } // make sure first argument is a string if (!JSValueIsString(ctx, arguments[0])) { std::string errorMsg = "Expected xpath expression as first argument"; JSStringRef string = JSStringCreateWithUTF8CString(errorMsg.c_str()); JSValueRef exceptionString = JSValueMakeString(ctx, string); JSStringRelease(string); *exception = JSValueToObject(ctx, exceptionString, NULL); return JSValueMakeUndefined(ctx); } JSStringRef stringReflocalXPath = JSValueToStringCopy(ctx, arguments[0], NULL); size_t localXPathMaxSize = JSStringGetMaximumUTF8CStringSize(stringReflocalXPath); char* localXPathBuffer = new char[localXPathMaxSize]; JSStringGetUTF8CString(stringReflocalXPath, localXPathBuffer, localXPathMaxSize); std::string localXPath(localXPathBuffer); JSStringRelease(stringReflocalXPath); free(localXPathBuffer); JSClassRef arbaicaRetClass = JSCXPathResult::getTmpl(); XPath::XPathValue<std::string>* retVal; try { if (argumentCount > 1) { // make sure second argument is a node if (!JSValueIsObject(ctx, arguments[1])) { std::string errorMsg = "Second argument is not of type node"; JSStringRef string = JSStringCreateWithUTF8CString(errorMsg.c_str()); JSValueRef exceptionString = JSValueMakeString(ctx, string); JSStringRelease(string); *exception = JSValueToObject(ctx, exceptionString, NULL); return JSValueMakeUndefined(ctx); } Arabica::DOM::Node<std::string>* localContextNode = (Arabica::DOM::Node<std::string>*)JSObjectGetPrivate(JSValueToObject(ctx, arguments[1], NULL)); retVal = new XPath::XPathValue<std::string>(privData->dom->xpath->evaluate(localXPath, *localContextNode)); } else { retVal = new XPath::XPathValue<std::string>(privData->dom->xpath->evaluate(localXPath, *privData->nativeObj)); } } catch (std::runtime_error e) { std::cout << e.what() << std::endl; return JSValueMakeUndefined(ctx); } struct JSCXPathResult::JSCXPathResultPrivate* retPrivData = new JSCXPathResult::JSCXPathResultPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; JSObjectRef arbaicaRetObj = JSObjectMake(ctx, arbaicaRetClass, retPrivData); return arbaicaRetObj; #if 0 if (args.Length() < 1) throw V8Exception("Wrong number of arguments in evaluate"); // if (!((V8Node::hasInstance(args[1])) && (V8XPathResult::hasInstance(args[3])))) // throw V8Exception("Parameter mismatch while calling evaluate"); v8::Local<v8::Object> self = args.Holder(); V8DocumentPrivate* privData = V8DOM::toClassPtr<V8DocumentPrivate >(self->GetInternalField(0)); v8::String::AsciiValue localExpression(args[0]); XPath::XPathValue<std::string>* retVal; if (args.Length() > 1) { Arabica::DOM::Node<std::string>* localContextNode = V8DOM::toClassPtr<Arabica::DOM::Node<std::string> >(args[1]->ToObject()->GetInternalField(0)); retVal = new XPath::XPathValue<std::string>(privData->dom->xpath->evaluate(*localExpression, *localContextNode)); } else { retVal = new XPath::XPathValue<std::string>(privData->dom->xpath->evaluate(*localExpression, *privData->nativeObj)); } v8::Handle<v8::Function> retCtor = V8XPathResult::getTmpl()->GetFunction(); v8::Persistent<v8::Object> retObj = v8::Persistent<v8::Object>::New(retCtor->NewInstance()); V8XPathResult::V8XPathResultPrivate* retPrivData = new V8XPathResult::V8XPathResultPrivate(); retPrivData->dom = privData->dom; retPrivData->nativeObj = retVal; retObj->SetInternalField(0, V8DOM::toExternal(retPrivData)); retObj.MakeWeak(0, V8XPathResult::jsDestructor); return retObj; #endif }