Gitweb links:

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

The branch, master has been updated
       via  f365e75407bc9964c09613f80de0b64eb6055975 (commit)
      from  bb3e0e51f1cbae2134b7891c44a24bccc2f7f255 (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 -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=f365e75407bc9964c09613f80de0b64eb6055975
commit f365e75407bc9964c09613f80de0b64eb6055975
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    Dukky: Support console logging better
    
    Add a polyfill for Array.from(), and fix the console formatter so that
    it won't keep exploding.  This should improve matters in the tests.
    
    Signed-off-by: Daniel Silverstone <[email protected]>

diff --git a/content/handlers/javascript/duktape/Makefile 
b/content/handlers/javascript/duktape/Makefile
index 7c9e60a..d15b712 100644
--- a/content/handlers/javascript/duktape/Makefile
+++ b/content/handlers/javascript/duktape/Makefile
@@ -4,7 +4,10 @@
 # Included by javascript/Makefile
 #
 
-content/handlers/javascript/duktape/dukky.c: $(OBJROOT)/duktape/binding.h 
$(OBJROOT)/duktape/generics.js.inc
+content/handlers/javascript/duktape/dukky.c: \
+       $(OBJROOT)/duktape/binding.h \
+       $(OBJROOT)/duktape/generics.js.inc \
+       $(OBJROOT)/duktape/polyfill.js.inc
 
 BINDINGS := $(wildcard content/handlers/javascript/duktape/*.bnd)
 
@@ -15,6 +18,13 @@ $(OBJROOT)/duktape/generics.js.inc: 
content/handlers/javascript/duktape/generics
        $(Q)xxd -i $< [email protected]
        $(Q)sed -e 
's/content_handlers_javascript_duktape_generics_js/generics_js/' [email protected] > $@
 
+# Generator for the C include representing the polyfill.js
+$(OBJROOT)/duktape/polyfill.js.inc: 
content/handlers/javascript/duktape/polyfill.js
+       $(Q)$(MKDIR) -p $(OBJROOT)/duktape
+       $(VQ)echo "     XXD: $<"
+       $(Q)xxd -i $< [email protected]
+       $(Q)sed -e 
's/content_handlers_javascript_duktape_polyfill_js/polyfill_js/' [email protected] > $@
+
 # ensure genbind generates debugging files
 GBFLAGS+=-D
 
diff --git a/content/handlers/javascript/duktape/dukky.c 
b/content/handlers/javascript/duktape/dukky.c
index 491c5c2..cd3549e 100644
--- a/content/handlers/javascript/duktape/dukky.c
+++ b/content/handlers/javascript/duktape/dukky.c
@@ -39,6 +39,7 @@
 
 #include "duktape/binding.h"
 #include "duktape/generics.js.inc"
+#include "duktape/polyfill.js.inc"
 
 #include "duktape.h"
 #include "dukky.h"
@@ -681,6 +682,25 @@ jsobject *js_newcompartment(jscontext *ctx, void 
*win_priv, void *doc_priv)
        duk_push_object(CTX);
        duk_put_global_string(CTX, EVENT_MAGIC);
 
+       /* Now load the polyfills */
+       /* ... */
+       duk_push_string(CTX, "polyfill.js");
+       /* ..., polyfill.js */
+       if (duk_pcompile_lstring_filename(CTX, DUK_COMPILE_EVAL,
+                                         (const char *)polyfill_js, 
polyfill_js_len) != 0) {
+               NSLOG(dukky, CRITICAL, "%s", duk_safe_to_string(CTX, -1));
+               NSLOG(dukky, CRITICAL, "Unable to compile polyfill.js, 
compartment aborted");
+               return NULL;
+       }
+       /* ..., (generics.js) */
+       if (dukky_pcall(CTX, 0, true) != 0) {
+               NSLOG(dukky, CRITICAL, "Unable to run polyfill.js, compartment 
aborted");
+               return NULL;
+       }
+       /* ..., result */
+       duk_pop(CTX);
+       /* ... */
+
        /* Now load the NetSurf table in */
        /* ... */
        duk_push_string(CTX, "generics.js");
diff --git a/content/handlers/javascript/duktape/generics.js 
b/content/handlers/javascript/duktape/generics.js
index 6850c9b..29beffc 100644
--- a/content/handlers/javascript/duktape/generics.js
+++ b/content/handlers/javascript/duktape/generics.js
@@ -44,7 +44,7 @@ var NetSurf = {
 
        const offset = target.search("%");
 
-       if (offset == -1 || offset >= target.length) {
+       if (offset == -1 || offset >= (target.length - 1)) {
            // We've a string, but the % either doesn't exist or is
            // at the end of it, so give up
            return Array.from(arguments);
diff --git a/content/handlers/javascript/duktape/polyfill.js 
b/content/handlers/javascript/duktape/polyfill.js
new file mode 100644
index 0000000..7fa4611
--- /dev/null
+++ b/content/handlers/javascript/duktape/polyfill.js
@@ -0,0 +1,85 @@
+/* Polyfiller for Duktape for NetSurf
+ *
+ * This JavaScript will be loaded into compartments before the generics
+ *
+ * We only care for the side-effects of this, be careful.
+ */
+
+// Production steps of ECMA-262, Edition 6, 22.1.2.1
+if (!Array.from) {
+  Array.from = (function () {
+    var toStr = Object.prototype.toString;
+    var isCallable = function (fn) {
+      return typeof fn === 'function' || toStr.call(fn) === '[object 
Function]';
+    };
+    var toInteger = function (value) {
+      var number = Number(value);
+      if (isNaN(number)) { return 0; }
+      if (number === 0 || !isFinite(number)) { return number; }
+      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
+    };
+    var maxSafeInteger = Math.pow(2, 53) - 1;
+    var toLength = function (value) {
+      var len = toInteger(value);
+      return Math.min(Math.max(len, 0), maxSafeInteger);
+    };
+
+    // The length property of the from method is 1.
+    return function from(arrayLike/*, mapFn, thisArg */) {
+      // 1. Let C be the this value.
+      var C = this;
+
+      // 2. Let items be ToObject(arrayLike).
+      var items = Object(arrayLike);
+
+      // 3. ReturnIfAbrupt(items).
+      if (arrayLike == null) {
+        throw new TypeError('Array.from requires an array-like object - not 
null or undefined');
+      }
+
+      // 4. If mapfn is undefined, then let mapping be false.
+      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
+      var T;
+      if (typeof mapFn !== 'undefined') {
+        // 5. else
+        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
+        if (!isCallable(mapFn)) {
+          throw new TypeError('Array.from: when provided, the second argument 
must be a function');
+        }
+
+        // 5. b. If thisArg was supplied, let T be thisArg; else let T be 
undefined.
+        if (arguments.length > 2) {
+          T = arguments[2];
+        }
+      }
+
+      // 10. Let lenValue be Get(items, "length").
+      // 11. Let len be ToLength(lenValue).
+      var len = toLength(items.length);
+
+      // 13. If IsConstructor(C) is true, then
+      // 13. a. Let A be the result of calling the [[Construct]] internal 
method 
+      // of C with an argument list containing the single item len.
+      // 14. a. Else, Let A be ArrayCreate(len).
+      var A = isCallable(C) ? Object(new C(len)) : new Array(len);
+
+      // 16. Let k be 0.
+      var k = 0;
+      // 17. Repeat, while k < len… (also steps a - h)
+      var kValue;
+      while (k < len) {
+        kValue = items[k];
+        if (mapFn) {
+          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, 
kValue, k);
+        } else {
+          A[k] = kValue;
+        }
+        k += 1;
+      }
+      // 18. Let putStatus be Put(A, "length", len, true).
+      A.length = len;
+      // 20. Return A.
+      return A;
+    };
+  }());
+}


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

Summary of changes:
 content/handlers/javascript/duktape/Makefile    |   12 +++-
 content/handlers/javascript/duktape/dukky.c     |   20 ++++++
 content/handlers/javascript/duktape/generics.js |    2 +-
 content/handlers/javascript/duktape/polyfill.js |   85 +++++++++++++++++++++++
 4 files changed, 117 insertions(+), 2 deletions(-)
 create mode 100644 content/handlers/javascript/duktape/polyfill.js

diff --git a/content/handlers/javascript/duktape/Makefile 
b/content/handlers/javascript/duktape/Makefile
index 7c9e60a..d15b712 100644
--- a/content/handlers/javascript/duktape/Makefile
+++ b/content/handlers/javascript/duktape/Makefile
@@ -4,7 +4,10 @@
 # Included by javascript/Makefile
 #
 
-content/handlers/javascript/duktape/dukky.c: $(OBJROOT)/duktape/binding.h 
$(OBJROOT)/duktape/generics.js.inc
+content/handlers/javascript/duktape/dukky.c: \
+       $(OBJROOT)/duktape/binding.h \
+       $(OBJROOT)/duktape/generics.js.inc \
+       $(OBJROOT)/duktape/polyfill.js.inc
 
 BINDINGS := $(wildcard content/handlers/javascript/duktape/*.bnd)
 
@@ -15,6 +18,13 @@ $(OBJROOT)/duktape/generics.js.inc: 
content/handlers/javascript/duktape/generics
        $(Q)xxd -i $< [email protected]
        $(Q)sed -e 
's/content_handlers_javascript_duktape_generics_js/generics_js/' [email protected] > $@
 
+# Generator for the C include representing the polyfill.js
+$(OBJROOT)/duktape/polyfill.js.inc: 
content/handlers/javascript/duktape/polyfill.js
+       $(Q)$(MKDIR) -p $(OBJROOT)/duktape
+       $(VQ)echo "     XXD: $<"
+       $(Q)xxd -i $< [email protected]
+       $(Q)sed -e 
's/content_handlers_javascript_duktape_polyfill_js/polyfill_js/' [email protected] > $@
+
 # ensure genbind generates debugging files
 GBFLAGS+=-D
 
diff --git a/content/handlers/javascript/duktape/dukky.c 
b/content/handlers/javascript/duktape/dukky.c
index 491c5c2..cd3549e 100644
--- a/content/handlers/javascript/duktape/dukky.c
+++ b/content/handlers/javascript/duktape/dukky.c
@@ -39,6 +39,7 @@
 
 #include "duktape/binding.h"
 #include "duktape/generics.js.inc"
+#include "duktape/polyfill.js.inc"
 
 #include "duktape.h"
 #include "dukky.h"
@@ -681,6 +682,25 @@ jsobject *js_newcompartment(jscontext *ctx, void 
*win_priv, void *doc_priv)
        duk_push_object(CTX);
        duk_put_global_string(CTX, EVENT_MAGIC);
 
+       /* Now load the polyfills */
+       /* ... */
+       duk_push_string(CTX, "polyfill.js");
+       /* ..., polyfill.js */
+       if (duk_pcompile_lstring_filename(CTX, DUK_COMPILE_EVAL,
+                                         (const char *)polyfill_js, 
polyfill_js_len) != 0) {
+               NSLOG(dukky, CRITICAL, "%s", duk_safe_to_string(CTX, -1));
+               NSLOG(dukky, CRITICAL, "Unable to compile polyfill.js, 
compartment aborted");
+               return NULL;
+       }
+       /* ..., (generics.js) */
+       if (dukky_pcall(CTX, 0, true) != 0) {
+               NSLOG(dukky, CRITICAL, "Unable to run polyfill.js, compartment 
aborted");
+               return NULL;
+       }
+       /* ..., result */
+       duk_pop(CTX);
+       /* ... */
+
        /* Now load the NetSurf table in */
        /* ... */
        duk_push_string(CTX, "generics.js");
diff --git a/content/handlers/javascript/duktape/generics.js 
b/content/handlers/javascript/duktape/generics.js
index 6850c9b..29beffc 100644
--- a/content/handlers/javascript/duktape/generics.js
+++ b/content/handlers/javascript/duktape/generics.js
@@ -44,7 +44,7 @@ var NetSurf = {
 
        const offset = target.search("%");
 
-       if (offset == -1 || offset >= target.length) {
+       if (offset == -1 || offset >= (target.length - 1)) {
            // We've a string, but the % either doesn't exist or is
            // at the end of it, so give up
            return Array.from(arguments);
diff --git a/content/handlers/javascript/duktape/polyfill.js 
b/content/handlers/javascript/duktape/polyfill.js
new file mode 100644
index 0000000..7fa4611
--- /dev/null
+++ b/content/handlers/javascript/duktape/polyfill.js
@@ -0,0 +1,85 @@
+/* Polyfiller for Duktape for NetSurf
+ *
+ * This JavaScript will be loaded into compartments before the generics
+ *
+ * We only care for the side-effects of this, be careful.
+ */
+
+// Production steps of ECMA-262, Edition 6, 22.1.2.1
+if (!Array.from) {
+  Array.from = (function () {
+    var toStr = Object.prototype.toString;
+    var isCallable = function (fn) {
+      return typeof fn === 'function' || toStr.call(fn) === '[object 
Function]';
+    };
+    var toInteger = function (value) {
+      var number = Number(value);
+      if (isNaN(number)) { return 0; }
+      if (number === 0 || !isFinite(number)) { return number; }
+      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
+    };
+    var maxSafeInteger = Math.pow(2, 53) - 1;
+    var toLength = function (value) {
+      var len = toInteger(value);
+      return Math.min(Math.max(len, 0), maxSafeInteger);
+    };
+
+    // The length property of the from method is 1.
+    return function from(arrayLike/*, mapFn, thisArg */) {
+      // 1. Let C be the this value.
+      var C = this;
+
+      // 2. Let items be ToObject(arrayLike).
+      var items = Object(arrayLike);
+
+      // 3. ReturnIfAbrupt(items).
+      if (arrayLike == null) {
+        throw new TypeError('Array.from requires an array-like object - not 
null or undefined');
+      }
+
+      // 4. If mapfn is undefined, then let mapping be false.
+      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
+      var T;
+      if (typeof mapFn !== 'undefined') {
+        // 5. else
+        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
+        if (!isCallable(mapFn)) {
+          throw new TypeError('Array.from: when provided, the second argument 
must be a function');
+        }
+
+        // 5. b. If thisArg was supplied, let T be thisArg; else let T be 
undefined.
+        if (arguments.length > 2) {
+          T = arguments[2];
+        }
+      }
+
+      // 10. Let lenValue be Get(items, "length").
+      // 11. Let len be ToLength(lenValue).
+      var len = toLength(items.length);
+
+      // 13. If IsConstructor(C) is true, then
+      // 13. a. Let A be the result of calling the [[Construct]] internal 
method 
+      // of C with an argument list containing the single item len.
+      // 14. a. Else, Let A be ArrayCreate(len).
+      var A = isCallable(C) ? Object(new C(len)) : new Array(len);
+
+      // 16. Let k be 0.
+      var k = 0;
+      // 17. Repeat, while k < len… (also steps a - h)
+      var kValue;
+      while (k < len) {
+        kValue = items[k];
+        if (mapFn) {
+          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, 
kValue, k);
+        } else {
+          A[k] = kValue;
+        }
+        k += 1;
+      }
+      // 18. Let putStatus be Put(A, "length", len, true).
+      A.length = len;
+      // 20. Return A.
+      return A;
+    };
+  }());
+}


-- 
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