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.
4
5var normalizeArgumentsAndValidate =
6    require('schemaUtils').normalizeArgumentsAndValidate
7var sendRequest = require('sendRequest').sendRequest;
8
9function extendSchema(schema) {
10  var extendedSchema = $Array.slice(schema);
11  extendedSchema.unshift({'type': 'string'});
12  return extendedSchema;
13}
14
15function StorageArea(namespace, schema) {
16  // Binds an API function for a namespace to its browser-side call, e.g.
17  // storage.sync.get('foo') -> (binds to) ->
18  // storage.get('sync', 'foo').
19  //
20  // TODO(kalman): Put as a method on CustombindingObject and re-use (or
21  // even generate) for other APIs that need to do this. Same for other
22  // callers of registerCustomType().
23  var self = this;
24  function bindApiFunction(functionName) {
25    self[functionName] = function() {
26      var funSchema = this.functionSchemas[functionName];
27      var args = $Array.slice(arguments);
28      args = normalizeArgumentsAndValidate(args, funSchema);
29      return sendRequest(
30          'storage.' + functionName,
31          $Array.concat([namespace], args),
32          extendSchema(funSchema.definition.parameters),
33          {preserveNullInObjects: true});
34    };
35  }
36  var apiFunctions = ['get', 'set', 'remove', 'clear', 'getBytesInUse'];
37  $Array.forEach(apiFunctions, bindApiFunction);
38}
39
40exports.StorageArea = StorageArea;
41