From 91276bebfbc6eaafcbb1b6e8bcc8ad58484b7f91 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 16 Nov 2014 12:49:55 -0200 Subject: [PATCH] eliminate overhead of creating two funcs/closure for each port connection --- meta/crx/vapi-background.js | 78 +++++++++++++++++++------------------ src/js/messaging.js | 33 ++++++++++++---- 2 files changed, 66 insertions(+), 45 deletions(-) diff --git a/meta/crx/vapi-background.js b/meta/crx/vapi-background.js index 700e13936..6cd19b2a9 100644 --- a/meta/crx/vapi-background.js +++ b/meta/crx/vapi-background.js @@ -219,6 +219,7 @@ vAPI.messaging = { ports: {}, listeners: {}, defaultHandler: null, + NOOPFUNC: function(){}, UNHANDLED: 'vAPI.messaging.notHandled' }; @@ -230,49 +231,50 @@ vAPI.messaging.listen = function(listenerName, callback) { /******************************************************************************/ -vAPI.messaging.onConnect = function(port) { - var onMessage = function(request) { - var callback = function(response) { - if ( vAPI.lastError() || response === undefined ) { - return; - } - - if ( request.requestId ) { - port.postMessage({ - requestId: request.requestId, - portName: request.portName, - msg: response - }); - } +vAPI.messaging.onPortMessage = function(request, port) { + var callback = vAPI.messaging.NOOPFUNC; + if ( request.requestId !== undefined ) { + callback = function(response) { + port.postMessage({ + requestId: request.requestId, + portName: request.portName, + msg: response !== undefined ? response : null + }); }; + } - // Specific handler - var r; - var listener = vAPI.messaging.listeners[request.portName]; - if ( typeof listener === 'function' ) { - r = listener(request.msg, port.sender, callback); - } - if ( r !== vAPI.messaging.UNHANDLED ) { - return; - } + // Specific handler + var r; + var listener = vAPI.messaging.listeners[request.portName]; + if ( typeof listener === 'function' ) { + r = listener(request.msg, port.sender, callback); + } + if ( r !== vAPI.messaging.UNHANDLED ) { + return; + } - // Default handler - r = vAPI.messaging.defaultHandler(request.msg, port.sender, callback); - if ( r !== vAPI.messaging.UNHANDLED ) { - return; - } + // Default handler + r = vAPI.messaging.defaultHandler(request.msg, port.sender, callback); + if ( r !== vAPI.messaging.UNHANDLED ) { + return; + } - console.error('µBlock> messaging > unknown request: %o', request); - }; + console.error('µBlock> messaging > unknown request: %o', request); +}; - var onDisconnect = function(port) { - port.onDisconnect.removeListener(onDisconnect); - port.onMessage.removeListener(onMessage); - delete vAPI.messaging.ports[port.name]; - }; +/******************************************************************************/ - port.onDisconnect.addListener(onDisconnect); - port.onMessage.addListener(onMessage); +vAPI.messaging.onDisconnect = function(port) { + port.onDisconnect.removeListener(vAPI.messaging.onDisconnect); + port.onMessage.removeListener(vAPI.messaging.onPortMessage); + delete vAPI.messaging.ports[port.name]; +}; + +/******************************************************************************/ + +vAPI.messaging.onConnect = function(port) { + port.onDisconnect.addListener(vAPI.messaging.onDisconnect); + port.onMessage.addListener(vAPI.messaging.onPortMessage); vAPI.messaging.ports[port.name] = port; }; @@ -286,7 +288,7 @@ vAPI.messaging.setup = function(defaultHandler) { if ( typeof defaultHandler !== 'function' ) { defaultHandler = function(){ return null; }; - }; + } this.defaultHandler = defaultHandler; chrome.runtime.onConnect.addListener(this.onConnect); diff --git a/src/js/messaging.js b/src/js/messaging.js index 12f2bc40b..db6c41396 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -26,13 +26,17 @@ /******************************************************************************/ /******************************************************************************/ -// Message router and default handler +// Default handler -vAPI.messaging.setup(function(request, sender, callback) { +(function() { + +/******************************************************************************/ + +var onMessage = function(request, sender, callback) { var µb = µBlock; + // Async switch ( request.what ) { - // Async case 'getAssetContent': µb.assets.getLocal(request.url, callback); return; @@ -41,14 +45,21 @@ vAPI.messaging.setup(function(request, sender, callback) { µb.loadUbiquitousWhitelists(); return; - // Sync + default: + break; + } + + // Sync + var response; + + switch ( request.what ) { case 'contextMenuEvent': µb.contextMenuClientX = request.clientX; µb.contextMenuClientY = request.clientY; break; case 'getUserSettings': - callback(µb.userSettings); + response = µb.userSettings; break; case 'gotoURL': @@ -60,13 +71,21 @@ vAPI.messaging.setup(function(request, sender, callback) { break; case 'userSettings': - callback(µb.changeUserSettings(request.name, request.value)); + response = µb.changeUserSettings(request.name, request.value); break; default: return vAPI.messaging.UNHANDLED; } -}); + + callback(response); +}; + +vAPI.messaging.setup(onMessage); + +/******************************************************************************/ + +})(); /******************************************************************************/ /******************************************************************************/