1 // Copyright 2013 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.
5 // Custom binding for the fileSystemProvider API.
7 var binding = require('binding').Binding.create('fileSystemProvider');
8 var fileSystemProviderInternal =
9 require('binding').Binding.create('fileSystemProviderInternal').generate();
10 var eventBindings = require('event_bindings');
11 var fileSystemNatives = requireNative('file_system_natives');
12 var GetDOMError = fileSystemNatives.GetDOMError;
15 * Annotates a date with its serialized value.
16 * @param {Date} date Input date.
17 * @return {Date} Date with an extra <code>value</code> attribute.
19 function annotateDate(date) {
20 // Copy in case the input date is frozen.
21 var result = new Date(date.getTime());
22 result.value = result.toString();
27 * Annotates an entry metadata by serializing its modifiedTime value.
28 * @param {EntryMetadata} metadata Input metadata.
29 * @return {EntryMetadata} metadata Annotated metadata, which can be passed
30 * back to the C++ layer.
32 function annotateMetadata(metadata) {
34 isDirectory: metadata.isDirectory,
37 modificationTime: annotateDate(metadata.modificationTime)
39 if ('mimeType' in metadata)
40 result.mimeType = metadata.mimeType;
45 * Massages arguments of an event raised by the File System Provider API.
46 * @param {Array.<*>} args Input arguments.
47 * @param {function(Array.<*>)} dispatch Closure to be called with massaged
50 function massageArgumentsDefault(args, dispatch) {
51 var executionStart = Date.now();
52 var options = args[0];
53 var onSuccessCallback = function(hasNext) {
54 fileSystemProviderInternal.operationRequestedSuccess(
55 options.fileSystemId, options.requestId, Date.now() - executionStart);
57 var onErrorCallback = function(error) {
58 fileSystemProviderInternal.operationRequestedError(
59 options.fileSystemId, options.requestId, error,
60 Date.now() - executionStart);
62 dispatch([options, onSuccessCallback, onErrorCallback]);
66 binding.registerCustomHook(function(bindingsAPI) {
67 var apiFunctions = bindingsAPI.apiFunctions;
69 apiFunctions.setUpdateArgumentsPostValidate(
71 function(options, successCallback, errorCallback) {
72 // Piggyback the error callback onto the success callback,
73 // so we can use the error callback later.
74 successCallback.errorCallback_ = errorCallback;
75 return [options, successCallback];
78 apiFunctions.setCustomCallback(
80 function(name, request, response) {
82 if (request.callback && response) {
83 // DOMError is present only if mount() failed.
85 // Convert a Dictionary to a DOMError.
86 domError = GetDOMError(response[0].name, response[0].message);
90 var successCallback = request.callback;
91 var errorCallback = request.callback.errorCallback_;
92 delete request.callback;
95 errorCallback(domError);
101 apiFunctions.setUpdateArgumentsPostValidate(
103 function(options, successCallback, errorCallback) {
104 // Piggyback the error callback onto the success callback,
105 // so we can use the error callback later.
106 successCallback.errorCallback_ = errorCallback;
107 return [options, successCallback];
110 apiFunctions.setCustomCallback(
112 function(name, request, response) {
114 if (request.callback) {
115 // DOMError is present only if mount() failed.
116 if (response && response[0]) {
117 // Convert a Dictionary to a DOMError.
118 domError = GetDOMError(response[0].name, response[0].message);
122 var successCallback = request.callback;
123 var errorCallback = request.callback.errorCallback_;
124 delete request.callback;
127 errorCallback(domError);
134 eventBindings.registerArgumentMassager(
135 'fileSystemProvider.onUnmountRequested',
136 massageArgumentsDefault);
138 eventBindings.registerArgumentMassager(
139 'fileSystemProvider.onGetMetadataRequested',
140 function(args, dispatch) {
141 var executionStart = Date.now();
142 var options = args[0];
143 var onSuccessCallback = function(metadata) {
144 fileSystemProviderInternal.getMetadataRequestedSuccess(
145 options.fileSystemId,
147 annotateMetadata(metadata),
148 Date.now() - executionStart);
150 var onErrorCallback = function(error) {
151 fileSystemProviderInternal.operationRequestedError(
152 options.fileSystemId, options.requestId, error,
153 Date.now() - executionStart);
155 dispatch([options, onSuccessCallback, onErrorCallback]);
158 eventBindings.registerArgumentMassager(
159 'fileSystemProvider.onReadDirectoryRequested',
160 function(args, dispatch) {
161 var executionStart = Date.now();
162 var options = args[0];
163 var onSuccessCallback = function(entries, hasNext) {
164 var annotatedEntries = entries.map(annotateMetadata);
165 fileSystemProviderInternal.readDirectoryRequestedSuccess(
166 options.fileSystemId, options.requestId, annotatedEntries, hasNext,
167 Date.now() - executionStart);
169 var onErrorCallback = function(error) {
170 fileSystemProviderInternal.operationRequestedError(
171 options.fileSystemId, options.requestId, error,
172 Date.now() - executionStart);
174 dispatch([options, onSuccessCallback, onErrorCallback]);
177 eventBindings.registerArgumentMassager(
178 'fileSystemProvider.onOpenFileRequested',
179 massageArgumentsDefault);
181 eventBindings.registerArgumentMassager(
182 'fileSystemProvider.onCloseFileRequested',
183 massageArgumentsDefault);
185 eventBindings.registerArgumentMassager(
186 'fileSystemProvider.onReadFileRequested',
187 function(args, dispatch) {
188 var executionStart = Date.now();
189 var options = args[0];
190 var onSuccessCallback = function(data, hasNext) {
191 fileSystemProviderInternal.readFileRequestedSuccess(
192 options.fileSystemId, options.requestId, data, hasNext,
193 Date.now() - executionStart);
195 var onErrorCallback = function(error) {
196 fileSystemProviderInternal.operationRequestedError(
197 options.fileSystemId, options.requestId, error,
198 Date.now() - executionStart);
200 dispatch([options, onSuccessCallback, onErrorCallback]);
203 eventBindings.registerArgumentMassager(
204 'fileSystemProvider.onCreateDirectoryRequested',
205 massageArgumentsDefault);
207 eventBindings.registerArgumentMassager(
208 'fileSystemProvider.onDeleteEntryRequested',
209 massageArgumentsDefault);
211 eventBindings.registerArgumentMassager(
212 'fileSystemProvider.onCreateFileRequested',
213 massageArgumentsDefault);
215 eventBindings.registerArgumentMassager(
216 'fileSystemProvider.onCopyEntryRequested',
217 massageArgumentsDefault);
219 eventBindings.registerArgumentMassager(
220 'fileSystemProvider.onMoveEntryRequested',
221 massageArgumentsDefault);
223 eventBindings.registerArgumentMassager(
224 'fileSystemProvider.onTruncateRequested',
225 massageArgumentsDefault);
227 eventBindings.registerArgumentMassager(
228 'fileSystemProvider.onWriteFileRequested',
229 massageArgumentsDefault);
231 exports.binding = binding.generate();