From 835d42e8925416ce04e6d1051b9c3c52725f2b55 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Tue, 18 May 2021 18:36:01 +0200 Subject: [PATCH] [js] element.nodeValue --- src/ecmascript/spidermonkey/element.c | 69 ++++++++++++++++++++++++++- test/ecmascript/nodeValue.html | 19 ++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 test/ecmascript/nodeValue.html diff --git a/src/ecmascript/spidermonkey/element.c b/src/ecmascript/spidermonkey/element.c index d5829610f..98deb1f97 100644 --- a/src/ecmascript/spidermonkey/element.c +++ b/src/ecmascript/spidermonkey/element.c @@ -73,6 +73,7 @@ static bool element_get_property_nextElementSibling(JSContext *ctx, unsigned int static bool element_get_property_nextSibling(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool element_get_property_nodeName(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool element_get_property_nodeType(JSContext *ctx, unsigned int argc, JS::Value *vp); +static bool element_get_property_nodeValue(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool element_get_property_outerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool element_set_property_outerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool element_get_property_parentElement(JSContext *ctx, unsigned int argc, JS::Value *vp); @@ -113,6 +114,7 @@ JSPropertySpec element_props[] = { JS_PSG("nextSibling", element_get_property_nextSibling, JSPROP_ENUMERATE), JS_PSG("nodeName", element_get_property_nodeName, JSPROP_ENUMERATE), JS_PSG("nodeType", element_get_property_nodeType, JSPROP_ENUMERATE), + JS_PSG("nodeValue", element_get_property_nodeValue, JSPROP_ENUMERATE), JS_PSGS("outerHTML", element_get_property_outerHtml, element_set_property_outerHtml, JSPROP_ENUMERATE), JS_PSG("parentElement", element_get_property_parentElement, JSPROP_ENUMERATE), JS_PSG("parentNode", element_get_property_parentNode, JSPROP_ENUMERATE), @@ -680,7 +682,6 @@ element_get_property_nodeName(JSContext *ctx, unsigned int argc, JS::Value *vp) return true; } - static bool element_get_property_nodeType(JSContext *ctx, unsigned int argc, JS::Value *vp) { @@ -730,6 +731,72 @@ element_get_property_nodeType(JSContext *ctx, unsigned int argc, JS::Value *vp) return true; } +static bool +element_get_property_nodeValue(JSContext *ctx, unsigned int argc, JS::Value *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct view_state *vs; + JSCompartment *comp = js::GetContextCompartment(ctx); + + if (!comp) { + return false; + } + + struct ecmascript_interpreter *interpreter = JS_GetCompartmentPrivate(comp); + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, &element_class, NULL)) + return false; + + vs = interpreter->vs; + if (!vs) { + return false; + } + + xmlpp::Node *node = JS_GetPrivate(hobj); + + if (!node) { + args.rval().setNull(); + return true; + } + + if (dynamic_cast(node)) { + args.rval().setNull(); + return true; + } + + auto el = dynamic_cast(node); + + if (el) { + std::string v = el->get_value(); + args.rval().setString(JS_NewStringCopyZ(ctx, v.c_str())); + return true; + } + + auto el2 = dynamic_cast(node); + + if (el2) { + std::string v = el2->get_content(); + args.rval().setString(JS_NewStringCopyZ(ctx, v.c_str())); + return true; + } + + auto el3 = dynamic_cast(node); + + if (el3) { + std::string v = el3->get_content(); + args.rval().setString(JS_NewStringCopyZ(ctx, v.c_str())); + return true; + } + + args.rval().setUndefined(); + return true; +} + static bool element_get_property_nextSibling(JSContext *ctx, unsigned int argc, JS::Value *vp) { diff --git a/test/ecmascript/nodeValue.html b/test/ecmascript/nodeValue.html new file mode 100644 index 000000000..6d80e0325 --- /dev/null +++ b/test/ecmascript/nodeValue.html @@ -0,0 +1,19 @@ + + + + +

to get the node type of this element.

+ + + +

+ + + + + \ No newline at end of file