OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 // Custom binding for the Permissions API. | |
6 | |
7 var binding = require('binding').Binding.create('permissions'); | |
8 | |
9 var Event = require('event_bindings').Event; | |
10 | |
11 // These custom binding are only necessary because it is not currently | |
12 // possible to have a union of types as the type of the items in an array. | |
13 // Once that is fixed, this entire file should go away. | |
14 // See, | |
15 // https://code.google.com/p/chromium/issues/detail?id=162044 | |
16 // https://code.google.com/p/chromium/issues/detail?id=162042 | |
17 // TODO(bryeung): delete this file. | |
18 binding.registerCustomHook(function(api) { | |
19 var apiFunctions = api.apiFunctions; | |
20 var permissions = api.compiledApi; | |
21 | |
22 function maybeConvertToObject(str) { | |
23 var parts = $String.split(str, '|'); | |
24 if (parts.length != 2) | |
25 return str; | |
26 | |
27 var ret = {}; | |
28 ret[parts[0]] = JSON.parse(parts[1]); | |
29 return ret; | |
30 } | |
31 | |
32 function convertObjectPermissionsToStrings() { | |
33 if (arguments.length < 1) | |
34 return arguments; | |
35 | |
36 var args = arguments[0].permissions; | |
37 if (!args) | |
38 return arguments; | |
39 | |
40 for (var i = 0; i < args.length; i += 1) { | |
41 if (typeof(args[i]) == 'object') { | |
42 var a = args[i]; | |
43 var keys = $Object.keys(a); | |
44 if (keys.length != 1) { | |
45 throw new Error("Too many keys in object-style permission."); | |
46 } | |
47 arguments[0].permissions[i] = keys[0] + '|' + | |
48 JSON.stringify(a[keys[0]]); | |
49 } | |
50 } | |
51 | |
52 return arguments; | |
53 } | |
54 | |
55 // Convert complex permissions to strings so they validate against the schema | |
56 apiFunctions.setUpdateArgumentsPreValidate( | |
57 'contains', convertObjectPermissionsToStrings); | |
58 apiFunctions.setUpdateArgumentsPreValidate( | |
59 'remove', convertObjectPermissionsToStrings); | |
60 apiFunctions.setUpdateArgumentsPreValidate( | |
61 'request', convertObjectPermissionsToStrings); | |
62 | |
63 // Convert complex permissions back to objects | |
64 apiFunctions.setCustomCallback('getAll', | |
65 function(name, request, response) { | |
66 for (var i = 0; i < response.permissions.length; i += 1) { | |
67 response.permissions[i] = | |
68 maybeConvertToObject(response.permissions[i]); | |
69 } | |
70 | |
71 // Since the schema says Permissions.permissions contains strings and | |
72 // not objects, validation will fail after the for-loop above. This | |
73 // skips validation and calls the callback directly, then clears it so | |
74 // that handleResponse doesn't call it again. | |
75 try { | |
76 if (request.callback) | |
77 $Function.apply(request.callback, request, [response]); | |
78 } finally { | |
79 delete request.callback; | |
80 } | |
81 }); | |
82 | |
83 // Also convert complex permissions back to objects for events. The | |
84 // dispatchToListener call happens after argument validation, which works | |
85 // around the problem that Permissions.permissions is supposed to be a list | |
86 // of strings. | |
87 permissions.onAdded.dispatchToListener = function(callback, args) { | |
88 for (var i = 0; i < args[0].permissions.length; i += 1) { | |
89 args[0].permissions[i] = maybeConvertToObject(args[0].permissions[i]); | |
90 } | |
91 $Function.call(Event.prototype.dispatchToListener, this, callback, args); | |
92 }; | |
93 permissions.onRemoved.dispatchToListener = | |
94 permissions.onAdded.dispatchToListener; | |
95 }); | |
96 | |
97 exports.binding = binding.generate(); | |
OLD | NEW |