2017-10-03 12:17:14 +02:00
|
|
|
/* 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(){
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const {createCollapser, createActionButtons} = require("./gui");
|
|
|
|
|
|
|
|
const actions = [];
|
|
|
|
const addAction = function addAction(action){
|
|
|
|
actions.push(action);
|
|
|
|
};
|
|
|
|
|
|
|
|
const addToContainer = function(){
|
|
|
|
const container = document.getElementById("prints");
|
2018-08-27 22:09:51 +02:00
|
|
|
container.querySelector("li").textContent = browser.i18n.getMessage("pleaseWait");
|
2017-10-03 12:17:14 +02:00
|
|
|
var first = true;
|
|
|
|
|
|
|
|
return function addToContainer(domainNotification){
|
|
|
|
if (first){
|
|
|
|
container.innerHTML = "";
|
|
|
|
first = false;
|
|
|
|
}
|
|
|
|
container.appendChild(domainNotification.node());
|
|
|
|
};
|
|
|
|
}();
|
|
|
|
|
|
|
|
const DomainNotification = function DomainNotification(domain, messageId){
|
|
|
|
this.domain = domain;
|
|
|
|
this.messageId = messageId;
|
2018-08-27 22:09:51 +02:00
|
|
|
this.extraNotifications = 0;
|
2017-10-03 12:17:14 +02:00
|
|
|
addToContainer(this);
|
|
|
|
this.update();
|
|
|
|
};
|
|
|
|
|
|
|
|
DomainNotification.prototype.notifications = function notifications(){
|
|
|
|
const notifications = [];
|
|
|
|
this.notifications = function(){
|
|
|
|
return notifications;
|
|
|
|
};
|
|
|
|
return notifications;
|
|
|
|
};
|
|
|
|
|
|
|
|
DomainNotification.prototype.addNotification = function addNotification(notification){
|
2018-08-27 22:09:51 +02:00
|
|
|
if (this.notifications().length > 250){
|
|
|
|
this.addMore();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
this.notifications().push(notification);
|
|
|
|
this.notificationsNode().appendChild(notification.node());
|
|
|
|
}
|
2017-10-03 12:17:14 +02:00
|
|
|
this.update();
|
|
|
|
};
|
2018-08-27 22:09:51 +02:00
|
|
|
|
|
|
|
DomainNotification.prototype.addMore = function addMore(){
|
|
|
|
this.notificationsNode().appendChild(document.createTextNode("..."));
|
|
|
|
this.extraNotifications += 1;
|
|
|
|
this.addMore = function addMore(){
|
|
|
|
this.extraNotifications += 1;
|
|
|
|
};
|
|
|
|
};
|
2017-10-03 12:17:14 +02:00
|
|
|
|
|
|
|
// DOM node creation functions
|
|
|
|
|
|
|
|
DomainNotification.prototype.node = function node(){
|
|
|
|
const node = document.createElement("li");
|
2018-08-22 22:16:49 +02:00
|
|
|
node.className = "domainPrints collapsible collapsed";
|
2017-10-03 12:17:14 +02:00
|
|
|
node.appendChild(this.textNode());
|
2017-10-14 12:24:53 +02:00
|
|
|
node.appendChild(document.createElement("br"));
|
2017-10-03 12:17:14 +02:00
|
|
|
createCollapser(node);
|
|
|
|
node.appendChild(this.notificationsNode());
|
|
|
|
|
|
|
|
this.node = function(){
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
DomainNotification.prototype.update = function update(){
|
|
|
|
this.updateTextNode();
|
|
|
|
this.notifications().forEach(function(notification){
|
|
|
|
notification.update();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
DomainNotification.prototype.textNode = function textNode(){
|
|
|
|
const node = document.createElement("span");
|
2017-10-14 12:24:53 +02:00
|
|
|
node.className = "text";
|
2017-10-03 12:17:14 +02:00
|
|
|
this.textNode = function(){
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
var messageParts = browser.i18n.getMessage(this.messageId).split(/\{url\}/g);
|
|
|
|
node.appendChild(document.createTextNode(messageParts.shift()));
|
|
|
|
while (messageParts.length){
|
|
|
|
var urlSpan = document.createElement("span");
|
|
|
|
urlSpan.textContent = this.domain;
|
2017-10-14 12:24:53 +02:00
|
|
|
urlSpan.className = "url hasHiddenActions";
|
|
|
|
urlSpan.appendChild(this.actionsNode());
|
2017-10-03 12:17:14 +02:00
|
|
|
node.appendChild(urlSpan);
|
|
|
|
node.appendChild(document.createTextNode(messageParts.shift()));
|
|
|
|
}
|
|
|
|
node.appendChild(document.createTextNode(" ("));
|
|
|
|
var countSpan = document.createElement("span");
|
|
|
|
countSpan.className = "count";
|
2017-10-10 13:38:55 +02:00
|
|
|
countSpan.textContent = "0";
|
2017-10-03 12:17:14 +02:00
|
|
|
node.appendChild(countSpan);
|
|
|
|
node.appendChild(document.createTextNode(") "));
|
|
|
|
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
DomainNotification.prototype.updateTextNode = function updateTextNode(){
|
|
|
|
const node = this.textNode();
|
|
|
|
const notifications = this.notifications();
|
|
|
|
const urls = notifications.map(function(not){
|
|
|
|
return not.url;
|
|
|
|
}).filter(function(url, i, urls){
|
|
|
|
return urls.indexOf(url) === i;
|
|
|
|
}).join("\n");
|
2018-08-27 22:09:51 +02:00
|
|
|
node.querySelectorAll(".url").forEach((urlSpan) => {
|
|
|
|
urlSpan.title = urls + (this.extraNotifications? "\n...": "");
|
2017-10-03 12:17:14 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
node.title = notifications.map(function(notification){
|
|
|
|
return notification.timestamp + ": " + notification.functionName;
|
2018-08-27 22:09:51 +02:00
|
|
|
}).join("\n") + this.extraNotifications? "\n...": "";
|
2017-10-03 12:17:14 +02:00
|
|
|
|
2018-08-27 22:09:51 +02:00
|
|
|
node.querySelectorAll(".count").forEach((countSpan) => {
|
|
|
|
countSpan.textContent = notifications.length + this.extraNotifications;
|
2017-10-03 12:17:14 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
DomainNotification.prototype.actionsNode = function actionsNode(){
|
|
|
|
const node = document.createElement("div");
|
2017-10-14 12:24:53 +02:00
|
|
|
node.className = "actions";
|
2017-10-03 12:17:14 +02:00
|
|
|
createActionButtons(node, actions, this.domain);
|
|
|
|
this.actionsNode = function(){
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
|
|
|
|
DomainNotification.prototype.notificationsNode = function notificationsNode(){
|
|
|
|
const node = document.createElement("ul");
|
|
|
|
node.className = "notifications collapsing";
|
|
|
|
this.notificationsNode = function(){
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
|
|
|
|
const domains = new Map();
|
|
|
|
const domainNotification = function(domain, messageId){
|
|
|
|
var domainNotification = domains.get(domain + messageId);
|
|
|
|
if (!domainNotification){
|
|
|
|
domainNotification = new DomainNotification(domain, messageId);
|
|
|
|
domains.set(domain + messageId, domainNotification);
|
|
|
|
}
|
|
|
|
return domainNotification;
|
|
|
|
};
|
|
|
|
domainNotification.addAction = addAction;
|
|
|
|
window.scope.domainNotification = domainNotification;
|
|
|
|
}());
|