var blobNatives = requireNative('blob_natives');
var mediaGalleriesNatives = requireNative('mediaGalleries');
+var blobsAwaitingMetadata = {};
var mediaGalleriesMetadata = {};
function createFileSystemObjectsAndUpdateMetadata(response) {
- var result = null;
+ var result = [];
mediaGalleriesMetadata = {}; // Clear any previous metadata.
if (response) {
- result = [];
for (var i = 0; i < response.length; i++) {
var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject(
response[i].fsid);
request.callback = null;
});
+ apiFunctions.setCustomCallback('dropPermissionForMediaFileSystem',
+ function(name, request, response) {
+ var galleryId = response;
+
+ if (galleryId) {
+ for (var key in mediaGalleriesMetadata) {
+ if (mediaGalleriesMetadata[key].galleryId == galleryId) {
+ delete mediaGalleriesMetadata[key];
+ break;
+ }
+ }
+ }
+ if (request.callback)
+ request.callback();
+ request.callback = null;
+ });
+
apiFunctions.setHandleRequest('getMediaFileSystemMetadata',
function(filesystem) {
if (filesystem && filesystem.name &&
- mediaGalleriesMetadata[filesystem.name]) {
+ filesystem.name in mediaGalleriesMetadata) {
return mediaGalleriesMetadata[filesystem.name];
}
- return {};
+ return {
+ 'name': '',
+ 'galleryId': '',
+ 'isRemovable': false,
+ 'isMediaDevice': false,
+ 'isAvailable': false,
+ };
});
apiFunctions.setUpdateArgumentsPostValidate('getMetadata',
function(mediaFile, options, callback) {
var blobUuid = blobNatives.GetBlobUuid(mediaFile)
+ // Store the blob in a global object to keep its refcount nonzero -- this
+ // prevents the object from being garbage collected before any metadata
+ // parsing gets to occur (see crbug.com/415792).
+ blobsAwaitingMetadata[blobUuid] = mediaFile;
return [blobUuid, options, callback];
});
+
+ apiFunctions.setCustomCallback('getMetadata',
+ function(name, request, response) {
+ if (response.attachedImagesBlobInfo) {
+ for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) {
+ var blobInfo = response.attachedImagesBlobInfo[i];
+ var blob = blobNatives.TakeBrowserProcessBlob(
+ blobInfo.blobUUID, blobInfo.type, blobInfo.size);
+ response.metadata.attachedImages.push(blob);
+ }
+ }
+
+ if (request.callback)
+ request.callback(response.metadata);
+ request.callback = null;
+
+ // The UUID was in position 0 in the setUpdateArgumentsPostValidate
+ // function.
+ var uuid = request.args[0];
+ delete blobsAwaitingMetadata[uuid];
+ });
});
exports.binding = binding.generate();