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