aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--background_page.html35
-rw-r--r--vimiumFrontend.js33
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); }