146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var normalizeArgumentsAndValidate =
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    require('schemaUtils').normalizeArgumentsAndValidate
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var sendRequest = require('sendRequest').sendRequest;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function extendSchema(schema) {
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  var extendedSchema = $Array.slice(schema);
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extendedSchema.unshift({'type': 'string'});
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return extendedSchema;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function StorageArea(namespace, schema) {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Binds an API function for a namespace to its browser-side call, e.g.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // storage.sync.get('foo') -> (binds to) ->
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // storage.get('sync', 'foo').
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(kalman): Put as a method on CustombindingObject and re-use (or
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // even generate) for other APIs that need to do this. Same for other
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callers of registerCustomType().
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var self = this;
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  function bindApiFunction(functionName) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self[functionName] = function() {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var funSchema = this.functionSchemas[functionName];
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var args = $Array.slice(arguments);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      args = normalizeArgumentsAndValidate(args, funSchema);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return sendRequest(
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'storage.' + functionName,
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          $Array.concat([namespace], args),
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          extendSchema(funSchema.definition.parameters),
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          {preserveNullInObjects: true});
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var apiFunctions = ['get', 'set', 'remove', 'clear', 'getBytesInUse'];
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  $Array.forEach(apiFunctions, bindApiFunction);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.StorageArea = StorageArea;
41