1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-15 23:35:34 +00:00

[libdom] debug_dump_xhtml

Helper function which print current state of document, called
after modification of DOM tree.
This commit is contained in:
Witold Filipczyk 2024-05-17 22:05:25 +02:00
parent 5c92b4ee96
commit 7885fb0797
8 changed files with 120 additions and 8 deletions

View File

@ -166,8 +166,12 @@ dump_dom_element(void *mapa, void *mapa_rev, struct string *buf, dom_node *node,
}
add_char_to_string(buf, '<');
save_in_map(mapa, node, buf->length);
save_offset_in_map(mapa_rev, node, buf->length);
if (mapa) {
save_in_map(mapa, node, buf->length);
}
if (mapa_rev) {
save_offset_in_map(mapa_rev, node, buf->length);
}
/* Get string data and print element name */
add_lowercase_to_string(buf, dom_string_data(node_name), dom_string_byte_length(node_name));
@ -475,6 +479,48 @@ walk_tree2_color(struct terminal *term, struct el_box *box, struct document *doc
}
#endif
void
debug_dump_xhtml(void *d)
{
#ifdef ECMASCRIPT_DEBUG
dom_document *doc = (dom_document *)d;
if (!doc) {
return;
}
dom_node *root = NULL;
dom_exception exc = dom_document_get_document_element(doc, &root);
if (exc != DOM_NO_ERR) {
fprintf(stderr, "Exception raised for get_document_element\n");
//dom_node_unref(doc);
return;
} else if (root == NULL) {
fprintf(stderr, "Broken: root == NULL\n");
//dom_node_unref(doc);
return;
}
struct string text;
if (!init_string(&text)) {
dom_node_unref(root);
return;
}
if (walk_tree(NULL, NULL, &text, root, true, 0) == false) {
fprintf(stderr, "Failed to complete DOM structure dump.\n");
dom_node_unref(root);
done_string(&text);
//dom_node_unref(doc);
return;
}
fprintf(stderr, "\n---%s\n", text.source);
done_string(&text);
dom_node_unref(root);
#endif
}
void
dump_xhtml(struct cache_entry *cached, struct document *document, int parse)
{

View File

@ -20,6 +20,7 @@ void render_xhtml_document(struct cache_entry *cached, struct document *document
void dump_xhtml(struct cache_entry *cached, struct document *document, int parse);
void free_libdom(void);
void debug_dump_xhtml(void *doc);
#if 0
void walk2(struct document *document);

View File

@ -30,8 +30,6 @@
#include "util/string.h"
#include "util/time.h"
//#define ECMASCRIPT_DEBUG 1
#ifdef ECMASCRIPT_DEBUG
#include <stdio.h>
#endif

View File

@ -175,12 +175,11 @@ spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter)
JS::Heap<JSObject*> *window_obj = new JS::Heap<JSObject*>(JS_NewGlobalObject(ctx, &window_class, NULL, JS::FireOnNewGlobalHook, options));
global = window_obj->get();
interpreter->ar = new JSAutoRealm(ctx, global);
if (!global) {
goto release_and_fail;
}
interpreter->ar = new JSAutoRealm(ctx, global);
interpreter->ac = window_obj;
if (!JS::InitRealmStandardClasses(ctx)) {

View File

@ -25,6 +25,7 @@
#include "document/document.h"
#include "document/forms.h"
#include "document/libdom/doc.h"
#include "document/libdom/renderer2.h"
#include "document/view.h"
#include "ecmascript/css2xpath.h"
#include "ecmascript/ecmascript.h"
@ -1197,6 +1198,10 @@ document_write_do(JSContext *ctx, unsigned int argc, JS::Value *rval, int newlin
}
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
if (argc >= 1) {
@ -1227,6 +1232,7 @@ document_write_do(JSContext *ctx, unsigned int argc, JS::Value *rval, int newlin
}
interpreter->changed = 1;
interpreter->was_write = 1;
debug_dump_xhtml(document->dom);
}
}

View File

@ -2904,7 +2904,6 @@ element_set_property_className(JSContext *ctx, unsigned int argc, JS::Value *vp)
}
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(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. */
@ -2921,6 +2920,8 @@ element_set_property_className(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = (dom_node *)JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
@ -2940,6 +2941,7 @@ element_set_property_className(JSContext *ctx, unsigned int argc, JS::Value *vp)
exc = dom_element_set_attribute(el, corestring_dom_class, classstr);
interpreter->changed = 1;
dom_string_unref(classstr);
debug_dump_xhtml(document->dom);
}
mem_free(str);
@ -2965,7 +2967,6 @@ element_set_property_dir(JSContext *ctx, unsigned int argc, JS::Value *vp)
}
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(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. */
@ -2981,6 +2982,8 @@ element_set_property_dir(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = (dom_node *)JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
@ -3002,6 +3005,7 @@ element_set_property_dir(JSContext *ctx, unsigned int argc, JS::Value *vp)
exc = dom_element_set_attribute(el, corestring_dom_dir, dir);
interpreter->changed = 1;
dom_string_unref(dir);
debug_dump_xhtml(document->dom);
}
}
mem_free(str);
@ -3045,6 +3049,8 @@ element_set_property_id(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = (dom_node *)JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
@ -3064,6 +3070,7 @@ element_set_property_id(JSContext *ctx, unsigned int argc, JS::Value *vp)
exc = dom_element_set_attribute(el, corestring_dom_id, idstr);
interpreter->changed = 1;
dom_string_unref(idstr);
debug_dump_xhtml(document->dom);
}
mem_free(str);
@ -3105,6 +3112,8 @@ element_set_property_innerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = (dom_node *)JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
@ -3118,6 +3127,9 @@ element_set_property_innerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp)
}
size_t size = strlen(s);
fprintf(stderr, "set innerHTML:%s\n", s);
dom_hubbub_parser_params parse_params;
dom_hubbub_error error;
dom_hubbub_parser *parser = NULL;
@ -3230,6 +3242,7 @@ out:
}
mem_free(s);
interpreter->changed = 1;
debug_dump_xhtml(document->dom);
return true;
}
@ -3269,6 +3282,8 @@ element_set_property_innerText(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
if (!el) {
@ -3286,6 +3301,7 @@ element_set_property_innerText(JSContext *ctx, unsigned int argc, JS::Value *vp)
el->add_child_text(text);
interpreter->changed = 1;
mem_free_if(text);
debug_dump_xhtml(document->dom);
#endif
return true;
@ -3326,6 +3342,9 @@ element_set_property_lang(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = (dom_node *)JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
@ -3345,6 +3364,7 @@ element_set_property_lang(JSContext *ctx, unsigned int argc, JS::Value *vp)
exc = dom_element_set_attribute(el, corestring_dom_lang, langstr);
interpreter->changed = 1;
dom_string_unref(langstr);
debug_dump_xhtml(document->dom);
}
mem_free(str);
@ -3386,6 +3406,9 @@ element_set_property_outerHtml(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_node *el = (dom_node *)JS::GetMaybePtrFromReservedSlot<dom_node>(hobj, 0);
if (!el) {
@ -3512,6 +3535,7 @@ out:
mem_free(s);
interpreter->changed = 1;
debug_dump_xhtml(document->dom);
return true;
}
@ -3589,6 +3613,8 @@ element_set_property_title(JSContext *ctx, unsigned int argc, JS::Value *vp)
if (!vs) {
return true;
}
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
dom_string *titlestr = NULL;
dom_exception exc;
@ -3610,6 +3636,7 @@ element_set_property_title(JSContext *ctx, unsigned int argc, JS::Value *vp)
exc = dom_element_set_attribute(el, corestring_dom_title, titlestr);
interpreter->changed = 1;
dom_string_unref(titlestr);
debug_dump_xhtml(document->dom);
}
mem_free(str);
@ -3942,6 +3969,9 @@ element_appendChild(JSContext *ctx, unsigned int argc, JS::Value *rval)
JS::RootedObject hobj(ctx, &args.thisv().toObject());
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
if (!JS_InstanceOf(ctx, hobj, &element_class, NULL)) {
#ifdef ECMASCRIPT_DEBUG
@ -3972,6 +4002,7 @@ element_appendChild(JSContext *ctx, unsigned int argc, JS::Value *rval)
interpreter->changed = 1;
JSObject *obj = getElement(ctx, res);
args.rval().setObject(*obj);
debug_dump_xhtml(document->dom);
return true;
}
args.rval().setNull();
@ -4654,6 +4685,9 @@ element_insertBefore(JSContext *ctx, unsigned int argc, JS::Value *rval)
}
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
JS::CallArgs args = CallArgsFromVp(argc, rval);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
@ -4691,6 +4725,7 @@ element_insertBefore(JSContext *ctx, unsigned int argc, JS::Value *rval)
JSObject *obj = getElement(ctx, spare);
args.rval().setObject(*obj);
interpreter->changed = 1;
debug_dump_xhtml(document->dom);
return true;
}
@ -4973,6 +5008,10 @@ element_remove(JSContext *ctx, unsigned int argc, JS::Value *rval)
// TODO
#if 0
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
xmlpp::Element *el = JS::GetMaybePtrFromReservedSlot<xmlpp::Element>(hobj, 0);
if (!el) {
@ -4981,6 +5020,7 @@ element_remove(JSContext *ctx, unsigned int argc, JS::Value *rval)
xmlpp::Node::remove_node(el);
interpreter->changed = 1;
debug_dump_xhtml(document->dom);
#endif
return true;
}
@ -5004,6 +5044,9 @@ element_removeChild(JSContext *ctx, unsigned int argc, JS::Value *rval)
JS::RootedObject hobj(ctx, &args.thisv().toObject());
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
if (!JS_InstanceOf(ctx, hobj, &element_class, NULL)) {
#ifdef ECMASCRIPT_DEBUG
@ -5027,6 +5070,7 @@ element_removeChild(JSContext *ctx, unsigned int argc, JS::Value *rval)
interpreter->changed = 1;
JSObject *obj = getElement(ctx, spare);
args.rval().setObject(*obj);
debug_dump_xhtml(document->dom);
return true;
}
args.rval().setNull();
@ -5060,6 +5104,10 @@ element_replaceWith(JSContext *ctx, unsigned int argc, JS::Value *rval)
// TODO
#if 0
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
xmlpp::Element *el = JS::GetMaybePtrFromReservedSlot<xmlpp::Element>(hobj, 0);
if (!el || !args[0].isObject()) {
@ -5074,6 +5122,7 @@ element_replaceWith(JSContext *ctx, unsigned int argc, JS::Value *rval)
xmlpp::Node::remove_node(el);
interpreter->changed = 1;
args.rval().setUndefined();
debug_dump_xhtml(document->dom);
#endif
return true;
}
@ -5097,6 +5146,9 @@ element_setAttribute(JSContext *ctx, unsigned int argc, JS::Value *rval)
JS::RootedObject hobj(ctx, &args.thisv().toObject());
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct view_state *vs = interpreter->vs;
struct document_view *doc_view = vs->doc_view;
struct document *document = doc_view->document;
if (!JS_InstanceOf(ctx, hobj, &element_class, NULL)) {
#ifdef ECMASCRIPT_DEBUG
@ -5152,6 +5204,7 @@ element_setAttribute(JSContext *ctx, unsigned int argc, JS::Value *rval)
return true;
}
interpreter->changed = 1;
debug_dump_xhtml(document->dom);
return true;
}

