1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Custom binding for the webViewRequest API.
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)var binding = require('binding').Binding.create('webViewRequest');
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)var declarativeWebRequestSchema =
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    requireNative('schema_registry').GetSchema('declarativeWebRequest');
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)var utils = require('utils');
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)var validate = require('schemaUtils').validate;
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)binding.registerCustomHook(function(api) {
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  var webViewRequest = api.compiledApi;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the schema definition of type |typeId| defined in
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |declarativeWebRequestScheme.types|.
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  function getSchema(typeId) {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return utils.lookup(declarativeWebRequestSchema.types,
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        'id',
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        'declarativeWebRequest.' + typeId);
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Helper function for the constructor of concrete datatypes of the
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // declarative webRequest API.
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Makes sure that |this| contains the union of parameters and
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // {'instanceType': 'declarativeWebRequest.' + typeId} and validates the
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // generated union dictionary against the schema for |typeId|.
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  function setupInstance(instance, parameters, typeId) {
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (var key in parameters) {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if ($Object.hasOwnProperty(parameters, key)) {
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        instance[key] = parameters[key];
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    instance.instanceType = 'declarativeWebRequest.' + typeId;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var schema = getSchema(typeId);
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    validate([instance], [schema]);
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Setup all data types for the declarative webRequest API from the schema.
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (var i = 0; i < declarativeWebRequestSchema.types.length; ++i) {
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var typeSchema = declarativeWebRequestSchema.types[i];
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var typeId = typeSchema.id.replace('declarativeWebRequest.', '');
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var action = function(typeId) {
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return function(parameters) {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        setupInstance(this, parameters, typeId);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      };
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }(typeId);
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    webViewRequest[typeId] = action;
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)});
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)exports.binding = binding.generate();
56