| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | '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;
 |