View File

@ -24,6 +24,7 @@
#include "document/document.h"
#include "document/forms.h"
#include "document/libdom/corestrings.h"
#include "document/libdom/renderer2.h"
#include "document/view.h"
#include "ecmascript/ecmascript.h"
#include "ecmascript/libdom/dom.h"
@ -638,6 +639,8 @@ style_set_property_cssText(JSContext *ctx, unsigned int argc, JS::Value *vp)
return false;
}
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct document_view *doc_view = interpreter->vs->doc_view;
struct document *document = doc_view->document;
/* This can be called if @obj if not itself an instance of the
* appropriate class but has one in its prototype chain. Fail
@ -679,6 +682,7 @@ style_set_property_cssText(JSContext *ctx, unsigned int argc, JS::Value *vp)
exc = dom_element_set_attribute(el, corestring_dom_style, stylestr);
interpreter->changed = 1;
dom_string_unref(stylestr);
debug_dump_xhtml(document->dom);
}
mem_free(res);
@ -702,6 +706,8 @@ style_set_style(JSContext *ctx, unsigned int argc, JS::Value *vp, const char *pr
return false;
}
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS::GetRealmPrivate(comp);
struct document_view *doc_view = interpreter->vs->doc_view;
struct document *document = doc_view->document;
/* This can be called if @obj if not itself an instance of the
* appropriate class but has one in its prototype chain. Fail
@ -752,6 +758,7 @@ style_set_style(JSContext *ctx, unsigned int argc, JS::Value *vp, const char *pr
exc = dom_element_set_attribute(el, corestring_dom_style, stylestr);
interpreter->changed = 1;
dom_string_unref(stylestr);
debug_dump_xhtml(document->dom);
}
mem_free(res);
return true;

View File

@ -125,4 +125,6 @@
#define FG_POLL_TIME 500
#define TERMINAL_POLL_TIMEOUT 1000
//#define ECMASCRIPT_DEBUG 1
#endif