зеркало из https://github.com/mozilla/lightbeam.git
179 строки
6.2 KiB
JavaScript
179 строки
6.2 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
(function (global) {
|
|
|
|
'use strict';
|
|
|
|
var visualizations = {};
|
|
var currentFilter;
|
|
var userSettings = {};
|
|
var allConnections = [];
|
|
var g = global;
|
|
|
|
// Constants for indexes of properties in array format
|
|
const SOURCE = 0;
|
|
const TARGET = 1;
|
|
const TIMESTAMP = 2;
|
|
const CONTENT_TYPE = 3;
|
|
const COOKIE = 4;
|
|
const SOURCE_VISITED = 5;
|
|
const SECURE = 6;
|
|
const SOURCE_PATH_DEPTH = 7;
|
|
const SOURCE_QUERY_DEPTH = 8;
|
|
const SOURCE_SUB = 9;
|
|
const TARGET_SUB = 10;
|
|
const METHOD = 11;
|
|
const STATUS = 12;
|
|
const CACHEABLE = 13;
|
|
const FROM_PRIVATE_MODE = 14;
|
|
|
|
var vizcanvas = document.querySelector('.vizcanvas');
|
|
var mapDocument, mapcanvas;
|
|
document.querySelector('.world-map').addEventListener('load', function (event) {
|
|
mapDocument = event.target.contentDocument;
|
|
mapcanvas = mapDocument.querySelector('.mapcanvas');
|
|
initMap(mapcanvas, mapDocument);
|
|
}, false);
|
|
|
|
// Export everything
|
|
global.visualizations = visualizations;
|
|
global.currentFilter = currentFilter;
|
|
global.userSettings = userSettings;
|
|
global.vizcanvas = vizcanvas;
|
|
global.allConnections = allConnections;
|
|
|
|
// DOM Utility
|
|
|
|
global.elem = function elem(name, attributes, children) {
|
|
// name is the tagName of an element
|
|
// [optional] attributes can be null or undefined, or an object of key/values to setAttribute on, attribute values can be functions to call to get the actual value
|
|
// [optional] children can be an element, text or an array (or null or undefined). If an array, can contain strings or elements
|
|
var e = document.createElement(name);
|
|
var val;
|
|
if (attributes && (Array.isArray(attributes) || attributes.nodeName || typeof attributes === 'string')) {
|
|
children = attributes;
|
|
attributes = null;
|
|
}
|
|
try {
|
|
if (attributes) {
|
|
Object.keys(attributes).forEach(function (key) {
|
|
if (attributes[key] === null || attributes[key] === undefined) return;
|
|
if (typeof attributes[key] === 'function') {
|
|
val = attributes[key](key, attributes);
|
|
if (val) {
|
|
e.setAttribute(key, val);
|
|
}
|
|
} else {
|
|
e.setAttribute(key, attributes[key]);
|
|
}
|
|
});
|
|
}
|
|
} catch (err) {
|
|
console.log('attributes: not what we think they are: %o', attributes);
|
|
}
|
|
if (children) {
|
|
if (!Array.isArray(children)) {
|
|
children = [children]; // convenience, allow a single argument vs. an array of one
|
|
}
|
|
children.forEach(function (child) {
|
|
if (child.nodeName) {
|
|
e.appendChild(child);
|
|
} else {
|
|
// assumes child is a string
|
|
e.appendChild(document.createTextNode(child));
|
|
}
|
|
});
|
|
}
|
|
return e;
|
|
};
|
|
|
|
window.addEventListener('load', function (evt) {
|
|
console.debug('window onload');
|
|
self.port.emit('uiready');
|
|
// Wire up events
|
|
document.querySelector('[data-value=Graph]').setAttribute("data-selected", true);
|
|
var visualizationName = "graph";
|
|
console.debug("current vis", visualizationName);
|
|
g.currentVisualization = visualizations[visualizationName];
|
|
switchVisualization(visualizationName);
|
|
});
|
|
|
|
function initCap(str) {
|
|
return str[0].toUpperCase() + str.slice(1);
|
|
}
|
|
|
|
global.switchVisualization = function switchVisualization(name) {
|
|
// var startTime = Date.now();
|
|
console.debug('switchVisualizations(' + name + ')');
|
|
if (g.currentVisualization != visualizations[name]) {
|
|
g.currentVisualization.emit('remove');
|
|
}
|
|
g.currentVisualization = visualizations[name];
|
|
resetAdditionalUI();
|
|
g.currentVisualization.emit('init');
|
|
self.port.emit("prefChanged", {
|
|
defaultVisualization: name
|
|
});
|
|
// console.log('it took %s ms to switch visualizations', Date.now() - startTime);
|
|
};
|
|
|
|
function resetAdditionalUI() {
|
|
// toggle off info panel
|
|
document.querySelector("#content").classList.remove("showinfo");
|
|
var activeTab = document.querySelector(".info-panel-controls ul li.active");
|
|
if (activeTab) { // make the active tab inactive, if any
|
|
activeTab.classList.remove("active");
|
|
activeTab.querySelector("img").classList.remove("hidden");
|
|
activeTab.querySelector("i").classList.add("hidden");
|
|
}
|
|
// hide all help sections
|
|
document.querySelector(".help-content .graph-view-help").classList.add("hidden");
|
|
document.querySelector(".help-content .list-view-help").classList.add("hidden");
|
|
// show vizcanvas again in case it is hidden
|
|
document.querySelector(".vizcanvas").classList.remove("hide");
|
|
// toggle footer section accordingly
|
|
document.querySelector(".graph-footer").classList.add("hidden");
|
|
document.querySelector(".list-footer").classList.add("hidden");
|
|
var vizName = g.currentVisualization.name;
|
|
document.querySelector("." + vizName + "-footer").classList.remove("hidden");
|
|
}
|
|
|
|
|
|
/****************************************
|
|
* Format date string
|
|
*/
|
|
global.formattedDate = function formattedDate(date, format) {
|
|
var d = (typeof date == "number") ? new Date(date) : date;
|
|
var month = ["Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"][d.getMonth()];
|
|
var formatted = month + " " + d.getDate() + ", " + d.getFullYear();
|
|
if (format == "long") {
|
|
var dayInWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][d.getDay()];
|
|
formatted = dayInWeek + ", " + formatted + " " + ((d.getHours() == 12) ? 12 : (d.getHours() % 12)) + ':' + d.toLocaleFormat('%M') + ['AM', 'PM'][Math.floor(d.getHours() / 12)];
|
|
}
|
|
return formatted;
|
|
};
|
|
|
|
|
|
global.singularOrPluralNoun = function singularOrPluralNoun(num, str) {
|
|
if (typeof num != "number") {
|
|
num = parseFloat(num);
|
|
}
|
|
return (num !== 1) ? str + "s" : str;
|
|
};
|
|
|
|
/****************************************
|
|
* update Stats Bar
|
|
*/
|
|
global.updateStatsBar = function updateStatsBar() {
|
|
var dateSince = "just now";
|
|
if (global.allConnections.length > 0) {
|
|
dateSince = formattedDate(global.allConnections[0][2]);
|
|
}
|
|
document.querySelector(".top-bar .date-gathered").textContent = dateSince;
|
|
document.querySelector(".top-bar .third-party-sites").textContent = aggregate.trackerCount + " " + singularOrPluralNoun(aggregate.trackerCount, "THIRD PARTY SITE");
|
|
document.querySelector(".top-bar .first-party-sites").textContent = aggregate.siteCount + " " + singularOrPluralNoun(aggregate.siteCount, "SITE");
|
|
};
|
|
|
|
})(this);
|