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.
153 lines
5.0 KiB
153 lines
5.0 KiB
// https://github.com/kangax/detect-global
|
|
|
|
// tweaked to run without a UI.
|
|
|
|
(function () {
|
|
function getPropertyDescriptors(object) {
|
|
var props = { };
|
|
for (var prop in object) {
|
|
|
|
// nerfing for firefox who goes crazy over some objects like sessionStorage
|
|
try {
|
|
|
|
props[prop] = {
|
|
type: typeof object[prop],
|
|
value: object[prop]
|
|
};
|
|
|
|
} catch(e){
|
|
props[prop] = {};
|
|
}
|
|
}
|
|
return props;
|
|
}
|
|
|
|
function getCleanWindow() {
|
|
var elIframe = document.createElement('iframe');
|
|
elIframe.style.display = 'none';
|
|
|
|
var ref = document.getElementsByTagName('script')[0];
|
|
ref.parentNode.insertBefore(elIframe, ref);
|
|
|
|
elIframe.src = 'about:blank';
|
|
return elIframe.contentWindow;
|
|
}
|
|
|
|
function appendControl(el, name) {
|
|
var elCheckbox = document.createElement('input');
|
|
elCheckbox.type = 'checkbox';
|
|
elCheckbox.checked = true;
|
|
elCheckbox.id = '__' + name;
|
|
|
|
var elLabel = document.createElement('label');
|
|
elLabel.htmlFor = '__' + name;
|
|
elLabel.innerHTML = 'Exclude ' + name + ' properties?';
|
|
elLabel.style.marginLeft = '0.5em';
|
|
|
|
var elWrapper = document.createElement('p');
|
|
elWrapper.style.marginBottom = '0.5em';
|
|
|
|
elWrapper.appendChild(elCheckbox);
|
|
elWrapper.appendChild(elLabel);
|
|
|
|
el.appendChild(elWrapper);
|
|
}
|
|
|
|
function appendAnalyze(el) {
|
|
var elAnalyze = document.createElement('button');
|
|
elAnalyze.id = '__analyze';
|
|
elAnalyze.innerHTML = 'Analyze';
|
|
elAnalyze.style.marginTop = '1em';
|
|
el.appendChild(elAnalyze);
|
|
}
|
|
|
|
function appendCancel(el) {
|
|
var elCancel = document.createElement('a');
|
|
elCancel.href = '#';
|
|
elCancel.innerHTML = 'Cancel';
|
|
elCancel.style.cssText = 'color:#eee;margin-left:0.5em;';
|
|
elCancel.onclick = function() {
|
|
el.parentNode.removeChild(el);
|
|
return false;
|
|
};
|
|
el.appendChild(elCancel);
|
|
}
|
|
|
|
function initConfigPopup() {
|
|
var el = document.createElement('div');
|
|
|
|
el.style.cssText = 'position:fixed; left:10px; top:10px; width:300px; background:rgba(50,50,50,0.9);' +
|
|
'-moz-border-radius:10px; padding:1em; color: #eee; text-align: left;' +
|
|
'font-family: "Helvetica Neue", Verdana, Arial, sans serif; z-index: 99999;';
|
|
|
|
for (var prop in propSets) {
|
|
appendControl(el, prop);
|
|
}
|
|
|
|
appendAnalyze(el);
|
|
appendCancel(el);
|
|
|
|
var ref = document.getElementsByTagName('script')[0];
|
|
ref.parentNode.insertBefore(el, ref);
|
|
}
|
|
|
|
function getPropsCount(object) {
|
|
var count = 0;
|
|
for (var prop in object) {
|
|
count++;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
function shouldDeleteProperty(propToCheck) {
|
|
for (var prop in propSets) {
|
|
var elCheckbox = document.getElementById('__' + prop);
|
|
var isPropInSet = propSets[prop].indexOf(propToCheck) > -1;
|
|
if (isPropInSet && (elCheckbox ? elCheckbox.checked : true) ) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
function analyze() {
|
|
var global = (function(){ return this; })(),
|
|
globalProps = getPropertyDescriptors(global),
|
|
cleanWindow = getCleanWindow();
|
|
|
|
for (var prop in cleanWindow) {
|
|
if (globalProps[prop]) {
|
|
delete globalProps[prop];
|
|
}
|
|
}
|
|
for (var prop in globalProps) {
|
|
if (shouldDeleteProperty(prop)) {
|
|
delete globalProps[prop];
|
|
}
|
|
}
|
|
|
|
window.__globalsCount = getPropsCount(globalProps);
|
|
window.__globals = globalProps;
|
|
|
|
window.console && console.log('Total number of global properties: ' + __globalsCount);
|
|
window.console && console.dir(__globals);
|
|
}
|
|
|
|
var propSets = {
|
|
'Prototype': '$$ $A $F $H $R $break $continue $w Abstract Ajax Class Enumerable Element Field Form ' +
|
|
'Hash Insertion ObjectRange PeriodicalExecuter Position Prototype Selector Template Toggle Try'.split(' '),
|
|
|
|
'Scriptaculous': 'Autocompleter Builder Control Draggable Draggables Droppables Effect Sortable SortableObserver Sound Scriptaculous'.split(' '),
|
|
'Firebug': 'loadFirebugConsole console _getFirebugConsoleElement _FirebugConsole _FirebugCommandLine _firebug'.split(' '),
|
|
'Mozilla': 'Components XPCNativeWrapper XPCSafeJSObjectWrapper getInterface netscape GetWeakReference GeckoActiveXObject'.split(' '),
|
|
'GoogleAnalytics': 'gaJsHost gaGlobal _gat _gaq pageTracker'.split(' '),
|
|
'lazyGlobals': 'onhashchange'.split(' ')
|
|
};
|
|
|
|
// initConfigPopup(); // disable because we're going UI-less.
|
|
|
|
var analyzeElem = document.getElementById('__analyze');
|
|
analyzeElem && (analyzeElem.onclick = analyze);
|
|
|
|
analyze(); // and assign total added globals to window.__globalsCount
|
|
|
|
})();
|