Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/bf80b18929da2dc3beb36aa96a6cea645e4088ef
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/bf80b18929da2dc3beb36aa96a6cea645e4088ef
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/bf80b18929da2dc3beb36aa96a6cea645e4088ef

The branch, dsilvers/eventtarget has been created
        at  bf80b18929da2dc3beb36aa96a6cea645e4088ef (commit)

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=bf80b18929da2dc3beb36aa96a6cea645e4088ef
commit bf80b18929da2dc3beb36aa96a6cea645e4088ef
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    Early bits for event targets, nowhere near ready yet

diff --git a/content/handlers/javascript/duktape/EventTarget.bnd 
b/content/handlers/javascript/duktape/EventTarget.bnd
new file mode 100644
index 0000000..a53e71d
--- /dev/null
+++ b/content/handlers/javascript/duktape/EventTarget.bnd
@@ -0,0 +1,123 @@
+/* Event Target binding for browser using duktape and libdom
+ *
+ * Copyright 2016 Daniel Silverstone <[email protected]>
+ *
+ * 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
+ */
+
+class EventTarget {
+       private bool is_node;
+};
+
+prologue EventTarget()
+%{
+#define EVENT_LISTENER_JS_MAGIC MAGIC(EVENT_LISTENER_JS_MAP)
+       
+static void event_target_push_listeners(duk_context *ctx) {
+       /* ... (this=EventTarget) */
+       duk_push_this(ctx);
+       /* ... this */
+       duk_get_prop_string(ctx, -1, EVENT_LISTENER_JS_MAGIC);
+       if (duk_is_null(ctx, -1)) {
+               /* ... this null */
+               duk_pop(ctx);
+               duk_push_object(ctx);
+               duk_dup(ctx, -1);
+               /* ... this listeners listeners */
+               duk_put_prop_string(ctx, -3, EVENT_LISTENER_JS_MAGIC);
+               /* ... this listeners */
+       }
+       /* ... this listeners */
+       duk_insert(ctx, -2);
+       /* ... listeners this */
+       duk_pop(ctx);
+       /* ... listeners */
+}
+
+%}
+
+init EventTarget()
+%{
+       priv->is_node = false;
+%}
+
+method EventTarget::addEventListener()
+%{
+       dom_exception exc;
+       /* Incoming stack is: type callback [options] */
+       if (duk_get_top(ctx) < 2) return 0; /* Bad arguments */
+       if (duk_get_top(ctx) > 3) return 0; /* Bad arguments */
+       if (duk_get_top(ctx) == 2) {
+               duk_push_object(ctx);
+               /* type callback options */
+       }
+       if (duk_get_type(ctx, -1) != DUK_TYPE_OBJECT) {
+               /* legacy support, if not object, it's the capture value */
+               duk_push_object(ctx);
+               /* ... capture options */
+               duk_insert(ctx, -2);
+               /* ... options capture */
+               duk_put_prop_string(ctx, -2, "capture");
+               /* ... options */
+       }
+       /* type callback options */
+       event_target_push_listeners(ctx);
+       /* type callback options listeners */
+       return 0;
+%}
+
+method EventTarget::removeEventListener()
+%{
+       dom_exception exc;
+       return 0;
+%}
+
+
+
+method EventTarget::dispatchEvent()
+%{
+       dom_exception exc;
+       if (!dukky_instanceof(ctx, 0, PROTO_NAME(EVENT))) return 0;
+
+       duk_get_prop_string(ctx, 0, PRIVATE_MAGIC);
+       event_private_t *evpriv = duk_get_pointer(ctx, -1);
+       duk_pop(ctx);
+
+       dom_event *evt = evpriv->evt;
+
+       /* Dispatch event logic, see:
+        * https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent
+        */
+       bool in_dispatch;
+       if (dom_event_in_dispatch(evt, &in_dispatch) != DOM_NO_ERR) return 0;
+       if (in_dispatch) {
+               /** \todo Raise InvalidStateException */
+               return 0;
+       }
+
+       bool is_initialised;
+       if (dom_event_is_initialised(evt, &is_initialised) != DOM_NO_ERR) 
return 0;
+       if (is_initialised == false) {
+               /** \todo Raise InvalidStateException */
+               return 0;
+       }
+
+       if (dom_event_set_is_trusted(evt, false) != DOM_NO_ERR) return 0;
+
+       /** \todo work out how to dispatch against non-node things */
+       if (priv->is_node == false) return 0;
+
+       bool success;
+       /* Event prepared, dispatch against ourselves */
+       exc = dom_event_target_dispatch_event(
+               ((node_private_t *)priv)->node,
+               evt,
+               &success);
+       if (exc != DOM_NO_ERR) return 0; /**< \todo raise correct exception */
+
+       duk_push_boolean(ctx, success);
+       return 1;
+%}
diff --git a/content/handlers/javascript/duktape/Node.bnd 
b/content/handlers/javascript/duktape/Node.bnd
index f237c87..f14cfc1 100644
--- a/content/handlers/javascript/duktape/Node.bnd
+++ b/content/handlers/javascript/duktape/Node.bnd
@@ -16,6 +16,7 @@ init Node(struct dom_node *node)
 %{
        priv->node = node;
        dom_node_ref(node);
+       priv->parent.is_node = true;
 %}
 
 fini Node()
diff --git a/content/handlers/javascript/duktape/netsurf.bnd 
b/content/handlers/javascript/duktape/netsurf.bnd
index 4aca475..2a56ccc 100644
--- a/content/handlers/javascript/duktape/netsurf.bnd
+++ b/content/handlers/javascript/duktape/netsurf.bnd
@@ -54,6 +54,7 @@ struct dom_html_br_element;
 
 };
 
+#include "EventTarget.bnd"
 #include "Console.bnd"
 #include "Window.bnd"
 #include "Document.bnd"


-----------------------------------------------------------------------


-- 
NetSurf Browser

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to