media_galleries_api.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implements the Chrome Extensions Media Galleries API.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries/media_galleries_api.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/shell_window_registry.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/shell_window.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/web_contents_modal_dialog_manager.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/experimental_media_galleries.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/media_galleries.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/api_permission.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/permissions/media_galleries_permission.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chrome::MediaFileSystemInfo;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chrome::MediaFileSystemRegistry;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chrome::MediaFileSystemsCallback;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessSecurityPolicy;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace MediaGalleries = extensions::api::media_galleries;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace GetMediaFileSystems = MediaGalleries::GetMediaFileSystems;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDisallowedByPolicy[] =
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Media Galleries API is disallowed by policy: ";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInvalidInteractive[] = "Unknown value for interactive.";
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDeviceIdKey[] = "deviceId";
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kGalleryIdKey[] = "galleryId";
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kIsMediaDeviceKey[] = "isMediaDevice";
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kIsRemovableKey[] = "isRemovable";
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kNameKey[] = "name";
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks whether the MediaGalleries API is currently accessible (it may be
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disallowed even if an extension has the requisite permission).
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ApiIsAccessible(std::string* error) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ChromeSelectFilePolicy::FileSelectDialogsAllowed()) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *error = std::string(kDisallowedByPolicy) +
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs::kAllowFileSelectionDialogs;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesGetMediaFileSystemsFunction::
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~MediaGalleriesGetMediaFileSystemsFunction() {}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesGetMediaFileSystemsFunction::RunImpl() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ApiIsAccessible(&error_))
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GetMediaFileSystems::Params> params(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMediaFileSystems::Params::Create(*args_));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleries::GetMediaFileSystemsInteractivity interactive =
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NO;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params->details.get() && params->details->interactive != MediaGalleries::
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NONE) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interactive = params->details->interactive;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (interactive) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_YES: {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The MediaFileSystemRegistry only updates preferences for extensions
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // that it knows are in use. Since this may be the first call to
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // chrome.getMediaFileSystems for this extension, call
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // GetMediaFileSystemsForExtension() here solely so that
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // MediaFileSystemRegistry will send preference changes.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetMediaFileSystemsForExtension(base::Bind(
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &MediaGalleriesGetMediaFileSystemsFunction::AlwaysShowDialog, this));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_IF_NEEDED: {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetMediaFileSystemsForExtension(base::Bind(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &MediaGalleriesGetMediaFileSystemsFunction::ShowDialogIfNoGalleries,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NO:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAndReturnGalleries();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NONE:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_ = kInvalidInteractive;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesGetMediaFileSystemsFunction::AlwaysShowDialog(
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<MediaFileSystemInfo>& /*filesystems*/) {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowDialog();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesGetMediaFileSystemsFunction::ShowDialogIfNoGalleries(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<MediaFileSystemInfo>& filesystems) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (filesystems.empty())
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowDialog();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReturnGalleries(filesystems);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries() {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetMediaFileSystemsForExtension(base::Bind(
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries, this));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<MediaFileSystemInfo>& filesystems) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh = render_view_host();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!rvh) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendResponse(false);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleriesPermission::CheckParam read_param(
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MediaGalleriesPermission::kReadPermission);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_read_permission = GetExtension()->CheckAPIPermissionWithParam(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      APIPermission::kMediaGalleries, &read_param);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int child_id = rvh->GetProcess()->GetID();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = new base::ListValue();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < filesystems.size(); i++) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> file_system_dict_value(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new base::DictionaryValue());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send the file system id so the renderer can create a valid FileSystem
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // object.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_system_dict_value->SetStringWithoutPathExpansion(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "fsid", filesystems[i].fsid);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_system_dict_value->SetStringWithoutPathExpansion(
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kNameKey, filesystems[i].name);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_system_dict_value->SetStringWithoutPathExpansion(
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kGalleryIdKey,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Uint64ToString(filesystems[i].pref_id));
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!filesystems[i].transient_device_id.empty()) {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file_system_dict_value->SetStringWithoutPathExpansion(
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          kDeviceIdKey, filesystems[i].transient_device_id);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_system_dict_value->SetBooleanWithoutPathExpansion(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kIsRemovableKey, filesystems[i].removable);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_system_dict_value->SetBooleanWithoutPathExpansion(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kIsMediaDeviceKey, filesystems[i].media_device);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->Append(file_system_dict_value.release());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (filesystems[i].path.empty())
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (has_read_permission) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::ChildProcessSecurityPolicy* policy =
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChildProcessSecurityPolicy::GetInstance();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!policy->CanReadFile(child_id, filesystems[i].path))
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        policy->GrantReadFile(child_id, filesystems[i].path);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy->GrantReadFileSystem(child_id, filesystems[i].fsid);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetResult(list);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendResponse(true);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesGetMediaFileSystemsFunction::ShowDialog() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* contents = WebContents::FromRenderViewHost(render_view_host());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsModalDialogManager* web_contents_modal_dialog_manager =
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContentsModalDialogManager::FromWebContents(contents);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_modal_dialog_manager) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If there is no WebContentsModalDialogManager, then this contents is
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // probably the background page for an app. Try to find a shell window to
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // host the dialog.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellWindow* window = ShellWindowRegistry::Get(profile())->
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetCurrentShellWindowForApp(GetExtension()->id());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (window) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents = window->web_contents();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Abort showing the dialog. TODO(estade) Perhaps return an error instead.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAndReturnGalleries();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Controller will delete itself.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure cb = base::Bind(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries, this);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new chrome::MediaGalleriesDialogController(contents, *GetExtension(), cb);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesGetMediaFileSystemsFunction::GetMediaFileSystemsForExtension(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const chrome::MediaFileSystemsCallback& cb) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_host()) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cb.Run(std::vector<MediaFileSystemInfo>());
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaFileSystemRegistry* registry =
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      g_browser_process->media_file_system_registry();
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->GetMediaFileSystemsForExtension(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host(), GetExtension(), cb);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaGalleriesAssembleMediaFileFunction -------------------------------------
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesAssembleMediaFileFunction::
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~MediaGalleriesAssembleMediaFileFunction() {}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaGalleriesAssembleMediaFileFunction::RunImpl() {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ApiIsAccessible(&error_))
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(vandebo) Update the metadata and return the new file.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(base::Value::CreateNullValue());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
247