summaryrefslogtreecommitdiff
path: root/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js
diff options
context:
space:
mode:
Diffstat (limited to 'data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js')
-rw-r--r--data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js388
1 files changed, 227 insertions, 161 deletions
diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js
index 0b49068..688c248 100644
--- a/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js
+++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/sidebar.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <https://adblockplus.org/>,
- * Copyright (C) 2006-2015 Eyeo GmbH
+ * Copyright (C) 2006-2017 eyeo GmbH
*
* Adblock Plus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
@@ -20,11 +20,13 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm");
// Main browser window
var mainWin = parent;
+// Location of the content window that the list refers to
+var contentLocation = null;
+
// The window handler currently in use
var requestNotifier = null;
var cacheStorage = null;
-var noFlash = false;
// Matcher for disabled filters
var disabledMatcher = new CombinedMatcher();
@@ -33,6 +35,9 @@ var disabledMatcher = new CombinedMatcher();
var docDomainThirdParty = null;
var docDomainFirstParty = null;
+// Localized type names
+var localizedTypes = new Map();
+
function init() {
docDomainThirdParty = document.documentElement.getAttribute("docDomainThirdParty");
docDomainFirstParty = document.documentElement.getAttribute("docDomainFirstParty");
@@ -84,12 +89,18 @@ function init() {
wnd.setAttribute(attr, defaults[attr]);
}
- let {getBrowser, addBrowserLocationListener} = require("appSupport");
- Object.defineProperty(window, "content", { get: () => getBrowser(mainWin).contentWindow });
+ let {addBrowserLocationListener} = require("appSupport");
+ updateContentLocation();
// Initialize matcher for disabled filters
reloadDisabledFilters();
- FilterNotifier.addListener(reloadDisabledFilters);
+ FilterNotifier.on("subscription.added", reloadDisabledFilters);
+ FilterNotifier.on("subscription.removed", reloadDisabledFilters);
+ FilterNotifier.on("subscription.disabled", reloadDisabledFilters);
+ FilterNotifier.on("subscription.updated", reloadDisabledFilters);
+ FilterNotifier.on("filter.added", reloadDisabledFilters);
+ FilterNotifier.on("filter.removed", reloadDisabledFilters);
+ FilterNotifier.on("filter.disabled", reloadDisabledFilters);
Prefs.addListener(onPrefChange);
// Activate flasher
@@ -101,6 +112,9 @@ function init() {
// Install a progress listener to catch location changes
if (addBrowserLocationListener)
addBrowserLocationListener(mainWin, handleLocationChange, true);
+
+ for (let type of Policy.contentTypes.values())
+ localizedTypes.set(type, Utils.getString("type_label_" + type.toLowerCase()));
}
// To be called for a detached window when the main window has been closed
@@ -108,11 +122,42 @@ function mainUnload() {
parent.close();
}
+function updateContentLocation()
+{
+ let {getCurrentLocation} = require("appSupport");
+ let location = getCurrentLocation(mainWin);
+ if (location instanceof Ci.nsIURI)
+ location = location.spec;
+ contentLocation = location;
+}
+
+function getOuterWindowID()
+{
+ let {getBrowser} = require("appSupport");
+ let browser = getBrowser(mainWin);
+ if ("selectedBrowser" in browser)
+ browser = browser.selectedBrowser;
+ return browser.outerWindowID;
+}
+
+function getFilter(item)
+{
+ if ("filter" in item && item.filter)
+ return Filter.fromText(item.filter);
+ else
+ return null;
+}
+
// To be called on unload
function cleanUp() {
- flasher.stop();
requestNotifier.shutdown();
- FilterNotifier.removeListener(reloadDisabledFilters);
+ FilterNotifier.off("subscription.added", reloadDisabledFilters);
+ FilterNotifier.off("subscription.removed", reloadDisabledFilters);
+ FilterNotifier.off("subscription.disabled", reloadDisabledFilters);
+ FilterNotifier.off("subscription.updated", reloadDisabledFilters);
+ FilterNotifier.off("filter.added", reloadDisabledFilters);
+ FilterNotifier.off("filter.removed", reloadDisabledFilters);
+ FilterNotifier.off("filter.disabled", reloadDisabledFilters);
Prefs.removeListener(onPrefChange);
E("list").view = null;
@@ -177,15 +222,15 @@ function onSelectionChange() {
else
E("copy-command").setAttribute("disabled", "true");
- if (item && window.content)
+ if (item)
{
let key = item.location + " " + item.type + " " + item.docDomain;
- RequestNotifier.storeSelection(window.content, key);
+ RequestNotifier.storeWindowData(getOuterWindowID(), key);
treeView.itemToSelect = null;
}
- if (!noFlash)
- flasher.flash(item ? item.nodes : null);
+ if (requestNotifier)
+ requestNotifier.flashNodes(item ? item.ids : null, Prefs.flash_scrolltoitem);
}
function handleLocationChange()
@@ -193,12 +238,18 @@ function handleLocationChange()
if (requestNotifier)
requestNotifier.shutdown();
+ updateContentLocation();
treeView.clearData();
- treeView.itemToSelect = RequestNotifier.getSelection(window.content);
- requestNotifier = new RequestNotifier(window.content, function(wnd, node, item, scanComplete)
+
+ let outerWindowID = getOuterWindowID();
+ RequestNotifier.retrieveWindowData(outerWindowID, key =>
+ {
+ treeView.itemToSelect = key;
+ });
+ requestNotifier = new RequestNotifier(outerWindowID, (item, scanComplete) =>
{
if (item)
- treeView.addItem(node, item, scanComplete);
+ treeView.addItem(item, scanComplete);
});
cacheStorage = null;
}
@@ -210,10 +261,17 @@ function setMultilineContent(box, text, noRemove)
while (box.firstChild)
box.removeChild(box.firstChild);
- for (var i = 0; i < text.length; i += 80)
+ let lines = text.match(/.{1,80}/g);
+ if (lines.length > 7)
{
- var description = document.createElement("description");
- description.setAttribute("value", text.substr(i, 80));
+ // Text is too long to display in full so we cut out the middle part
+ lines = lines.slice(0,3).concat("\u2026", lines.slice(-3));
+ }
+
+ for (let line of lines)
+ {
+ let description = document.createElement("description");
+ description.setAttribute("value", line);
box.appendChild(description);
}
}
@@ -239,14 +297,12 @@ function fillInTooltip(e) {
return;
}
- let filter = ("filter" in item && item.filter ? item.filter : null);
- let size = ("tooltip" in item ? null : getItemSize(item));
+ let filter = getFilter(item);
let subscriptions = (filter ? filter.subscriptions.filter(function(subscription) { return !subscription.disabled; }) : []);
E("tooltipDummy").hidden = !("tooltip" in item);
E("tooltipAddressRow").hidden = ("tooltip" in item);
E("tooltipTypeRow").hidden = ("tooltip" in item);
- E("tooltipSizeRow").hidden = !size;
E("tooltipDocDomainRow").hidden = ("tooltip" in item || !item.docDomain);
E("tooltipFilterRow").hidden = !filter;
E("tooltipFilterSourceRow").hidden = !subscriptions.length;
@@ -255,19 +311,16 @@ function fillInTooltip(e) {
E("tooltipDummy").setAttribute("value", item.tooltip);
else
{
- E("tooltipAddress").parentNode.hidden = (item.typeDescr == "ELEMHIDE");
+ E("tooltipAddress").parentNode.hidden = (item.type == "ELEMHIDE");
setMultilineContent(E("tooltipAddress"), item.location);
- var type = item.localizedDescr;
+ var type = localizedTypes.get(item.type);
if (filter && filter instanceof WhitelistFilter)
type += " " + E("tooltipType").getAttribute("whitelisted");
- else if (filter && item.typeDescr != "ELEMHIDE")
+ else if (filter && item.type != "ELEMHIDE")
type += " " + E("tooltipType").getAttribute("filtered");
E("tooltipType").setAttribute("value", type);
- if (size)
- E("tooltipSize").setAttribute("value", size.join(" x "));
-
E("tooltipDocDomain").setAttribute("value", item.docDomain + " " + (item.thirdParty ? docDomainThirdParty : docDomainFirstParty));
}
@@ -289,32 +342,36 @@ function fillInTooltip(e) {
while (sourceElement.firstChild)
sourceElement.removeChild(sourceElement.firstChild);
for (let i = 0; i < subscriptions.length; i++)
- setMultilineContent(sourceElement, subscriptions[i].title, true);
+ setMultilineContent(sourceElement, getSubscriptionTitle(subscriptions[i]), true);
}
}
+ E("tooltipSizeRow").hidden = true;
+ if (!("tooltip" in item))
+ {
+ getItemSize(item, (size) =>
+ {
+ if (size)
+ {
+ E("tooltipSizeRow").hidden = false;
+ E("tooltipSize").setAttribute("value", size.join(" x "));
+ }
+ });
+ }
+
var showPreview = Prefs.previewimages && !("tooltip" in item);
- showPreview = showPreview && item.typeDescr == "IMAGE";
- showPreview = showPreview && (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter);
+ showPreview = showPreview && item.type == "IMAGE";
+ showPreview = showPreview && (!filter || filter.disabled || filter instanceof WhitelistFilter);
E("tooltipPreviewBox").hidden = true;
if (showPreview)
{
if (!cacheStorage)
{
let {Services} = Cu.import("resource://gre/modules/Services.jsm", null);
- // Cache v2 API is enabled by default starting with Gecko 32
- if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0)
- {
- let {LoadContextInfo} = Cu.import("resource://gre/modules/LoadContextInfo.jsm", null);
- let loadContext = content.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIWebNavigation)
- .QueryInterface(Ci.nsILoadContext);
- cacheStorage = Services.cache2.diskCacheStorage(LoadContextInfo.fromLoadContext(loadContext, false), false);
- }
- else
- cacheStorage = Services.cache.createSession("HTTP", Ci.nsICache.STORE_ANYWHERE, true);
+ let {LoadContextInfo} = Cu.import("resource://gre/modules/LoadContextInfo.jsm", null);
+ cacheStorage = Services.cache2.diskCacheStorage(LoadContextInfo.default, false);
}
-
+
let showTooltipPreview = function ()
{
E("tooltipPreview").setAttribute("src", item.location);
@@ -322,35 +379,17 @@ function fillInTooltip(e) {
};
try
{
- if (Ci.nsICacheStorage && cacheStorage instanceof Ci.nsICacheStorage)
- {
- cacheStorage.asyncOpenURI(Utils.makeURI(item.location), "", Ci.nsICacheStorage.OPEN_READONLY, {
- onCacheEntryCheck: function (entry, appCache)
- {
- return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED;
- },
- onCacheEntryAvailable: function (entry, isNew, appCache, status)
- {
- if (!isNew)
- showTooltipPreview();
- }
- });
- }
- else
- {
- cacheStorage.asyncOpenCacheEntry(item.location, Ci.nsICache.ACCESS_READ, {
- onCacheEntryAvailable: function(descriptor, accessGranted, status)
- {
- if (!descriptor)
- return;
- descriptor.close();
+ cacheStorage.asyncOpenURI(Utils.makeURI(item.location), "", Ci.nsICacheStorage.OPEN_READONLY, {
+ onCacheEntryCheck: function (entry, appCache)
+ {
+ return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED;
+ },
+ onCacheEntryAvailable: function (entry, isNew, appCache, status)
+ {
+ if (Components.isSuccessCode(status) && !isNew)
showTooltipPreview();
- },
- onCacheEntryDoomed: function(status)
- {
- }
- });
- }
+ }
+ });
}
catch (e)
{
@@ -388,14 +427,14 @@ function fillInContext(/**Event*/ e)
E("contextDisableFilter").hidden = true;
E("contextEnableFilter").hidden = true;
E("contextDisableOnSite").hidden = true;
- if ("filter" in item && item.filter)
+ let filter = getFilter(item);
+ if (filter)
{
- let filter = item.filter;
let menuItem = E(filter.disabled ? "contextEnableFilter" : "contextDisableFilter");
menuItem.setAttribute("label", menuItem.getAttribute("labeltempl").replace(/\?1\?/, filter.text));
menuItem.hidden = false;
- if (filter instanceof ActiveFilter && !filter.disabled && filter.subscriptions.length && !filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription)))
+ if (filter instanceof ActiveFilter && !filter.disabled && filter.subscriptions.length && !filter.subscriptions.some(subscription => !(subscription instanceof SpecialSubscription)))
{
let domain = null;
try {
@@ -411,34 +450,18 @@ function fillInContext(/**Event*/ e)
}
}
- E("contextWhitelist").hidden = ("tooltip" in item || !item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter || item.typeDescr == "ELEMHIDE");
+ E("contextWhitelist").hidden = ("tooltip" in item || !filter || filter.disabled || filter instanceof WhitelistFilter || item.type == "ELEMHIDE");
E("contextBlock").hidden = !E("contextWhitelist").hidden;
- E("contextBlock").setAttribute("disabled", "filter" in item && item.filter && !item.filter.disabled);
- E("contextEditFilter").setAttribute("disabled", !("filter" in item && item.filter));
- E("contextOpen").setAttribute("disabled", "tooltip" in item || item.typeDescr == "ELEMHIDE");
- E("contextFlash").setAttribute("disabled", "tooltip" in item || !(item.typeDescr in visual) || (item.filter && !item.filter.disabled && !(item.filter instanceof WhitelistFilter)));
- E("contextCopyFilter").setAttribute("disabled", !allItems.some(function(item) {return "filter" in item && item.filter}));
+ E("contextBlock").setAttribute("disabled", filter && !filter.disabled);
+ E("contextEditFilter").setAttribute("disabled", !filter);
+ E("contextOpen").setAttribute("disabled", "tooltip" in item || item.type == "ELEMHIDE");
+ E("contextFlash").setAttribute("disabled", "tooltip" in item || !(item.type in visual) || (filter && !filter.disabled && !(filter instanceof WhitelistFilter)));
+ E("contextCopyFilter").setAttribute("disabled", !allItems.some(getFilter));
return true;
}
/**
- * Resets context menu data once the context menu is closed.
- */
-function clearContextMenu(/**Event*/ event)
-{
- if (event.eventPhase != event.AT_TARGET)
- return;
-
- {
- let menuItem = E("contextDisableOnSite");
- menuItem.item = item;
- menuItem.filter = filter;
- menuItem.domain = domain;
- }
-}
-
-/**
* Processed mouse clicks on the item list.
* @param {Event} event
*/
@@ -447,8 +470,9 @@ function handleClick(event)
let item = treeView.getItemAt(event.clientX, event.clientY);
if (event.button == 0 && treeView.getColumnAt(event.clientX, event.clientY) == "state")
{
- if (item.filter)
- enableFilter(item.filter, item.filter.disabled);
+ let filter = getFilter(item);
+ if (filter)
+ enableFilter(filter, filter.disabled);
event.preventDefault();
}
else if (event.button == 1)
@@ -478,24 +502,27 @@ function openInTab(item, /**Event*/ event)
let items = (item ? [item] : treeView.getAllSelectedItems());
for (let item of items)
{
- if (item && item.typeDescr != "ELEMHIDE")
+ if (item && item.type != "ELEMHIDE")
UI.loadInBrowser(item.location, mainWin, event);
}
}
function doBlock() {
var item = treeView.getSelectedItem();
- if (!item || item.typeDescr == "ELEMHIDE")
+ if (!item || item.type == "ELEMHIDE")
return;
- var filter = null;
- if (item.filter && !item.filter.disabled)
- filter = item.filter;
-
- if (filter && filter instanceof WhitelistFilter)
+ var filter = getFilter(item);
+ if (filter && !filter.disabled && filter instanceof WhitelistFilter)
return;
- openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", item.nodes, item.orig);
+ if (requestNotifier)
+ {
+ requestNotifier.storeNodesForEntries(item.ids, (nodesID) =>
+ {
+ UI.blockItem(window, nodesID, item.orig);
+ });
+ }
}
function editFilter()
@@ -504,13 +531,11 @@ function editFilter()
if (treeView.data && !treeView.data.length)
item = treeView.getDummyTooltip();
- if (!("filter" in item) || !item.filter)
+ let filter = getFilter(item);
+ if (!filter)
return;
- if (!("location") in item)
- item.location = undefined
-
- UI.openFiltersDialog(item.filter);
+ UI.openFiltersDialog(filter);
}
function enableFilter(filter, enable) {
@@ -525,8 +550,8 @@ function enableFilter(filter, enable) {
function disableOnSite()
{
let item = treeView.getSelectedItem();
- let filter = item.filter;
- if (!(filter instanceof ActiveFilter) || filter.disabled || !filter.subscriptions.length || filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription)))
+ let filter = getFilter(item);
+ if (!(filter instanceof ActiveFilter) || filter.disabled || !filter.subscriptions.length || filter.subscriptions.some(subscription => !(subscription instanceof SpecialSubscription)))
return;
let domain;
@@ -552,7 +577,7 @@ function disableOnSite()
let match = /^DOMAIN=(.*)/.exec(options[i]);
if (match)
{
- let domains = match[1].split("|").filter(function(d) d != domain && d != "~" + domain && (d.length <= domain.length || d.lastIndexOf("." + domain) != d.length - domain.length - 1));
+ let domains = match[1].split("|").filter(d => d != domain && d != "~" + domain && (d.length <= domain.length || d.lastIndexOf("." + domain) != d.length - domain.length - 1));
domains.push("~" + domain);
options[i] = "DOMAIN=" + domains.join("|");
found = true;
@@ -573,7 +598,7 @@ function disableOnSite()
if (match)
{
let selector = match[2];
- let domains = match[1].toUpperCase().split(",").filter(function(d) d != domain && (d.length <= domain.length || d != "~" + domain && d.lastIndexOf("." + domain) != d.length - domain.length - 1));
+ let domains = match[1].toUpperCase().split(",").filter(d => d != domain && (d.length <= domain.length || d != "~" + domain && d.lastIndexOf("." + domain) != d.length - domain.length - 1));
domains.push("~" + domain);
text = domains.join(",").toLowerCase() + selector;
}
@@ -591,7 +616,7 @@ function disableOnSite()
else if (!newFilter.subscriptions.length)
{
newFilter.disabled = false;
- let subscription = filter.subscriptions.filter(function(s) s instanceof SpecialSubscription)[0];
+ let subscription = filter.subscriptions.filter(s => s instanceof SpecialSubscription)[0];
if (subscription)
FilterStorage.addFilter(newFilter, subscription, subscription.filters.indexOf(filter));
}
@@ -599,7 +624,7 @@ function disableOnSite()
// Update display
for (let i = 0; i < treeView.allData.length; i++)
- if (treeView.allData[i].filter == filter)
+ if (getFilter(treeView.allData[i]) == filter)
treeView.allData[i].filter = null;
treeView.boxObject.invalidate();
}
@@ -613,14 +638,14 @@ function copyToClipboard() {
}
function copyFilter() {
- var items = treeView.getAllSelectedItems().filter(function(item) {return item.filter});
+ var items = treeView.getAllSelectedItems().filter(getFilter);
if (treeView.data && !treeView.data.length)
items = [treeView.getDummyTooltip()];
if (!items.length)
return;
- Utils.clipboardHelper.copyString(items.map(function(item) {return item.filter.text}).join(IO.lineBreak));
+ Utils.clipboardHelper.copyString(items.map(function(item) {return item.filter}).join(IO.lineBreak));
}
function selectAll() {
@@ -666,20 +691,35 @@ function detach(doDetach)
myMainWin.document.getElementById("abp-command-sidebar").doCommand();
}
-// Returns items size in the document if available
-function getItemSize(item)
+// Returns item's size if already known, otherwise undefined
+function getCachedItemSize(item)
{
- if (item.filter && !item.filter.disabled && item.filter instanceof BlockingFilter)
+ if ("size" in item)
+ return item.size;
+
+ let filter = getFilter(item);
+ if (filter && !filter.disabled && filter instanceof BlockingFilter)
return null;
- for (let node of item.nodes)
+ return undefined;
+}
+
+// Retrieves item's size in the document if available
+function getItemSize(item, callback)
+{
+ let size = getCachedItemSize(item);
+ if (typeof size != "undefined" || !requestNotifier)
{
- if (node instanceof HTMLImageElement && (node.naturalWidth || node.naturalHeight))
- return [node.naturalWidth, node.naturalHeight];
- else if (node instanceof HTMLElement && (node.offsetWidth || node.offsetHeight))
- return [node.offsetWidth, node.offsetHeight];
+ callback(size);
+ return;
}
- return null;
+
+ requestNotifier.retrieveNodeSize(item.ids, function(size)
+ {
+ if (size)
+ item.size = size;
+ callback(size);
+ });
}
// Sort functions for the item list
@@ -697,9 +737,11 @@ function sortByAddressDesc(item1, item2) {
}
function compareType(item1, item2) {
- if (item1.localizedDescr < item2.localizedDescr)
+ let type1 = localizedTypes.get(item1.type);
+ let type2 = localizedTypes.get(item2.type);
+ if (type1 < type2)
return -1;
- else if (item1.localizedDescr > item2.localizedDescr)
+ else if (type1 > type2)
return 1;
else
return 0;
@@ -710,25 +752,29 @@ function compareFilter(item1, item2) {
var hasFilter2 = (item2.filter ? 1 : 0);
if (hasFilter1 != hasFilter2)
return hasFilter1 - hasFilter2;
- else if (hasFilter1 && item1.filter.text < item2.filter.text)
+ else if (hasFilter1 && item1.filter < item2.filter)
return -1;
- else if (hasFilter1 && item1.filter.text > item2.filter.text)
+ else if (hasFilter1 && item1.filter > item2.filter)
return 1;
else
return 0;
}
-function compareState(item1, item2) {
- var state1 = (!item1.filter ? 0 : (item1.filter.disabled ? 1 : (item1.filter instanceof WhitelistFilter ? 2 : 3)));
- var state2 = (!item2.filter ? 0 : (item2.filter.disabled ? 1 : (item2.filter instanceof WhitelistFilter ? 2 : 3)));
+function compareState(item1, item2)
+{
+ let filter1 = getFilter(item1);
+ let filter2 = getFilter(item2);
+ let state1 = (!filter1 ? 0 : (filter1.disabled ? 1 : (filter1 instanceof WhitelistFilter ? 2 : 3)));
+ let state2 = (!filter2 ? 0 : (filter2.disabled ? 1 : (filter2 instanceof WhitelistFilter ? 2 : 3)));
return state1 - state2;
}
-function compareSize(item1, item2) {
- var size1 = getItemSize(item1);
- size1 = size1 ? size1[0] * size1[1] : 0;
+function compareSize(item1, item2)
+{
+ let size1 = getCachedItemSize(item1);
+ let size2 = getCachedItemSize(item2);
- var size2 = getItemSize(item2);
+ size1 = size1 ? size1[0] * size1[1] : 0;
size2 = size2 ? size2[0] * size2[1] : 0;
return size1 - size2;
}
@@ -749,8 +795,10 @@ function compareDocDomain(item1, item2)
function compareFilterSource(item1, item2)
{
- let subs1 = item1.filter ? item1.filter.subscriptions.map(function(s) s.title).join(", ") : "";
- let subs2 = item2.filter ? item2.filter.subscriptions.map(function(s) s.title).join(", ") : "";
+ let filter1 = getFilter(item1);
+ let filter2 = getFilter(item2);
+ let subs1 = filter1 ? filter1.subscriptions.map(s => getSubscriptionTitle(s)).join(", ") : "";
+ let subs2 = filter2 ? filter2.subscriptions.map(s => getSubscriptionTitle(s)).join(", ") : "";
if (subs1 < subs2)
return -1;
else if (subs1 > subs2)
@@ -865,22 +913,31 @@ var treeView = {
if (row >= this.data.length)
return "";
if (col == "type")
- return this.data[row].localizedDescr;
+ return localizedTypes.get(this.data[row].type);
else if (col == "filter")
- return (this.data[row].filter ? this.data[row].filter.text : "");
+ return (this.data[row].filter || "");
else if (col == "size")
{
- let size = getItemSize(this.data[row]);
+ let size = getCachedItemSize(this.data[row]);
+ if (typeof size == "undefined")
+ {
+ getItemSize(this.data[row], (size) =>
+ {
+ if (size)
+ this.boxObject.invalidateRow(row)
+ });
+ }
return (size ? size.join(" x ") : "");
}
else if (col == "docDomain")
return this.data[row].docDomain + " " + (this.data[row].thirdParty ? docDomainThirdParty : docDomainFirstParty);
else if (col == "filterSource")
{
- if (!this.data[row].filter)
+ let filter = getFilter(this.data[row])
+ if (!filter)
return "";
- return this.data[row].filter.subscriptions.filter(function(s) !s.disabled).map(function(s) s.title).join(", ");
+ return filter.subscriptions.filter(s => !s.disabled).map(s => getSubscriptionTitle(s)).join(", ");
}
else
return this.data[row].location;
@@ -890,11 +947,11 @@ var treeView = {
if (row > 0 || (col != "address" && col != "filter"))
return "";
if (col == "filter") {
- var filter = Policy.isWindowWhitelisted(window.content);
+ var filter = Policy.isWhitelisted(contentLocation);
return filter ? filter.text : "";
}
- return (Policy.isWindowWhitelisted(window.content) ? this.whitelistDummy : this.itemsDummy);
+ return (Policy.isWhitelisted(contentLocation) ? this.whitelistDummy : this.itemsDummy);
}
},
@@ -933,7 +990,7 @@ var treeView = {
if (this.data && this.data.length) {
list.push("dummy-false");
- let filter = this.data[row].filter;
+ let filter = getFilter(this.data[row]);
if (filter)
list.push("filter-disabled-" + filter.disabled);
@@ -944,7 +1001,7 @@ var treeView = {
state = "state-whitelisted";
else if (filter instanceof BlockingFilter)
state = "state-filtered";
- else if (filter instanceof ElemHideFilter)
+ else if (filter instanceof ElemHideFilter || filter instanceof ElemHideEmulationFilter)
state = "state-hidden";
else if (filter instanceof ElemHideException)
state = "state-hiddenexception";
@@ -954,7 +1011,7 @@ var treeView = {
list.push("dummy-true");
state = "state-filtered";
- if (this.data && Policy.isWindowWhitelisted(window.content))
+ if (this.data && Policy.isWhitelisted(contentLocation))
state = "state-whitelisted";
}
list.push(state);
@@ -1070,7 +1127,7 @@ var treeView = {
this.boxObject.rowCountChanged(0, this.rowCount);
},
- addItem: function(/**Node*/ node, /**RequestEntry*/ item, /**Boolean*/ scanComplete)
+ addItem: function(/**RequestEntry*/ item, /**Boolean*/ scanComplete)
{
// Merge duplicate entries
let key = item.location + " " + item.type + " " + item.docDomain;
@@ -1080,21 +1137,25 @@ var treeView = {
let existing = this.dataMap[key];
if (item.filter)
existing.filter = item.filter;
+ existing.ids.push(item.id);
- existing.nodes.push(node);
this.invalidateItem(existing);
return;
}
// Add new item to the list
// Store original item in orig property - reading out prototype is messed up in Gecko 1.9.2
- item = {__proto__: item, orig: item, nodes: [node]};
+ item = {__proto__: item, orig: item, ids: [item.id]};
this.allData.push(item);
this.dataMap[key] = item;
// Show disabled filters if no other filter applies
if (!item.filter)
- item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+ {
+ let disabledMatch = disabledMatcher.matchesAny(item.location, RegExpFilter.typeMap[item.type], item.docDomain, item.thirdParty);
+ if (disabledMatch)
+ item.filter = disabledMatch.text;
+ }
if (!this.matchesFilter(item))
return;
@@ -1146,10 +1207,15 @@ var treeView = {
{
for (let item of this.allData)
{
- if (item.filter instanceof RegExpFilter && item.filter.disabled)
+ let filter = getFilter(item);
+ if (filter instanceof RegExpFilter && filter.disabled)
delete item.filter;
- if (!item.filter)
- item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+ if (!filter)
+ {
+ let disabledMatch = disabledMatcher.matchesAny(item.location, RegExpFilter.typeMap[item.type], item.docDomain, item.thirdParty);
+ if (disabledMatch)
+ item.filter = disabledMatch.text;
+ }
}
this.refilter();
},
@@ -1178,9 +1244,9 @@ var treeView = {
return true;
return (item.location.toLowerCase().indexOf(this.filter) >= 0 ||
- (item.filter && item.filter.text.toLowerCase().indexOf(this.filter) >= 0) ||
- item.typeDescr.toLowerCase().indexOf(this.filter.replace(/-/g, "_")) >= 0 ||
- item.localizedDescr.toLowerCase().indexOf(this.filter) >= 0 ||
+ (item.filter && item.filter.toLowerCase().indexOf(this.filter) >= 0) ||
+ item.type.toLowerCase().indexOf(this.filter.replace(/-/g, "_")) >= 0 ||
+ localizedTypes.get(item.type).toLowerCase().indexOf(this.filter) >= 0 ||
(item.docDomain && item.docDomain.toLowerCase().indexOf(this.filter) >= 0) ||
(item.docDomain && item.thirdParty && docDomainThirdParty.toLowerCase().indexOf(this.filter) >= 0) ||
(item.docDomain && !item.thirdParty && docDomainFirstParty.toLowerCase().indexOf(this.filter) >= 0));
@@ -1255,9 +1321,9 @@ var treeView = {
if (!this.data || this.data.length)
return null;
- var filter = Policy.isWindowWhitelisted(window.content);
+ var filter = Policy.isWhitelisted(contentLocation);
if (filter)
- return {tooltip: this.whitelistDummyTooltip, filter: filter};
+ return {tooltip: this.whitelistDummyTooltip, filter: filter.text};
else
return {tooltip: this.itemsDummyTooltip};
},