Gitweb links:

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

The branch, master has been updated
       via  550900b1cbfffcd3ceb5c00631bcbae2b453443c (commit)
       via  f29f12a5df255f252987e8acf92994e40125aff6 (commit)
       via  7bcd4fd2465631f4a17e1920594e9c2536b6f057 (commit)
      from  764fca4f3abfc7437003f496d52039ad7e6b779d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 .../javascript/duktape/DOMSettableTokenList.bnd    |   44 ++++++
 .../handlers/javascript/duktape/DOMTokenList.bnd   |  163 ++++++++++++++++++++
 content/handlers/javascript/duktape/Element.bnd    |   31 ++++
 content/handlers/javascript/duktape/netsurf.bnd    |    2 +
 content/handlers/javascript/duktape/polyfill.js    |   18 +++
 docs/UnimplementedJavascript.md                    |   17 +-
 test/js/class-list.html                            |   29 ++++
 test/js/index.html                                 |    1 +
 8 files changed, 289 insertions(+), 16 deletions(-)
 create mode 100644 content/handlers/javascript/duktape/DOMSettableTokenList.bnd
 create mode 100644 content/handlers/javascript/duktape/DOMTokenList.bnd
 create mode 100644 test/js/class-list.html

diff --git a/content/handlers/javascript/duktape/DOMSettableTokenList.bnd 
b/content/handlers/javascript/duktape/DOMSettableTokenList.bnd
new file mode 100644
index 0000000..ac5c706
--- /dev/null
+++ b/content/handlers/javascript/duktape/DOMSettableTokenList.bnd
@@ -0,0 +1,44 @@
+/* DOMTokenList binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <[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 DOMSettableTokenList {
+};
+
+init DOMSettableTokenList(struct dom_tokenlist *tokens::tokens);
+
+getter DOMSettableTokenList::value()
+%{
+       dom_exception exc;
+       dom_string *value;
+
+       exc = dom_tokenlist_get_value(priv->parent.tokens, &value);
+       if (exc != DOM_NO_ERR) return 0; /* coerced to undefined */
+
+       duk_push_lstring(ctx, dom_string_data(value), dom_string_length(value));
+       dom_string_unref(value);
+
+       return 1;
+%}
+
+setter DOMSettableTokenList::value()
+%{
+       dom_exception exc;
+       dom_string *value;
+    duk_size_t slen;
+    const char *s = duk_require_lstring(ctx, 0, &slen);
+
+    exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+    if (exc != DOM_NO_ERR) return 0;
+
+    exc = dom_tokenlist_set_value(priv->parent.tokens, value);
+    dom_string_unref(value);
+
+    return 0;
+%}
\ No newline at end of file
diff --git a/content/handlers/javascript/duktape/DOMTokenList.bnd 
b/content/handlers/javascript/duktape/DOMTokenList.bnd
new file mode 100644
index 0000000..928d9ef
--- /dev/null
+++ b/content/handlers/javascript/duktape/DOMTokenList.bnd
@@ -0,0 +1,163 @@
+/* DOMTokenList binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <[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 DOMTokenList {
+       private struct dom_tokenlist *tokens;
+};
+
+init DOMTokenList(struct dom_tokenlist *tokens)
+%{
+       priv->tokens = tokens;
+       dom_tokenlist_ref(tokens);
+%}
+
+fini DOMTokenList()
+%{
+       dom_tokenlist_unref(priv->tokens);
+%}
+
+getter DOMTokenList::length()
+%{
+       dom_exception err;
+       uint32_t len;
+
+       err = dom_tokenlist_get_length(priv->tokens, &len);
+
+       if (err != DOM_NO_ERR) return 0; /* coerced to undefined */
+
+       duk_push_uint(ctx, (duk_uint_t)len);
+
+       return 1;
+%}
+
+method DOMTokenList::item()
+%{
+       unsigned long i = duk_to_uint(ctx, 0);
+       dom_exception err;
+       dom_string *value;
+
+       err = dom_tokenlist_item(priv->tokens, i, &value);
+
+       if (err != DOM_NO_ERR) return 0; /* coerced to undefined */
+
+    if (value == NULL) {
+        duk_push_null(ctx);
+        return 1;
+    }
+
+    duk_push_lstring(ctx, dom_string_data(value), dom_string_length(value));
+       dom_string_unref(value);
+
+       return 1;
+%}
+
+method DOMTokenList::add()
+%{
+       dom_exception exc;
+       dom_string *value;
+       duk_size_t slen;
+       const char *s;
+       duk_idx_t spos;
+
+       for (spos = 0; spos < duk_get_top(ctx); ++spos) {
+               s = duk_safe_to_lstring(ctx, spos, &slen);
+
+               duk_safe_to_lstring(ctx, 0, &slen);
+
+               exc = dom_string_create_interned((const uint8_t *)s, slen, 
&value);
+               if (exc != DOM_NO_ERR) return 0;
+
+               exc = dom_tokenlist_add(priv->tokens, value);
+               dom_string_unref(value);
+       }
+       
+       return 0;
+%}
+
+method DOMTokenList::remove()
+%{
+       dom_exception exc;
+       dom_string *value;
+       duk_size_t slen;
+       const char *s;
+       duk_idx_t spos;
+
+       for (spos = 0; spos < duk_get_top(ctx); ++spos) {
+               s = duk_safe_to_lstring(ctx, spos, &slen);
+
+               duk_safe_to_lstring(ctx, 0, &slen);
+
+               exc = dom_string_create_interned((const uint8_t *)s, slen, 
&value);
+               if (exc != DOM_NO_ERR) return 0;
+
+               exc = dom_tokenlist_remove(priv->tokens, value);
+               dom_string_unref(value);
+       }
+       
+       return 0;
+%}
+
+method DOMTokenList::contains()
+%{
+       dom_exception exc;
+       dom_string *value;
+       duk_size_t slen;
+       const char *s = duk_safe_to_lstring(ctx, 0, &slen);
+       bool present = false;
+
+       exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+       if (exc != DOM_NO_ERR) return 0;
+
+       exc = dom_tokenlist_contains(priv->tokens, value, &present);
+       dom_string_unref(value);
+       if (exc != DOM_NO_ERR) return 0;
+
+       duk_push_boolean(ctx, present);
+       
+       return 1;
+%}
+
+method DOMTokenList::toggle()
+%{
+       dom_exception exc;
+       dom_string *value;
+       duk_size_t slen;
+       const char *s = duk_require_lstring(ctx, 0, &slen);
+       bool toggle_set = duk_get_top(ctx) > 1;
+       bool toggle = duk_opt_boolean(ctx, 1, 0);
+       bool present;
+
+       exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+       if (exc != DOM_NO_ERR) return 0;
+
+       exc = dom_tokenlist_contains(priv->tokens, value, &present);
+       if (exc != DOM_NO_ERR) {
+               dom_string_unref(value);
+               return 0;
+       }
+
+       /* Decision matrix is based on present, toggle_set, and toggle */
+       if (toggle_set) {
+               if (toggle) {
+                       exc = dom_tokenlist_add(priv->tokens, value);
+               } else {
+                       exc = dom_tokenlist_remove(priv->tokens, value);
+               }
+       } else {
+               if (present) {
+                       exc = dom_tokenlist_add(priv->tokens, value);
+               } else {
+                       exc = dom_tokenlist_remove(priv->tokens, value);
+               }
+       }
+       dom_string_unref(value);
+
+       return 0;
+%}
\ No newline at end of file
diff --git a/content/handlers/javascript/duktape/Element.bnd 
b/content/handlers/javascript/duktape/Element.bnd
index a965a6c..ff0686f 100644
--- a/content/handlers/javascript/duktape/Element.bnd
+++ b/content/handlers/javascript/duktape/Element.bnd
@@ -392,6 +392,37 @@ setter Element::className ()
        return 0;
 %}
 
