diff options
| author | Jez Ng | 2012-01-17 23:05:26 +0800 |
|---|---|---|
| committer | Jez Ng | 2012-01-25 23:47:55 -0500 |
| commit | 670af66d2d3537c58a42278318ea18bec4a90cdc (patch) | |
| tree | a1fe2c79ec28da95cd3bf595030a0cf2501ba74c /vimiumFrontend.js | |
| parent | b06787cfccd129c1cbb55d209bcd10ae0def575d (diff) | |
| download | vimium-670af66d2d3537c58a42278318ea18bec4a90cdc.tar.bz2 | |
Allow content scripts to both read and write settings.
Diffstat (limited to 'vimiumFrontend.js')
| -rw-r--r-- | vimiumFrontend.js | 39 |
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 }); }); |
