Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2012 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 
      5 // Custom binding for the fileBrowserPrivate API.
      6 
      7 // Bindings
      8 var binding = require('binding').Binding.create('fileBrowserPrivate');
      9 var eventBindings = require('event_bindings');
     10 
     11 // Natives
     12 var fileBrowserPrivateNatives = requireNative('file_browser_private');
     13 var fileBrowserHandlerNatives = requireNative('file_browser_handler');
     14 
     15 // Internals
     16 var fileBrowserPrivateInternal =
     17     require('binding').Binding.create('fileBrowserPrivateInternal').generate();
     18 
     19 // Shorthands
     20 var GetFileSystem = fileBrowserPrivateNatives.GetFileSystem;
     21 var GetExternalFileEntry = fileBrowserHandlerNatives.GetExternalFileEntry;
     22 
     23 binding.registerCustomHook(function(bindingsAPI) {
     24   var apiFunctions = bindingsAPI.apiFunctions;
     25 
     26   apiFunctions.setCustomCallback('requestFileSystem',
     27                                  function(name, request, response) {
     28     var fs = null;
     29     if (response && !response.error)
     30       fs = GetFileSystem(response.name, response.root_url);
     31     if (request.callback)
     32       request.callback(fs);
     33     request.callback = null;
     34   });
     35 
     36   apiFunctions.setCustomCallback('searchDrive',
     37                                  function(name, request, response) {
     38     if (response && !response.error && response.entries) {
     39       response.entries = response.entries.map(function(entry) {
     40         return GetExternalFileEntry(entry);
     41       });
     42     }
     43 
     44     // So |request.callback| doesn't break if response is not defined.
     45     if (!response)
     46       response = {};
     47 
     48     if (request.callback)
     49       request.callback(response.entries, response.nextFeed);
     50     request.callback = null;
     51   });
     52 
     53   apiFunctions.setCustomCallback('searchDriveMetadata',
     54                                  function(name, request, response) {
     55     if (response && !response.error) {
     56       for (var i = 0; i < response.length; i++) {
     57         response[i].entry =
     58             GetExternalFileEntry(response[i].entry);
     59       }
     60     }
     61 
     62     // So |request.callback| doesn't break if response is not defined.
     63     if (!response)
     64       response = {};
     65 
     66     if (request.callback)
     67       request.callback(response);
     68     request.callback = null;
     69   });
     70 
     71   apiFunctions.setHandleRequest('resolveIsolatedEntries',
     72                                 function(entries, callback) {
     73     var urls = entries.map(function(entry) {
     74       return fileBrowserHandlerNatives.GetEntryURL(entry);
     75     });
     76     fileBrowserPrivateInternal.resolveIsolatedEntries(urls, function(
     77         entryDescriptions) {
     78       callback(entryDescriptions.map(function(description) {
     79         return GetExternalFileEntry(description);
     80       }));
     81     });
     82   });
     83 });
     84 
     85 eventBindings.registerArgumentMassager(
     86     'fileBrowserPrivate.onDirectoryChanged', function(args, dispatch) {
     87   // Convert the entry arguments into a real Entry object.
     88   args[0].entry = GetExternalFileEntry(args[0].entry);
     89   dispatch(args);
     90 });
     91 
     92 exports.binding = binding.generate();
     93