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