eliminate overhead of creating two funcs/closure for each port connection

This commit is contained in:
Raymond Hill 2014-11-16 12:49:55 -02:00
parent 338bf59507
commit 91276bebfb
2 changed files with 66 additions and 45 deletions

View file

@ -219,6 +219,7 @@ vAPI.messaging = {
ports: {}, ports: {},
listeners: {}, listeners: {},
defaultHandler: null, defaultHandler: null,
NOOPFUNC: function(){},
UNHANDLED: 'vAPI.messaging.notHandled' UNHANDLED: 'vAPI.messaging.notHandled'
}; };
@ -230,49 +231,50 @@ vAPI.messaging.listen = function(listenerName, callback) {
/******************************************************************************/ /******************************************************************************/
vAPI.messaging.onConnect = function(port) { vAPI.messaging.onPortMessage = function(request, port) {
var onMessage = function(request) { var callback = vAPI.messaging.NOOPFUNC;
var callback = function(response) { if ( request.requestId !== undefined ) {
if ( vAPI.lastError() || response === undefined ) { callback = function(response) {
return; port.postMessage({
} requestId: request.requestId,
portName: request.portName,
if ( request.requestId ) { msg: response !== undefined ? response : null
port.postMessage({ });
requestId: request.requestId,
portName: request.portName,
msg: response
});
}
}; };
}
// Specific handler // Specific handler
var r; var r;
var listener = vAPI.messaging.listeners[request.portName]; var listener = vAPI.messaging.listeners[request.portName];
if ( typeof listener === 'function' ) { if ( typeof listener === 'function' ) {
r = listener(request.msg, port.sender, callback); r = listener(request.msg, port.sender, callback);
} }
if ( r !== vAPI.messaging.UNHANDLED ) { if ( r !== vAPI.messaging.UNHANDLED ) {
return; return;
} }
// Default handler // Default handler
r = vAPI.messaging.defaultHandler(request.msg, port.sender, callback); r = vAPI.messaging.defaultHandler(request.msg, port.sender, callback);
if ( r !== vAPI.messaging.UNHANDLED ) { if ( r !== vAPI.messaging.UNHANDLED ) {
return; 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); vAPI.messaging.onDisconnect = function(port) {
port.onMessage.addListener(onMessage); 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; vAPI.messaging.ports[port.name] = port;
}; };
@ -286,7 +288,7 @@ vAPI.messaging.setup = function(defaultHandler) {
if ( typeof defaultHandler !== 'function' ) { if ( typeof defaultHandler !== 'function' ) {
defaultHandler = function(){ return null; }; defaultHandler = function(){ return null; };
}; }
this.defaultHandler = defaultHandler; this.defaultHandler = defaultHandler;
chrome.runtime.onConnect.addListener(this.onConnect); chrome.runtime.onConnect.addListener(this.onConnect);

View file

@ -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; var µb = µBlock;
// Async
switch ( request.what ) { switch ( request.what ) {
// Async
case 'getAssetContent': case 'getAssetContent':
µb.assets.getLocal(request.url, callback); µb.assets.getLocal(request.url, callback);
return; return;
@ -41,14 +45,21 @@ vAPI.messaging.setup(function(request, sender, callback) {
µb.loadUbiquitousWhitelists(); µb.loadUbiquitousWhitelists();
return; return;
// Sync default:
break;
}
// Sync
var response;
switch ( request.what ) {
case 'contextMenuEvent': case 'contextMenuEvent':
µb.contextMenuClientX = request.clientX; µb.contextMenuClientX = request.clientX;
µb.contextMenuClientY = request.clientY; µb.contextMenuClientY = request.clientY;
break; break;
case 'getUserSettings': case 'getUserSettings':
callback(µb.userSettings); response = µb.userSettings;
break; break;
case 'gotoURL': case 'gotoURL':
@ -60,13 +71,21 @@ vAPI.messaging.setup(function(request, sender, callback) {
break; break;
case 'userSettings': case 'userSettings':
callback(µb.changeUserSettings(request.name, request.value)); response = µb.changeUserSettings(request.name, request.value);
break; break;
default: default:
return vAPI.messaging.UNHANDLED; return vAPI.messaging.UNHANDLED;
} }
});
callback(response);
};
vAPI.messaging.setup(onMessage);
/******************************************************************************/
})();
/******************************************************************************/ /******************************************************************************/
/******************************************************************************/ /******************************************************************************/