aboutsummaryrefslogtreecommitdiffstats
path: root/vimiumFrontend.js
diff options
context:
space:
mode:
authorJez Ng2012-01-17 23:05:26 +0800
committerJez Ng2012-01-25 23:47:55 -0500
commit670af66d2d3537c58a42278318ea18bec4a90cdc (patch)
treea1fe2c79ec28da95cd3bf595030a0cf2501ba74c /vimiumFrontend.js
parentb06787cfccd129c1cbb55d209bcd10ae0def575d (diff)
downloadvimium-670af66d2d3537c58a42278318ea18bec4a90cdc.tar.bz2
Allow content scripts to both read and write settings.
Diffstat (limited to 'vimiumFrontend.js')
-rw-r--r--vimiumFrontend.js39
1 files changed, 29 insertions, 10 deletions
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 });
});