diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2012-07-23 17:51:53 +0100 |
---|---|---|
committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2012-07-23 17:51:53 +0100 |
commit | d316c5d1a09406b63cc5b5754726007882e6360d (patch) | |
tree | 9b11a607b319c6168cd6128f4c72f724c091b92c | |
parent | bce4040985c2c1d43a46b670d857024b0536aabe (diff) | |
parent | 542b8cb8feba8f15497eecf31cac53a7f4b17add (diff) | |
download | libdom-d316c5d1a09406b63cc5b5754726007882e6360d.tar.gz libdom-d316c5d1a09406b63cc5b5754726007882e6360d.tar.bz2 |
Merge branch 'master' of git://git.netsurf-browser.org/libdom into chris/amiga-hubbub-lib-compat
-rw-r--r-- | gdb/libdom.py | 157 | ||||
-rw-r--r-- | src/html/html_button_element.c | 14 | ||||
-rw-r--r-- | src/html/html_input_element.c | 14 | ||||
-rw-r--r-- | src/html/html_text_area_element.c | 14 |
4 files changed, 157 insertions, 42 deletions
diff --git a/gdb/libdom.py b/gdb/libdom.py new file mode 100644 index 0000000..65286e3 --- /dev/null +++ b/gdb/libdom.py @@ -0,0 +1,157 @@ +# LibDOM related commands and utilities for gdb + +import gdb + +def dom_get_type_ptr(typename): + return gdb.lookup_type(typename).pointer() + +def dom_node_at(ptr): + nodetype = dom_get_type_ptr("dom_node_internal") + return ptr.cast(nodetype).dereference() + +def dom_document_at(ptr): + doctype = dom_get_type_ptr("dom_document") + return ptr.cast(doctype).dereference() + +def dom_node_type(node): + return node["type"] + +def dom_node_refcnt(node): + return node["base"]["refcnt"] + +def lwc_string_value(strptr): + cptr = strptr+1 + charptr = cptr.cast(dom_get_type_ptr("char")) + return charptr.string() + +def dom_string__is_intern(intstr): + return str(intstr['type']) == "DOM_STRING_INTERNED" + +def cdata_string_value(cdata): + cptr = cdata['ptr'] + charptr = cptr.cast(dom_get_type_ptr("char")) + return charptr.string() + +def dom_string_value(stringptr): + intstr = stringptr.cast(dom_get_type_ptr("dom_string_internal")).dereference() + if intstr.address == gdb.parse_and_eval("(dom_string_internal*)0"): + return "" + if dom_string__is_intern(intstr): + return lwc_string_value(intstr['data']['intern']) + else: + return cdata_string_value(intstr['data']['cdata']) + +def dom_node_name(node): + namestr = node["name"] + return " '%s'" % dom_string_value(namestr) + +def dom_node_pending_offset(): + return gdb.parse_and_eval("(int)&((struct dom_node_internal *)0)->pending_list") + +def dom_print_node(node, prefix = ""): + print("%s%s @ %s [%s]%s" % (prefix, dom_node_type(node), + node.address, dom_node_refcnt(node), + dom_node_name(node))) + +def dom_walk_tree(node, prefix = ""): + dom_print_node(node, prefix) + current = node['first_child'].dereference() + while current.address != 0: + dom_walk_tree(current, "%s " % prefix) + current = current['next'].dereference() + +def dom_document_show(doc): + print "Node Tree:" + node = dom_node_at(doc.address) + dom_walk_tree(node, " ") + pending = doc['pending_nodes'] + if pending['next'] != pending.address: + print "Pending Node trees:" + current_list_entry = pending['next'] + while current_list_entry is not None: + voidp = current_list_entry.cast(dom_get_type_ptr("void")) + voidp = voidp - dom_node_pending_offset() + node = dom_node_at(voidp) + dom_walk_tree(node, " ") + current_list_entry = node['pending_list']['next'] + if current_list_entry == pending.address: + current_list_entry = None + + +class DOMCommand(gdb.Command): + """DOM related commands""" + + def __init__(self): + gdb.Command.__init__(self, "dom", gdb.COMMAND_DATA, + gdb.COMPLETE_COMMAND, True) + +class DOMNodeCommand(gdb.Command): + """DOMNode related commands""" + + def __init__(self): + gdb.Command.__init__(self, "dom node", gdb.COMMAND_DATA, + gdb.COMPLETE_COMMAND, True) + +class DOMDocumentCommand(gdb.Command): + """DOMDocument related commands""" + + def __init__(self): + gdb.Command.__init__(self, "dom document", gdb.COMMAND_DATA, + gdb.COMPLETE_COMMAND, True) + +class DOMNodeShowCommand(gdb.Command): + """Show a node at a given address.""" + + def __init__(self): + gdb.Command.__init__(self, "dom node show", gdb.COMMAND_DATA, + gdb.COMPLETE_NONE, True) + + def invoke(self, arg, from_tty): + args = gdb.string_to_argv(arg) + self._invoke(*args) + + def _invoke(self, nodeptr): + _ptr = gdb.parse_and_eval(nodeptr) + node = dom_node_at(_ptr) + dom_print_node(node) + +class DOMNodeWalkCommand(gdb.Command): + """Walk a node tree at a given address.""" + + def __init__(self): + gdb.Command.__init__(self, "dom node walk", gdb.COMMAND_DATA, + gdb.COMPLETE_NONE, True) + + def invoke(self, arg, from_tty): + args = gdb.string_to_argv(arg) + self._invoke(*args) + + def _invoke(self, nodeptr): + _ptr = gdb.parse_and_eval(nodeptr) + node = dom_node_at(_ptr) + dom_walk_tree(node) + +class DOMDocumentShowCommand(gdb.Command): + """Show a document at a given address.""" + + def __init__(self): + gdb.Command.__init__(self, "dom document show", gdb.COMMAND_DATA, + gdb.COMPLETE_NONE, True) + + def invoke(self, arg, from_tty): + args = gdb.string_to_argv(arg) + self._invoke(*args) + + def _invoke(self, docptr): + _ptr = gdb.parse_and_eval(docptr) + doc = dom_document_at(_ptr) + dom_document_show(doc) + +DOMCommand() + +DOMNodeCommand() +DOMNodeShowCommand() +DOMNodeWalkCommand() + +DOMDocumentCommand() +DOMDocumentShowCommand() diff --git a/src/html/html_button_element.c b/src/html/html_button_element.c index 4a73fcf..68cb1a5 100644 --- a/src/html/html_button_element.c +++ b/src/html/html_button_element.c @@ -74,11 +74,6 @@ dom_exception _dom_html_button_element_initialise(struct dom_html_document *doc, */ void _dom_html_button_element_finalise(struct dom_html_button_element *ele) { - if (ele->form != NULL) { - dom_node_unref(ele->form); - ele->form = NULL; - } - _dom_html_element_finalise(&ele->base); } @@ -228,17 +223,8 @@ dom_exception dom_html_button_element_get_form( dom_exception _dom_html_button_element_set_form( dom_html_button_element *button, dom_html_form_element *form) { - if (button->form == form) - return DOM_NO_ERR; - - if (button->form != NULL) - dom_node_unref(button->form); - button->form = form; - if (button->form != NULL) - dom_node_ref(button->form); - return DOM_NO_ERR; } diff --git a/src/html/html_input_element.c b/src/html/html_input_element.c index ee75a64..aa3e05f 100644 --- a/src/html/html_input_element.c +++ b/src/html/html_input_element.c @@ -83,11 +83,6 @@ void _dom_html_input_element_finalise(struct dom_html_input_element *ele) ele->default_value = NULL; } - if (ele->form != NULL) { - dom_node_unref(ele->form); - ele->form = NULL; - } - _dom_html_element_finalise(&ele->base); } @@ -402,17 +397,8 @@ dom_exception dom_html_input_element_get_form( dom_exception _dom_html_input_element_set_form( dom_html_input_element *input, dom_html_form_element *form) { - if (input->form == form) - return DOM_NO_ERR; - - if (input->form != NULL) - dom_node_unref(input->form); - input->form = form; - if (input->form != NULL) - dom_node_ref(input->form); - return DOM_NO_ERR; } diff --git a/src/html/html_text_area_element.c b/src/html/html_text_area_element.c index 0234076..cb95920 100644 --- a/src/html/html_text_area_element.c +++ b/src/html/html_text_area_element.c @@ -90,11 +90,6 @@ void _dom_html_text_area_element_finalise(struct dom_html_text_area_element *ele ele->value_set = false; } - if (ele->form != NULL) { - dom_node_unref(ele->form); - ele->form = NULL; - } - _dom_html_element_finalise(&ele->base); } @@ -425,17 +420,8 @@ dom_exception dom_html_text_area_element_get_form( dom_exception _dom_html_text_area_element_set_form( dom_html_text_area_element *text_area, dom_html_form_element *form) { - if (text_area->form == form) - return DOM_NO_ERR; - - if (text_area->form != NULL) - dom_node_unref(text_area->form); - text_area->form = form; - if (text_area->form != NULL) - dom_node_ref(text_area->form); - return DOM_NO_ERR; } |