+getter Element::classList ()
+%{
+       dom_exception exc;
+       dom_tokenlist *tokens;
+
+       duk_set_top(ctx, 0);
+       duk_push_this(ctx);
+       duk_get_prop_string(ctx, 0, MAGIC(classList));
+
+       if (duk_is_undefined(ctx, -1)) {
+               duk_pop(ctx);
+               exc = dom_tokenlist_create((dom_element *)priv->parent.node, 
corestring_dom_class, &tokens);
+               if (exc != DOM_NO_ERR) return 0; /* Coerced to undefined */
+
+               /* Create a settable tokenlist - While the IDL says this isn't 
settable, all browsers
+                * seem to make it settable, so we'll permit it too
+                */
+               duk_push_pointer(ctx, tokens);
+               if (dukky_create_object(ctx, PROTO_NAME(DOMSETTABLETOKENLIST), 
1) != DUK_EXEC_SUCCESS) {
+                       dom_tokenlist_unref(tokens);
+                       NSLOG(dukky, DEBUG, "Unable to create 
DOMSettableTokenList object");
+                       return 0; /* Coerced to undefined */
+               }
+               dom_tokenlist_unref(tokens);
+               duk_dup(ctx, -1);
+               duk_put_prop_string(ctx, 0, MAGIC(classList));
+       }
+
+       return 1;
+%}
+
 getter Element::innerHTML()
 %{
        duk_push_lstring(ctx, "", 0);
diff --git a/content/handlers/javascript/duktape/netsurf.bnd 
b/content/handlers/javascript/duktape/netsurf.bnd
index 651c2fd..483f347 100644
--- a/content/handlers/javascript/duktape/netsurf.bnd
+++ b/content/handlers/javascript/duktape/netsurf.bnd
@@ -60,6 +60,8 @@ struct dom_html_br_element;
 #include "Document.bnd"
 #include "Node.bnd"
 #include "NodeList.bnd"
+#include "DOMTokenList.bnd"
+#include "DOMSettableTokenList.bnd"
 #include "NamedNodeMap.bnd"
 #include "Element.bnd"
 #include "HTMLCollection.bnd"
diff --git a/content/handlers/javascript/duktape/polyfill.js 
b/content/handlers/javascript/duktape/polyfill.js
index 5f02156..6c85ce1 100644
--- a/content/handlers/javascript/duktape/polyfill.js
+++ b/content/handlers/javascript/duktape/polyfill.js
@@ -83,3 +83,21 @@ if (!Array.from) {
     };
   }());
 }
