diff options
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.js | 388 |
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}; }, |