| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <script src="../resources/js-test-pre.js"></script> |
| </head> |
| <body> |
| <pre id='console'></pre> |
| <canvas></canvas> |
| |
| <script> |
| "use strict"; |
| |
| const log = console.log.bind(console); |
| const canvas = document.querySelector("canvas"); |
| const ctx = canvas.getContext("2d"); |
| |
| let callCount = 0; |
| function makeValue(x) { |
| return { |
| valueOf() { ++callCount; return x; } |
| }; |
| } |
| |
| let array = [makeValue(1), makeValue(2), makeValue(3)]; |
| ctx.setLineDash(array); |
| let a = ctx.getLineDash(); |
| log("Using an array but with objects with valueOf()"); |
| log(a); |
| |
| ctx.setLineDash([1,2,3]); |
| let b = ctx.getLineDash(); |
| log(b); |
| |
| if (a.toString() !== b.toString()) |
| throw new Error("Bad result. They should be equal."); |
| |
| log(`callCount: ${callCount}`); |
| if (callCount !== 3) |
| throw new Error("Bad result. callCount should be 3."); |
| |
| |
| let iter = [][Symbol.iterator](); |
| let iterProto = Object.getPrototypeOf(iter); |
| let oldNext = iterProto.next; |
| |
| callCount = 0; |
| function hackedNext() { |
| ++callCount; |
| |
| let val = oldNext.call(this); |
| if ("value" in val) { |
| val.value++; |
| } |
| return val; |
| } |
| const obj = { |
| valueOf: function() { |
| iterProto.next = hackedNext; |
| return 2; |
| } |
| }; |
| array = [1, obj, 3]; |
| ctx.setLineDash(array); |
| b = ctx.getLineDash(); |
| log(`${b}`); |
| |
| iterProto.next = oldNext; |
| ctx.setLineDash([1,2,3]); |
| a = ctx.getLineDash(); |
| log(a); |
| if (a.toString() !== b.toString()) |
| throw new Error("Bad result. They should be equal."); |
| |
| log(`callCount: ${callCount}`); |
| if (callCount !== 0) |
| throw new Error("Bad result. callCount should be 0."); |
| |
| </script> |
| |
| <script src="../resources/js-test-post.js"></script> |
| |
| </body> |
| </html> |