| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 | 
#
# This is a stub for chrome.strorage.sync for testing.
# It does what chrome.storage.sync should do (roughly), but does so synchronously.
# It also provides stubs for a number of other chrome APIs.
#
exports.window = {}
exports.localStorage = {}
global.navigator =
  appVersion: "5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"
global.document =
  createElement: -> {}
  addEventListener: ->
global.XMLHttpRequest =
  class XMLHttpRequest
    open: ->
    onload: ->
    send: ->
exports.chrome =
  areRunningVimiumTests: true
  runtime:
    getURL: ->
    getManifest: () ->
      version: "1.2.3"
    onConnect:
      addListener: () -> true
    onMessage:
      addListener: () -> true
    onInstalled:
      addListener: ->
  extension:
    getURL: (path) -> path
    getBackgroundPage: -> {}
    getViews: -> []
  tabs:
    onUpdated:
      addListener: () -> true
    onAttached:
      addListener: () -> true
    onMoved:
      addListener: () -> true
    onRemoved:
      addListener: () -> true
    onActivated:
      addListener: () -> true
    onReplaced:
      addListener: () -> true
    query: () -> true
  webNavigation:
    onHistoryStateUpdated:
      addListener: () ->
    onReferenceFragmentUpdated:
      addListener: () ->
    onCommitted:
      addListener: () ->
  windows:
    onRemoved:
      addListener: () -> true
    getAll: () -> true
    onFocusChanged:
      addListener: () -> true
  browserAction:
    setBadgeBackgroundColor: ->
  storage:
    # chrome.storage.local
    local:
      get: (_, callback) -> callback?()
      set: (_, callback) -> callback?()
      remove: (_, callback) -> callback?()
    # chrome.storage.onChanged
    onChanged:
      addListener: (func) -> @func = func
      # Fake a callback from chrome.storage.sync.
      call: (key, value) ->
        chrome.runtime.lastError = undefined
        key_value = {}
        key_value[key] = { newValue: value }
        @func(key_value,'sync') if @func
      callEmpty: (key) ->
        chrome.runtime.lastError = undefined
        if @func
          items = {}
          items[key] = {}
          @func(items,'sync')
    session:
      MAX_SESSION_RESULTS: 25
    # chrome.storage.sync
    sync:
      store: {}
      set: (items, callback) ->
        chrome.runtime.lastError = undefined
        for own key, value of items
          @store[key] = value
        callback() if callback
        # Now, generate (supposedly asynchronous) notifications for listeners.
        for own key, value of items
          global.chrome.storage.onChanged.call(key,value)
      get: (keys, callback) ->
        chrome.runtime.lastError = undefined
        if keys == null
          keys = []
          for own key, value of @store
            keys.push key
        items = {}
        for key in keys
          items[key] = @store[key]
        # Now, generate (supposedly asynchronous) callback
        callback items if callback
      remove: (key, callback) ->
        chrome.runtime.lastError = undefined
        if key of @store
          delete @store[key]
        callback() if callback
        # Now, generate (supposedly asynchronous) notification for listeners.
        global.chrome.storage.onChanged.callEmpty(key)
 |