You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.1 KiB
122 lines
3.1 KiB
'use strict'; |
|
|
|
var keysShim; |
|
if (!Object.keys) { |
|
// modified from https://github.com/es-shims/es5-shim |
|
var has = Object.prototype.hasOwnProperty; |
|
var toStr = Object.prototype.toString; |
|
var isArgs = require('./isArguments'); // eslint-disable-line global-require |
|
var isEnumerable = Object.prototype.propertyIsEnumerable; |
|
var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); |
|
var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); |
|
var dontEnums = [ |
|
'toString', |
|
'toLocaleString', |
|
'valueOf', |
|
'hasOwnProperty', |
|
'isPrototypeOf', |
|
'propertyIsEnumerable', |
|
'constructor' |
|
]; |
|
var equalsConstructorPrototype = function (o) { |
|
var ctor = o.constructor; |
|
return ctor && ctor.prototype === o; |
|
}; |
|
var excludedKeys = { |
|
$applicationCache: true, |
|
$console: true, |
|
$external: true, |
|
$frame: true, |
|
$frameElement: true, |
|
$frames: true, |
|
$innerHeight: true, |
|
$innerWidth: true, |
|
$onmozfullscreenchange: true, |
|
$onmozfullscreenerror: true, |
|
$outerHeight: true, |
|
$outerWidth: true, |
|
$pageXOffset: true, |
|
$pageYOffset: true, |
|
$parent: true, |
|
$scrollLeft: true, |
|
$scrollTop: true, |
|
$scrollX: true, |
|
$scrollY: true, |
|
$self: true, |
|
$webkitIndexedDB: true, |
|
$webkitStorageInfo: true, |
|
$window: true |
|
}; |
|
var hasAutomationEqualityBug = (function () { |
|
/* global window */ |
|
if (typeof window === 'undefined') { return false; } |
|
for (var k in window) { |
|
try { |
|
if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { |
|
try { |
|
equalsConstructorPrototype(window[k]); |
|
} catch (e) { |
|
return true; |
|
} |
|
} |
|
} catch (e) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}()); |
|
var equalsConstructorPrototypeIfNotBuggy = function (o) { |
|
/* global window */ |
|
if (typeof window === 'undefined' || !hasAutomationEqualityBug) { |
|
return equalsConstructorPrototype(o); |
|
} |
|
try { |
|
return equalsConstructorPrototype(o); |
|
} catch (e) { |
|
return false; |
|
} |
|
}; |
|
|
|
keysShim = function keys(object) { |
|
var isObject = object !== null && typeof object === 'object'; |
|
var isFunction = toStr.call(object) === '[object Function]'; |
|
var isArguments = isArgs(object); |
|
var isString = isObject && toStr.call(object) === '[object String]'; |
|
var theKeys = []; |
|
|
|
if (!isObject && !isFunction && !isArguments) { |
|
throw new TypeError('Object.keys called on a non-object'); |
|
} |
|
|
|
var skipProto = hasProtoEnumBug && isFunction; |
|
if (isString && object.length > 0 && !has.call(object, 0)) { |
|
for (var i = 0; i < object.length; ++i) { |
|
theKeys.push(String(i)); |
|
} |
|
} |
|
|
|
if (isArguments && object.length > 0) { |
|
for (var j = 0; j < object.length; ++j) { |
|
theKeys.push(String(j)); |
|
} |
|
} else { |
|
for (var name in object) { |
|
if (!(skipProto && name === 'prototype') && has.call(object, name)) { |
|
theKeys.push(String(name)); |
|
} |
|
} |
|
} |
|
|
|
if (hasDontEnumBug) { |
|
var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); |
|
|
|
for (var k = 0; k < dontEnums.length; ++k) { |
|
if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { |
|
theKeys.push(dontEnums[k]); |
|
} |
|
} |
|
} |
|
return theKeys; |
|
}; |
|
} |
|
module.exports = keysShim;
|
|
|