+
+// DOMTokenList formatter, in theory we can remove this if we do the 
stringifier IDL support
+
+DOMTokenList.prototype.toString = function () {
+  if (this.length == 0) {
+    return "";
+  }
+
+  var ret = this.item(0);
+  for (var index = 1; index < this.length; index++) {
+    ret = ret + " " + this.item(index);
+  }
+
+  return ret;
+}
+
+// Inherit the same toString for settable lists
+DOMSettableTokenList.prototype.toString = DOMTokenList.prototype.toString;
\ No newline at end of file
diff --git a/docs/UnimplementedJavascript.md b/docs/UnimplementedJavascript.md
index 4a2f02e..0d21dc8 100644
--- a/docs/UnimplementedJavascript.md
+++ b/docs/UnimplementedJavascript.md
@@ -170,7 +170,6 @@ getter | Element::namespaceURI(string);
 getter | Element::prefix(string);
 getter | Element::localName(string);
 getter | Element::tagName(string);
-getter | Element::classList(user);
 getter | Element::outerHTML(string);
 setter | Element::outerHTML(string);
 getter | Element::children(user);
@@ -597,10 +596,6 @@ method | CanvasRenderingContext2D::arcTo();
 method | CanvasRenderingContext2D::rect();
 method | CanvasRenderingContext2D::arc();
 method | CanvasRenderingContext2D::ellipse();
