Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / media_galleries / media_galleries_api.cc
index 8f1c48d..fed85fb 100644 (file)
@@ -10,8 +10,8 @@
 #include <string>
 #include <vector>
 
-#include "apps/shell_window.h"
-#include "apps/shell_window_registry.h"
+#include "apps/app_window.h"
+#include "apps/app_window_registry.h"
 #include "base/lazy_instance.h"
 #include "base/platform_file.h"
 #include "base/stl_util.h"
@@ -21,6 +21,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/api/file_system/file_system_api.h"
 #include "chrome/browser/extensions/blob_reader.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/media_galleries/media_file_system_registry.h"
 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
 #include "chrome/browser/media_galleries/media_galleries_histograms.h"
 #include "chrome/browser/media_galleries/media_scan_manager.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/storage_monitor/storage_info.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "chrome/common/extensions/api/media_galleries.h"
 #include "chrome/common/extensions/permissions/media_galleries_permission.h"
 #include "chrome/common/pref_names.h"
+#include "components/storage_monitor/storage_info.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_security_policy.h"
@@ -43,6 +44,7 @@
 #include "content/public/browser/web_contents_view.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_system.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/permissions/api_permission.h"
 #include "extensions/common/permissions/permissions_data.h"
@@ -64,6 +66,8 @@ const char kDisallowedByPolicy[] =
     "Media Galleries API is disallowed by policy: ";
 const char kMissingEventListener[] =
     "Missing event listener registration.";
+const char kNoScanPermission[] =
+    "No permission to scan.";
 
 const char kDeviceIdKey[] = "deviceId";
 const char kGalleryIdKey[] = "galleryId";
