From c4a64216ce2b47093f617ac47c7f77c51d29556d Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 6 Mar 2018 04:19:01 -0500 Subject: [PATCH] Reduce idle CPU use to ~0% Various animated things (search spinner, progress meters) were using CPU even when hidden, either because they weren't properly hidden (equivalent of `display: none` rather than `visibility: hidden`) or because of bizarre Firefox bugs with progress meters on Linux. Addresses #1455 --- chrome/content/zotero/lookup.js | 10 ++++++++-- chrome/content/zotero/xpcom/zotero.js | 21 ++++++++++++++++++++- chrome/content/zotero/zoteroPane.js | 4 ++-- chrome/content/zotero/zoteroPane.xul | 11 ++++++----- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/chrome/content/zotero/lookup.js b/chrome/content/zotero/lookup.js index 0a7431aa5e..0603b7c38f 100644 --- a/chrome/content/zotero/lookup.js +++ b/chrome/content/zotero/lookup.js @@ -206,14 +206,20 @@ var Zotero_Lookup = new function () { } this.toggleProgress = function(on) { + // In Firefox 52.6.0, progressmeters burn CPU at idle on Linux when undetermined, even + // if they're hidden. (Being hidden is enough on macOS.) + var mode = on ? 'undetermined' : 'determined'; + //single line var txtBox = document.getElementById("zotero-lookup-textbox"); txtBox.style.opacity = on ? 0.5 : 1; txtBox.disabled = !!on; - document.getElementById("zotero-lookup-progress").setAttribute("collapsed", !on); + var p1 = document.getElementById("zotero-lookup-progress"); + p1.mode = mode; //multiline document.getElementById("zotero-lookup-multiline-textbox").disabled = !!on; - document.getElementById("zotero-lookup-multiline-progress").setAttribute("collapsed", !on); + var p2 = document.getElementById("zotero-lookup-multiline-progress"); + p2.mode = mode; } } diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 5381a5cbc8..2a1088e6e6 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -1833,7 +1833,19 @@ Services.scriptloader.loadSubScript("resource://zotero/polyfill.js"); else { label.hidden = true; } - var progressMeter = win.ZoteroPane.document.getElementById('zotero-pane-progressmeter') + // This is the craziest thing. In Firefox 52.6.0, the very presence of this line + // causes Zotero on Linux to burn 5% CPU at idle, even if everything below it in + // the block is commented out. Same if the progressmeter itself is hidden="true". + // For some reason it also doesn't seem to work to set the progressmeter to + // 'determined' when hiding, which we're doing in lookup.js. So instead, create a new + // progressmeter each time and delete it in _hideWindowZoteroPaneOverlay(). + // + //let progressMeter = win.ZoteroPane.document.getElementById('zotero-pane-progressmeter'); + let doc = win.ZoteroPane.document; + let container = doc.getElementById('zotero-pane-progressmeter-container'); + let progressMeter = doc.createElement('progressmeter'); + progressMeter.id = 'zotero-pane-progressmeter'; + progressMeter.setAttribute('mode', 'undetermined'); if (determinate) { progressMeter.mode = 'determined'; progressMeter.value = 0; @@ -1842,6 +1854,7 @@ Services.scriptloader.loadSubScript("resource://zotero/polyfill.js"); else { progressMeter.mode = 'undetermined'; } + container.appendChild(progressMeter); _showWindowZoteroPaneOverlay(win.ZoteroPane.document); win.ZoteroPane.document.getElementById('zotero-pane-overlay-deck').selectedIndex = 0; @@ -1929,6 +1942,12 @@ Services.scriptloader.loadSubScript("resource://zotero/polyfill.js"); doc.getElementById('zotero-pane-tab-catcher-top').hidden = true; doc.getElementById('zotero-pane-tab-catcher-bottom').hidden = true; doc.getElementById('zotero-pane-overlay').hidden = true; + + // See note in showZoteroPaneProgressMeter() + let pm = doc.getElementById('zotero-pane-progressmeter'); + if (pm) { + pm.parentNode.removeChild(pm); + } } diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js index e814727cf2..e41b568558 100644 --- a/chrome/content/zotero/zoteroPane.js +++ b/chrome/content/zotero/zoteroPane.js @@ -2256,10 +2256,10 @@ var ZoteroPane = new function() return; } var spinner = document.getElementById('zotero-tb-search-spinner'); - spinner.style.visibility = 'visible'; + spinner.style.display = 'inline'; var searchVal = search.value; yield this.itemsView.setFilter('search', searchVal); - spinner.style.visibility = 'hidden'; + spinner.style.display = 'none'; if (runAdvanced) { this.clearItemsPaneMessage(); } diff --git a/chrome/content/zotero/zoteroPane.xul b/chrome/content/zotero/zoteroPane.xul index b86764fc1c..e02d0d6244 100644 --- a/chrome/content/zotero/zoteroPane.xul +++ b/chrome/content/zotero/zoteroPane.xul @@ -170,7 +170,7 @@ &zotero.lookup.description; - +