Upstream version 10.38.220.0
[platform/framework/web/crosswalk.git] / src / chrome / renderer / resources / extensions / media_galleries_custom_bindings.js
index 2d9116d..bbe740a 100644 (file)
@@ -5,17 +5,16 @@
 // Custom binding for the Media Gallery API.
 
 var binding = require('binding').Binding.create('mediaGalleries');
-
-var mediaGalleriesNatives = requireNative('mediaGalleries');
 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);
@@ -68,20 +67,68 @@ binding.registerCustomHook(function(bindingsAPI, extensionId) {
     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();