Roll src/third_party/WebKit 9301d6f:4619053 (svn 201058:201059)
[chromium-blink-merge.git] / extensions / renderer / resources / permissions_custom_bindings.js
blob43b436e2e9e631e43deb5abac0829075a85345a3
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.
5 // Custom binding for the Permissions API.
7 var binding = require('binding').Binding.create('permissions');
9 var Event = require('event_bindings').Event;
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;
22   function maybeConvertToObject(str) {
23     var parts = $String.split(str, '|');
24     if (parts.length != 2)
25       return str;
27     var ret = {};
28     ret[parts[0]] = JSON.parse(parts[1]);
29     return ret;
30   }
32   function convertObjectPermissionsToStrings() {
33     if (arguments.length < 1)
34       return arguments;
36     var args = arguments[0].permissions;
37     if (!args)
38       return arguments;
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     }
52     return arguments;
53   }
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);
63   // Convert complex permissions back to objects
64   apiFunctions.setCustomCallback('getAll',
65       function(name, request, callback, response) {
66         for (var i = 0; i < response.permissions.length; i += 1) {
67           response.permissions[i] =
68               maybeConvertToObject(response.permissions[i]);
69         }
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.
74         if (callback)
75           callback(response);
76       });
78   // Also convert complex permissions back to objects for events.  The
79   // dispatchToListener call happens after argument validation, which works
80   // around the problem that Permissions.permissions is supposed to be a list
81   // of strings.
82   permissions.onAdded.dispatchToListener = function(callback, args) {
83     for (var i = 0; i < args[0].permissions.length; i += 1) {
84       args[0].permissions[i] = maybeConvertToObject(args[0].permissions[i]);
85     }
86     $Function.call(Event.prototype.dispatchToListener, this, callback, args);
87   };
88   permissions.onRemoved.dispatchToListener =
89       permissions.onAdded.dispatchToListener;
90 });
92 exports.binding = binding.generate();