aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--background_page.html14
-rw-r--r--vimiumFrontend.js39
2 files changed, 38 insertions, 15 deletions
diff --git a/background_page.html b/background_page.html
index 3a8e5b64..95765e2a 100644
--- a/background_page.html
+++ b/background_page.html
@@ -63,7 +63,7 @@
keyDown: handleKeyDown,
returnScrollPosition: handleReturnScrollPosition,
getCurrentTabUrl: getCurrentTabUrl,
- getSetting: getSetting,
+ settings: handleSettings,
getBookmarks: getBookmarks
};
@@ -290,10 +290,14 @@
/*
* Used by the content scripts to get settings from the local storage.
*/
- function getSetting(args, port) {
- var value = getSettingFromLocalStorage(args.key);
- var returnPort = chrome.tabs.connect(port.tab.id, { name: "returnSetting" });
- returnPort.postMessage({ key: args.key, value: value });
+ function handleSettings(args, port) {
+ if (args.operation == "get") {
+ var value = getSettingFromLocalStorage(args.key);
+ port.postMessage({ key: args.key, value: value });
+ }
+ else { // operation == "set"
+ localStorage[args.key] = args.value;
+ }
}
function getBookmarks(args, port) {
diff --git a/vimiumFrontend.js b/vimiumFrontend.js
index 60a96a3a..0446c376 100644
--- a/vimiumFrontend.js
+++ b/vimiumFrontend.js
@@ -13,7 +13,6 @@ var findModeQueryHasResults = false;
var isShowingHelpDialog = false;
var handlerStack = [];
var keyPort;
-var settingPort;
// Users can disable Vimium on URL patterns via the settings page.
var isEnabledForUrl = true;
// The user's operating system.
@@ -37,26 +36,46 @@ var textInputXPath = (function() {
return utils.makeXPath(inputElements);
})();
+/**
+ * settings provides a browser-global localStorage-backed dict. get() and set() are synchronous, but load()
+ * must be called beforehand to ensure get() will return up-to-date values.
+ */
var settings = {
+ port: null,
values: {},
loadedValues: 0,
- valuesToLoad: ["scrollStepSize", "linkHintCharacters", "filterLinkHints", "previousPatterns", "nextPatterns"],
+ valuesToLoad: ["scrollStepSize", "linkHintCharacters", "filterLinkHints", "previousPatterns", "nextPatterns",
+ "findQuery"],
+
+ init: function () {
+ this.port = chrome.extension.connect({ name: "settings" });
+ this.port.onMessage.addListener(this.receiveMessage);
+ },
get: function (key) { return this.values[key]; },
- load: function() {
- for (var i in this.valuesToLoad) { this.sendMessage(this.valuesToLoad[i]); }
+ set: function (key, value) {
+ if (!this.port)
+ this.init();
+
+ this.values[key] = value;
+ this.port.postMessage({ operation: "set", key: key, value: value });
},
- sendMessage: function (key) {
- if (!settingPort)
- settingPort = chrome.extension.connect({ name: "getSetting" });
- settingPort.postMessage({ key: key });
+ load: function() {
+ if (!this.port)
+ this.init();
+
+ for (var i in this.valuesToLoad) {
+ this.port.postMessage({ operation: "get", key: this.valuesToLoad[i] });
+ }
},
receiveMessage: function (args) {
// not using 'this' due to issues with binding on callback
settings.values[args.key] = args.value;
+ // since load() can be called more than once, loadedValues can be greater than valuesToLoad, but we test
+ // for equality so initializeOnReady only runs once
if (++settings.loadedValues == settings.valuesToLoad.length)
settings.initializeOnReady();
},
@@ -146,8 +165,6 @@ function initializePreDomReady() {
port.onMessage.addListener(function(args) {
if (getCurrentUrlHandlers.length > 0) { getCurrentUrlHandlers.pop()(args.url); }
});
- } else if (port.name == "returnSetting") {
- port.onMessage.addListener(settings.receiveMessage);
} else if (port.name == "refreshCompletionKeys") {
port.onMessage.addListener(function (args) {
refreshCompletionKeys(args.completionKeys);
@@ -174,6 +191,8 @@ function initializeWhenEnabled() {
* The backend needs to know which frame has focus.
*/
window.addEventListener("focus", function(e) {
+ // settings may have changed since the frame last had focus
+ settings.load();
chrome.extension.sendRequest({ handler: "frameFocused", frameId: frameId });
});