/* DOMImplementation binding for browser using duktape and libdom * * Copyright 2020 Daniel Silverstone * * This file is part of NetSurf, http://www.netsurf-browser.org/ * * Released under the terms of the MIT License, * http://www.opensource.org/licenses/mit-license */ prologue DOMImplementation () %{ #include "utils/corestrings.h" %} method DOMImplemention::hasFeature () %{ /* Always return true */ duk_push_bool(ctx, true); return 1; %} method DOMImplementation::createHTMLDocument () %{ duk_size_t text_len; const char *text = duk_safe_to_lstring(ctx, 0, &text_len); struct dom_document *doc = NULL, *ret = NULL; struct dom_document_type *doctype = NULL; struct dom_html_element *html = NULL, *head = NULL, *title = NULL, *body = NULL; struct dom_node *spare_ref = NULL; dom_string *text_str = NULL; dom_exception exc; exc = dom_string_create((const uint8_t*)text, text_len, &text_str); if (exc != DOM_NO_ERR) goto out; exc = dom_implementation_create_document( DOM_IMPLEMENTATION_HTML, NULL, NULL, NULL, NULL, NULL, &doc ); if (exc != DOM_NO_ERR) goto out; exc = dom_implementation_create_document_type( "html", NULL, NULL, &doctype); if (exc != DOM_NO_ERR) goto out; exc = dom_node_append_child(doc, doctype, &spare_ref); if (exc != DOM_NO_ERR) goto out; if (spare_ref != NULL) { dom_node_unref(spare_ref); spare_ref = NULL; } exc = dom_document_create_element_ns(doc, corestring_dom_html_namespace, corestring_dom_HTML, &html); if (exc != DOM_NO_ERR) goto out; exc = dom_document_create_element_ns(doc, corestring_dom_html_namespace, corestring_dom_HEAD, &head); if (exc != DOM_NO_ERR) goto out; exc = dom_document_create_element_ns(doc, corestring_dom_html_namespace, corestring_dom_TITLE, &title); if (exc != DOM_NO_ERR) goto out; exc = dom_document_create_element_ns(doc, corestring_dom_html_namespace, corestring_dom_BODY, &body); if (exc != DOM_NO_ERR) goto out; exc = dom_node_set_text_content(title, text_str); if (exc != DOM_NO_ERR) goto out; exc = dom_node_append_child(head, title, &spare_ref); if (exc != DOM_NO_ERR) goto out; if (spare_ref != NULL) { dom_node_unref(spare_ref); spare_ref = NULL; } exc = dom_node_append_child(html, head, &spare_ref); if (exc != DOM_NO_ERR) goto out; if (spare_ref != NULL) { dom_node_unref(spare_ref); spare_ref = NULL; } exc = dom_node_append_child(html, body, &spare_ref); if (exc != DOM_NO_ERR) goto out; if (spare_ref != NULL) { dom_node_unref(spare_ref); spare_ref = NULL; } exc = dom_node_append_child(doc, html, &spare_ref); if (exc != DOM_NO_ERR) goto out; if (spare_ref != NULL) { dom_node_unref(spare_ref); spare_ref = NULL; } ret = doc; doc = NULL; out: if (text_str != NULL) { dom_string_unref(text_str); } if (doc != NULL) { dom_node_unref(doc); } if (html != NULL) { dom_node_unref(html); } if (head != NULL) { dom_node_unref(head); } if (title != NULL) { dom_node_unref(title); } if (body != NULL) { dom_node_unref(body); } if (doctype != NULL) { dom_node_unref(doctype); } if (ret != NULL) { dukky_push_node(ctx, (struct dom_node *)ret); dom_node_unref(ret); return 1; } return 0; /* Coerced to undefined */ %}