diff options
| -rw-r--r-- | background_page.html | 35 | ||||
| -rw-r--r-- | vimiumFrontend.js | 33 |
2 files changed, 60 insertions, 8 deletions
diff --git a/background_page.html b/background_page.html index d8f28df4..bd032bcd 100644 --- a/background_page.html +++ b/background_page.html @@ -10,6 +10,8 @@ var portHandlers = { "keyDown": handleKeyDown, "returnScrollPosition": handleReturnScrollPosition, "getCurrentTabUrl": getCurrentTabUrl, + "getZoomLevel": getZoomLevel, + "saveZoomLevel": saveZoomLevel, "getSetting": getSetting}; // Event handlers @@ -47,31 +49,56 @@ * because window.location doesn't know anything about the Chrome-specific "view-source:". */ function getCurrentTabUrl(args) { - chrome.tabs.getSelected(null, function (tab) { + chrome.tabs.getSelected(null, function(tab) { var returnPort = chrome.tabs.connect(tab.id, { name: "returnCurrentTabUrl" }); returnPort.postMessage({ url: tab.url }); }); } /* + * Returns the previously saved zoom level for the current tab, or the default zoom level + */ + function getZoomLevel(args) { + chrome.tabs.getSelected(null, function(tab) { + var returnPort = chrome.tabs.connect(tab.id, { name: "returnZoomLevel" }); + var localStorageKey = "zoom" + args.domain; + var zoomLevelForDomain = (localStorage[localStorageKey] || "").split(",")[1]; + var zoomLevel = parseInt(zoomLevelForDomain || localStorage["defaultZoomLevel"] || 100); + returnPort.postMessage({ zoomLevel: zoomLevel }); + }); + } + + /* * Used by the content scripts to get settings from the local storage. */ function getSetting(args) { var value = localStorage[args.key] ? localStorage[args.key] : defaultSettings[args.key]; - chrome.tabs.getSelected(null, function (tab) { + chrome.tabs.getSelected(null, function(tab) { var returnPort = chrome.tabs.connect(tab.id, { name: "returnSetting" }); returnPort.postMessage({ key: args.key, value: value }); }); } - chrome.tabs.onSelectionChanged.addListener(function (tabId, selectionInfo) { + /* + * Persists the current zoom level for a given domain + */ + function saveZoomLevel(args) { + var localStorageKey = "zoom" + args.domain; + // TODO(philc): We might want to consider expiring these entries after X months as NoSquint does. + // Note(philc): We might also want to jsonify this hash instead of polluting our local storage keyspace. + localStorage[localStorageKey] = [getCurrentTimeInSeconds(), args.zoomLevel].join(","); + } + + function getCurrentTimeInSeconds() { Math.floor((new Date()).getTime() / 1000); } + + chrome.tabs.onSelectionChanged.addListener(function(tabId, selectionInfo) { if (selectionChangedHandlers.length > 0) { selectionChangedHandlers.pop().call(); } }); function repeatFunction(func, totalCount, currentCount) { if (currentCount < totalCount) - func(function () { repeatFunction(func, totalCount, currentCount + 1); }); + func(function() { repeatFunction(func, totalCount, currentCount + 1); }); } // Returns the currently selected tab along with scroll coordinates. Pass in a callback of the form: diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 7aeb7118..41de1949 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -7,15 +7,14 @@ var keyCodes = { ESC: 27 }; var insertMode = false; var keyPort; var settingPort; +var saveZoomLevelPort; // TODO(philc): This should be pulled from the extension's storage when the page loads. var currentZoomLevel = 100; function getSetting(key) { if (!settingPort) - { settingPort = chrome.extension.connect({ name: "getSetting" }); - } settingPort.postMessage({ key: key }); } @@ -28,6 +27,9 @@ function initializeFrontend() { document.addEventListener("focus", onFocusCapturePhase, true); document.addEventListener("blur", onBlurCapturePhase, true); + var getZoomLevelPort = chrome.extension.connect({ name: "getZoomLevel" }); + getZoomLevelPort.postMessage({ domain: window.location.host }); + // Send the key to the key handler in the background page. keyPort = chrome.extension.connect({name: "keyDown"}); @@ -57,6 +59,11 @@ function initializeFrontend() { port.onMessage.addListener(function (args) { if (getCurrentUrlHandlers.length > 0) { getCurrentUrlHandlers.pop()(args.url); } }); + } else if (port.name == "returnZoomLevel") { + port.onMessage.addListener(function (args) { + currentZoomLevel = args.zoomLevel; + setPageZoomLevel(currentZoomLevel); + }); } else if (port.name == "returnSetting") { port.onMessage.addListener(setSetting); } @@ -70,10 +77,28 @@ function initializeFrontend() { }; /* + * Asks the background page to persist the zoom level for the given domain to localStorage. + */ +function saveZoomLevel(domain, zoomLevel) { + if (!saveZoomLevelPort) + saveZoomLevelPort = chrome.extension.connect({ name: "saveZoomLevel" }); + saveZoomLevelPort.postMessage({ domain: domain, zoomLevel: zoomLevel }); +} + +/* * Zoom in increments of 20%; this matches chrome's CMD+ and CMD- keystrokes. */ -function zoomIn() { document.body.style.zoom = (currentZoomLevel += 20) + "%"; } -function zoomOut() { document.body.style.zoom = (currentZoomLevel -= 20) + "%"; } +function setPageZoomLevel(zoomLevel) { document.body.style.zoom = zoomLevel + "%"; } + +function zoomIn() { + setPageZoomLevel(currentZoomLevel += 20); + saveZoomLevel(window.location.host, currentZoomLevel); +} + +function zoomOut() { + setPageZoomLevel(currentZoomLevel -= 20); + saveZoomLevel(window.location.host, currentZoomLevel); +} function scrollToBottom() { window.scrollTo(0, document.body.scrollHeight); } function scrollToTop() { window.scrollTo(0, 0); } |
