diff --git a/test/index.html b/test/index.html index c76be6215..b49d07047 100644 --- a/test/index.html +++ b/test/index.html @@ -47,24 +47,37 @@ }()); function addBizarroMethods() { + var funcProto = Function.prototype, + objectProto = Object.prototype, + stringProto = String.prototype; + + var hasOwnProperty = objectProto.hasOwnProperty, + fnToString = funcProto.toString, + nativeString = fnToString.call(objectProto.toString), + propertyIsEnumerable = objectProto.propertyIsEnumerable, + reToString = /toString/g; + + function constant(value) { + return function() { + return value; + }; + } + function createToString(funcName) { + return constant(nativeString.replace(reToString, funcName)); + } // allow bypassing native checks - setProperty(Function.prototype, 'toString', (function() { + setProperty(funcProto, 'toString', (function() { function wrapper() { setProperty(funcProto, 'toString', fnToString); var result = hasOwnProperty.call(this, 'toString') ? this.toString() : fnToString.call(this); setProperty(funcProto, 'toString', wrapper); return result; } - var funcProto = Function.prototype, - fnToString = funcProto.toString, - hasOwnProperty = Object.prototype.hasOwnProperty; - - setProperty(funcProto, '_toString', fnToString); return wrapper; }())); // add extensions - Function.prototype._method = function() {}; + funcProto._method = function() {}; // set bad shims setProperty(Array, '_isArray', Array.isArray); @@ -85,7 +98,7 @@ setProperty(Object, '_keys', Object.keys); setProperty(Object, 'keys', function() {}); - setProperty(Object.prototype, 'hasOwnProperty', (function() { + setProperty(objectProto, 'hasOwnProperty', (function() { function wrapper(key) { if (key == '1' && this && typeof this == 'object' && this.length === 2 && hasOwnProperty.call(this, 'callee') && @@ -95,10 +108,6 @@ } return hasOwnProperty.call(this, key); } - var objectProto = Object.prototype, - hasOwnProperty = objectProto.hasOwnProperty, - propertyIsEnumerable = objectProto.propertyIsEnumerable; - setProperty(objectProto, '_hasOwnProperty', hasOwnProperty); return wrapper; }())); @@ -106,8 +115,8 @@ setProperty(Number, '_isFinite', Number.isFinite); setProperty(Number, 'isFinite', function() {}); - setProperty(String.prototype, '_contains', String.prototype.contains); - setProperty(String.prototype, 'contains', String.prototype._contains ? function() {} : Boolean); + setProperty(stringProto, '_contains', stringProto.contains); + setProperty(stringProto, 'contains', stringProto._contains ? function() {} : Boolean); setProperty(document, '_createDocumentFragment', document.createDocumentFragment); document.createDocumentFragment = function() {}; @@ -129,21 +138,21 @@ view.set(new Uint8Array(this)); return newBuffer; } - function constant(value) { - return function() { - return value; - }; - } - var reToString = /toString/g, - nativeString = Function.prototype.toString.call(toString), - bufferToString = constant(nativeString.replace(reToString, 'ArrayBuffer')), - sliceToString = constant(nativeString.replace(reToString, 'slice')); - - setProperty(ArrayBuffer, 'toString', bufferToString); - setProperty(bufferSlice, 'toString', sliceToString); + setProperty(ArrayBuffer, 'toString', createToString('ArrayBuffer')); + setProperty(bufferSlice, 'toString', createToString('slice')); return ArrayBuffer; }(_ArrayBuffer)); } + if (!window.Float64Array && window.Uint8Array) { + Float64Array = (function() { + function Float64Array(buffer, byteOffset, length) { + return new Uint8Array(buffer, byteOffset || 0, length || buffer.byteLength); + } + setProperty(Float64Array, 'BYTES_PER_ELEMENT', 8); + setProperty(Float64Array, 'toString', createToString('Float64Array')); + return Float64Array; + }()); + } setProperty(window, 'WinRTError', Error); setProperty(window, 'exports', window); @@ -152,6 +161,10 @@ } function removeBizarroMethods() { + var funcProto = Function.prototype, + objectProto = Object.prototype, + stringProto = String.prototype; + if (Array._isArray) { setProperty(Array, 'isArray', Array._isArray); } else { @@ -187,13 +200,12 @@ } else { delete Number.isFinite; } - if (String.prototype._contains) { - setProperty(String.prototype, 'contains', String.prototype._contains); + if (stringProto._contains) { + setProperty(stringProto, 'contains', stringProto._contains); } else { - delete String.prototype.contains; + delete stringProto.contains; } - setProperty(Function.prototype, 'toString', Function.prototype._toString); - setProperty(Object.prototype, 'hasOwnProperty', Object.prototype._hasOwnProperty); + setProperty(objectProto, 'hasOwnProperty', objectProto._hasOwnProperty); document.createDocumentFragment = document._createDocumentFragment; setProperty(document, '_createDocumentFragment', undefined); @@ -202,7 +214,6 @@ ArrayBuffer = _ArrayBuffer; } setProperty(window, '_ArrayBuffer', undefined); - setProperty(window, 'WinRTError', undefined); setProperty(window, 'exports', undefined); @@ -211,18 +222,13 @@ delete Array._isArray; delete Date._now; - delete Function.prototype._method; - delete Function.prototype._toString; + delete funcProto._method; delete Object._create; delete Object._defineProperty; delete Object._getPrototypeOf; delete Object._keys; - delete Object.prototype._hasOwnProperty; - delete String.prototype._contains; - } - - if (!window.Float64Array && window.Uint8Array) { - Float64Array = Uint8Array; + delete objectProto._hasOwnProperty; + delete stringProto._contains; } QUnit.config.hidepassed = true; diff --git a/test/test.js b/test/test.js index fb719196b..242926f8f 100644 --- a/test/test.js +++ b/test/test.js @@ -328,6 +328,13 @@ return; } } + var fnToString = funcProto.toString, + nativeString = fnToString.call(toString), + reToString = /toString/g; + + function createToString(funcName) { + return _.constant(nativeString.replace(reToString, funcName)); + } // load ES6 Set shim require('./asset/set'); @@ -339,10 +346,9 @@ _._baseEach = baseEach.baseEach || baseEach['default'] || baseEach; } // allow bypassing native checks - var _fnToString = funcProto.toString; setProperty(funcProto, 'toString', function wrapper() { - setProperty(funcProto, 'toString', _fnToString); - var result = _.has(this, 'toString') ? this.toString() : _fnToString.call(this); + setProperty(funcProto, 'toString', fnToString); + var result = _.has(this, 'toString') ? this.toString() : fnToString.call(this); setProperty(funcProto, 'toString', wrapper); return result; }); @@ -374,7 +380,7 @@ if (key == '1' && _.isArguments(this) && _.isEqual(_.values(this), [0, 0])) { throw new Error; } - return _hasOwnProperty.call(this, key); + return _.has(this, key); }); var _isFinite = Number.isFinite; @@ -399,18 +405,20 @@ view.set(new Uint8Array(this)); return newBuffer; } - var reToString = /toString/g, - nativeString = _fnToString.call(toString), - bufferToString = _.constant(nativeString.replace(reToString, 'ArrayBuffer')), - sliceToString = _.constant(nativeString.replace(reToString, 'slice')); - - setProperty(ArrayBuffer, 'toString', bufferToString); - setProperty(bufferSlice, 'toString', sliceToString); + setProperty(ArrayBuffer, 'toString', createToString('ArrayBuffer')); + setProperty(bufferSlice, 'toString', createToString('slice')); return ArrayBuffer; }())); if (!root.Float64Array) { - setProperty(root, 'Float64Array', Uint8Array); + setProperty(root, 'Float64Array', (function() { + function Float64Array(buffer, byteOffset, length) { + return new Uint8Array(buffer, byteOffset || 0, length || buffer.byteLength); + } + setProperty(Float64Array, 'BYTES_PER_ELEMENT', 8); + setProperty(Float64Array, 'toString', createToString('Float64Array')); + return Float64Array; + }())); } // fake `WinRTError` setProperty(root, 'WinRTError', Error); @@ -437,7 +445,6 @@ setProperty(Object, 'keys', _keys); setProperty(objectProto, 'hasOwnProperty', _hasOwnProperty); - setProperty(funcProto, 'toString', _fnToString); if (_isFinite) { setProperty(Number, 'isFinite', _isFinite);