blob: 357e2ed0c4ca4133721d3fdb50cc0ae9055fbc54 [file] [log] [blame]
<!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>