summaryrefslogtreecommitdiff
path: root/content/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'content/handlers')
-rw-r--r--content/handlers/javascript/duktape/DOMImplementation.bnd120
-rw-r--r--content/handlers/javascript/duktape/Document.bnd21
-rw-r--r--content/handlers/javascript/duktape/netsurf.bnd1
3 files changed, 142 insertions, 0 deletions
diff --git a/content/handlers/javascript/duktape/DOMImplementation.bnd b/content/handlers/javascript/duktape/DOMImplementation.bnd
new file mode 100644
index 000000000..05c481ddc
--- /dev/null
+++ b/content/handlers/javascript/duktape/DOMImplementation.bnd
@@ -0,0 +1,120 @@
+/* DOMImplementation binding for browser using duktape and libdom
+ *
+ * Copyright 2020 Daniel Silverstone <dsilvers@netsurf-browser.org>
+ *
+ * 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 */
+%}
diff --git a/content/handlers/javascript/duktape/Document.bnd b/content/handlers/javascript/duktape/Document.bnd
index d9bff0a16..de96cd864 100644
--- a/content/handlers/javascript/duktape/Document.bnd
+++ b/content/handlers/javascript/duktape/Document.bnd
@@ -433,6 +433,27 @@ method Document::createEvent ()
return 1;
%}
+getter Document::implementation ()
+%{
+ /* Create a new DOMImplementation instance */
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, -1, MAGIC(DOMImplementation));
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+
+ if (dukky_create_object(ctx,
+ PROTO_NAME(DOMIMPLEMENTATION),
+ 0) != DUK_EXEC_SUCCESS) {
+ return duk_error(ctx,
+ DUK_ERR_ERROR,
+ "Unable to create dom implementation object");
+ }
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, -3, MAGIC(DOMImplementation));
+ }
+ return 1;
+%}
+
getter Document::onabort();
setter Document::onabort();
getter Document::onautocompleteerror();
diff --git a/content/handlers/javascript/duktape/netsurf.bnd b/content/handlers/javascript/duktape/netsurf.bnd
index 628b2a324..30b3d4a14 100644
--- a/content/handlers/javascript/duktape/netsurf.bnd
+++ b/content/handlers/javascript/duktape/netsurf.bnd
@@ -64,6 +64,7 @@ struct dom_html_br_element;
#include "HTMLCollection.bnd"
#include "Location.bnd"
#include "Navigator.bnd"
+#include "DOMImplementation.bnd"
/* events */