This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
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.
141 lines
3.5 KiB
141 lines
3.5 KiB
'use strict'; |
|
|
|
// modified from https://github.com/es-shims/es5-shim |
|
var has = Object.prototype.hasOwnProperty; |
|
var toStr = Object.prototype.toString; |
|
var slice = Array.prototype.slice; |
|
var isArgs = require('./isArguments'); |
|
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, |
|
$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; |
|
} |
|
}; |
|
|
|
var 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; |
|
}; |
|
|
|
keysShim.shim = function shimObjectKeys() { |
|
if (Object.keys) { |
|
var keysWorksWithArguments = (function () { |
|
// Safari 5.0 bug |
|
return (Object.keys(arguments) || '').length === 2; |
|
}(1, 2)); |
|
if (!keysWorksWithArguments) { |
|
var originalKeys = Object.keys; |
|
Object.keys = function keys(object) { // eslint-disable-line func-name-matching |
|
if (isArgs(object)) { |
|
return originalKeys(slice.call(object)); |
|
} else { |
|
return originalKeys(object); |
|
} |
|
}; |
|
} |
|
} else { |
|
Object.keys = keysShim; |
|
} |
|
return Object.keys || keysShim; |
|
}; |
|
|
|
module.exports = keysShim;
|
|
|