mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
[js] Improved setter for innerHTML
This commit is contained in:
parent
871d47bf41
commit
4e651e5391
@ -433,6 +433,8 @@ delayed_reload(void *data)
|
||||
|
||||
assert(rel);
|
||||
doc_rerender_after_document_update(rel->ses);
|
||||
xmlpp::Document *docu = rel->doc;
|
||||
// delete docu;
|
||||
mem_free(rel);
|
||||
}
|
||||
|
||||
@ -468,6 +470,7 @@ check_for_rerender(struct ecmascript_interpreter *interpreter)
|
||||
|
||||
if (rel) {
|
||||
rel->ses = ses;
|
||||
rel->doc = docu;
|
||||
register_bottom_half(delayed_reload, rel);
|
||||
}
|
||||
}
|
||||
|
@ -50,6 +50,7 @@
|
||||
#include <libxml/HTMLparser.h>
|
||||
#include <libxml++/libxml++.h>
|
||||
#include <libxml++/attributenode.h>
|
||||
#include <libxml++/parsers/domparser.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
@ -66,6 +67,7 @@ static bool element_get_property_firstElementChild(JSContext *ctx, unsigned int
|
||||
static bool element_get_property_id(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
static bool element_set_property_id(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
static bool element_get_property_innerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
static bool element_set_property_innerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
static bool element_set_property_innerText(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
static bool element_get_property_lang(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
static bool element_set_property_lang(JSContext *ctx, unsigned int argc, JS::Value *vp);
|
||||
@ -109,7 +111,7 @@ JSPropertySpec element_props[] = {
|
||||
JS_PSG("firstChild", element_get_property_firstChild, JSPROP_ENUMERATE),
|
||||
JS_PSG("firstElementChild", element_get_property_firstElementChild, JSPROP_ENUMERATE),
|
||||
JS_PSGS("id", element_get_property_id, element_set_property_id, JSPROP_ENUMERATE),
|
||||
JS_PSGS("innerHTML", element_get_property_innerHtml, element_set_property_innerText, JSPROP_ENUMERATE),
|
||||
JS_PSGS("innerHTML", element_get_property_innerHtml, element_set_property_innerHtml, JSPROP_ENUMERATE),
|
||||
JS_PSGS("innerText", element_get_property_innerHtml, element_set_property_innerText, JSPROP_ENUMERATE),
|
||||
JS_PSGS("lang", element_get_property_lang, element_set_property_lang, JSPROP_ENUMERATE),
|
||||
JS_PSG("lastChild", element_get_property_lastChild, JSPROP_ENUMERATE),
|
||||
@ -1472,6 +1474,63 @@ element_set_property_id(JSContext *ctx, unsigned int argc, JS::Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
element_set_property_innerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp)
|
||||
{
|
||||
JS::CallArgs args = CallArgsFromVp(argc, vp);
|
||||
JS::RootedObject hobj(ctx, &args.thisv().toObject());
|
||||
|
||||
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;
|
||||
|
||||
struct view_state *vs = interpreter->vs;
|
||||
if (!vs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
xmlpp::Element *el = JS_GetPrivate(hobj);
|
||||
if (!el) {
|
||||
return true;
|
||||
}
|
||||
|
||||
auto children = el->get_children();
|
||||
auto it = children.begin();
|
||||
auto end = children.end();
|
||||
for (;it != end; ++it) {
|
||||
xmlpp::Node::remove_node(*it);
|
||||
}
|
||||
|
||||
std::string text = "<root>";
|
||||
text += JS_EncodeString(ctx, args[0].toString());
|
||||
text += "</root>";
|
||||
|
||||
xmlpp::DomParser example1;
|
||||
example1.parse_memory(text);
|
||||
auto doc1 = example1.get_document();
|
||||
auto root1 = doc1->get_root_node();
|
||||
auto children2 = root1->get_children();
|
||||
auto it2 = children2.begin();
|
||||
auto end2 = children2.end();
|
||||
for (; it2 != end2; ++it2) {
|
||||
el->import_node(*it2);
|
||||
}
|
||||
interpreter->changed = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
element_set_property_innerText(JSContext *ctx, unsigned int argc, JS::Value *vp)
|
||||
{
|
||||
|
@ -33,6 +33,7 @@ struct delayed_open {
|
||||
|
||||
struct delayed_rel {
|
||||
struct session *ses;
|
||||
void *doc;
|
||||
};
|
||||
|
||||
enum remote_session_flags {
|
||||
|
@ -15,8 +15,8 @@ function aa()
|
||||
|
||||
function bb()
|
||||
{
|
||||
document.getElementById('blabla').innerHTML = '<u>test</u>';
|
||||
alert(document.getElementsByTagName("HTML")[0].outerHTML);
|
||||
document.getElementById('blabla').innerHTML = '<u>test</u><b>OK</b>';
|
||||
// alert(document.getElementsByTagName("HTML")[0].outerHTML);
|
||||
}
|
||||
</script>
|
||||
<button onclick="return aa()">Click me!</button>
|
||||
|
Loading…
Reference in New Issue
Block a user