[d565449] | 1 | 'use strict';
|
---|
| 2 |
|
---|
| 3 | var keysShim;
|
---|
| 4 | if (!Object.keys) {
|
---|
| 5 | // modified from https://github.com/es-shims/es5-shim
|
---|
| 6 | var has = Object.prototype.hasOwnProperty;
|
---|
| 7 | var toStr = Object.prototype.toString;
|
---|
| 8 | var isArgs = require('./isArguments'); // eslint-disable-line global-require
|
---|
| 9 | var isEnumerable = Object.prototype.propertyIsEnumerable;
|
---|
| 10 | var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
|
---|
| 11 | var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
|
---|
| 12 | var dontEnums = [
|
---|
| 13 | 'toString',
|
---|
| 14 | 'toLocaleString',
|
---|
| 15 | 'valueOf',
|
---|
| 16 | 'hasOwnProperty',
|
---|
| 17 | 'isPrototypeOf',
|
---|
| 18 | 'propertyIsEnumerable',
|
---|
| 19 | 'constructor'
|
---|
| 20 | ];
|
---|
| 21 | var equalsConstructorPrototype = function (o) {
|
---|
| 22 | var ctor = o.constructor;
|
---|
| 23 | return ctor && ctor.prototype === o;
|
---|
| 24 | };
|
---|
| 25 | var excludedKeys = {
|
---|
| 26 | $applicationCache: true,
|
---|
| 27 | $console: true,
|
---|
| 28 | $external: true,
|
---|
| 29 | $frame: true,
|
---|
| 30 | $frameElement: true,
|
---|
| 31 | $frames: true,
|
---|
| 32 | $innerHeight: true,
|
---|
| 33 | $innerWidth: true,
|
---|
| 34 | $onmozfullscreenchange: true,
|
---|
| 35 | $onmozfullscreenerror: true,
|
---|
| 36 | $outerHeight: true,
|
---|
| 37 | $outerWidth: true,
|
---|
| 38 | $pageXOffset: true,
|
---|
| 39 | $pageYOffset: true,
|
---|
| 40 | $parent: true,
|
---|
| 41 | $scrollLeft: true,
|
---|
| 42 | $scrollTop: true,
|
---|
| 43 | $scrollX: true,
|
---|
| 44 | $scrollY: true,
|
---|
| 45 | $self: true,
|
---|
| 46 | $webkitIndexedDB: true,
|
---|
| 47 | $webkitStorageInfo: true,
|
---|
| 48 | $window: true
|
---|
| 49 | };
|
---|
| 50 | var hasAutomationEqualityBug = (function () {
|
---|
| 51 | /* global window */
|
---|
| 52 | if (typeof window === 'undefined') { return false; }
|
---|
| 53 | for (var k in window) {
|
---|
| 54 | try {
|
---|
| 55 | if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
|
---|
| 56 | try {
|
---|
| 57 | equalsConstructorPrototype(window[k]);
|
---|
| 58 | } catch (e) {
|
---|
| 59 | return true;
|
---|
| 60 | }
|
---|
| 61 | }
|
---|
| 62 | } catch (e) {
|
---|
| 63 | return true;
|
---|
| 64 | }
|
---|
| 65 | }
|
---|
| 66 | return false;
|
---|
| 67 | }());
|
---|
| 68 | var equalsConstructorPrototypeIfNotBuggy = function (o) {
|
---|
| 69 | /* global window */
|
---|
| 70 | if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
|
---|
| 71 | return equalsConstructorPrototype(o);
|
---|
| 72 | }
|
---|
| 73 | try {
|
---|
| 74 | return equalsConstructorPrototype(o);
|
---|
| 75 | } catch (e) {
|
---|
| 76 | return false;
|
---|
| 77 | }
|
---|
| 78 | };
|
---|
| 79 |
|
---|
| 80 | keysShim = function keys(object) {
|
---|
| 81 | var isObject = object !== null && typeof object === 'object';
|
---|
| 82 | var isFunction = toStr.call(object) === '[object Function]';
|
---|
| 83 | var isArguments = isArgs(object);
|
---|
| 84 | var isString = isObject && toStr.call(object) === '[object String]';
|
---|
| 85 | var theKeys = [];
|
---|
| 86 |
|
---|
| 87 | if (!isObject && !isFunction && !isArguments) {
|
---|
| 88 | throw new TypeError('Object.keys called on a non-object');
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | var skipProto = hasProtoEnumBug && isFunction;
|
---|
| 92 | if (isString && object.length > 0 && !has.call(object, 0)) {
|
---|
| 93 | for (var i = 0; i < object.length; ++i) {
|
---|
| 94 | theKeys.push(String(i));
|
---|
| 95 | }
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 | if (isArguments && object.length > 0) {
|
---|
| 99 | for (var j = 0; j < object.length; ++j) {
|
---|
| 100 | theKeys.push(String(j));
|
---|
| 101 | }
|
---|
| 102 | } else {
|
---|
| 103 | for (var name in object) {
|
---|
| 104 | if (!(skipProto && name === 'prototype') && has.call(object, name)) {
|
---|
| 105 | theKeys.push(String(name));
|
---|
| 106 | }
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | if (hasDontEnumBug) {
|
---|
| 111 | var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
|
---|
| 112 |
|
---|
| 113 | for (var k = 0; k < dontEnums.length; ++k) {
|
---|
| 114 | if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
|
---|
| 115 | theKeys.push(dontEnums[k]);
|
---|
| 116 | }
|
---|
| 117 | }
|
---|
| 118 | }
|
---|
| 119 | return theKeys;
|
---|
| 120 | };
|
---|
| 121 | }
|
---|
| 122 | module.exports = keysShim;
|
---|