OLD | NEW |
| (Empty) |
1 // Copyright 2014 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; | |
OLD | NEW |