diff options
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 31 | ||||
| -rw-r--r-- | lib/settings.coffee | 2 | ||||
| -rw-r--r-- | manifest.json | 1 | ||||
| -rw-r--r-- | tests/dom_tests/chrome.coffee | 6 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.coffee | 30 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.html | 1 |
6 files changed, 33 insertions, 38 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index c8c83029..c603e15f 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -65,37 +65,18 @@ settings = searchEngines: null init: -> - @port = chrome.runtime.connect name: "settings" - @port.onMessage.addListener (response) => @receiveMessage response + @port = true + Settings.init() - # If the port is closed, the background page has gone away (since we never close it ourselves). Stub the - # settings object so we don't keep trying to connect to the extension even though it's gone away. - @port.onDisconnect.addListener => - @port = null - for own property, value of this - # @get doesn't depend on @port, so we can continue to support it to try and reduce errors. - @[property] = (->) if "function" == typeof value and property != "get" - - get: (key) -> @values[key] + get: Settings.get.bind Settings set: (key, value) -> @init() unless @port + Settings.set key, value - @values[key] = value - @port.postMessage operation: "set", key: key, value: value - - load: -> - @init() unless @port - @port.postMessage operation: "fetch", values: @values - - receiveMessage: (response) -> - @values = response.values if response.values? - @values[response.key] = response.value if response.key? and response.value? - @isLoaded = true - listener() while listener = @eventListeners.load?.pop() + load: -> @init() unless @port - addEventListener: (eventName, callback) -> - (@eventListeners[eventName] ||= []).push callback + addEventListener: Settings.addEventListener.bind Settings # # Give this frame a unique (non-zero) id. diff --git a/lib/settings.coffee b/lib/settings.coffee index b5021225..88e3b883 100644 --- a/lib/settings.coffee +++ b/lib/settings.coffee @@ -81,7 +81,7 @@ root.Settings = Settings = get: (key) -> console.log "WARNING: Settings have not loaded yet; using the default value for #{key}." unless @isLoaded - if (key of @cache) then JSON.parse(@cache[key]) else @defaults[key] + if key of @cache and @cache[key]? then JSON.parse(@cache[key]) else @defaults[key] set: (key, value) -> # Don't store the value if it is equal to the default, so we can change the defaults in the future diff --git a/manifest.json b/manifest.json index f0c51117..80eef6c1 100644 --- a/manifest.json +++ b/manifest.json @@ -41,6 +41,7 @@ "lib/rect.js", "lib/handler_stack.js", "lib/clipboard.js", + "lib/settings.js", "content_scripts/ui_component.js", "content_scripts/link_hints.js", "content_scripts/vomnibar.js", diff --git a/tests/dom_tests/chrome.coffee b/tests/dom_tests/chrome.coffee index 4c9bfa52..4de85876 100644 --- a/tests/dom_tests/chrome.coffee +++ b/tests/dom_tests/chrome.coffee @@ -7,6 +7,9 @@ root.chromeMessages = [] document.hasFocus = -> true +fakeManifest = + version: "1.51" + root.chrome = runtime: connect: -> @@ -18,7 +21,7 @@ root.chrome = onMessage: addListener: -> sendMessage: (message) -> chromeMessages.unshift message - getManifest: -> + getManifest: -> fakeManifest getURL: (url) -> "../../#{url}" storage: local: @@ -31,3 +34,4 @@ root.chrome = addListener: -> extension: inIncognitoContext: false + getURL: (url) -> chrome.runtime.getURL url diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee index 8c2b73c3..e57f3eab 100644 --- a/tests/dom_tests/dom_tests.coffee +++ b/tests/dom_tests/dom_tests.coffee @@ -34,12 +34,20 @@ initializeModeState = -> handlerStack.bubbleEvent "registerKeyQueue", keyQueue: "" +# Tell Settings that it's been loaded. +Settings.isLoaded = true + +# Shoulda.js doesn't support async code, so we try not to use any. +Utils.nextTick = (func) -> func() + # # Retrieve the hint markers as an array object. # getHintMarkers = -> Array::slice.call document.getElementsByClassName("vimiumHintMarker"), 0 +stubSettings = (key, value) -> stub Settings.cache, key, JSON.stringify value + # # Generate tests that are common to both default and filtered # link hinting modes. @@ -52,8 +60,8 @@ createGeneralHintTests = (isFilteredMode) -> initializeModeState() testContent = "<a>test</a>" + "<a>tress</a>" document.getElementById("test-div").innerHTML = testContent - stub settings.values, "filterLinkHints", false - stub settings.values, "linkHintCharacters", "ab" + stubSettings "filterLinkHints", false + stubSettings "linkHintCharacters", "ab" tearDown -> document.getElementById("test-div").innerHTML = "" @@ -92,8 +100,8 @@ context "Test link hints for focusing input elements correctly", testDiv = document.getElementById("test-div") testDiv.innerHTML = "" - stub settings.values, "filterLinkHints", false - stub settings.values, "linkHintCharacters", "ab" + stubSettings "filterLinkHints", false + stubSettings "linkHintCharacters", "ab" # Every HTML5 input type except for hidden. We should be able to activate all of them with link hints. inputTypes = ["button", "checkbox", "color", "date", "datetime", "datetime-local", "email", "file", @@ -129,8 +137,8 @@ context "Alphabetical link hints", setup -> initializeModeState() - stub settings.values, "filterLinkHints", false - stub settings.values, "linkHintCharacters", "ab" + stubSettings "filterLinkHints", false + stubSettings "linkHintCharacters", "ab" # Three hints will trigger double hint chars. createLinks 3 @@ -161,8 +169,8 @@ context "Filtered link hints", # elements. setup -> - stub settings.values, "filterLinkHints", true - stub settings.values, "linkHintNumbers", "0123456789" + stubSettings "filterLinkHints", true + stubSettings "linkHintNumbers", "0123456789" context "Text hints", @@ -289,7 +297,7 @@ context "Find prev / next links", <a href='#first'>nextcorrupted</a> <a href='#second'>next page</a> """ - stub settings.values, "nextPatterns", "next" + stubSettings "nextPatterns", "next" goNext() assert.equal '#second', window.location.hash @@ -297,7 +305,7 @@ context "Find prev / next links", document.getElementById("test-div").innerHTML = """ <a href='#first'>>></a> """ - stub settings.values, "nextPatterns", ">>" + stubSettings "nextPatterns", ">>" goNext() assert.equal '#first', window.location.hash @@ -306,7 +314,7 @@ context "Find prev / next links", <a href='#first'>lorem ipsum next</a> <a href='#second'>next!</a> """ - stub settings.values, "nextPatterns", "next" + stubSettings "nextPatterns", "next" goNext() assert.equal '#second', window.location.hash diff --git a/tests/dom_tests/dom_tests.html b/tests/dom_tests/dom_tests.html index 5ccd39e7..f7cc430d 100644 --- a/tests/dom_tests/dom_tests.html +++ b/tests/dom_tests/dom_tests.html @@ -35,6 +35,7 @@ <script type="text/javascript" src="../../lib/rect.js"></script> <script type="text/javascript" src="../../lib/handler_stack.js"></script> <script type="text/javascript" src="../../lib/clipboard.js"></script> + <script type="text/javascript" src="../../lib/settings.js"></script> <script type="text/javascript" src="../../content_scripts/ui_component.js"></script> <script type="text/javascript" src="../../content_scripts/link_hints.js"></script> <script type="text/javascript" src="../../content_scripts/vomnibar.js"></script> |
