| 'use strict'; | |
| // Creates a <div> element, appends it to the document body and | |
| // removes the created element during test cleanup. | |
| function createDiv(test, doc) { | |
| return createElement(test, 'div', doc); | |
| } | |
| // Creates an element with the given |tagName|, appends it to the document body | |
| // and removes the created element during test cleanup. | |
| // If |tagName| is null or undefined, creates a <div> element. | |
| function createElement(test, tagName, doc) { | |
| if (!doc) { | |
| doc = document; | |
| } | |
| var element = doc.createElement(tagName || 'div'); | |
| doc.body.appendChild(element); | |
| test.add_cleanup(function() { | |
| element.remove(); | |
| }); | |
| return element; | |
| } | |
| // Convert px unit value to a Number | |
| function pxToNum(str) { | |
| return Number(String(str).match(/^(-?[\d.]+)px$/)[1]); | |
| } | |
| // Cubic bezier with control points (0, 0), (x1, y1), (x2, y2), and (1, 1). | |
| function cubicBezier(x1, y1, x2, y2) { | |
| function xForT(t) { | |
| var omt = 1-t; | |
| return 3 * omt * omt * t * x1 + 3 * omt * t * t * x2 + t * t * t; | |
| } | |
| function yForT(t) { | |
| var omt = 1-t; | |
| return 3 * omt * omt * t * y1 + 3 * omt * t * t * y2 + t * t * t; | |
| } | |
| function tForX(x) { | |
| // Binary subdivision. | |
| var mint = 0, maxt = 1; | |
| for (var i = 0; i < 30; ++i) { | |
| var guesst = (mint + maxt) / 2; | |
| var guessx = xForT(guesst); | |
| if (x < guessx) { | |
| maxt = guesst; | |
| } else { | |
| mint = guesst; | |
| } | |
| } | |
| return (mint + maxt) / 2; | |
| } | |
| return function bezierClosure(x) { | |
| if (x == 0) { | |
| return 0; | |
| } | |
| if (x == 1) { | |
| return 1; | |
| } | |
| return yForT(tForX(x)); | |
| } | |
| } |