@@ -104,10 +108,10 @@ WebContents* GetWebContents(content::RenderViewHost* rvh,
       WebContentsModalDialogManager::FromWebContents(contents);
   if (!web_contents_modal_dialog_manager) {
     // If there is no WebContentsModalDialogManager, then this contents is
-    // probably the background page for an app. Try to find a shell window to
+    // probably the background page for an app. Try to find a app window to
     // host the dialog.
-    apps::ShellWindow* window = apps::ShellWindowRegistry::Get(
-        profile)->GetCurrentShellWindowForApp(app_id);
+    apps::AppWindow* window = apps::AppWindowRegistry::Get(profile)
+                                  ->GetCurrentAppWindowForApp(app_id);
     contents = window ? window->web_contents() : NULL;
   }
   return contents;
@@ -181,6 +185,19 @@ base::ListValue* ConstructFileSystemList(
   return list.release();
 }
 
+bool CheckScanPermission(const extensions::Extension* extension,
+                         std::string* error) {
+  DCHECK(extension);
+  DCHECK(error);
+  MediaGalleriesPermission::CheckParam scan_param(
+      MediaGalleriesPermission::kScanPermission);
+  bool has_scan_permission = PermissionsData::CheckAPIPermissionWithParam(
+      extension, APIPermission::kMediaGalleries, &scan_param);
+  if (!has_scan_permission)
+    *error = kNoScanPermission;
+  return has_scan_permission;
+}
+
 class SelectDirectoryDialog : public ui::SelectFileDialog::Listener,
                               public base::RefCounted<SelectDirectoryDialog> {
  public:
@@ -301,14 +318,24 @@ void MediaGalleriesEventRouter::OnScanCancelled(
 }
 
 void MediaGalleriesEventRouter::OnScanFinished(
-    const std::string& extension_id, int gallery_count, int image_count,
-    int audio_count, int video_count) {
+    const std::string& extension_id, int gallery_count,
+    const MediaGalleryScanResult& file_counts) {
   MediaGalleries::ScanProgressDetails details;
   details.type = MediaGalleries::SCAN_PROGRESS_TYPE_FINISH;
   details.gallery_count.reset(new int(gallery_count));
-  details.image_count.reset(new int(image_count));
-  details.audio_count.reset(new int(audio_count));
-  details.video_count.reset(new int(video_count));
+  details.audio_count.reset(new int(file_counts.audio_count));
+  details.image_count.reset(new int(file_counts.image_count));
+  details.video_count.reset(new int(file_counts.video_count));
+  DispatchEventToExtension(
+      extension_id,
+      MediaGalleries::OnScanProgress::kEventName,
+      MediaGalleries::OnScanProgress::Create(details).Pass());
+}
+
+void MediaGalleriesEventRouter::OnScanError(
+    const std::string& extension_id) {
+  MediaGalleries::ScanProgressDetails details;
+  details.type = MediaGalleries::SCAN_PROGRESS_TYPE_ERROR;
   DispatchEventToExtension(
       extension_id,
       MediaGalleries::OnScanProgress::kEventName,
@@ -514,8 +541,16 @@ void MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit() {
   const std::string& app_id = GetExtension()->id();
   WebContents* contents = GetWebContents(render_view_host(), profile, app_id);
   if (!contents) {
-    SendResponse(false);
-    return;
+    // When the request originated from a background page, but there is no app
+    // window open, check to see if it originated from a tab and display the
+    // dialog in that tab.
+    bool found_tab = extensions::ExtensionTabUtil::GetTabById(
+        source_tab_id(), profile, profile->IsOffTheRecord(),
+        NULL, NULL, &contents, NULL);
+    if (!found_tab || !contents) {
+      SendResponse(false);
+      return;
+    }
   }
 
   if (!user_gesture()) {
@@ -605,6 +640,11 @@ MediaGalleriesStartMediaScanFunction::~MediaGalleriesStartMediaScanFunction() {}
 
 bool MediaGalleriesStartMediaScanFunction::RunImpl() {
   media_galleries::UsageCount(media_galleries::START_MEDIA_SCAN);
+  if (!CheckScanPermission(GetExtension(), &error_)) {
+    MediaGalleriesEventRouter::Get(GetProfile())->OnScanError(
+        GetExtension()->id());
+    return false;
+  }
   return Setup(GetProfile(), &error_, base::Bind(
       &MediaGalleriesStartMediaScanFunction::OnPreferencesInit, this));
 }
@@ -618,7 +658,7 @@ void MediaGalleriesStartMediaScanFunction::OnPreferencesInit() {
     return;
   }
 
-  media_scan_manager()->StartScan(GetProfile(), GetExtension()->id());
+  media_scan_manager()->StartScan(GetProfile(), GetExtension(), user_gesture());
   SendResponse(true);
 }
 
@@ -628,13 +668,18 @@ MediaGalleriesCancelMediaScanFunction::
 
 bool MediaGalleriesCancelMediaScanFunction::RunImpl() {
   media_galleries::UsageCount(media_galleries::CANCEL_MEDIA_SCAN);
+  if (!CheckScanPermission(GetExtension(), &error_)) {
+    MediaGalleriesEventRouter::Get(GetProfile())->OnScanError(
+        GetExtension()->id());
+    return false;
+  }
   return Setup(GetProfile(), &error_, base::Bind(
       &MediaGalleriesCancelMediaScanFunction::OnPreferencesInit, this));
 }
 
 void MediaGalleriesCancelMediaScanFunction::OnPreferencesInit() {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  media_scan_manager()->CancelScan(GetProfile(), GetExtension()->id());
+  media_scan_manager()->CancelScan(GetProfile(), GetExtension());
   SendResponse(true);
 }
 
@@ -642,6 +687,13 @@ MediaGalleriesAddScanResultsFunction::~MediaGalleriesAddScanResultsFunction() {}
 
 bool MediaGalleriesAddScanResultsFunction::RunImpl() {
   media_galleries::UsageCount(media_galleries::ADD_SCAN_RESULTS);
+  if (!CheckScanPermission(GetExtension(), &error_)) {
+    // We don't fire a scan progress error here, as it would be unintuitive.
+    return false;
+  }
+  if (!user_gesture())
+    return false;
+
   return Setup(GetProfile(), &error_, base::Bind(
       &MediaGalleriesAddScanResultsFunction::OnPreferencesInit, this));
 }
@@ -649,6 +701,14 @@ bool MediaGalleriesAddScanResultsFunction::RunImpl() {
 void MediaGalleriesAddScanResultsFunction::OnPreferencesInit() {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
   const Extension* extension = GetExtension();
+  MediaGalleriesPreferences* preferences =
+      media_file_system_registry()->GetPreferences(GetProfile());
+  if (MediaGalleriesScanResultDialogController::ScanResultCountForExtension(
+          preferences, extension) == 0) {
+    GetAndReturnGalleries();
+    return;
+  }
+
   WebContents* contents =
       GetWebContents(render_view_host(), GetProfile(), extension->id());
   if (!contents) {