Created
March 4, 2017 12:05
-
-
Save bga/030075cdad2c5d8a2909d77e53d14be7 to your computer and use it in GitHub Desktop.
canvas+Math api versioning
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var demoSeasonDate = "2015/02" | |
(function() { | |
var whiteListApi = function(methodNames) { | |
var C = function(nativeObj) { | |
this._nativeObj = nativeObj | |
} | |
methodNames.forEach(function(methodName) { | |
C.prototype[methodName] = function() { | |
return this._nativeObj[methodName].apply(this._nativeObj, arguments) | |
} | |
}) | |
return C | |
} | |
var Canvas2D2015_02 = whiteListApi([ | |
"canvas", | |
"currentTransform", | |
"direction", | |
"fillStyle", | |
"filter", | |
"font", | |
"globalAlpha", | |
"globalCompositeOperation", | |
"imageSmoothingEnabled", | |
"lineCap", | |
"lineDashOffset", | |
"lineJoin", | |
"lineWidth", | |
"miterLimit", | |
"shadowBlur", | |
"shadowColor", | |
"shadowOffsetX", | |
"shadowOffsetY", | |
"strokeStyle", | |
"textAlign", | |
"textBaseline", | |
"addHitRegion", | |
"arc", | |
"arcTo", | |
"asyncDrawXULElement", | |
"beginPath", | |
"bezierCurveTo", | |
"clearHitRegions", | |
"clearRect", | |
"clip", | |
"closePath", | |
"createImageData", | |
"createLinearGradient", | |
"createPattern", | |
"createRadialGradient", | |
"drawFocusIfNeeded", | |
"drawImage", | |
"drawWindow", | |
"ellipse", | |
"fill", | |
"fillRect", | |
"fillText", | |
"getImageData", | |
"getLineDash", | |
"isPointInPath", | |
"isPointInStroke", | |
"lineTo", | |
"measureText", | |
"moveTo", | |
"putImageData", | |
"quadraticCurveTo", | |
"rect", | |
"removeHitRegion", | |
"resetTransform", | |
"restore", | |
"rotate", | |
"save", | |
"scale", | |
"scrollPathIntoView", | |
"setLineDash", | |
"setTransform", | |
"stroke", | |
"strokeRect", | |
"strokeText", | |
"transform", | |
"translate", | |
]) | |
var nativeGetContext = HTMLCanvasElement.prototype.getContext | |
HTMLCanvasElement.prototype.getContext = function(name) { | |
if(name == "2d") { | |
var nativeCanvas2dContext = nativeGetContext.apply(this, [name]) | |
return new ({ | |
"2010": Canvas2d2010Original, | |
"2010XMas": Canvas2d2010XMas, | |
"2011XMas": Canvas2d2010XMas, | |
"2013/02": Canvas2D2013_02 | |
"2015/02": Canvas2D2015_02 | |
}[demoSeasonDate] || console.assert(false, "Unsupported demoSeasonDate", demoSeasonDate))(nativeCanvas2dContext) | |
} | |
} | |
})() | |
var genSetFromList = function(list) { | |
return list | |
} | |
var excludeSet = function(from, what) { | |
return from.filter(function(v) { | |
return what.indexOf(v) != -1 | |
}) | |
} | |
if(null) { | |
} | |
else if(demoSeasonDate == "2010/05") { | |
excludeSet(genSetFromList(Object.getOwnPropertyNames(Math)), genSetFromList([ | |
"E", | |
"LN10", | |
"LN2", | |
"LOG10E", | |
"LOG2E", | |
"PI", | |
"SQRT1_2", | |
"SQRT2", | |
"abs", | |
"acos", | |
"asin", | |
"atan", | |
"atan2", | |
"ceil", | |
"cos", | |
"exp", | |
"floor", | |
"log", | |
"max", | |
"min", | |
"pow", | |
"random", | |
"round", | |
"sin", | |
"sqrt", | |
"tan", | |
])).forEach(function(i) { | |
delete(Math[i]) | |
}) | |
} | |
with((function() { | |
var getNativeObject = function(v) { | |
return v.toString._nativeObj | |
} | |
return hideNewApi({ | |
"2010/05": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/89519] | |
Math: { | |
E: Math.E, | |
LN10: Math.LN10, | |
LN2: Math.LN2, | |
LOG10E: Math.LOG10E, | |
LOG2E: Math.LOG2E, | |
PI: Math.PI, | |
SQRT1_2: SQRT1_2, | |
SQRT2: SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
asin: Math.asin, | |
atan: Math.atan, | |
atan2: Math.atan2, | |
ceil: Math.ceil, | |
cos: Math.cos, | |
exp: Math.exp, | |
floor: Math.floor, | |
log: Math.log, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sin: Math.sin, | |
sqrt: Math.sqrt, | |
tan: Math.tan | |
} | |
}, | |
"2010/11": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/89519] | |
Math: { | |
E: Math.E, | |
LN10: Math.LN10, | |
LN2: Math.LN2, | |
LOG10E: Math.LOG10E, | |
LOG2E: Math.LOG2E, | |
PI: Math.PI, | |
SQRT1_2: SQRT1_2, | |
SQRT2: SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
asin: Math.asin, | |
atan: Math.atan, | |
atan2: Math.atan2, | |
ceil: Math.ceil, | |
cos: Math.cos, | |
exp: Math.exp, | |
floor: Math.floor, | |
log: Math.log, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sin: Math.sin, | |
sqrt: Math.sqrt, | |
tan: Math.tan | |
} | |
}, | |
"2011/03": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/89519] | |
Math: { | |
E: Math.E, | |
LN10: Math.LN10, | |
LN2: Math.LN2, | |
LOG10E: Math.LOG10E, | |
LOG2E: Math.LOG2E, | |
PI: Math.PI, | |
SQRT1_2: SQRT1_2, | |
SQRT2: SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
asin: Math.asin, | |
atan: Math.atan, | |
atan2: Math.atan2, | |
ceil: Math.ceil, | |
cos: Math.cos, | |
exp: Math.exp, | |
floor: Math.floor, | |
log: Math.log, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sin: Math.sin, | |
sqrt: Math.sqrt, | |
tan: Math.tan | |
} | |
}, | |
"2012/02": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/89523] | |
Math: { | |
E: Math.E, | |
LN10: Math.LN10, | |
LN2: Math.LN2, | |
LOG10E: Math.LOG10E, | |
LOG2E: Math.LOG2E, | |
PI: Math.PI, | |
SQRT1_2: SQRT1_2, | |
SQRT2: SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
asin: Math.asin, | |
atan: Math.atan, | |
atan2: Math.atan2, | |
ceil: Math.ceil, | |
cos: Math.cos, | |
exp: Math.exp, | |
floor: Math.floor, | |
log: Math.log, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sin: Math.sin, | |
sqrt: Math.sqrt, | |
tan: Math.tan | |
} | |
}, | |
"2013/02": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/340119] | |
Math: { | |
E: Math.E, | |
LN10: Math.LN10, | |
LN2: Math.LN2, | |
LOG10E: Math.LOG10E, | |
LOG2E: Math.LOG2E, | |
PI: Math.PI, | |
SQRT1_2: SQRT1_2, | |
SQRT2: SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
asin: Math.asin, | |
atan: Math.atan, | |
atan2: Math.atan2, | |
ceil: Math.ceil, | |
cos: Math.cos, | |
exp: Math.exp, | |
floor: Math.floor, | |
log: Math.log, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sin: Math.sin, | |
sqrt: Math.sqrt, | |
tan: Math.tan | |
} | |
}, | |
"2014/02": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/485197] | |
Math: { | |
E: Math.LN2, | |
LN2: Math.LN2, | |
LN10: Math.LN10, | |
LOG2E: Math.LOG2E, | |
LOG10E: Math.LOG10E, | |
PI: Math.PI, | |
SQRT1_2: Math.SQRT1_2, | |
SQRT2: Math.SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
acosh: Math.acosh, | |
asin: Math.asin, | |
asinh: Math.asinh, | |
atan: Math.atan, | |
atanh: Math.atanh, | |
atan2: Math.atan2, | |
cbrt: Math.cbrt, | |
ceil: Math.ceil, | |
cos: Math.cos, | |
cosh: Math.cosh, | |
exp: Math.exp, | |
expm1: Math.expm1, | |
floor: Math.floor, | |
fround: Math.fround, | |
hypot: Math.hypot, | |
imul: Math.imul, | |
log: Math.log, | |
log1p: Math.log1p, | |
log10: Math.log10, | |
log2: Math.log2, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sign: Math.sign, | |
sin: Math.sin, | |
sinh: Math.sinh, | |
sqrt: Math.sqrt, | |
tan: Math.tan, | |
tanh: Math.tanh, | |
trunc: Math.trunc | |
} | |
}, | |
"2015/02": { | |
//# [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math$revision/719777] | |
Math: { | |
E: Math.E, | |
LN10: Math.LN10, | |
LN2: Math.LN2, | |
LOG10E: Math.LOG10E, | |
LOG2E: Math.LOG2E, | |
PI: Math.PI, | |
SQRT1_2: Math.SQRT1_2, | |
SQRT2: Math.SQRT2, | |
abs: Math.abs, | |
acos: Math.acos, | |
acosh: Math.acosh, | |
asin: Math.asin, | |
asinh: Math.asinh, | |
atan: Math.atan, | |
atanh: Math.atanh, | |
atan2: Math.atan2, | |
cbrt: Math.cbrt, | |
ceil: Math.ceil, | |
clz32: Math.clz32, | |
cos: Math.cos, | |
cosh: Math.cosh, | |
exp: Math.exp, | |
expm1: Math.expm1, | |
floor: Math.floor, | |
fround: Math.fround, | |
hypot: Math.hypot, | |
imul: Math.imul, | |
log: Math.log, | |
log1p: Math.log1p, | |
log10: Math.log10, | |
log2: Math.log2, | |
max: Math.max, | |
min: Math.min, | |
pow: Math.pow, | |
random: Math.random, | |
round: Math.round, | |
sign: Math.sign, | |
sin: Math.sin, | |
sinh: Math.sinh, | |
sqrt: Math.sqrt, | |
tan: Math.tan, | |
tanh: Math.tanh, | |
trunc: Math.trunc | |
} | |
} | |
}) | |
})()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment