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> | 
