1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Routines used to normalize arguments to messaging functions. 6 7 function alignSendMessageArguments(args, hasOptionsArgument) { 8 // Align missing (optional) function arguments with the arguments that 9 // schema validation is expecting, e.g. 10 // extension.sendRequest(req) -> extension.sendRequest(null, req) 11 // extension.sendRequest(req, cb) -> extension.sendRequest(null, req, cb) 12 if (!args || !args.length) 13 return null; 14 var lastArg = args.length - 1; 15 16 // responseCallback (last argument) is optional. 17 var responseCallback = null; 18 if (typeof args[lastArg] == 'function') 19 responseCallback = args[lastArg--]; 20 21 var options = null; 22 if (hasOptionsArgument && lastArg >= 1) { 23 // options (third argument) is optional. It can also be ambiguous which 24 // argument it should match. If there are more than two arguments remaining, 25 // options is definitely present: 26 if (lastArg > 1) { 27 options = args[lastArg--]; 28 } else { 29 // Exactly two arguments remaining. If the first argument is a string, 30 // it should bind to targetId, and the second argument should bind to 31 // request, which is required. In other words, when two arguments remain, 32 // only bind options when the first argument cannot bind to targetId. 33 if (!(args[0] === null || typeof args[0] == 'string')) 34 options = args[lastArg--]; 35 } 36 } 37 38 // request (second argument) is required. 39 var request = args[lastArg--]; 40 41 // targetId (first argument, extensionId in the manifest) is optional. 42 var targetId = null; 43 if (lastArg >= 0) 44 targetId = args[lastArg--]; 45 46 if (lastArg != -1) 47 return null; 48 if (hasOptionsArgument) 49 return [targetId, request, options, responseCallback]; 50 return [targetId, request, responseCallback]; 51 } 52 53 exports.alignSendMessageArguments = alignSendMessageArguments; 54