Adapt to browser.storage if available. Disable proxy for now.

Added feature detection for some other chrome.* APIs.
This commit is contained in:
FelisCatus 2017-03-24 23:01:47 -04:00
parent 7333d43064
commit 8d040f9402
6 changed files with 42 additions and 16 deletions

View File

@ -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.') state = new OmegaTargetCurrent.BrowserStorage(localStorage, 'omega.local.')
if chrome.storage.sync if chrome?.storage?.sync or browser?.storage?.sync
syncStorage = new OmegaTargetCurrent.Storage(chrome.storage.sync, 'sync') syncStorage = new OmegaTargetCurrent.Storage('sync')
sync = new OmegaTargetCurrent.OptionsSync(syncStorage) sync = new OmegaTargetCurrent.OptionsSync(syncStorage)
if localStorage['omega.local.syncOptions'] != '"sync"' if localStorage['omega.local.syncOptions'] != '"sync"'
sync.enabled = false sync.enabled = false

View File

@ -34,8 +34,10 @@ class TrackedEvent
constructor: (@event) -> constructor: (@event) ->
@callbacks = [] @callbacks = []
mes = ['hasListener', 'hasListeners', 'addRules', 'getRules', 'removeRules'] mes = ['hasListener', 'hasListeners', 'addRules', 'getRules', 'removeRules']
for method in mes for methodName in mes
this[method] = @event[method].bind(@event) method = @event[methodName]
if method?
this[methodName] = method.bind(@event)
addListener: (callback) -> addListener: (callback) ->
@event.addListener(callback) @event.addListener(callback)
@ -69,7 +71,7 @@ class TrackedEvent
### ###
dispose: -> dispose: ->
@removeAllListeners() @removeAllListeners()
if @event.hasListeners() if @event.hasListeners?()
throw new Error("Underlying Event still has listeners!") throw new Error("Underlying Event still has listeners!")
@event = null @event = null
@callbacks = null @callbacks = null

View File

@ -10,6 +10,7 @@ module.exports = class ExternalApi
'padekgcemlokbadohgkifijomclgjgif': 32 'padekgcemlokbadohgkifijomclgjgif': 32
disabled: false disabled: false
listen: -> listen: ->
return unless chrome.runtime.onConnectExternal
chrome.runtime.onConnectExternal.addListener (rawPort) => chrome.runtime.onConnectExternal.addListener (rawPort) =>
port = new ChromePort(rawPort) port = new ChromePort(rawPort)
port.onMessage.addListener (msg) => @onMessage(msg, port) port.onMessage.addListener (msg) => @onMessage(msg, port)

View File

@ -3,7 +3,14 @@ OmegaPac = OmegaTarget.OmegaPac
Promise = OmegaTarget.Promise Promise = OmegaTarget.Promise
querystring = require('querystring') querystring = require('querystring')
chromeApiPromisifyAll = require('./chrome_api') chromeApiPromisifyAll = require('./chrome_api')
if chrome?.proxy?.settings
proxySettings = chromeApiPromisifyAll(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') parseExternalProfile = require('./parse_external_profile')
ProxyAuth = require('./proxy_auth') ProxyAuth = require('./proxy_auth')
WebRequestMonitor = require('./web_request_monitor') WebRequestMonitor = require('./web_request_monitor')
@ -118,14 +125,14 @@ class ChromeOptions extends OmegaTarget.Options
@_proxyChangeListener = (details) => @_proxyChangeListener = (details) =>
for watcher in @_proxyChangeWatchers for watcher in @_proxyChangeWatchers
watcher(details) watcher(details)
chrome.proxy.settings.onChange.addListener @_proxyChangeListener proxySettings.onChange.addListener @_proxyChangeListener
@_proxyChangeWatchers.push(callback) @_proxyChangeWatchers.push(callback)
applyProfileProxy: (profile, meta) -> applyProfileProxy: (profile, meta) ->
meta ?= profile meta ?= profile
if profile.profileType == 'SystemProfile' if profile.profileType == 'SystemProfile'
# Clear proxy settings, returning proxy control to Chromium. # Clear proxy settings, returning proxy control to Chromium.
return proxySettings.clearAsync({}).then => return proxySettings.clearAsync({}).then =>
chrome.proxy.settings.get {}, @_proxyChangeListener proxySettings.get {}, @_proxyChangeListener
return return
config = {} config = {}
if profile.profileType == 'DirectProfile' if profile.profileType == 'DirectProfile'
@ -161,7 +168,7 @@ class ChromeOptions extends OmegaTarget.Options
@_proxyAuth.setProxies(@_watchingProfiles) @_proxyAuth.setProxies(@_watchingProfiles)
proxySettings.setAsync({value: config}) proxySettings.setAsync({value: config})
).then => ).then =>
chrome.proxy.settings.get {}, @_proxyChangeListener proxySettings.get {}, @_proxyChangeListener
return return
_quickSwitchInit: false _quickSwitchInit: false

View File

@ -13,6 +13,9 @@ module.exports = class ProxyAuth
if not chrome.webRequest if not chrome.webRequest
@options.log.error('Proxy auth disabled! No webRequest permission.') @options.log.error('Proxy auth disabled! No webRequest permission.')
return return
if not chrome.webRequest.onAuthRequired
@options.log.error('Proxy auth disabled! onAuthRequired not available.')
return
chrome.webRequest.onAuthRequired.addListener( chrome.webRequest.onAuthRequired.addListener(
@authHandler.bind(this) @authHandler.bind(this)
{urls: ['<all_urls>']} {urls: ['<all_urls>']}

View File

@ -28,27 +28,40 @@ class ChromeStorage extends OmegaTarget.Storage
# This could happen if the storage area is not available. For example, # This could happen if the storage area is not available. For example,
# some Chromium-based browsers disable access to the sync storage. # some Chromium-based browsers disable access to the sync storage.
err = new OmegaTarget.Storage.StorageUnavailableError() 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) return Promise.reject(err)
constructor: (storage, @areaName) -> constructor: (@areaName) ->
@storage = chromeApiPromisifyAll(storage) 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) -> get: (keys) ->
keys ?= null keys ?= null
@storage.getAsync(keys).catch(ChromeStorage.parseStorageErrors) Promise.resolve(@storage.get(keys)).catch(ChromeStorage.parseStorageErrors)
set: (items) -> set: (items) ->
if Object.keys(items).length == 0 if Object.keys(items).length == 0
return Promise.resolve({}) return Promise.resolve({})
@storage.setAsync(items).catch(ChromeStorage.parseStorageErrors) Promise.resolve(@storage.set(items)).catch(ChromeStorage.parseStorageErrors)
remove: (keys) -> remove: (keys) ->
if not keys? if not keys?
return @storage.clearAsync() return Promise.resolve(@storage.clear())
if Array.isArray(keys) and keys.length == 0 if Array.isArray(keys) and keys.length == 0
return Promise.resolve({}) return Promise.resolve({})
@storage.removeAsync(keys).catch(ChromeStorage.parseStorageErrors) Promise.resolve(@storage.remove(keys))
.catch(ChromeStorage.parseStorageErrors)
watch: (keys, callback) -> watch: (keys, callback) ->
ChromeStorage.watchers[@areaName] ?= {} ChromeStorage.watchers[@areaName] ?= {}