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