diff --git a/omega-target-chromium-extension/background.coffee b/omega-target-chromium-extension/background.coffee index 50fb17c..ca93899 100644 --- a/omega-target-chromium-extension/background.coffee +++ b/omega-target-chromium-extension/background.coffee @@ -147,11 +147,11 @@ actionForUrl = (url) -> } -storage = new OmegaTargetCurrent.Storage(chrome.storage.local, 'local') +storage = new OmegaTargetCurrent.Storage('local') state = new OmegaTargetCurrent.BrowserStorage(localStorage, 'omega.local.') -if chrome.storage.sync - syncStorage = new OmegaTargetCurrent.Storage(chrome.storage.sync, 'sync') +if chrome?.storage?.sync or browser?.storage?.sync + syncStorage = new OmegaTargetCurrent.Storage('sync') sync = new OmegaTargetCurrent.OptionsSync(syncStorage) if localStorage['omega.local.syncOptions'] != '"sync"' sync.enabled = false diff --git a/omega-target-chromium-extension/src/chrome_port.coffee b/omega-target-chromium-extension/src/chrome_port.coffee index 0cddb01..e007b11 100644 --- a/omega-target-chromium-extension/src/chrome_port.coffee +++ b/omega-target-chromium-extension/src/chrome_port.coffee @@ -34,8 +34,10 @@ class TrackedEvent constructor: (@event) -> @callbacks = [] mes = ['hasListener', 'hasListeners', 'addRules', 'getRules', 'removeRules'] - for method in mes - this[method] = @event[method].bind(@event) + for methodName in mes + method = @event[methodName] + if method? + this[methodName] = method.bind(@event) addListener: (callback) -> @event.addListener(callback) @@ -69,7 +71,7 @@ class TrackedEvent ### dispose: -> @removeAllListeners() - if @event.hasListeners() + if @event.hasListeners?() throw new Error("Underlying Event still has listeners!") @event = null @callbacks = null diff --git a/omega-target-chromium-extension/src/external_api.coffee b/omega-target-chromium-extension/src/external_api.coffee index a080718..6768809 100644 --- a/omega-target-chromium-extension/src/external_api.coffee +++ b/omega-target-chromium-extension/src/external_api.coffee @@ -10,6 +10,7 @@ module.exports = class ExternalApi 'padekgcemlokbadohgkifijomclgjgif': 32 disabled: false listen: -> + return unless chrome.runtime.onConnectExternal chrome.runtime.onConnectExternal.addListener (rawPort) => port = new ChromePort(rawPort) port.onMessage.addListener (msg) => @onMessage(msg, port) diff --git a/omega-target-chromium-extension/src/options.coffee b/omega-target-chromium-extension/src/options.coffee index ecf9185..8f5db9f 100644 --- a/omega-target-chromium-extension/src/options.coffee +++ b/omega-target-chromium-extension/src/options.coffee @@ -3,7 +3,14 @@ OmegaPac = OmegaTarget.OmegaPac Promise = OmegaTarget.Promise querystring = require('querystring') chromeApiPromisifyAll = require('./chrome_api') -proxySettings = chromeApiPromisifyAll(chrome.proxy.settings) +if chrome?.proxy?.settings + proxySettings = chromeApiPromisifyAll(chrome.proxy.settings) +else + proxySettings = + setAsync: -> Promise.resolve() + clearAsync: -> Promise.resolve() + get: -> null + onChange: addListener: -> null parseExternalProfile = require('./parse_external_profile') ProxyAuth = require('./proxy_auth') WebRequestMonitor = require('./web_request_monitor') @@ -118,14 +125,14 @@ class ChromeOptions extends OmegaTarget.Options @_proxyChangeListener = (details) => for watcher in @_proxyChangeWatchers watcher(details) - chrome.proxy.settings.onChange.addListener @_proxyChangeListener + proxySettings.onChange.addListener @_proxyChangeListener @_proxyChangeWatchers.push(callback) applyProfileProxy: (profile, meta) -> meta ?= profile if profile.profileType == 'SystemProfile' # Clear proxy settings, returning proxy control to Chromium. return proxySettings.clearAsync({}).then => - chrome.proxy.settings.get {}, @_proxyChangeListener + proxySettings.get {}, @_proxyChangeListener return config = {} if profile.profileType == 'DirectProfile' @@ -161,7 +168,7 @@ class ChromeOptions extends OmegaTarget.Options @_proxyAuth.setProxies(@_watchingProfiles) proxySettings.setAsync({value: config}) ).then => - chrome.proxy.settings.get {}, @_proxyChangeListener + proxySettings.get {}, @_proxyChangeListener return _quickSwitchInit: false diff --git a/omega-target-chromium-extension/src/proxy_auth.coffee b/omega-target-chromium-extension/src/proxy_auth.coffee index e11d17c..50aa764 100644 --- a/omega-target-chromium-extension/src/proxy_auth.coffee +++ b/omega-target-chromium-extension/src/proxy_auth.coffee @@ -13,6 +13,9 @@ module.exports = class ProxyAuth if not chrome.webRequest @options.log.error('Proxy auth disabled! No webRequest permission.') return + if not chrome.webRequest.onAuthRequired + @options.log.error('Proxy auth disabled! onAuthRequired not available.') + return chrome.webRequest.onAuthRequired.addListener( @authHandler.bind(this) {urls: ['']} diff --git a/omega-target-chromium-extension/src/storage.coffee b/omega-target-chromium-extension/src/storage.coffee index c7069e0..0838491 100644 --- a/omega-target-chromium-extension/src/storage.coffee +++ b/omega-target-chromium-extension/src/storage.coffee @@ -28,27 +28,40 @@ class ChromeStorage extends OmegaTarget.Storage # This could happen if the storage area is not available. For example, # some Chromium-based browsers disable access to the sync storage. err = new OmegaTarget.Storage.StorageUnavailableError() + else if err.message.indexOf( + 'Please set webextensions.storage.sync.enabled to true') >= 0 + # This happens when sync storage is disabled in flags. + err = new OmegaTarget.Storage.StorageUnavailableError() return Promise.reject(err) - constructor: (storage, @areaName) -> - @storage = chromeApiPromisifyAll(storage) + constructor: (@areaName) -> + if browser?.storage?[@areaName] + @storage = browser.storage[@areaName] + else + wrapper = chromeApiPromisifyAll(chrome.storage[@areaName]) + @storage = + get: wrapper.getAsync.bind(wrapper), + set: wrapper.setAsync.bind(wrapper), + remove: wrapper.removeAsync.bind(wrapper), + clear: wrapper.clearAsync.bind(wrapper), get: (keys) -> keys ?= null - @storage.getAsync(keys).catch(ChromeStorage.parseStorageErrors) + Promise.resolve(@storage.get(keys)).catch(ChromeStorage.parseStorageErrors) set: (items) -> if Object.keys(items).length == 0 return Promise.resolve({}) - @storage.setAsync(items).catch(ChromeStorage.parseStorageErrors) + Promise.resolve(@storage.set(items)).catch(ChromeStorage.parseStorageErrors) remove: (keys) -> if not keys? - return @storage.clearAsync() + return Promise.resolve(@storage.clear()) if Array.isArray(keys) and keys.length == 0 return Promise.resolve({}) - @storage.removeAsync(keys).catch(ChromeStorage.parseStorageErrors) + Promise.resolve(@storage.remove(keys)) + .catch(ChromeStorage.parseStorageErrors) watch: (keys, callback) -> ChromeStorage.watchers[@areaName] ?= {}