| Index: chrome/content/ui/sidebar.js |
| =================================================================== |
| --- a/chrome/content/ui/sidebar.js |
| +++ b/chrome/content/ui/sidebar.js |
| @@ -253,23 +253,21 @@ function fillInTooltip(e) { |
| if (!item) |
| { |
| e.preventDefault(); |
| return; |
| } |
| let filter = getFilter(item); |
| - let size = ("tooltip" in item ? null : getItemSize(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; |
| if ("tooltip" in item) |
| E("tooltipDummy").setAttribute("value", item.tooltip); |
| else |
| { |
| @@ -278,19 +276,16 @@ function fillInTooltip(e) { |
| var type = localizedTypes.get(item.type); |
| if (filter && filter instanceof WhitelistFilter) |
| type += " " + E("tooltipType").getAttribute("whitelisted"); |
| 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)); |
| } |
| if (filter) |
| { |
| let filterField = E("tooltipFilter"); |
| setMultilineContent(filterField, filter.text); |
| if (filter.disabled) |
| @@ -306,16 +301,29 @@ function fillInTooltip(e) { |
| let sourceElement = E("tooltipFilterSource"); |
| while (sourceElement.firstChild) |
| sourceElement.removeChild(sourceElement.firstChild); |
| for (let i = 0; i < subscriptions.length; i++) |
| setMultilineContent(sourceElement, subscriptions[i].title, 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.type == "IMAGE"; |
| showPreview = showPreview && (!filter || filter.disabled || filter instanceof WhitelistFilter); |
| E("tooltipPreviewBox").hidden = true; |
| if (showPreview) |
| { |
| if (!cacheStorage) |
| { |
| @@ -659,31 +667,45 @@ function detach(doDetach) |
| let myMainWin = mainWin; |
| // Close sidebar and open detached window |
| myMainWin.document.getElementById("abp-command-sidebar").doCommand(); |
| myPrefs.detachsidebar = 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 ("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 |
| function sortByAddress(item1, item2) { |
| if (item1.location < item2.location) |
| return -1; |
| else if (item1.location > item2.location) |
| return 1; |
| @@ -723,21 +745,22 @@ 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); |
| +function compareSize(item1, item2) |
| +{ |
| + let size1 = getCachedItemSize(item1); |
| + let size2 = getCachedItemSize(item2); |
| + |
| size1 = size1 ? size1[0] * size1[1] : 0; |
| - |
| - var size2 = getItemSize(item2); |
| size2 = size2 ? size2[0] * size2[1] : 0; |
| return size1 - size2; |
| } |
| function compareDocDomain(item1, item2) |
| { |
| if (item1.docDomain < item2.docDomain) |
| return -1; |
| @@ -871,17 +894,25 @@ var treeView = { |
| if (row >= this.data.length) |
| return ""; |
| if (col == "type") |
| return localizedTypes.get(this.data[row].type); |
| else if (col == "filter") |
| 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") |
| { |
| let filter = getFilter(this.data[row]) |
| if (!filter) |