| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Custom binding for the Permissions API. |
| |
| var binding = require('binding').Binding.create('permissions'); |
| |
| var Event = require('event_bindings').Event; |
| |
| // These custom binding are only necessary because it is not currently |
| // possible to have a union of types as the type of the items in an array. |
| // Once that is fixed, this entire file should go away. |
| // See, |
| // https://code.google.com/p/chromium/issues/detail?id=162044 |
| // https://code.google.com/p/chromium/issues/detail?id=162042 |
| // TODO(bryeung): delete this file. |
| binding.registerCustomHook(function(api) { |
| var apiFunctions = api.apiFunctions; |
| var permissions = api.compiledApi; |
| |
| function maybeConvertToObject(str) { |
| var parts = $String.split(str, '|'); |
| if (parts.length != 2) |
| return str; |
| |
| var ret = {}; |
| ret[parts[0]] = JSON.parse(parts[1]); |
| return ret; |
| } |
| |
| function convertObjectPermissionsToStrings() { |
| if (arguments.length < 1) |
| return arguments; |
| |
| var args = arguments[0].permissions; |
| if (!args) |
| return arguments; |
| |
| for (var i = 0; i < args.length; i += 1) { |
| if (typeof(args[i]) == 'object') { |
| var a = args[i]; |
| var keys = $Object.keys(a); |
| if (keys.length != 1) { |
| throw new Error("Too many keys in object-style permission."); |
| } |
| arguments[0].permissions[i] = keys[0] + '|' + |
| JSON.stringify(a[keys[0]]); |
| } |
| } |
| |
| return arguments; |
| } |
| |
| // Convert complex permissions to strings so they validate against the schema |
| apiFunctions.setUpdateArgumentsPreValidate( |
| 'contains', convertObjectPermissionsToStrings); |
| apiFunctions.setUpdateArgumentsPreValidate( |
| 'remove', convertObjectPermissionsToStrings); |
| apiFunctions.setUpdateArgumentsPreValidate( |
| 'request', convertObjectPermissionsToStrings); |
| |
| // Convert complex permissions back to objects |
| apiFunctions.setCustomCallback('getAll', |
| function(name, request, response) { |
| for (var i = 0; i < response.permissions.length; i += 1) { |
| response.permissions[i] = |
| maybeConvertToObject(response.permissions[i]); |
| } |
| |
| // Since the schema says Permissions.permissions contains strings and |
| // not objects, validation will fail after the for-loop above. This |
| // skips validation and calls the callback directly, then clears it so |
| // that handleResponse doesn't call it again. |
| try { |
| if (request.callback) |
| $Function.apply(request.callback, request, [response]); |
| } finally { |
| delete request.callback; |
| } |
| }); |
| |
| // Also convert complex permissions back to objects for events. The |
| // dispatchToListener call happens after argument validation, which works |
| // around the problem that Permissions.permissions is supposed to be a list |
| // of strings. |
| permissions.onAdded.dispatchToListener = function(callback, args) { |
| for (var i = 0; i < args[0].permissions.length; i += 1) { |
| args[0].permissions[i] = maybeConvertToObject(args[0].permissions[i]); |
| } |
| $Function.call(Event.prototype.dispatchToListener, this, callback, args); |
| }; |
| permissions.onRemoved.dispatchToListener = |
| permissions.onAdded.dispatchToListener; |
| }); |
| |
| exports.binding = binding.generate(); |