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