UNPKG

3.22 kBJavaScriptView Raw
1'use strict';
2
3var keysShim;
4if (!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}
122module.exports = keysShim;