15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Custom binding for the declarativeWebRequest API.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var binding = require('binding').Binding.create('declarativeWebRequest');
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var utils = require('utils');
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var validate = require('schemaUtils').validate;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)binding.registerCustomHook(function(api) {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var declarativeWebRequest = api.compiledApi;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the schema definition of type |typeId| defined in |namespace|.
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  function getSchema(typeId) {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return utils.lookup(api.schema.types,
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        'id',
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        'declarativeWebRequest.' + typeId);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for the constructor of concrete datatypes of the
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // declarative webRequest API.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure that |this| contains the union of parameters and
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // {'instanceType': 'declarativeWebRequest.' + typeId} and validates the
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // generated union dictionary against the schema for |typeId|.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function setupInstance(instance, parameters, typeId) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var key in parameters) {
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if ($Object.hasOwnProperty(parameters, key)) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance[key] = parameters[key];
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance.instanceType = 'declarativeWebRequest.' + typeId;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var schema = getSchema(typeId);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    validate([instance], [schema]);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup all data types for the declarative webRequest API.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RequestMatcher = function(parameters) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RequestMatcher');
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.CancelRequest = function(parameters) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'CancelRequest');
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RedirectRequest = function(parameters) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RedirectRequest');
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.SetRequestHeader = function(parameters) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'SetRequestHeader');
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RemoveRequestHeader = function(parameters) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RemoveRequestHeader');
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.AddResponseHeader = function(parameters) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'AddResponseHeader');
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RemoveResponseHeader = function(parameters) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RemoveResponseHeader');
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RedirectToTransparentImage =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function(parameters) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RedirectToTransparentImage');
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RedirectToEmptyDocument = function(parameters) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RedirectToEmptyDocument');
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RedirectByRegEx = function(parameters) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RedirectByRegEx');
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.IgnoreRules = function(parameters) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'IgnoreRules');
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.AddRequestCookie = function(parameters) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'AddRequestCookie');
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.AddResponseCookie = function(parameters) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'AddResponseCookie');
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.EditRequestCookie = function(parameters) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'EditRequestCookie');
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.EditResponseCookie = function(parameters) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'EditResponseCookie');
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RemoveRequestCookie = function(parameters) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RemoveRequestCookie');
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.RemoveResponseCookie = function(parameters) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setupInstance(this, parameters, 'RemoveResponseCookie');
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  declarativeWebRequest.SendMessageToExtension = function(parameters) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setupInstance(this, parameters, 'SendMessageToExtension');
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.binding = binding.generate();
97