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