From 9cfa214d19e31e54beaaeb9210afa0bcfae36816 Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 27 May 2015 23:30:22 +0300 Subject: [PATCH 1/3] Manage: remember scroll position, initialize styles earlier --- manage.html | 3 +-- manage.js | 47 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/manage.html b/manage.html index 59134c6f..58da0dec 100644 --- a/manage.html +++ b/manage.html @@ -134,6 +134,7 @@ +
- - diff --git a/manage.js b/manage.js index 79bd7a2d..67fbb0f7 100644 --- a/manage.js +++ b/manage.js @@ -15,28 +15,32 @@ var styleTemplate = tHTML('\ '); var lastUpdatedStyleId = null; -var installed = document.getElementById("installed"); +var installed; var appliesToExtraTemplate = document.createElement("span"); appliesToExtraTemplate.className = "applies-to-extra"; appliesToExtraTemplate.innerHTML = " " + t('appliesDisplayTruncatedSuffix'); chrome.extension.sendMessage({method: "getStyles"}, showStyles); -loadPrefs({ - "manage.onlyEnabled": false, - "manage.onlyEdited": false, - "show-badge": true -}); function showStyles(styles) { if (!styles) { // Chrome is starting up chrome.extension.sendMessage({method: "getStyles"}, showStyles); return; } + if (!installed) { + // "getStyles" message callback is invoked before document is loaded, + // postpone the action until DOMContentLoaded is fired + document.stylishStyles = styles; + return; + } styles.sort(function(a, b) { return a.name.localeCompare(b.name)}); styles.map(createStyleElement).forEach(function(e) { installed.appendChild(e); }); + if (history.state) { + window.scrollTo(0, history.state.scrollY); + } } function createStyleElement(style) { @@ -132,6 +136,8 @@ function createStyleElement(style) { active: openForegroundTab }); } + } else { + history.replaceState({scrollY: window.scrollY}, document.title); } } }); @@ -468,11 +474,6 @@ function searchStyles(immediately) { } } -document.getElementById("check-all-updates").addEventListener("click", checkUpdateAll, false); -document.getElementById("apply-all-updates").addEventListener("click", applyUpdateAll, false); -document.getElementById("search").addEventListener("input", searchStyles); -searchStyles(true); // re-apply filtering on history Back - function onFilterChange (className, event) { installed.classList.toggle(className, event.target.checked); } @@ -480,7 +481,25 @@ function initFilter(className, node) { node.addEventListener("change", onFilterChange.bind(undefined, className), false); onFilterChange(className, {target: node}); } -initFilter("enabled-only", document.getElementById("manage.onlyEnabled")); -initFilter("edited-only", document.getElementById("manage.onlyEdited")); -loadPrefs({"popup.stylesFirst": true}); +document.addEventListener("DOMContentLoaded", function() { + installed = document.getElementById("installed"); + if (document.stylishStyles) { + showStyles(document.stylishStyles); + delete document.stylishStyles; + } + + document.getElementById("check-all-updates").addEventListener("click", checkUpdateAll); + document.getElementById("apply-all-updates").addEventListener("click", applyUpdateAll); + document.getElementById("search").addEventListener("input", searchStyles); + searchStyles(true); // re-apply filtering on history Back + + loadPrefs({ + "manage.onlyEnabled": false, + "manage.onlyEdited": false, + "show-badge": true, + "popup.stylesFirst": true + }); + initFilter("enabled-only", document.getElementById("manage.onlyEnabled")); + initFilter("edited-only", document.getElementById("manage.onlyEdited")); +}); From 67fe43e9a9691bf88ea0edd570d5076152d77974 Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 10 Jun 2015 15:55:32 +0300 Subject: [PATCH 2/3] Editor: use history back for Back-To-Manage when appropriate --- edit.js | 31 +++++++++++++++++++++++-------- manage.js | 10 +++++++--- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/edit.js b/edit.js index 5a239699..c516828b 100644 --- a/edit.js +++ b/edit.js @@ -4,6 +4,7 @@ var styleId = null; var dirty = {}; // only the actually dirty items here var editors = []; // array of all CodeMirror instances var saveSizeOnClose; +var useHistoryBack; // use browser history back when "back to manage" is clicked // direct & reverse mapping of @-moz-document keywords and internal property names var propertyToCss = {urls: "url", urlPrefixes: "url-prefix", domains: "domain", regexps: "regexp"}; @@ -404,21 +405,34 @@ document.addEventListener("wheel", function(event) { } }); -if (prefs.getPref("openEditInWindow")) { - chrome.tabs.query({currentWindow: true}, function(tabs) { - var windowId = tabs[0].windowId; +chrome.tabs.query({currentWindow: true}, function(tabs) { + var windowId = tabs[0].windowId; + if (prefs.getPref("openEditInWindow")) { if (tabs.length == 1 && window.history.length == 1) { sessionStorageHash("saveSizeOnClose").set(windowId, true); saveSizeOnClose = true; } else { saveSizeOnClose = sessionStorageHash("saveSizeOnClose").value[windowId]; } - chrome.tabs.onRemoved.addListener(function(tabId, info) { - if (info.windowId == windowId && info.isWindowClosing) { - sessionStorageHash("saveSizeOnClose").unset(windowId); - } - }); + } + chrome.tabs.onRemoved.addListener(function(tabId, info) { + sessionStorageHash("manageStylesHistory").unset(tabId); + if (info.windowId == windowId && info.isWindowClosing) { + sessionStorageHash("saveSizeOnClose").unset(windowId); + } }); +}); + +getActiveTab(function(tab) { + useHistoryBack = sessionStorageHash("manageStylesHistory").value[tab.id] == location.href; +}); + +function goBackToManage(event) { + if (useHistoryBack) { + event.stopPropagation(); + event.preventDefault(); + history.back(); + } } window.onbeforeunload = function() { @@ -791,6 +805,7 @@ function initHooks() { document.getElementById("save-button").addEventListener("click", save, false); document.getElementById("sections-help").addEventListener("click", showSectionHelp, false); document.getElementById("keyMap-help").addEventListener("click", showKeyMapHelp, false); + document.getElementById("cancel-button").addEventListener("click", goBackToManage); setupGlobalSearch(); setCleanGlobal(); diff --git a/manage.js b/manage.js index 67fbb0f7..3e67b9d4 100644 --- a/manage.js +++ b/manage.js @@ -121,10 +121,10 @@ function createStyleElement(style) { var openWindow = left && shift && !ctrl; var openBackgroundTab = (middle && !shift) || (left && ctrl && !shift); var openForegroundTab = (middle && shift) || (left && ctrl && shift); + var url = event.target.href || event.target.parentNode.href; + event.preventDefault(); + event.stopPropagation(); if (openWindow || openBackgroundTab || openForegroundTab) { - event.preventDefault(); - event.stopPropagation(); - var url = event.target.href || event.target.parentNode.href; if (openWindow) { var options = prefs.getPref('windowPosition', {}); options.url = url; @@ -138,6 +138,10 @@ function createStyleElement(style) { } } else { history.replaceState({scrollY: window.scrollY}, document.title); + getActiveTab(function(tab) { + sessionStorageHash("manageStylesHistory").set(tab.id, url); + location.href = url; + }); } } }); From 8b890e86521d6bf856ec7f65a018be8f5a36261f Mon Sep 17 00:00:00 2001 From: tophf Date: Mon, 15 Jun 2015 18:56:48 +0300 Subject: [PATCH 3/3] Editor: don't save window size after browser restart Because if an edit style window was the only window open when closing the browser it'll become the main browser window after restart and is likely to be resized differently. --- edit.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/edit.js b/edit.js index c516828b..d681002c 100644 --- a/edit.js +++ b/edit.js @@ -409,8 +409,12 @@ chrome.tabs.query({currentWindow: true}, function(tabs) { var windowId = tabs[0].windowId; if (prefs.getPref("openEditInWindow")) { if (tabs.length == 1 && window.history.length == 1) { - sessionStorageHash("saveSizeOnClose").set(windowId, true); - saveSizeOnClose = true; + chrome.windows.getAll(function(windows) { + if (windows.length > 1) { + sessionStorageHash("saveSizeOnClose").set(windowId, true); + saveSizeOnClose = true; + } + }); } else { saveSizeOnClose = sessionStorageHash("saveSizeOnClose").value[windowId]; }