-getter | CanvasRenderingContext2D::width(unsigned long);
-setter | CanvasRenderingContext2D::width(unsigned long);
-getter | CanvasRenderingContext2D::height(unsigned long);
-setter | CanvasRenderingContext2D::height(unsigned long);
 getter | CanvasRenderingContext2D::currentTransform(user);
 setter | CanvasRenderingContext2D::currentTransform(user);
 getter | CanvasRenderingContext2D::globalAlpha(double);
@@ -647,8 +642,6 @@ method | HTMLCanvasElement::setContext();
 method | HTMLCanvasElement::transferControlToProxy();
 method | HTMLCanvasElement::toDataURL();
 method | HTMLCanvasElement::toBlob();
-setter | HTMLCanvasElement::width(unsigned long);
-setter | HTMLCanvasElement::height(unsigned long);
 getter | HTMLTemplateElement::content(user);
 getter | HTMLScriptElement::async(boolean);
 setter | HTMLScriptElement::async(boolean);
@@ -1344,14 +1337,6 @@ method | HTMLAllCollection::namedItem();
 getter | HTMLAllCollection::length(unsigned long);
 method | XMLSerializer::serializeToString();
 method | DOMParser::parseFromString();
-method | DOMTokenList::item();
-method | DOMTokenList::contains();
-method | DOMTokenList::add();
-method | DOMTokenList::remove();
-method | DOMTokenList::toggle();
-getter | DOMTokenList::length(unsigned long);
-getter | DOMSettableTokenList::value(string);
-setter | DOMSettableTokenList::value(string);
 method | NodeFilter::acceptNode();
 method | TreeWalker::parentNode();
 method | TreeWalker::firstChild();
@@ -1560,5 +1545,5 @@ method | EventListener::handleEvent();
 method | CustomEvent::initCustomEvent();
 getter | CustomEvent::detail(any);
 
- 1554 unimplemented bindings
+ 1539 unimplemented bindings
 
diff --git a/test/js/class-list.html b/test/js/class-list.html
new file mode 100644
index 0000000..4c73283
--- /dev/null
+++ b/test/js/class-list.html
@@ -0,0 +1,29 @@
+<html>
+    <head>
+        <title>Class List (and other token lists?)</title>
+    <style>
+        .bad { background-color: red; }
+        .ok { background-color: green; }
+    </style>
+    </head>
+    <body>
+        <h1>This is a set of demonstrators for the token list 
Element.classList</h1>
+        <h2>This first is taken from the MDN for DOMTokenList</h2>
+        <span id="demo1" class="    d   d e f bad"></span>
+        <script>
+            var span = document.getElementById("demo1");
+            var classes = span.classList;
+            classes.add("x", "d", "g");
+            classes.remove("e", "g");
+            classes.toggle("d"); // Toggles d off
+            classes.toggle("q", false); // Forces q off (won't be present)
+            classes.toggle("d"); // Toggles d on
+            classes.toggle("d", true); // Forces d on (won't toggle it off 
again)
+            if (classes.contains("d")) {
+                classes.add("ok")
+                classes.remove("bad")
+                span.textContent = "span classList is \"" + classes + '"';
+            }
+        </script>
+    </body>
+</html>
diff --git a/test/js/index.html b/test/js/index.html
index 0329467..6d2c654 100644
--- a/test/js/index.html
+++ b/test/js/index.html
@@ -104,6 +104,7 @@
 <li><a href="assorted-log-doc-write.html">console.log and 
document.write</a></li>
 <li><a href="wikipedia-lcm.html">Example from wikipedia</a></li>
 <li><a href="verify-instanceofness.html">Check instanceof behaviour</a></li>
+<li><a href="class-list.html">Class list (and other token lists?)</a></li>
 <li><a href="mandelbrot.html">Canvas/ImageData Mandelbrot ploter</a></li>
 <li><a href="life.html">Game of Life</a></li>
 </ul>


-- 
NetSurf Browser
_______________________________________________
netsurf-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to