diff --git a/platform/chromium/vapi-client.js b/platform/chromium/vapi-client.js index 6fdc851fc..dd54c5bd9 100644 --- a/platform/chromium/vapi-client.js +++ b/platform/chromium/vapi-client.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 The µBlock authors + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 The µBlock authors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ 'use strict'; +/******************************************************************************/ /******************************************************************************/ // https://github.com/chrisaljoudi/uBlock/issues/464 @@ -91,241 +92,251 @@ vAPI.shutdown = (function() { }; })(); +/******************************************************************************/ /******************************************************************************/ vAPI.messaging = { port: null, - channels: {}, - pending: {}, + portTimer: null, + portTimerDelay: 10000, + channels: Object.create(null), + channelCount: 0, + pending: Object.create(null), pendingCount: 0, auxProcessId: 1, + shuttingDown: false, - onDisconnect: function() { + shutdown: function() { + this.shuttingDown = true; + this.destroyPort(); + }, + + disconnectListener: function() { this.port = null; - this.close(); vAPI.shutdown.exec(); }, + disconnectListenerCallback: null, - setup: function() { - try { - this.port = chrome.runtime.connect({name: vAPI.sessionId}) || null; - } catch (ex) { + messageListener: function(details) { + if ( !details ) { + return; } - if ( this.port === null ) { - vAPI.shutdown.exec(); - return false; + + // Sent to all channels + if ( details.broadcast === true && !details.channelName ) { + for ( var channelName in this.channels ) { + this.sendToChannelListeners(channelName, details.msg); + } + return; + } + + // Response to specific message previously sent + if ( details.auxProcessId ) { + var listener = this.pending[details.auxProcessId]; + delete this.pending[details.auxProcessId]; + delete details.auxProcessId; // TODO: why? + if ( listener ) { + this.pendingCount -= 1; + listener(details.msg); + return; + } + } + + // Sent to a specific channel + var response = this.sendToChannelListeners(details.channelName, details.msg); + + // Respond back if required + if ( details.mainProcessId === undefined ) { + return; + } + var port = this.connect(); + if ( port !== null ) { + port.postMessage({ + mainProcessId: details.mainProcessId, + msg: response + }); } - this.port.onMessage.addListener(messagingConnector); - this.port.onDisconnect.addListener(this.onDisconnect.bind(this)); - return true; }, + messageListenerCallback: null, - close: function() { + portPoller: function() { + this.portTimer = null; + if ( this.port !== null ) { + if ( this.channelCount !== 0 || this.pendingCount !== 0 ) { + this.portTimer = vAPI.setTimeout(this.portPollerCallback, this.portTimerDelay); + this.portTimerDelay = Math.min(this.portTimerDelay * 2, 3600000); + return; + } + } + this.destroyPort(); + }, + portPollerCallback: null, + + destroyPort: function() { + if ( this.portTimer !== null ) { + clearTimeout(this.portTimer); + this.portTimer = null; + } var port = this.port; if ( port !== null ) { port.disconnect(); - port.onMessage.removeListener(messagingConnector); - port.onDisconnect.removeListener(this.onDisconnect); + port.onMessage.removeListener(this.messageListenerCallback); + port.onDisconnect.removeListener(this.disconnectListenerCallback); this.port = null; } - this.channels = {}; + if ( this.channelCount !== 0 ) { + this.channels = Object.create(null); + this.channelCount = 0; + } // service pending callbacks - var pending = this.pending, listener; - this.pending = {}; - this.pendingCount = 0; - for ( var auxId in pending ) { - if ( this.pending.hasOwnProperty(auxId) ) { - listener = pending[auxId]; - if ( typeof listener === 'function' ) { - listener(null); + if ( this.pendingCount !== 0 ) { + var pending = this.pending, callback; + this.pending = Object.create(null); + this.pendingCount = 0; + for ( var auxId in pending ) { + callback = pending[auxId]; + if ( typeof callback === 'function' ) { + callback(null); } } } }, - channel: function(channelName, callback) { - if ( !channelName ) { - return; + createPort: function() { + if ( this.shuttingDown ) { + return null; } - var channel = this.channels[channelName]; - if ( channel instanceof MessagingChannel ) { - channel.addListener(callback); - channel.refCount += 1; - } else { - channel = this.channels[channelName] = new MessagingChannel(channelName, callback); + if ( this.messageListenerCallback === null ) { + this.messageListenerCallback = this.messageListener.bind(this); + this.disconnectListenerCallback = this.disconnectListener.bind(this); + this.portPollerCallback = this.portPoller.bind(this); } - return channel; - } -}; - -/******************************************************************************/ - -var messagingConnector = function(details) { - if ( !details ) { - return; - } - - var messaging = vAPI.messaging; - var channels = messaging.channels; - var channel; - - // Sent to all channels - if ( details.broadcast === true && !details.channelName ) { - for ( channel in channels ) { - if ( channels[channel] instanceof MessagingChannel === false ) { - continue; - } - channels[channel].sendToListeners(details.msg); + var port = null; + try { + port = this.port = chrome.runtime.connect({name: vAPI.sessionId}); + port.onMessage.addListener(this.messageListenerCallback); + port.onDisconnect.addListener(this.disconnectListenerCallback); + } catch (ex) { } - return; - } - - // Response to specific message previously sent - if ( details.auxProcessId ) { - var listener = messaging.pending[details.auxProcessId]; - delete messaging.pending[details.auxProcessId]; - delete details.auxProcessId; // TODO: why? - if ( listener ) { - messaging.pendingCount -= 1; - listener(details.msg); - return; + this.portTimerDelay = 15000; + if ( this.portTimer === null ) { + this.portTimer = vAPI.setTimeout(this.portPollerCallback, this.portTimerDelay); } - } + return port; + }, - // Sent to a specific channel - var response; - channel = channels[details.channelName]; - if ( channel instanceof MessagingChannel ) { - response = channel.sendToListeners(details.msg); - } + connect: function() { + return this.port !== null ? this.port : this.createPort(); + }, - // Respond back if required - if ( details.mainProcessId !== undefined ) { - messaging.port.postMessage({ - mainProcessId: details.mainProcessId, - msg: response - }); - } -}; + send: function(channelName, message, callback) { + this.sendTo(channelName, message, undefined, undefined, callback); + }, -/******************************************************************************/ - -var MessagingChannel = function(name, listener) { - this.channelName = name; - this.listeners = typeof listener === 'function' ? [listener] : []; - this.refCount = 1; - if ( typeof listener === 'function' ) { - var messaging = vAPI.messaging; - if ( messaging.port === null ) { - messaging.setup(); + sendTo: function(channelName, message, toTabId, toChannel, callback) { + // Too large a gap between the last request and the last response means + // the main process is no longer reachable: memory leaks and bad + // performance become a risk -- especially for long-lived, dynamic + // pages. Guard against this. + if ( this.pendingCount > 25 ) { + vAPI.shutdown.exec(); } - } -}; - -MessagingChannel.prototype.send = function(message, callback) { - this.sendTo(message, undefined, undefined, callback); -}; - -MessagingChannel.prototype.sendTo = function(message, toTabId, toChannel, callback) { - var messaging = vAPI.messaging; - // Too large a gap between the last request and the last response means - // the main process is no longer reachable: memory leaks and bad - // performance become a risk -- especially for long-lived, dynamic - // pages. Guard against this. - if ( messaging.pendingCount > 25 ) { - //console.error('uBlock> Sigh. Main process is sulking. Will try to patch things up.'); - messaging.close(); - } - if ( messaging.port === null ) { - if ( messaging.setup() === false ) { + var port = this.connect(); + if ( port === null ) { if ( typeof callback === 'function' ) { callback(); } return; } - } - var auxProcessId; - if ( callback ) { - auxProcessId = messaging.auxProcessId++; - messaging.pending[auxProcessId] = callback; - messaging.pendingCount += 1; - } - messaging.port.postMessage({ - channelName: this.channelName, - auxProcessId: auxProcessId, - toTabId: toTabId, - toChannel: toChannel, - msg: message - }); -}; - -MessagingChannel.prototype.close = function() { - this.refCount -= 1; - if ( this.refCount !== 0 ) { - return; - } - var messaging = vAPI.messaging; - delete messaging.channels[this.channelName]; - if ( Object.keys(messaging.channels).length === 0 ) { - messaging.close(); - } -}; - -MessagingChannel.prototype.addListener = function(callback) { - if ( typeof callback !== 'function' ) { - return; - } - if ( this.listeners.indexOf(callback) !== -1 ) { - throw new Error('Duplicate listener.'); - } - this.listeners.push(callback); - var messaging = vAPI.messaging; - if ( messaging.port === null ) { - messaging.setup(); - } -}; - -MessagingChannel.prototype.removeListener = function(callback) { - if ( typeof callback !== 'function' ) { - return; - } - var pos = this.listeners.indexOf(callback); - if ( pos === -1 ) { - throw new Error('Listener not found.'); - } - this.listeners.splice(pos, 1); -}; - -MessagingChannel.prototype.removeAllListeners = function() { - this.listeners = []; -}; - -MessagingChannel.prototype.sendToListeners = function(msg) { - var response; - var listeners = this.listeners; - for ( var i = 0, n = listeners.length; i < n; i++ ) { - response = listeners[i](msg); - if ( response !== undefined ) { - break; + var auxProcessId; + if ( callback ) { + auxProcessId = this.auxProcessId++; + this.pending[auxProcessId] = callback; + this.pendingCount += 1; } + port.postMessage({ + channelName: channelName, + auxProcessId: auxProcessId, + toTabId: toTabId, + toChannel: toChannel, + msg: message + }); + }, + + addChannelListener: function(channelName, callback) { + if ( typeof callback !== 'function' ) { + return; + } + var listeners = this.channels[channelName]; + if ( listeners !== undefined && listeners.indexOf(callback) !== -1 ) { + console.error('Duplicate listener on channel "%s"', channelName); + return; + } + if ( listeners === undefined ) { + this.channels[channelName] = [callback]; + this.channelCount += 1; + } else { + listeners.push(callback); + } + this.connect(); + }, + + removeChannelListener: function(channelName, callback) { + if ( typeof callback !== 'function' ) { + return; + } + var listeners = this.channels[channelName]; + if ( listeners === undefined ) { + return; + } + var pos = this.listeners.indexOf(callback); + if ( pos === -1 ) { + console.error('Listener not found on channel "%s"', channelName); + return; + } + listeners.splice(pos, 1); + if ( listeners.length === 0 ) { + delete this.channels[channelName]; + this.channelCount -= 1; + } + }, + + removeAllChannelListeners: function(channelName) { + var listeners = this.channels[channelName]; + if ( listeners === undefined ) { + return; + } + delete this.channels[channelName]; + this.channelCount -= 1; + }, + + sendToChannelListeners: function(channelName, msg) { + var listeners = this.channels[channelName]; + if ( listeners === undefined ) { + return; + } + var response; + for ( var i = 0, n = listeners.length; i < n; i++ ) { + response = listeners[i](msg); + if ( response !== undefined ) { + break; + } + } + return response; } - return response; }; +/******************************************************************************/ + +vAPI.shutdown.add(function() { + vAPI.messaging.shutdown(); + window.vAPI = null; +}); + // https://www.youtube.com/watch?v=rT5zCHn0tsg // https://www.youtube.com/watch?v=E-jS4e3zacI /******************************************************************************/ - -// No need to have vAPI client linger around after shutdown if -// we are not a top window (because element picker can still -// be injected in top window). -if ( window !== window.top ) { - vAPI.shutdown.add(function() { - vAPI = null; - }); -} - /******************************************************************************/ })(this); diff --git a/platform/firefox/vapi-background.js b/platform/firefox/vapi-background.js index b22a23910..1bb627eb8 100644 --- a/platform/firefox/vapi-background.js +++ b/platform/firefox/vapi-background.js @@ -410,6 +410,7 @@ vAPI.storage = (function() { if ( typeof callback === 'function' && reason === 0 ) { callback(result); } + result = null; }, handleError: function(error) { console.error('SQLite error ', error.result, error.message); @@ -417,6 +418,7 @@ vAPI.storage = (function() { if ( typeof callback === 'function' ) { callback(null); } + result = null; } }); }; diff --git a/platform/firefox/vapi-client.js b/platform/firefox/vapi-client.js index e19dade01..39c133500 100644 --- a/platform/firefox/vapi-client.js +++ b/platform/firefox/vapi-client.js @@ -114,16 +114,53 @@ vAPI.shutdown = (function() { /******************************************************************************/ vAPI.messaging = { - channels: {}, - pending: {}, + channels: Object.create(null), + channelCount: 0, + pending: Object.create(null), pendingCount: 0, auxProcessId: 1, connected: false, - connector: function(msg) { - messagingConnector(JSON.parse(msg)); + + messageListener: function(msg) { + var details = JSON.parse(msg); + if ( !details ) { + return; + } + + // Sent to all channels + if ( details.broadcast && !details.channelName ) { + for ( var channelName in this.channels ) { + this.sendToChannelListeners(channelName, details.msg); + } + return; + } + + // Response to specific message previously sent + if ( details.auxProcessId ) { + var listener = this.pending[details.auxProcessId]; + delete this.pending[details.auxProcessId]; + delete details.auxProcessId; // TODO: why? + if ( listener ) { + this.pendingCount -= 1; + listener(details.msg); + return; + } + } + + // Sent to a specific channel + var response = this.sendToChannelListeners(details.channelName, details.msg); + + // Respond back if required + if ( details.mainProcessId === undefined ) { + return; + } + sendAsyncMessage('ublock0:background', { + mainProcessId: details.mainProcessId, + msg: response + }); }, - builtinChannelHandler: function(msg) { + builtinListener: function(msg) { if ( msg.cmd === 'injectScript' ) { // injectScript is not always present. // - See contentObserver.initContentScripts in frameModule.js @@ -152,7 +189,7 @@ vAPI.messaging = { } if ( msg.cmd === 'shutdownSandbox' ) { vAPI.shutdown.exec(); - vAPI.messaging.shutdown(); + this.stop(); if ( typeof self.outerShutdown === 'function' ) { outerShutdown(); } @@ -160,53 +197,58 @@ vAPI.messaging = { } }, - setup: function() { - this.channels['vAPI'] = new MessagingChannel('vAPI', this.builtinChannelHandler); - window.addEventListener('pagehide', this.toggleListener, true); - window.addEventListener('pageshow', this.toggleListener, true); + toggleListener: function({type, persisted}) { + if ( type === 'pagehide' && !persisted ) { + vAPI.shutdown.exec(); + this.stop(); + if ( typeof self.outerShutdown === 'function' ) { + outerShutdown(); + } + return; + } + + if ( type === 'pagehide' ) { + this.disconnect(); + } else /* if ( type === 'pageshow' ) */ { + this.connect(); + } + }, + toggleListenerCallback: null, + + start: function() { + this.addChannelListener('vAPI', this.builtinListener.bind(this)); + if ( this.toggleListenerCallback === null ) { + this.toggleListenerCallback = this.toggleListener.bind(this); + } + window.addEventListener('pagehide', this.toggleListenerCallback, true); + window.addEventListener('pageshow', this.toggleListenerCallback, true); }, - shutdown: function() { - this.close(); - window.removeEventListener('pagehide', this.toggleListener, true); - window.removeEventListener('pageshow', this.toggleListener, true); - vAPI.messaging = null; - }, - - close: function() { + stop: function() { + if ( this.toggleListenerCallback !== null ) { + window.removeEventListener('pagehide', this.toggleListenerCallback, true); + window.removeEventListener('pageshow', this.toggleListenerCallback, true); + } this.disconnect(); - this.channels = {}; + this.channels = Object.create(null); + this.channelCount = 0; // service pending callbacks - var pending = this.pending, listener; - this.pending = {}; + var pending = this.pending, callback; + this.pending = Object.create(null); this.pendingCount = 0; for ( var auxId in pending ) { if ( this.pending.hasOwnProperty(auxId) ) { - listener = pending[auxId]; - if ( typeof listener === 'function' ) { - listener(null); + callback = pending[auxId]; + if ( typeof callback === 'function' ) { + callback(null); } } } }, - channel: function(channelName, callback) { - if ( !channelName ) { - return; - } - var channel = this.channels[channelName]; - if ( channel instanceof MessagingChannel ) { - channel.addListener(callback); - channel.refCount += 1; - } else { - channel = this.channels[channelName] = new MessagingChannel(channelName, callback); - } - return channel; - }, - connect: function() { if ( !this.connected ) { - addMessageListener(this.connector); + addMessageListener(this.messageListener.bind(this)); this.connected = true; } }, @@ -218,185 +260,109 @@ vAPI.messaging = { } }, - toggleListener: function({type, persisted}) { - var me = vAPI.messaging; - if ( !me ) { - return; - } + send: function(channelName, message, callback) { + this.sendTo(channelName, message, undefined, undefined, callback); + }, - if ( type === 'pagehide' ) { - if ( !persisted ) { - vAPI.shutdown.exec(); - vAPI.messaging.shutdown(); - if ( typeof self.outerShutdown === 'function' ) { - outerShutdown(); - } + sendTo: function(channelName, message, toTabId, toChannel, callback) { + if ( !this.connected ) { + if ( typeof callback === 'function' ) { + callback(); } - me.disconnect(); return; } - - me.connect(); - } -}; - -/******************************************************************************/ - -var messagingConnector = function(details) { - if ( !details ) { - return; - } - - var messaging = vAPI.messaging; - - // Sandbox might have been shutdown - if ( !messaging ) { - return; - } - - var channels = messaging.channels; - var channel; - - // Sent to all channels - if ( details.broadcast && !details.channelName ) { - for ( channel in channels ) { - if ( channels[channel] instanceof MessagingChannel === false ) { - continue; - } - channels[channel].sendToListeners(details.msg); + // Too large a gap between the last request and the last response means + // the main process is no longer reachable: memory leaks and bad + // performance become a risk -- especially for long-lived, dynamic + // pages. Guard against this. + if ( this.pendingCount > 25 ) { + vAPI.shutdown.exec(); } - return; - } - - // Response to specific message previously sent - if ( details.auxProcessId ) { - var listener = messaging.pending[details.auxProcessId]; - delete messaging.pending[details.auxProcessId]; - delete details.auxProcessId; // TODO: why? - if ( listener ) { - messaging.pendingCount -= 1; - listener(details.msg); - return; + this.connect(); + var auxProcessId; + if ( callback ) { + auxProcessId = this.auxProcessId++; + this.pending[auxProcessId] = callback; + this.pendingCount += 1; } - } - - // Sent to a specific channel - var response; - channel = channels[details.channelName]; - if ( channel instanceof MessagingChannel ) { - response = channel.sendToListeners(details.msg); - } - - // Respond back if required - if ( details.mainProcessId !== undefined ) { sendAsyncMessage('ublock0:background', { - mainProcessId: details.mainProcessId, - msg: response + channelName: self._sandboxId_ + '|' + channelName, + auxProcessId: auxProcessId, + toTabId: toTabId, + toChannel: toChannel, + msg: message }); - } -}; + }, -/******************************************************************************/ - -var MessagingChannel = function(name, callback) { - this.channelName = name; - this.listeners = typeof callback === 'function' ? [callback] : []; - this.refCount = 1; - if ( typeof callback === 'function' ) { - vAPI.messaging.connect(); - } -}; - -MessagingChannel.prototype.send = function(message, callback) { - this.sendTo(message, undefined, undefined, callback); -}; - -MessagingChannel.prototype.sendTo = function(message, toTabId, toChannel, callback) { - var messaging = vAPI.messaging; - if ( !messaging ) { - if ( typeof callback === 'function' ) { - callback(); + addChannelListener: function(channelName, callback) { + if ( typeof callback !== 'function' ) { + return; } - return; - } - // Too large a gap between the last request and the last response means - // the main process is no longer reachable: memory leaks and bad - // performance become a risk -- especially for long-lived, dynamic - // pages. Guard against this. - if ( messaging.pendingCount > 25 ) { - //console.error('uBlock> Sigh. Main process is sulking. Will try to patch things up.'); - messaging.close(); - } - messaging.connect(); - var auxProcessId; - if ( callback ) { - auxProcessId = messaging.auxProcessId++; - messaging.pending[auxProcessId] = callback; - messaging.pendingCount += 1; - } - sendAsyncMessage('ublock0:background', { - channelName: self._sandboxId_ + '|' + this.channelName, - auxProcessId: auxProcessId, - toTabId: toTabId, - toChannel: toChannel, - msg: message - }); -}; - -MessagingChannel.prototype.close = function() { - this.refCount -= 1; - if ( this.refCount !== 0 ) { - return; - } - delete vAPI.messaging.channels[this.channelName]; -}; - -MessagingChannel.prototype.addListener = function(callback) { - if ( typeof callback !== 'function' ) { - return; - } - if ( this.listeners.indexOf(callback) !== -1 ) { - throw new Error('Duplicate listener.'); - } - this.listeners.push(callback); - vAPI.messaging.connect(); -}; - -MessagingChannel.prototype.removeListener = function(callback) { - if ( typeof callback !== 'function' ) { - return; - } - var pos = this.listeners.indexOf(callback); - if ( pos === -1 ) { - throw new Error('Listener not found.'); - } - this.listeners.splice(pos, 1); -}; - -MessagingChannel.prototype.removeAllListeners = function() { - this.listeners = []; -}; - -MessagingChannel.prototype.sendToListeners = function(msg) { - var response; - var listeners = this.listeners; - for ( var i = 0, n = listeners.length; i < n; i++ ) { - response = listeners[i](msg); - if ( response !== undefined ) { - break; + var listeners = this.channels[channelName]; + if ( listeners !== undefined && listeners.indexOf(callback) !== -1 ) { + console.error('Duplicate listener on channel "%s"', channelName); + return; } + if ( listeners === undefined ) { + this.channels[channelName] = [callback]; + this.channelCount += 1; + } else { + listeners.push(callback); + } + this.connect(); + }, + + removeChannelListener: function(channelName, callback) { + if ( typeof callback !== 'function' ) { + return; + } + var listeners = this.channels[channelName]; + if ( listeners === undefined ) { + return; + } + var pos = this.listeners.indexOf(callback); + if ( pos === -1 ) { + console.error('Listener not found on channel "%s"', channelName); + return; + } + listeners.splice(pos, 1); + if ( listeners.length === 0 ) { + delete this.channels[channelName]; + this.channelCount -= 1; + } + }, + + removeAllChannelListeners: function(channelName) { + var listeners = this.channels[channelName]; + if ( listeners === undefined ) { + return; + } + delete this.channels[channelName]; + this.channelCount -= 1; + }, + + sendToChannelListeners: function(channelName, msg) { + var listeners = this.channels[channelName]; + if ( listeners === undefined ) { + return; + } + var response; + for ( var i = 0, n = listeners.length; i < n; i++ ) { + response = listeners[i](msg); + if ( response !== undefined ) { + break; + } + } + return response; } - return response; }; +vAPI.messaging.start(); + // https://www.youtube.com/watch?v=Cg0cmhjdiLs /******************************************************************************/ -vAPI.messaging.setup(); - -/******************************************************************************/ - // No need to have vAPI client linger around after shutdown if // we are not a top window (because element picker can still // be injected in top window). diff --git a/src/js/1p-filters.js b/src/js/1p-filters.js index ac6ac2d22..57e2f934d 100644 --- a/src/js/1p-filters.js +++ b/src/js/1p-filters.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI, uDom, uBlockDashboard */ +/* global uDom, uBlockDashboard */ /******************************************************************************/ @@ -29,14 +29,11 @@ /******************************************************************************/ +var messaging = vAPI.messaging; var cachedUserFilters = ''; /******************************************************************************/ -var messager = vAPI.messaging.channel('1p-filters.js'); - -/******************************************************************************/ - // This is to give a visual hint that the content of user blacklist has changed. function userFiltersChanged() { @@ -56,13 +53,13 @@ function renderUserFilters() { uDom.nodeFromId('userFilters').value = details.content; userFiltersChanged(); }; - messager.send({ what: 'readUserFilters' }, onRead); + messaging.send('dashboard', { what: 'readUserFilters' }, onRead); } /******************************************************************************/ function allFiltersApplyHandler() { - messager.send({ what: 'reloadAllFilters' }); + messaging.send('dashboard', { what: 'reloadAllFilters' }); uDom('#userFiltersApply').prop('disabled', true ); } @@ -160,7 +157,7 @@ var applyChanges = function() { what: 'writeUserFilters', content: textarea.value }; - messager.send(request, onWritten); + messaging.send('dashboard', request, onWritten); }; var revertChanges = function() { diff --git a/src/js/3p-filters.js b/src/js/3p-filters.js index 2598c1cdb..e89ea1ccc 100644 --- a/src/js/3p-filters.js +++ b/src/js/3p-filters.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI, uDom */ +/* global uDom */ /******************************************************************************/ @@ -48,7 +48,7 @@ var onMessage = function(msg) { case 'forceUpdateAssetsProgress': renderBusyOverlay(true, msg.progress); if ( msg.done ) { - messager.send({ what: 'reloadAllFilters' }); + messaging.send('dashboard', { what: 'reloadAllFilters' }); } break; @@ -57,7 +57,8 @@ var onMessage = function(msg) { } }; -var messager = vAPI.messaging.channel('3p-filters.js', onMessage); +var messaging = vAPI.messaging; +messaging.addChannelListener('dashboard', onMessage); /******************************************************************************/ @@ -262,7 +263,7 @@ var renderFilterLists = function() { renderBusyOverlay(details.manualUpdate, details.manualUpdateProgress); }; - messager.send({ what: 'getLists' }, onListsReceived); + messaging.send('dashboard', { what: 'getLists' }, onListsReceived); }; /******************************************************************************/ @@ -372,7 +373,7 @@ var onPurgeClicked = function() { return; } - messager.send({ what: 'purgeCache', path: href }); + messaging.send('dashboard', { what: 'purgeCache', path: href }); button.remove(); // If the cached version is purged, the installed version must be assumed @@ -397,11 +398,14 @@ var onPurgeClicked = function() { var selectFilterLists = function(callback) { // Cosmetic filtering switch - messager.send({ - what: 'userSettings', - name: 'parseAllABPHideFilters', - value: listDetails.cosmetic - }); + messaging.send( + 'dashboard', + { + what: 'userSettings', + name: 'parseAllABPHideFilters', + value: listDetails.cosmetic + } + ); // Filter lists var switches = []; @@ -415,10 +419,14 @@ var selectFilterLists = function(callback) { }); } - messager.send({ - what: 'selectFilterLists', - switches: switches - }, callback); + messaging.send( + 'dashboard', + { + what: 'selectFilterLists', + switches: switches + }, + callback + ); }; /******************************************************************************/ @@ -429,7 +437,7 @@ var buttonApplyHandler = function() { renderBusyOverlay(true); var onSelectionDone = function() { - messager.send({ what: 'reloadAllFilters' }); + messaging.send('dashboard', { what: 'reloadAllFilters' }); }; selectFilterLists(onSelectionDone); @@ -446,7 +454,7 @@ var buttonUpdateHandler = function() { renderBusyOverlay(true); var onSelectionDone = function() { - messager.send({ what: 'forceUpdateAssets' }); + messaging.send('dashboard', { what: 'forceUpdateAssets' }); }; selectFilterLists(onSelectionDone); @@ -467,17 +475,20 @@ var buttonPurgeAllHandler = function() { renderFilterLists(); }; - messager.send({ what: 'purgeAllCaches' }, onCompleted); + messaging.send('dashboard', { what: 'purgeAllCaches' }, onCompleted); }; /******************************************************************************/ var autoUpdateCheckboxChanged = function() { - messager.send({ - what: 'userSettings', - name: 'autoUpdate', - value: this.checked - }); + messaging.send( + 'dashboard', + { + what: 'userSettings', + name: 'autoUpdate', + value: this.checked + } + ); }; /******************************************************************************/ @@ -494,7 +505,11 @@ var renderExternalLists = function() { uDom('#externalLists').val(details); externalLists = details; }; - messager.send({ what: 'userSettings', name: 'externalLists' }, onReceived); + messaging.send( + 'dashboard', + { what: 'userSettings', name: 'externalLists' }, + onReceived + ); }; /******************************************************************************/ @@ -508,11 +523,14 @@ var externalListsChangeHandler = function() { var externalListsApplyHandler = function() { externalLists = uDom.nodeFromId('externalLists').value; - messager.send({ - what: 'userSettings', - name: 'externalLists', - value: externalLists - }); + messaging.send( + 'dashboard', + { + what: 'userSettings', + name: 'externalLists', + value: externalLists + } + ); renderFilterLists(); uDom('#externalListsApply').prop('disabled', true); }; diff --git a/src/js/about.js b/src/js/about.js index 9b5db6caa..2f5a0c597 100644 --- a/src/js/about.js +++ b/src/js/about.js @@ -29,15 +29,11 @@ uDom.onLoad(function() { /******************************************************************************/ -var messager = vAPI.messaging.channel('about.js'); - -/******************************************************************************/ - var onAppDataReady = function(appData) { uDom('#aboutNameVer').text(appData.name + ' v' + appData.version); }; -messager.send({ what: 'getAppData' }, onAppDataReady); +vAPI.messaging.send('dashboard', { what: 'getAppData' }, onAppDataReady); /******************************************************************************/ diff --git a/src/js/asset-viewer.js b/src/js/asset-viewer.js index 5585675e5..7741948a8 100644 --- a/src/js/asset-viewer.js +++ b/src/js/asset-viewer.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,16 +19,13 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI, uDom */ -'use strict'; +/* global uDom */ /******************************************************************************/ (function() { -/******************************************************************************/ - -var messager = vAPI.messaging.channel('asset-viewer.js'); +'use strict'; /******************************************************************************/ @@ -44,7 +41,8 @@ if ( !matches || matches.length !== 2 ) { return; } -messager.send( +vAPI.messaging.send( + 'default', { what : 'getAssetContent', url: decodeURIComponent(matches[1]) diff --git a/src/js/cloud-ui.js b/src/js/cloud-ui.js index 510a2cfa8..e616625a7 100644 --- a/src/js/cloud-ui.js +++ b/src/js/cloud-ui.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,12 +20,13 @@ */ /* global uDom */ -'use strict'; /******************************************************************************/ (function() { +'use strict'; + /******************************************************************************/ self.cloud = { @@ -48,9 +49,7 @@ if ( self.cloud.datakey === '' ) { return; } -/******************************************************************************/ - -var messager = vAPI.messaging.channel('cloud-ui.js'); +var messaging = vAPI.messaging; /******************************************************************************/ @@ -84,7 +83,8 @@ var onCloudDataReceived = function(entry) { /******************************************************************************/ var fetchCloudData = function() { - messager.send( + messaging.send( + 'cloudWidget', { what: 'cloudPull', datakey: self.cloud.datakey @@ -99,7 +99,8 @@ var pushData = function() { if ( typeof self.cloud.onPush !== 'function' ) { return; } - messager.send( + messaging.send( + 'cloudWidget', { what: 'cloudPush', datakey: self.cloud.datakey, @@ -154,12 +155,16 @@ var submitOptions = function() { self.cloud.options = options; }; - messager.send({ - what: 'cloudSetOptions', - options: { - deviceName: uDom.nodeFromId('cloudDeviceName').value - } - }, onOptions); + messaging.send( + 'cloudWidget', + { + what: 'cloudSetOptions', + options: { + deviceName: uDom.nodeFromId('cloudDeviceName').value + } + }, + onOptions + ); uDom.nodeFromId('cloudOptions').classList.remove('show'); }; @@ -203,7 +208,7 @@ var onInitialize = function(options) { uDom('#cloudOptionsSubmit').on('click', submitOptions); }; -messager.send({ what: 'cloudGetOptions' }, onInitialize); +messaging.send('cloudWidget', { what: 'cloudGetOptions' }, onInitialize); /******************************************************************************/ diff --git a/src/js/contentscript-end.js b/src/js/contentscript-end.js index 4fae8d148..bc0d40247 100644 --- a/src/js/contentscript-end.js +++ b/src/js/contentscript-end.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -55,15 +55,6 @@ if ( vAPI.contentscriptEndInjected ) { vAPI.contentscriptEndInjected = true; vAPI.styles = vAPI.styles || []; -/******************************************************************************/ - -var messager = vAPI.messaging.channel('contentscript-end.js'); - -// https://github.com/gorhill/uMatrix/issues/144 -vAPI.shutdown.add(function() { - messager.close(); -}); - /******************************************************************************/ /******************************************************************************/ @@ -83,6 +74,7 @@ var uBlockCollapser = (function() { var src2ndProps = { 'img': 'srcset' }; + var messaging = vAPI.messaging; var PendingRequest = function(target, tagName, attr) { this.id = requestId++; @@ -143,12 +135,15 @@ var uBlockCollapser = (function() { } } if ( selectors.length !== 0 ) { - messager.send({ - what: 'cosmeticFiltersInjected', - type: 'net', - hostname: window.location.hostname, - selectors: selectors - }); + messaging.send( + 'contentscript', + { + what: 'cosmeticFiltersInjected', + type: 'net', + hostname: window.location.hostname, + selectors: selectors + } + ); } // Renew map: I believe that even if all properties are deleted, an // object will still use more memory than a brand new one. @@ -159,12 +154,15 @@ var uBlockCollapser = (function() { var send = function() { timer = null; - messager.send({ - what: 'filterRequests', - pageURL: window.location.href, - pageHostname: window.location.hostname, - requests: newRequests - }, onProcessed); + messaging.send( + 'contentscript', + { + what: 'filterRequests', + pageURL: window.location.href, + pageHostname: window.location.hostname, + requests: newRequests + }, onProcessed + ); newRequests = []; }; @@ -400,6 +398,7 @@ var uBlockCollapser = (function() { }; checkStyleTags(); + var messaging = vAPI.messaging; var queriedSelectors = {}; var injectedSelectors = {}; var lowGenericSelectors = []; @@ -410,7 +409,9 @@ var uBlockCollapser = (function() { var retrieveGenericSelectors = function() { if ( lowGenericSelectors.length !== 0 || highGenerics === null ) { //console.log('µBlock> ABP cosmetic filters: retrieving CSS rules using %d selectors', lowGenericSelectors.length); - messager.send({ + messaging.send( + 'contentscript', + { what: 'retrieveGenericCosmeticSelectors', pageURL: window.location.href, selectors: lowGenericSelectors, @@ -522,12 +523,15 @@ var uBlockCollapser = (function() { vAPI.styles.push(style); } hideElements(styleText); - messager.send({ - what: 'cosmeticFiltersInjected', - type: 'cosmetic', - hostname: window.location.hostname, - selectors: selectors - }); + messaging.send( + 'contentscript', + { + what: 'cosmeticFiltersInjected', + type: 'cosmetic', + hostname: window.location.hostname, + selectors: selectors + } + ); //console.debug('µBlock> generic cosmetic filters: injecting %d CSS rules:', selectors.length, text); }; @@ -850,7 +854,7 @@ var uBlockCollapser = (function() { idsFromNodeList(selectNodes('[id]')); classesFromNodeList(selectNodes('[class]')); retrieveGenericSelectors(); - messager.send({ what: 'cosmeticFiltersActivated' }); + messaging.send('contentscript', { what: 'cosmeticFiltersActivated' }); } }; @@ -903,6 +907,12 @@ var uBlockCollapser = (function() { if ( addedNodeListsTimer !== null ) { clearTimeout(addedNodeListsTimer); } + if ( removedNodeListsTimer !== null ) { + clearTimeout(removedNodeListsTimer); + } + if ( processHighHighGenericsTimer !== null ) { + clearTimeout(processHighHighGenericsTimer); + } }); })(); @@ -970,20 +980,25 @@ var uBlockCollapser = (function() { if ( window !== window.top ) { return; } + + var messaging = vAPI.messaging; + var onMouseClick = function(ev) { var elem = ev.target; while ( elem !== null && elem.localName !== 'a' ) { elem = elem.parentElement; } - messager.send({ - what: 'mouseClick', - x: ev.clientX, - y: ev.clientY, - url: elem !== null ? elem.href : '' - }); + messaging.send( + 'contentscript', + { + what: 'mouseClick', + x: ev.clientX, + y: ev.clientY, + url: elem !== null ? elem.href : '' + }); }; - window.addEventListener('mousedown', onMouseClick, true); + document.addEventListener('mousedown', onMouseClick, true); // https://github.com/gorhill/uMatrix/issues/144 vAPI.shutdown.add(function() { diff --git a/src/js/contentscript-start.js b/src/js/contentscript-start.js index 68ad3bf80..5a206448c 100644 --- a/src/js/contentscript-start.js +++ b/src/js/contentscript-start.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,23 +35,17 @@ // This can happen if ( typeof vAPI !== 'object' ) { - //console.debug('contentscript-start.js > vAPI not found'); return; } // https://github.com/chrisaljoudi/uBlock/issues/456 // Already injected? if ( vAPI.contentscriptStartInjected ) { - //console.debug('contentscript-start.js > content script already injected'); return; } vAPI.contentscriptStartInjected = true; vAPI.styles = vAPI.styles || []; -/******************************************************************************/ - -var localMessager = vAPI.messaging.channel('contentscript-start.js'); - /******************************************************************************/ /******************************************************************************/ @@ -166,7 +160,7 @@ var filteringHandler = function(details) { // This is just to inform the background process that cosmetic filters were // actually injected. if ( vAPI.styles.length !== styleTagCount ) { - localMessager.send({ what: 'cosmeticFiltersActivated' }); + vAPI.messaging.send('contentscript', { what: 'cosmeticFiltersActivated' }); } // https://github.com/chrisaljoudi/uBlock/issues/587 @@ -174,9 +168,6 @@ var filteringHandler = function(details) { // process was fully initialized. When this happens, pages won't be // cleaned right after browser launch. vAPI.contentscriptStartInjected = details && details.ready; - - // Cleanup before leaving - localMessager.close(); }; /******************************************************************************/ @@ -233,7 +224,8 @@ var hideElements = function(selectors) { /******************************************************************************/ var url = window.location.href; -localMessager.send( +vAPI.messaging.send( + 'contentscript', { what: 'retrieveDomainCosmeticSelectors', pageURL: url, diff --git a/src/js/document-blocked.js b/src/js/document-blocked.js index 56fe62ada..6657a027f 100644 --- a/src/js/document-blocked.js +++ b/src/js/document-blocked.js @@ -29,7 +29,7 @@ /******************************************************************************/ -var messager = vAPI.messaging.channel('document-blocked.js'); +var messaging = vAPI.messaging; var details = {}; (function() { @@ -82,11 +82,15 @@ var details = {}; uDom.nodeFromId('whyex').style.removeProperty('display'); }; - messager.send({ - what: 'listsFromNetFilter', - compiledFilter: details.fc, - rawFilter: details.fs - }, onReponseReady); + messaging.send( + 'documentBlocked', + { + what: 'listsFromNetFilter', + compiledFilter: details.fc, + rawFilter: details.fs + }, + onReponseReady + ); })(); /******************************************************************************/ @@ -109,22 +113,30 @@ var proceedToURL = function() { /******************************************************************************/ var proceedTemporary = function() { - messager.send({ - what: 'temporarilyWhitelistDocument', - hostname: getTargetHostname() - }, proceedToURL); + messaging.send( + 'documentBlocked', + { + what: 'temporarilyWhitelistDocument', + hostname: getTargetHostname() + }, + proceedToURL + ); }; /******************************************************************************/ var proceedPermanent = function() { - messager.send({ - what: 'toggleHostnameSwitch', - name: 'no-strict-blocking', - hostname: getTargetHostname(), - deep: true, - state: true - }, proceedToURL); + messaging.send( + 'documentBlocked', + { + what: 'toggleHostnameSwitch', + name: 'no-strict-blocking', + hostname: getTargetHostname(), + deep: true, + state: true + }, + proceedToURL + ); }; /******************************************************************************/ diff --git a/src/js/dyna-rules.js b/src/js/dyna-rules.js index c01765203..abd7a37fb 100644 --- a/src/js/dyna-rules.js +++ b/src/js/dyna-rules.js @@ -1,7 +1,7 @@ /******************************************************************************* - µMatrix - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uMatrix */ -/* global vAPI, uDom */ +/* global uDom */ /******************************************************************************/ @@ -29,7 +29,7 @@ /******************************************************************************/ -var messager = vAPI.messaging.channel('dyna-rules.js'); +var messaging = vAPI.messaging; /******************************************************************************/ @@ -125,7 +125,7 @@ function handleImportFilePicker() { 'what': 'setSessionRules', 'rules': rulesFromHTML('#diff .right li') + '\n' + result }; - messager.send(request, renderRules); + messaging.send('dashboard', request, renderRules); }; var file = this.files[0]; if ( file === undefined || file.name === '' ) { @@ -188,7 +188,7 @@ var revertHandler = function() { 'what': 'setSessionRules', 'rules': rulesFromHTML('#diff .left li') }; - messager.send(request, renderRules); + messaging.send('dashboard', request, renderRules); }; /******************************************************************************/ @@ -198,7 +198,7 @@ var commitHandler = function() { 'what': 'setPermanentRules', 'rules': rulesFromHTML('#diff .right li') }; - messager.send(request, renderRules); + messaging.send('dashboard', request, renderRules); }; /******************************************************************************/ @@ -222,7 +222,7 @@ var editStopHandler = function() { 'what': 'setSessionRules', 'rules': uDom('#diff .right textarea').val() }; - messager.send(request, renderRules); + messaging.send('dashboard', request, renderRules); }; /******************************************************************************/ @@ -249,7 +249,7 @@ var setCloudData = function(data, append) { 'what': 'setSessionRules', 'rules': data }; - messager.send(request, renderRules); + messaging.send('dashboard', request, renderRules); }; self.cloud.onPush = getCloudData; @@ -269,7 +269,7 @@ uDom('#diff > .pane.right > .rulesContainer').on('dblclick', editStartHandler); uDom('#editStopButton').on('click', editStopHandler); uDom('#editCancelButton').on('click', editCancelHandler); -messager.send({ what: 'getRules' }, renderRules); +messaging.send('dashboard', { what: 'getRules' }, renderRules); /******************************************************************************/ diff --git a/src/js/logger-ui-inspector.js b/src/js/logger-ui-inspector.js index 7a1341663..584f24a59 100644 --- a/src/js/logger-ui-inspector.js +++ b/src/js/logger-ui-inspector.js @@ -40,7 +40,7 @@ if ( typeof Map === undefined || Map.polyfill || typeof WeakMap === undefined ) /******************************************************************************/ var logger = self.logger; -var messager = logger.messager; +var messaging = vAPI.messaging; var inspectedTabId = ''; var inspectedURL = ''; @@ -349,9 +349,9 @@ var startDialog = (function() { ev.stopPropagation(); if ( target.id === 'createCosmeticFilters' ) { - messager.send({ what: 'createUserFilter', filters: textarea.value }); + messaging.send('loggerUI', { what: 'createUserFilter', filters: textarea.value }); // Force a reload for the new cosmetic filter(s) to take effect - messager.send({ what: 'reloadTab', tabId: inspectedTabId }); + messaging.send('loggerUI', { what: 'reloadTab', tabId: inspectedTabId }); return stop(); } }; @@ -386,26 +386,28 @@ var startDialog = (function() { }; var showCommitted = function() { - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'showCommitted', hide: hideSelectors.join(',\n'), unhide: unhideSelectors.join(',\n') }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); }; var showInteractive = function() { - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'showInteractive', hide: hideSelectors.join(',\n'), unhide: unhideSelectors.join(',\n') }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); }; @@ -422,10 +424,11 @@ var startDialog = (function() { }); } } - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'cookFilters', entries: entries }, inspectedTabId, - 'dom-inspector.js', + 'domInspector', onCooked ); }; @@ -476,7 +479,8 @@ var onClick = function(ev) { // Toggle cosmetic filter if ( target.classList.contains('filter') ) { - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'toggleNodes', original: false, @@ -485,7 +489,7 @@ var onClick = function(ev) { nid: '' }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); uDom('[data-filter-id="' + target.getAttribute('data-filter-id') + '"]', inspector).toggleClass( 'off', @@ -494,7 +498,8 @@ var onClick = function(ev) { } // Toggle node else { - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'toggleNodes', original: true, @@ -503,7 +508,7 @@ var onClick = function(ev) { nid: nidFromNode(target) }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); } @@ -520,7 +525,8 @@ var onMouseOver = (function() { var timerHandler = function() { mouseoverTimer = null; - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'highlightOne', selector: selectorFromNode(mouseoverTarget), @@ -528,7 +534,7 @@ var onMouseOver = (function() { scrollTo: true }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); }; @@ -603,13 +609,14 @@ var fetchDOMAsync = (function() { var onTimeout = function() { pollTimer = null; - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'domLayout', fingerprint: fingerprint }, inspectedTabId, - 'dom-inspector.js', + 'domInspector', onFetched ); }; @@ -633,11 +640,14 @@ var injectInspector = function() { } inspectedTabId = tabId; fingerprint = null; - messager.send({ - what: 'scriptlet', - tabId: tabId, - scriptlet: 'dom-inspector' - }); + messaging.send( + 'loggerUI', + { + what: 'scriptlet', + tabId: tabId, + scriptlet: 'dom-inspector' + } + ); fetchDOMAsync(250); }; @@ -660,7 +670,12 @@ var injectInspectorAsync = function(delay) { var shutdownInspector = function() { if ( inspectedTabId !== '' ) { - messager.sendTo({ what: 'shutdown' }, inspectedTabId, 'dom-inspector.js'); + messaging.sendTo( + 'loggerUI', + { what: 'shutdown' }, + inspectedTabId, + 'domInspector' + ); } logger.removeAllChildren(domTree); if ( pollTimer !== null ) { @@ -682,13 +697,14 @@ var onTabIdChanged = function() { /******************************************************************************/ var toggleHighlightMode = function() { - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'highlightMode', invert: uDom.nodeFromSelector('#domInspector .permatoolbar .highlightMode').classList.toggle('invert') }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); }; @@ -696,10 +712,11 @@ var toggleHighlightMode = function() { var revert = function() { uDom('#domTree .off').removeClass('off'); - messager.sendTo( + messaging.sendTo( + 'loggerUI', { what: 'resetToggledNodes' }, inspectedTabId, - 'dom-inspector.js' + 'domInspector' ); inspector.querySelector('.permatoolbar .revert').classList.add('disabled'); inspector.querySelector('.permatoolbar .commit').classList.add('disabled'); diff --git a/src/js/logger-ui.js b/src/js/logger-ui.js index 767648b27..ea7cf2de6 100644 --- a/src/js/logger-ui.js +++ b/src/js/logger-ui.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI, uDom */ +/* global uDom */ /******************************************************************************/ @@ -30,7 +30,7 @@ /******************************************************************************/ var logger = self.logger = {}; -var messager = logger.messager = vAPI.messaging.channel('logger-ui.js'); +var messaging = vAPI.messaging; /******************************************************************************/ @@ -728,7 +728,7 @@ var onLogBufferRead = function(response) { // require a bit more code to ensure no multi time out events. var readLogBuffer = function() { - messager.send({ what: 'readAll' }, onLogBufferRead); + messaging.send('loggerUI', { what: 'readAll' }, onLogBufferRead); }; /******************************************************************************/ @@ -789,7 +789,7 @@ var reloadTab = function() { if ( tabId === 'bts' || tabId === '' ) { return; } - messager.send({ what: 'reloadTab', tabId: tabId }); + messaging.send('loggerUI', { what: 'reloadTab', tabId: tabId }); }; /******************************************************************************/ @@ -810,11 +810,14 @@ var onMaxEntriesChanged = function() { input.value = maxEntries.toString(10); - messager.send({ - what: 'userSettings', - name: 'requestLogMaxEntries', - value: maxEntries - }); + messaging.send( + 'loggerUI', + { + what: 'userSettings', + name: 'requestLogMaxEntries', + value: maxEntries + } + ); truncateLog(maxEntries); }; @@ -877,12 +880,16 @@ var netFilteringManager = (function() { }; var colorize = function() { - messager.send({ - what: 'getURLFilteringData', - context: selectValue('select.dynamic.origin'), - urls: targetURLs, - type: uglyTypeFromSelector('dynamic') - }, onColorsReady); + messaging.send( + 'loggerUI', + { + what: 'getURLFilteringData', + context: selectValue('select.dynamic.origin'), + urls: targetURLs, + type: uglyTypeFromSelector('dynamic') + }, + onColorsReady + ); }; var parseStaticInputs = function() { @@ -963,10 +970,13 @@ var netFilteringManager = (function() { createdStaticFilters[value] = true; if ( value !== '' ) { var d = new Date(); - messager.send({ - what: 'createUserFilter', - filters: '! ' + d.toLocaleString() + ' ' + targetPageDomain + '\n' + value - }); + messaging.send( + 'loggerUI', + { + what: 'createUserFilter', + filters: '! ' + d.toLocaleString() + ' ' + targetPageDomain + '\n' + value + } + ); } updateWidgets(); return; @@ -974,12 +984,16 @@ var netFilteringManager = (function() { // Save url filtering rule(s) if ( target.id === 'saveRules' ) { - messager.send({ - what: 'saveURLFilteringRules', - context: selectValue('select.dynamic.origin'), - urls: targetURLs, - type: uglyTypeFromSelector('dynamic') - }, colorize); + messaging.send( + 'loggerUI', + { + what: 'saveURLFilteringRules', + context: selectValue('select.dynamic.origin'), + urls: targetURLs, + type: uglyTypeFromSelector('dynamic') + }, + colorize + ); return; } @@ -987,73 +1001,95 @@ var netFilteringManager = (function() { // Remove url filtering rule if ( tcl.contains('action') ) { - messager.send({ - what: 'setURLFilteringRule', - context: selectValue('select.dynamic.origin'), - url: target.getAttribute('data-url'), - type: uglyTypeFromSelector('dynamic'), - action: 0, - persist: persist - }, colorize); + messaging.send( + 'loggerUI', + { + what: 'setURLFilteringRule', + context: selectValue('select.dynamic.origin'), + url: target.getAttribute('data-url'), + type: uglyTypeFromSelector('dynamic'), + action: 0, + persist: persist + }, + colorize + ); return; } // add "allow" url filtering rule if ( tcl.contains('allow') ) { - messager.send({ - what: 'setURLFilteringRule', - context: selectValue('select.dynamic.origin'), - url: target.parentNode.getAttribute('data-url'), - type: uglyTypeFromSelector('dynamic'), - action: 2, - persist: persist - }, colorize); + messaging.send( + 'loggerUI', + { + what: 'setURLFilteringRule', + context: selectValue('select.dynamic.origin'), + url: target.parentNode.getAttribute('data-url'), + type: uglyTypeFromSelector('dynamic'), + action: 2, + persist: persist + }, + colorize + ); return; } // add "block" url filtering rule if ( tcl.contains('noop') ) { - messager.send({ - what: 'setURLFilteringRule', - context: selectValue('select.dynamic.origin'), - url: target.parentNode.getAttribute('data-url'), - type: uglyTypeFromSelector('dynamic'), - action: 3, - persist: persist - }, colorize); + messaging.send( + 'loggerUI', + { + what: 'setURLFilteringRule', + context: selectValue('select.dynamic.origin'), + url: target.parentNode.getAttribute('data-url'), + type: uglyTypeFromSelector('dynamic'), + action: 3, + persist: persist + }, + colorize + ); return; } // add "block" url filtering rule if ( tcl.contains('block') ) { - messager.send({ - what: 'setURLFilteringRule', - context: selectValue('select.dynamic.origin'), - url: target.parentNode.getAttribute('data-url'), - type: uglyTypeFromSelector('dynamic'), - action: 1, - persist: persist - }, colorize); + messaging.send( + 'loggerUI', + { + what: 'setURLFilteringRule', + context: selectValue('select.dynamic.origin'), + url: target.parentNode.getAttribute('data-url'), + type: uglyTypeFromSelector('dynamic'), + action: 1, + persist: persist + }, + colorize + ); return; } // Force a reload of the tab if ( tcl.contains('reload') ) { - messager.send({ - what: 'reloadTab', - tabId: targetTabId - }); + messaging.send( + 'loggerUI', + { + what: 'reloadTab', + tabId: targetTabId + } + ); return; } // Hightlight corresponding element in target web page if ( tcl.contains('picker') ) { - messager.send({ - what: 'launchElementPicker', - tabId: targetTabId, - targetURL: 'img\t' + targetURLs[0], - select: true - }); + messaging.send( + 'loggerUI', + { + what: 'launchElementPicker', + tabId: targetTabId, + targetURL: 'img\t' + targetURLs[0], + select: true + } + ); return; } }; @@ -1306,10 +1342,14 @@ var netFilteringManager = (function() { targetFrameHostname = targetRow.getAttribute('data-hn-frame') || ''; // We need the root domain names for best user experience. - messager.send({ - what: 'getDomainNames', - targets: [targetURLs[0], targetPageHostname, targetFrameHostname] - }, fillDialog); + messaging.send( + 'loggerUI', + { + what: 'getDomainNames', + targets: [targetURLs[0], targetPageHostname, targetFrameHostname] + }, + fillDialog + ); }; var toggleOff = function() { @@ -1425,17 +1465,25 @@ var reverseLookupManager = (function() { } if ( row.classList.contains('cat_net') ) { - messager.send({ - what: 'listsFromNetFilter', - compiledFilter: row.getAttribute('data-filter') || '', - rawFilter: rawFilter - }, reverseLookupDone); + messaging.send( + 'loggerUI', + { + what: 'listsFromNetFilter', + compiledFilter: row.getAttribute('data-filter') || '', + rawFilter: rawFilter + }, + reverseLookupDone + ); } else if ( row.classList.contains('cat_cosmetic') ) { - messager.send({ - what: 'listsFromCosmeticFilter', - hostname: row.getAttribute('data-hn-frame') || '', - rawFilter: rawFilter, - }, reverseLookupDone); + messaging.send( + 'loggerUI', + { + what: 'listsFromCosmeticFilter', + hostname: row.getAttribute('data-hn-frame') || '', + rawFilter: rawFilter, + }, + reverseLookupDone + ); } }; diff --git a/src/js/messaging.js b/src/js/messaging.js index a972f2ee1..d19f6116f 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -128,6 +128,10 @@ var onMessage = function(request, sender, callback) { response = getDomainNames(request.targets); break; + case 'getWhitelist': + response = µb.stringFromWhitelist(µb.netWhitelist); + break; + case 'launchElementPicker': // Launched from some auxiliary pages, clear context menu coords. µb.mouseX = µb.mouseY = -1; @@ -155,6 +159,11 @@ var onMessage = function(request, sender, callback) { µb.selectFilterLists(request.switches); break; + case 'setWhitelist': + µb.netWhitelist = µb.whitelistFromString(request.whitelist); + µb.saveWhitelist(); + break; + case 'toggleHostnameSwitch': µb.toggleHostnameSwitch(request); break; @@ -179,7 +188,7 @@ vAPI.messaging.setup(onMessage); /******************************************************************************/ /******************************************************************************/ -// popup.js +// channel: popupPanel (function() { @@ -432,7 +441,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('popup.js', onMessage); +vAPI.messaging.listen('popupPanel', onMessage); /******************************************************************************/ @@ -441,60 +450,7 @@ vAPI.messaging.listen('popup.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// contentscript-start.js - -(function() { - -'use strict'; - -/******************************************************************************/ - -var µb = µBlock; - -/******************************************************************************/ - -var onMessage = function(request, sender, callback) { - // Async - switch ( request.what ) { - default: - break; - } - - // Sync - var response; - - var pageStore; - if ( sender && sender.tab ) { - pageStore = µb.pageStoreFromTabId(sender.tab.id); - } - - switch ( request.what ) { - case 'retrieveDomainCosmeticSelectors': - if ( pageStore && pageStore.getNetFilteringSwitch() ) { - response = µb.cosmeticFilteringEngine.retrieveDomainSelectors(request); - if ( response && response.skipCosmeticFiltering !== true ) { - response.skipCosmeticFiltering = !pageStore.getSpecificCosmeticFilteringSwitch(); - } - } - break; - - default: - return vAPI.messaging.UNHANDLED; - } - - callback(response); -}; - -vAPI.messaging.listen('contentscript-start.js', onMessage); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ -/******************************************************************************/ - -// contentscript-end.js +// channel: contentscript (function() { @@ -575,6 +531,15 @@ var onMessage = function(request, sender, callback) { } switch ( request.what ) { + case 'retrieveDomainCosmeticSelectors': + if ( pageStore && pageStore.getNetFilteringSwitch() ) { + response = µb.cosmeticFilteringEngine.retrieveDomainSelectors(request); + if ( response && response.skipCosmeticFiltering !== true ) { + response.skipCosmeticFiltering = !pageStore.getSpecificCosmeticFilteringSwitch(); + } + } + break; + case 'retrieveGenericCosmeticSelectors': response = { shutdown: !pageStore || !pageStore.getNetFilteringSwitch(), @@ -602,7 +567,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('contentscript-end.js', onMessage); +vAPI.messaging.listen('contentscript', onMessage); /******************************************************************************/ @@ -611,7 +576,7 @@ vAPI.messaging.listen('contentscript-end.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// element-picker.js +// channel: elementPicker (function() { @@ -681,7 +646,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('element-picker.js', onMessage); +vAPI.messaging.listen('elementPicker', onMessage); /******************************************************************************/ @@ -690,7 +655,7 @@ vAPI.messaging.listen('element-picker.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// cloud-ui.js +// channel: cloudWidget (function() { @@ -743,7 +708,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('cloud-ui.js', onMessage); +vAPI.messaging.listen('cloudWidget', onMessage); /******************************************************************************/ @@ -752,7 +717,7 @@ vAPI.messaging.listen('cloud-ui.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// 3p-filters.js +// channel: dashboard (function() { @@ -764,309 +729,7 @@ var µb = µBlock; /******************************************************************************/ -var prepEntries = function(entries) { - var µburi = µb.URI; - var entry, hn; - for ( var k in entries ) { - if ( entries.hasOwnProperty(k) === false ) { - continue; - } - entry = entries[k]; - if ( typeof entry.supportURL === 'string' && entry.supportURL !== '' ) { - entry.supportName = µburi.hostnameFromURI(entry.supportURL); - } else if ( typeof entry.homeURL === 'string' && entry.homeURL !== '' ) { - hn = µburi.hostnameFromURI(entry.homeURL); - entry.supportURL = 'http://' + hn + '/'; - entry.supportName = µburi.domainFromHostname(hn); - } - } -}; - -/******************************************************************************/ - -var getLists = function(callback) { - var r = { - autoUpdate: µb.userSettings.autoUpdate, - available: null, - cache: null, - cosmetic: µb.userSettings.parseAllABPHideFilters, - cosmeticFilterCount: µb.cosmeticFilteringEngine.getFilterCount(), - current: µb.remoteBlacklists, - manualUpdate: false, - netFilterCount: µb.staticNetFilteringEngine.getFilterCount(), - userFiltersPath: µb.userFiltersPath - }; - var onMetadataReady = function(entries) { - r.cache = entries; - r.manualUpdate = µb.assetUpdater.manualUpdate; - r.manualUpdateProgress = µb.assetUpdater.manualUpdateProgress; - prepEntries(r.cache); - callback(r); - }; - var onLists = function(lists) { - r.available = lists; - prepEntries(r.available); - µb.assets.metadata(onMetadataReady); - }; - µb.getAvailableLists(onLists); -}; - -/******************************************************************************/ - -var onMessage = function(request, sender, callback) { - // Async - switch ( request.what ) { - case 'getLists': - return getLists(callback); - - case 'purgeAllCaches': - return µb.assets.purgeAll(callback); - - default: - break; - } - - // Sync - var response; - - switch ( request.what ) { - case 'purgeCache': - µb.assets.purgeCacheableAsset(request.path); - break; - - default: - return vAPI.messaging.UNHANDLED; - } - - callback(response); -}; - -vAPI.messaging.listen('3p-filters.js', onMessage); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ -/******************************************************************************/ - -// 1p-filters.js - -(function() { - -'use strict'; - -/******************************************************************************/ - -var µb = µBlock; - -/******************************************************************************/ - -var onMessage = function(request, sender, callback) { - // Async - switch ( request.what ) { - case 'readUserFilters': - return µb.loadUserFilters(callback); - - case 'writeUserFilters': - return µb.saveUserFilters(request.content, callback); - - default: - break; - } - - // Sync - var response; - - switch ( request.what ) { - default: - return vAPI.messaging.UNHANDLED; - } - - callback(response); -}; - -vAPI.messaging.listen('1p-filters.js', onMessage); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ -/******************************************************************************/ - -// dyna-rules.js - -(function() { - -'use strict'; - -/******************************************************************************/ - -var µb = µBlock; - -/******************************************************************************/ - -var getRules = function() { - return { - permanentRules: µb.permanentFirewall.toString() + '\n' + µb.permanentURLFiltering.toString(), - sessionRules: µb.sessionFirewall.toString() + '\n' + µb.sessionURLFiltering.toString(), - hnSwitches: µb.hnSwitches.toString() - }; -}; - -// Untangle firewall rules, url rules and switches. -var untangle = function(s) { - var textEnd = s.length; - var lineBeg = 0, lineEnd; - var line; - var firewallRules = []; - var urlRules = []; - var switches = []; - - while ( lineBeg < textEnd ) { - lineEnd = s.indexOf('\n', lineBeg); - if ( lineEnd < 0 ) { - lineEnd = s.indexOf('\r', lineBeg); - if ( lineEnd < 0 ) { - lineEnd = textEnd; - } - } - line = s.slice(lineBeg, lineEnd).trim(); - lineBeg = lineEnd + 1; - - if ( line.indexOf('://') !== -1 ) { - urlRules.push(line); - } else if ( line.indexOf(':') === -1 ) { - firewallRules.push(line); - } else { - switches.push(line); - } - } - - return { - firewallRules: firewallRules.join('\n'), - urlRules: urlRules.join('\n'), - switches: switches.join('\n') - }; -}; - -/******************************************************************************/ - -var onMessage = function(request, sender, callback) { - // Async - switch ( request.what ) { - default: - break; - } - - // Sync - var r; - var response; - - switch ( request.what ) { - case 'getRules': - response = getRules(); - break; - - case 'setSessionRules': - // https://github.com/chrisaljoudi/uBlock/issues/772 - µb.cosmeticFilteringEngine.removeFromSelectorCache('*'); - r = untangle(request.rules); - µb.sessionFirewall.fromString(r.firewallRules); - µb.sessionURLFiltering.fromString(r.urlRules); - µb.hnSwitches.fromString(r.switches); - µb.saveHostnameSwitches(); - response = getRules(); - break; - - case 'setPermanentRules': - r = untangle(request.rules); - µb.permanentFirewall.fromString(r.firewallRules); - µb.savePermanentFirewallRules(); - µb.permanentURLFiltering.fromString(r.urlRules); - µb.savePermanentURLFilteringRules(); - µb.hnSwitches.fromString(r.switches); - µb.saveHostnameSwitches(); - response = getRules(); - break; - - default: - return vAPI.messaging.UNHANDLED; - } - - callback(response); -}; - -vAPI.messaging.listen('dyna-rules.js', onMessage); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ -/******************************************************************************/ - -// whitelist.js - -(function() { - -'use strict'; - -/******************************************************************************/ - -var µb = µBlock; - -/******************************************************************************/ - -var onMessage = function(request, sender, callback) { - // Async - switch ( request.what ) { - default: - break; - } - - // Sync - var response; - - switch ( request.what ) { - case 'getWhitelist': - response = µb.stringFromWhitelist(µb.netWhitelist); - break; - - case 'setWhitelist': - µb.netWhitelist = µb.whitelistFromString(request.whitelist); - µb.saveWhitelist(); - break; - - default: - return vAPI.messaging.UNHANDLED; - } - - callback(response); -}; - -vAPI.messaging.listen('whitelist.js', onMessage); - -/******************************************************************************/ - -})(); - - -/******************************************************************************/ -/******************************************************************************/ - -// settings.js - -(function() { - -'use strict'; - -/******************************************************************************/ - -var µb = µBlock; - -/******************************************************************************/ +// Settings var getLocalData = function(callback) { var onStorageInfoReady = function(bytesInUse) { @@ -1083,8 +746,6 @@ var getLocalData = function(callback) { µb.getBytesInUse(onStorageInfoReady); }; -/******************************************************************************/ - var backupUserData = function(callback) { var userData = { timeStamp: Date.now(), @@ -1126,8 +787,6 @@ var backupUserData = function(callback) { µb.assets.get(µb.userFiltersPath, onUserFiltersReady); }; -/******************************************************************************/ - var restoreUserData = function(request) { var userData = request.userData; var countdown = 8; @@ -1171,8 +830,6 @@ var restoreUserData = function(request) { vAPI.storage.clear(onAllRemoved); }; -/******************************************************************************/ - var resetUserData = function() { vAPI.storage.clear(); @@ -1184,15 +841,124 @@ var resetUserData = function() { /******************************************************************************/ +// 3rd-party filters + +var prepListEntries = function(entries) { + var µburi = µb.URI; + var entry, hn; + for ( var k in entries ) { + if ( entries.hasOwnProperty(k) === false ) { + continue; + } + entry = entries[k]; + if ( typeof entry.supportURL === 'string' && entry.supportURL !== '' ) { + entry.supportName = µburi.hostnameFromURI(entry.supportURL); + } else if ( typeof entry.homeURL === 'string' && entry.homeURL !== '' ) { + hn = µburi.hostnameFromURI(entry.homeURL); + entry.supportURL = 'http://' + hn + '/'; + entry.supportName = µburi.domainFromHostname(hn); + } + } +}; + +var getLists = function(callback) { + var r = { + autoUpdate: µb.userSettings.autoUpdate, + available: null, + cache: null, + cosmetic: µb.userSettings.parseAllABPHideFilters, + cosmeticFilterCount: µb.cosmeticFilteringEngine.getFilterCount(), + current: µb.remoteBlacklists, + manualUpdate: false, + netFilterCount: µb.staticNetFilteringEngine.getFilterCount(), + userFiltersPath: µb.userFiltersPath + }; + var onMetadataReady = function(entries) { + r.cache = entries; + r.manualUpdate = µb.assetUpdater.manualUpdate; + r.manualUpdateProgress = µb.assetUpdater.manualUpdateProgress; + prepListEntries(r.cache); + callback(r); + }; + var onLists = function(lists) { + r.available = lists; + prepListEntries(r.available); + µb.assets.metadata(onMetadataReady); + }; + µb.getAvailableLists(onLists); +}; + +/******************************************************************************/ + +// My rules + +var getRules = function() { + return { + permanentRules: µb.permanentFirewall.toString() + '\n' + µb.permanentURLFiltering.toString(), + sessionRules: µb.sessionFirewall.toString() + '\n' + µb.sessionURLFiltering.toString(), + hnSwitches: µb.hnSwitches.toString() + }; +}; + +// Untangle firewall rules, url rules and switches. +var untangleRules = function(s) { + var textEnd = s.length; + var lineBeg = 0, lineEnd; + var line; + var firewallRules = []; + var urlRules = []; + var switches = []; + + while ( lineBeg < textEnd ) { + lineEnd = s.indexOf('\n', lineBeg); + if ( lineEnd < 0 ) { + lineEnd = s.indexOf('\r', lineBeg); + if ( lineEnd < 0 ) { + lineEnd = textEnd; + } + } + line = s.slice(lineBeg, lineEnd).trim(); + lineBeg = lineEnd + 1; + + if ( line.indexOf('://') !== -1 ) { + urlRules.push(line); + } else if ( line.indexOf(':') === -1 ) { + firewallRules.push(line); + } else { + switches.push(line); + } + } + + return { + firewallRules: firewallRules.join('\n'), + urlRules: urlRules.join('\n'), + switches: switches.join('\n') + }; +}; + +/******************************************************************************/ + var onMessage = function(request, sender, callback) { // Async switch ( request.what ) { case 'backupUserData': return backupUserData(callback); + case 'getLists': + return getLists(callback); + case 'getLocalData': return getLocalData(callback); + case 'purgeAllCaches': + return µb.assets.purgeAll(callback); + + case 'readUserFilters': + return µb.loadUserFilters(callback); + + case 'writeUserFilters': + return µb.saveUserFilters(request.content, callback); + default: break; } @@ -1201,6 +967,14 @@ var onMessage = function(request, sender, callback) { var response; switch ( request.what ) { + case 'getRules': + response = getRules(); + break; + + case 'purgeCache': + µb.assets.purgeCacheableAsset(request.path); + break; + case 'restoreUserData': restoreUserData(request); break; @@ -1209,6 +983,28 @@ var onMessage = function(request, sender, callback) { resetUserData(); break; + case 'setSessionRules': + // https://github.com/chrisaljoudi/uBlock/issues/772 + µb.cosmeticFilteringEngine.removeFromSelectorCache('*'); + response = untangleRules(request.rules); + µb.sessionFirewall.fromString(response.firewallRules); + µb.sessionURLFiltering.fromString(response.urlRules); + µb.hnSwitches.fromString(response.switches); + µb.saveHostnameSwitches(); + response = getRules(); + break; + + case 'setPermanentRules': + response = untangleRules(request.rules); + µb.permanentFirewall.fromString(response.firewallRules); + µb.savePermanentFirewallRules(); + µb.permanentURLFiltering.fromString(response.urlRules); + µb.savePermanentURLFilteringRules(); + µb.hnSwitches.fromString(response.switches); + µb.saveHostnameSwitches(); + response = getRules(); + break; + default: return vAPI.messaging.UNHANDLED; } @@ -1216,7 +1012,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('settings.js', onMessage); +vAPI.messaging.listen('dashboard', onMessage); /******************************************************************************/ @@ -1225,7 +1021,7 @@ vAPI.messaging.listen('settings.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// logger-ui.js +// channel: loggerUI (function() { @@ -1329,7 +1125,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('logger-ui.js', onMessage); +vAPI.messaging.listen('loggerUI', onMessage); /******************************************************************************/ @@ -1340,7 +1136,7 @@ vAPI.messaging.listen('logger-ui.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// document-blocked.js +// channel: documentBlocked (function() { @@ -1370,7 +1166,7 @@ var onMessage = function(request, sender, callback) { callback(response); }; -vAPI.messaging.listen('document-blocked.js', onMessage); +vAPI.messaging.listen('documentBlocked', onMessage); /******************************************************************************/ @@ -1379,7 +1175,7 @@ vAPI.messaging.listen('document-blocked.js', onMessage); /******************************************************************************/ /******************************************************************************/ -// scriptlets +// channel: scriptlets (function() { diff --git a/src/js/popup.js b/src/js/popup.js index 2cb37b979..8b068a580 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global punycode, vAPI, uDom */ +/* global punycode, uDom */ /******************************************************************************/ @@ -81,6 +81,7 @@ if ( dfPaneVisibleStored ) { /******************************************************************************/ +var messaging = vAPI.messaging; var popupData = {}; var dfPaneBuilt = false; var reIP = /^\d+(?:\.\d+){1,3}$/; @@ -106,12 +107,6 @@ var reNetworkRelatedURL = /^(?:ftps?|https?|wss?):\/\//; /******************************************************************************/ -// https://github.com/gorhill/httpswitchboard/issues/345 - -var messager = vAPI.messaging.channel('popup.js'); - -/******************************************************************************/ - var cachePopupData = function(data) { popupData = {}; scopeToSrcHostnameMap['.'] = ''; @@ -519,10 +514,14 @@ var renderPopupLazy = function() { .textContent = typeof v === 'number' ? v.toLocaleString() : v; }; - messager.send({ - what: 'getPopupDataLazy', - tabId: popupData.tabId - }, onDataReady); + messaging.send( + 'popupPanel', + { + what: 'getPopupDataLazy', + tabId: popupData.tabId + }, + onDataReady + ); }; /******************************************************************************/ @@ -534,13 +533,16 @@ var toggleNetFilteringSwitch = function(ev) { if ( popupData.pageHostname === 'behind-the-scene' && !popupData.advancedUserEnabled ) { return; } - messager.send({ - what: 'toggleNetFiltering', - url: popupData.pageURL, - scope: ev.ctrlKey || ev.metaKey ? 'page' : '', - state: !uDom('body').toggleClass('off').hasClass('off'), - tabId: popupData.tabId - }); + messaging.send( + 'popupPanel', + { + what: 'toggleNetFiltering', + url: popupData.pageURL, + scope: ev.ctrlKey || ev.metaKey ? 'page' : '', + state: !uDom('body').toggleClass('off').hasClass('off'), + tabId: popupData.tabId + } + ); hashFromPopupData(); }; @@ -548,10 +550,13 @@ var toggleNetFilteringSwitch = function(ev) { /******************************************************************************/ var gotoPick = function() { - messager.send({ - what: 'launchElementPicker', - tabId: popupData.tabId - }); + messaging.send( + 'popupPanel', + { + what: 'launchElementPicker', + tabId: popupData.tabId + } + ); vAPI.closePopup(); }; @@ -567,15 +572,18 @@ var gotoURL = function(ev) { var rel = this.getAttribute('rel') || ''; - messager.send({ - what: 'gotoURL', - details: { - url: this.getAttribute('href'), - select: true, - index: -1, - popup: rel === 'popup' && ev.shiftKey + messaging.send( + 'popupPanel', + { + what: 'gotoURL', + details: { + url: this.getAttribute('href'), + select: true, + index: -1, + popup: rel === 'popup' && ev.shiftKey + } } - }); + ); vAPI.closePopup(); }; @@ -588,11 +596,14 @@ var toggleFirewallPane = function() { } popupData.dfEnabled = !popupData.dfEnabled; - messager.send({ - what: 'userSettings', - name: 'dynamicFilteringEnabled', - value: popupData.dfEnabled - }); + messaging.send( + 'popupPanel', + { + what: 'userSettings', + name: 'dynamicFilteringEnabled', + value: popupData.dfEnabled + } + ); // https://github.com/chrisaljoudi/uBlock/issues/996 // Remember the last state of the firewall pane. This allows to @@ -632,16 +643,20 @@ var setFirewallRule = function(src, des, type, action, persist) { updateAllFirewallCells(); hashFromPopupData(); }; - messager.send({ - what: 'toggleFirewallRule', - tabId: popupData.tabId, - pageHostname: popupData.pageHostname, - srcHostname: src, - desHostname: des, - requestType: type, - action: action, - persist: persist - }, onFirewallRuleChanged); + messaging.send( + 'popupPanel', + { + what: 'toggleFirewallRule', + tabId: popupData.tabId, + pageHostname: popupData.pageHostname, + srcHostname: src, + desHostname: des, + requestType: type, + action: action, + persist: persist + }, + onFirewallRuleChanged + ); }; /******************************************************************************/ @@ -688,7 +703,14 @@ var setFirewallRuleHandler = function(ev) { /******************************************************************************/ var reloadTab = function() { - messager.send({ what: 'reloadTab', tabId: popupData.tabId, select: true }); + messaging.send( + 'popupPanel', + { + what: 'reloadTab', + tabId: popupData.tabId, + select: true + } + ); // Polling will take care of refreshing the popup content @@ -708,14 +730,17 @@ var toggleMinimize = function(ev) { // Useful to take snapshots of the whole list of domains -- example: // https://github.com/gorhill/uBlock/issues/736#issuecomment-178879944 if ( ev.shiftKey && ev.ctrlKey ) { - messager.send({ - what: 'gotoURL', - details: { - url: 'popup.html?tabId=' + popupData.tabId + '&fullsize=1', - select: true, - index: -1 + messaging.send( + 'popupPanel', + { + what: 'gotoURL', + details: { + url: 'popup.html?tabId=' + popupData.tabId + '&fullsize=1', + select: true, + index: -1 + } } - }); + ); vAPI.closePopup(); return; } @@ -723,22 +748,28 @@ var toggleMinimize = function(ev) { popupData.firewallPaneMinimized = uDom.nodeFromId('firewallContainer') .classList .toggle('minimized'); - messager.send({ - what: 'userSettings', - name: 'firewallPaneMinimized', - value: popupData.firewallPaneMinimized - }); + messaging.send( + 'popupPanel', + { + what: 'userSettings', + name: 'firewallPaneMinimized', + value: popupData.firewallPaneMinimized + } + ); positionRulesetTools(); }; /******************************************************************************/ var saveFirewallRules = function() { - messager.send({ - what: 'saveFirewallRules', - srcHostname: popupData.pageHostname, - desHostnames: popupData.hostnameDict - }); + messaging.send( + 'popupPanel', + { + what: 'saveFirewallRules', + srcHostname: popupData.pageHostname, + desHostnames: popupData.hostnameDict + } + ); uDom.nodeFromId('firewallContainer').classList.remove('dirty'); }; @@ -750,12 +781,16 @@ var revertFirewallRules = function() { updateAllFirewallCells(); hashFromPopupData(); }; - messager.send({ - what: 'revertFirewallRules', - srcHostname: popupData.pageHostname, - desHostnames: popupData.hostnameDict, - tabId: popupData.tabId - }, onFirewallRuleChanged); + messaging.send( + 'popupPanel', + { + what: 'revertFirewallRules', + srcHostname: popupData.pageHostname, + desHostnames: popupData.hostnameDict, + tabId: popupData.tabId + }, + onFirewallRuleChanged + ); uDom.nodeFromId('firewallContainer').classList.remove('dirty'); }; @@ -768,13 +803,16 @@ var toggleHostnameSwitch = function(ev) { return; } target.classList.toggle('on'); - messager.send({ - what: 'toggleHostnameSwitch', - name: switchName, - hostname: popupData.pageHostname, - state: target.classList.contains('on'), - tabId: popupData.tabId - }); + messaging.send( + 'popupPanel', + { + what: 'toggleHostnameSwitch', + name: switchName, + hostname: popupData.pageHostname, + state: target.classList.contains('on'), + tabId: popupData.tabId + } + ); hashFromPopupData(); }; @@ -803,7 +841,8 @@ var pollForContentChange = (function() { var pollCallback = function() { pollTimer = null; - messager.send( + messaging.send( + 'popupPanel', { what: 'hasPopupContentChanged', tabId: popupData.tabId, @@ -841,7 +880,11 @@ var getPopupData = function(tabId) { hashFromPopupData(true); pollForContentChange(); }; - messager.send({ what: 'getPopupData', tabId: tabId }, onDataReceived); + messaging.send( + 'popupPanel', + { what: 'getPopupData', tabId: tabId }, + onDataReceived + ); }; /******************************************************************************/ diff --git a/src/js/scriptlets/cosmetic-logger.js b/src/js/scriptlets/cosmetic-logger.js index 7040c164e..722e03925 100644 --- a/src/js/scriptlets/cosmetic-logger.js +++ b/src/js/scriptlets/cosmetic-logger.js @@ -1,7 +1,7 @@ /******************************************************************************* - uBlock - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -71,17 +71,15 @@ vAPI.loggedSelectors = loggedSelectors; /******************************************************************************/ -var localMessager = vAPI.messaging.channel('scriptlets'); - -localMessager.send({ - what: 'logCosmeticFilteringData', - frameURL: window.location.href, - frameHostname: window.location.hostname, - matchedSelectors: matchedSelectors -}, function() { - localMessager.close(); - localMessager = null; -}); +vAPI.messaging.send( + 'scriptlets', + { + what: 'logCosmeticFilteringData', + frameURL: window.location.href, + frameHostname: window.location.hostname, + matchedSelectors: matchedSelectors + } +); /******************************************************************************/ diff --git a/src/js/scriptlets/cosmetic-survey.js b/src/js/scriptlets/cosmetic-survey.js index 3d62ed5d3..d50c9c5b6 100644 --- a/src/js/scriptlets/cosmetic-survey.js +++ b/src/js/scriptlets/cosmetic-survey.js @@ -1,7 +1,7 @@ /******************************************************************************* - uBlock - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -53,15 +53,14 @@ if ( injectedSelectors.length !== 0 ) { /******************************************************************************/ -var localMessager = vAPI.messaging.channel('scriptlets'); - -localMessager.send({ - what: 'liveCosmeticFilteringData', - pageURL: window.location.href, - filteredElementCount: filteredElementCount -}, function() { - localMessager.close(); -}); +vAPI.messaging.send( + 'scriptlets', + { + what: 'liveCosmeticFilteringData', + pageURL: window.location.href, + filteredElementCount: filteredElementCount + } +); /******************************************************************************/ diff --git a/src/js/scriptlets/dom-inspector.js b/src/js/scriptlets/dom-inspector.js index d33926282..d2ce5784b 100644 --- a/src/js/scriptlets/dom-inspector.js +++ b/src/js/scriptlets/dom-inspector.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -137,8 +137,6 @@ var cssEscape = (function(/*root*/) { /******************************************************************************/ /******************************************************************************/ -var localMessager = vAPI.messaging.channel('dom-inspector.js'); - // Highlighter-related var svgRoot = null; var pickerRoot = null; @@ -903,9 +901,7 @@ var shutdown = function() { cosmeticFilterMapper.shutdown(); resetToggledNodes(); domLayout.shutdown(); - localMessager.removeAllListeners(); - localMessager.close(); - localMessager = null; + vAPI.messaging.removeAllChannelListeners('domInspector'); window.removeEventListener('scroll', onScrolled, true); document.documentElement.removeChild(pickerRoot); pickerRoot = svgRoot = null; @@ -1150,7 +1146,7 @@ pickerRoot.onload = function() { highlightElements(); cosmeticFilterMapper.reset(); - localMessager.addListener(onMessage); + vAPI.messaging.addChannelListener('domInspector', onMessage); }; document.documentElement.appendChild(pickerRoot); diff --git a/src/js/scriptlets/element-picker.js b/src/js/scriptlets/element-picker.js index f150a9f1c..1d077c6c3 100644 --- a/src/js/scriptlets/element-picker.js +++ b/src/js/scriptlets/element-picker.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -135,8 +135,6 @@ if ( pickerRoot ) { return; } -var localMessager = vAPI.messaging.channel('element-picker.js'); - var svgOcean = null; var svgIslands = null; var svgRoot = null; @@ -292,12 +290,15 @@ var netFilterFromUnion = (function() { if ( from === '' || a.host === '' || a.host !== lastNetFilterHostname ) { lastNetFilterHostname = a.host; lastNetFilterUnion = to; - localMessager.send({ - what: 'elementPickerEprom', - lastNetFilterSession: lastNetFilterSession, - lastNetFilterHostname: lastNetFilterHostname, - lastNetFilterUnion: lastNetFilterUnion - }); + vAPI.messaging.send( + 'elementPicker', + { + what: 'elementPickerEprom', + lastNetFilterSession: lastNetFilterSession, + lastNetFilterHostname: lastNetFilterHostname, + lastNetFilterUnion: lastNetFilterUnion + } + ); return; } @@ -338,12 +339,15 @@ var netFilterFromUnion = (function() { lastNetFilterUnion = from; // Remember across element picker sessions - localMessager.send({ - what: 'elementPickerEprom', - lastNetFilterSession: lastNetFilterSession, - lastNetFilterHostname: lastNetFilterHostname, - lastNetFilterUnion: lastNetFilterUnion - }); + vAPI.messaging.send( + 'elementPicker', + { + what: 'elementPickerEprom', + lastNetFilterSession: lastNetFilterSession, + lastNetFilterHostname: lastNetFilterHostname, + lastNetFilterUnion: lastNetFilterUnion + } + ); }; })(); @@ -694,10 +698,13 @@ var onDialogClicked = function(ev) { var filter = userFilterFromCandidate(); if ( filter ) { var d = new Date(); - localMessager.send({ - what: 'createUserFilter', - filters: '! ' + d.toLocaleString() + ' ' + window.location.href + '\n' + filter, - }); + vAPI.messaging.send( + 'elementPicker', + { + what: 'createUserFilter', + filters: '! ' + d.toLocaleString() + ' ' + window.location.href + '\n' + filter, + } + ); removeElements(elementsFromFilter(taCandidate.value)); stopPicker(); } @@ -901,7 +908,6 @@ var stopPicker = function() { dialog = svgRoot = svgOcean = svgIslands = taCandidate = null; - localMessager.close(); window.focus(); }; @@ -1037,7 +1043,12 @@ pickerRoot.style.cssText = [ ].join('!important; '); pickerRoot.onload = function() { - localMessager.send({ what: 'elementPickerArguments' }, startPicker); + vAPI.shutdown.add(stopPicker); + vAPI.messaging.send( + 'elementPicker', + { what: 'elementPickerArguments' }, + startPicker + ); }; document.documentElement.appendChild(pickerRoot); diff --git a/src/js/scriptlets/load-large-media-interactive.js b/src/js/scriptlets/load-large-media-interactive.js index 6d7cbb2ce..e8d7ed2f1 100644 --- a/src/js/scriptlets/load-large-media-interactive.js +++ b/src/js/scriptlets/load-large-media-interactive.js @@ -1,7 +1,7 @@ /******************************************************************************* uBlock Origin - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -114,10 +114,6 @@ document.head.appendChild(styleTag); /******************************************************************************/ -var messager = vAPI.messaging.channel('scriptlets'); - -/******************************************************************************/ - var stayOrLeave = (function() { var timer = null; @@ -139,10 +135,6 @@ var stayOrLeave = (function() { vAPI.loadLargeMediaInteractive = false; document.removeEventListener('error', onLoadError, true); document.removeEventListener('click', onMouseClick, true); - if ( messager !== null ) { - messager.close(); - messager = null; - } }; return function(leaveNow) { @@ -184,9 +176,11 @@ var onMouseClick = function(ev) { stayOrLeave(); }; - messager.send({ - what: 'temporarilyAllowLargeMediaElement' - }, onLargeMediaElementAllowed); + vAPI.messaging.send( + 'scriptlets', + { what: 'temporarilyAllowLargeMediaElement' }, + onLargeMediaElementAllowed + ); ev.preventDefault(); ev.stopPropagation(); diff --git a/src/js/scriptlets/subscriber.js b/src/js/scriptlets/subscriber.js index 2b591b6a6..1cdec045a 100644 --- a/src/js/scriptlets/subscriber.js +++ b/src/js/scriptlets/subscriber.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2015 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2015-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,10 +59,6 @@ if ( /******************************************************************************/ -var messager = vAPI.messaging.channel('scriptlets'); - -/******************************************************************************/ - var onAbpLinkClicked = function(ev) { if ( ev.button !== 0 ) { return; @@ -87,21 +83,27 @@ var onAbpLinkClicked = function(ev) { return; } } + var location = decodeURIComponent(matches[1]); var title = decodeURIComponent(matches[2]); + var messaging = vAPI.messaging; ev.stopPropagation(); ev.preventDefault(); var onListsSelectionDone = function() { - messager.send({ what: 'reloadAllFilters' }); + messaging.send('scriptlets', { what: 'reloadAllFilters' }); }; var onExternalListsSaved = function() { - messager.send({ - what: 'selectFilterLists', - switches: [ { location: location, off: false } ] - }, onListsSelectionDone); + messaging.send( + 'scriptlets', + { + what: 'selectFilterLists', + switches: [ { location: location, off: false } ] + }, + onListsSelectionDone + ); }; var onSubscriberDataReady = function(details) { @@ -122,14 +124,22 @@ var onAbpLinkClicked = function(ev) { } lines.push(location, ''); - messager.send({ - what: 'userSettings', - name: 'externalLists', - value: lines.join('\n') - }, onExternalListsSaved); + messaging.send( + 'scriptlets', + { + what: 'userSettings', + name: 'externalLists', + value: lines.join('\n') + }, + onExternalListsSaved + ); }; - messager.send({ what: 'subscriberData' }, onSubscriberDataReady); + messaging.send( + 'scriptlets', + { what: 'subscriberData' }, + onSubscriberDataReady + ); }; document.addEventListener('click', onAbpLinkClicked, true); diff --git a/src/js/settings.js b/src/js/settings.js index b593dfbfb..77d0242e7 100644 --- a/src/js/settings.js +++ b/src/js/settings.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI, uDom */ +/* global uDom */ /******************************************************************************/ @@ -29,7 +29,7 @@ /******************************************************************************/ -var messager = vAPI.messaging.channel('settings.js'); +var messaging = vAPI.messaging; /******************************************************************************/ @@ -72,11 +72,14 @@ var handleImportFilePicker = function() { .replace('{{time}}', time.toLocaleString()); var proceed = window.confirm(msg); if ( proceed ) { - messager.send({ - what: 'restoreUserData', - userData: userData, - file: filename - }); + messaging.send( + 'dashboard', + { + what: 'restoreUserData', + userData: userData, + file: filename + } + ); } }; @@ -99,7 +102,7 @@ var startImportFilePicker = function() { /******************************************************************************/ var exportToFile = function() { - messager.send({ what: 'backupUserData' }, onLocalDataReceived); + messaging.send('dashboard', { what: 'backupUserData' }, onLocalDataReceived); }; /******************************************************************************/ @@ -143,18 +146,21 @@ var resetUserData = function() { var msg = vAPI.i18n('aboutResetDataConfirm'); var proceed = window.confirm(msg); if ( proceed ) { - messager.send({ what: 'resetUserData' }); + messaging.send('dashboard', { what: 'resetUserData' }); } }; /******************************************************************************/ var changeUserSettings = function(name, value) { - messager.send({ - what: 'userSettings', - name: name, - value: value - }); + messaging.send( + 'dashboard', + { + what: 'userSettings', + name: name, + value: value + } + ); }; /******************************************************************************/ @@ -216,8 +222,8 @@ var onUserSettingsReceived = function(details) { /******************************************************************************/ uDom.onLoad(function() { - messager.send({ what: 'userSettings' }, onUserSettingsReceived); - messager.send({ what: 'getLocalData' }, onLocalDataReceived); + messaging.send('dashboard', { what: 'userSettings' }, onUserSettingsReceived); + messaging.send('dashboard', { what: 'getLocalData' }, onLocalDataReceived); }); /******************************************************************************/ diff --git a/src/js/whitelist.js b/src/js/whitelist.js index 96a733d5e..d8e7004fd 100644 --- a/src/js/whitelist.js +++ b/src/js/whitelist.js @@ -1,7 +1,7 @@ /******************************************************************************* - µBlock - a browser extension to block requests. - Copyright (C) 2014 Raymond Hill + uBlock Origin - a browser extension to block requests. + Copyright (C) 2014-2016 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI, uDom, uBlockDashboard */ +/* global uDom, uBlockDashboard */ /******************************************************************************/ @@ -29,10 +29,7 @@ /******************************************************************************/ -var messager = vAPI.messaging.channel('whitelist.js'); - -/******************************************************************************/ - +var messaging = vAPI.messaging; var cachedWhitelist = ''; // Could make it more fancy if needed. But speed... It's a compromise. @@ -58,7 +55,7 @@ var renderWhitelist = function() { uDom.nodeFromId('whitelist').value = cachedWhitelist + '\n'; whitelistChanged(); }; - messager.send({ what: 'getWhitelist' }, onRead); + messaging.send('dashboard', { what: 'getWhitelist' }, onRead); }; /******************************************************************************/ @@ -117,7 +114,7 @@ var applyChanges = function() { what: 'setWhitelist', whitelist: cachedWhitelist }; - messager.send(request, renderWhitelist); + messaging.send('dashboard', request, renderWhitelist); }; var revertChanges = function() {