Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: chrome/browser/extensions/api/media_galleries/media_galleries_api.cc

Issue 93643002: Media Galleries: Add chrome.mediaGalleries.addUserSelectedFolder(). (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: rebase Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Implements the Chrome Extensions Media Galleries API. 5 // Implements the Chrome Extensions Media Galleries API.
6 6
7 #include "chrome/browser/extensions/api/media_galleries/media_galleries_api.h" 7 #include "chrome/browser/extensions/api/media_galleries/media_galleries_api.h"
8 8
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "apps/shell_window.h" 13 #include "apps/shell_window.h"
14 #include "apps/shell_window_registry.h" 14 #include "apps/shell_window_registry.h"
15 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_ptr.h"
16 #include "base/platform_file.h" 16 #include "base/platform_file.h"
17 #include "base/stl_util.h" 17 #include "base/stl_util.h"
18 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
19 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
20 #include "base/task_runner_util.h"
20 #include "base/values.h" 21 #include "base/values.h"
21 #include "chrome/browser/browser_process.h" 22 #include "chrome/browser/browser_process.h"
23 #include "chrome/browser/extensions/api/file_system/file_system_api.h"
24 #include "chrome/browser/extensions/extension_prefs.h"
22 #include "chrome/browser/media_galleries/media_file_system_registry.h" 25 #include "chrome/browser/media_galleries/media_file_system_registry.h"
23 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" 26 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
24 #include "chrome/browser/media_galleries/media_galleries_histograms.h" 27 #include "chrome/browser/media_galleries/media_galleries_histograms.h"
25 #include "chrome/browser/media_galleries/media_galleries_preferences.h" 28 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
29 #include "chrome/browser/platform_util.h"
26 #include "chrome/browser/profiles/profile.h" 30 #include "chrome/browser/profiles/profile.h"
27 #include "chrome/browser/storage_monitor/storage_info.h" 31 #include "chrome/browser/storage_monitor/storage_info.h"
28 #include "chrome/browser/ui/chrome_select_file_policy.h" 32 #include "chrome/browser/ui/chrome_select_file_policy.h"
29 #include "chrome/common/extensions/api/media_galleries.h" 33 #include "chrome/common/extensions/api/media_galleries.h"
30 #include "chrome/common/extensions/permissions/media_galleries_permission.h" 34 #include "chrome/common/extensions/permissions/media_galleries_permission.h"
31 #include "chrome/common/pref_names.h" 35 #include "chrome/common/pref_names.h"
32 #include "components/web_modal/web_contents_modal_dialog_manager.h" 36 #include "components/web_modal/web_contents_modal_dialog_manager.h"
37 #include "content/public/browser/browser_thread.h"
33 #include "content/public/browser/child_process_security_policy.h" 38 #include "content/public/browser/child_process_security_policy.h"
34 #include "content/public/browser/render_process_host.h" 39 #include "content/public/browser/render_process_host.h"
35 #include "content/public/browser/render_view_host.h" 40 #include "content/public/browser/render_view_host.h"
36 #include "content/public/browser/web_contents.h" 41 #include "content/public/browser/web_contents.h"
42 #include "content/public/browser/web_contents_view.h"
37 #include "extensions/common/extension.h" 43 #include "extensions/common/extension.h"
38 #include "extensions/common/permissions/api_permission.h" 44 #include "extensions/common/permissions/api_permission.h"
39 #include "extensions/common/permissions/permissions_data.h" 45 #include "extensions/common/permissions/permissions_data.h"
40 46
41 using content::WebContents; 47 using content::WebContents;
42 using web_modal::WebContentsModalDialogManager; 48 using web_modal::WebContentsModalDialogManager;
43 49
44 namespace extensions { 50 namespace extensions {
45 51
46 namespace MediaGalleries = api::media_galleries; 52 namespace MediaGalleries = api::media_galleries;
47 namespace GetMediaFileSystems = MediaGalleries::GetMediaFileSystems; 53 namespace GetMediaFileSystems = MediaGalleries::GetMediaFileSystems;
54 namespace ManageMediaLocations = MediaGalleries::ManageMediaLocations;
48 55
49 namespace { 56 namespace {
50 57
51 const char kDisallowedByPolicy[] = 58 const char kDisallowedByPolicy[] =
52 "Media Galleries API is disallowed by policy: "; 59 "Media Galleries API is disallowed by policy: ";
60 const char kInvalidManageRequestType[] =
61 "Invalid manageMediaLocations request type";
53 62
54 const char kDeviceIdKey[] = "deviceId"; 63 const char kDeviceIdKey[] = "deviceId";
55 const char kGalleryIdKey[] = "galleryId"; 64 const char kGalleryIdKey[] = "galleryId";
56 const char kIsAvailableKey[] = "isAvailable"; 65 const char kIsAvailableKey[] = "isAvailable";
57 const char kIsMediaDeviceKey[] = "isMediaDevice"; 66 const char kIsMediaDeviceKey[] = "isMediaDevice";
58 const char kIsRemovableKey[] = "isRemovable"; 67 const char kIsRemovableKey[] = "isRemovable";
59 const char kNameKey[] = "name"; 68 const char kNameKey[] = "name";
60 69
61 // Checks whether the MediaGalleries API is currently accessible (it may be 70 // Checks whether the MediaGalleries API is currently accessible (it may be
62 // disallowed even if an extension has the requisite permission). 71 // disallowed even if an extension has the requisite permission).
63 bool ApiIsAccessible(std::string* error) { 72 bool ApiIsAccessible(std::string* error) {
64 if (!ChromeSelectFilePolicy::FileSelectDialogsAllowed()) { 73 if (!ChromeSelectFilePolicy::FileSelectDialogsAllowed()) {
65 *error = std::string(kDisallowedByPolicy) + 74 *error = std::string(kDisallowedByPolicy) +
66 prefs::kAllowFileSelectionDialogs; 75 prefs::kAllowFileSelectionDialogs;
67 return false; 76 return false;
68 } 77 }
69 78
70 return true; 79 return true;
71 } 80 }
72 81
73 MediaFileSystemRegistry* media_file_system_registry() { 82 MediaFileSystemRegistry* media_file_system_registry() {
74 return g_browser_process->media_file_system_registry(); 83 return g_browser_process->media_file_system_registry();
75 } 84 }
76 85
86 class SelectDirectoryDialog : public ui::SelectFileDialog::Listener,
87 public base::RefCounted<SelectDirectoryDialog> {
88 public:
89 // Selected file path, or an empty path if the user canceled.
90 typedef base::Callback<void(const base::FilePath&)> Callback;
91
92 SelectDirectoryDialog(WebContents* web_contents, const Callback& callback)
93 : web_contents_(web_contents),
94 callback_(callback) {
95 select_file_dialog_ = ui::SelectFileDialog::Create(
96 this, new ChromeSelectFilePolicy(web_contents));
97 }
98
99 void Show(const base::FilePath& default_path) {
100 AddRef(); // Balanced in the two reachable listener outcomes.
101 select_file_dialog_->SelectFile(
102 ui::SelectFileDialog::SELECT_FOLDER,
103 base::string16(), // TODO(thestig) Add a title.
vandebo (ex-Chrome) 2013/12/18 20:15:53 This is a privacy requirement. Probably should pu
Lei Zhang 2014/01/08 23:49:54 Done. Re-using the one from the media galleries pe
104 default_path,
105 NULL,
106 0,
107 base::FilePath::StringType(),
108 platform_util::GetTopLevel(web_contents_->GetView()->GetNativeView()),
109 NULL);
110 }
111
112 // ui::SelectFileDialog::Listener implementation.
113 virtual void FileSelected(const base::FilePath& path,
114 int index,
115 void* params) OVERRIDE {
116 callback_.Run(path);
117 Release(); // Balanced in Show().
118 }
119
120 virtual void MultiFilesSelected(const std::vector<base::FilePath>& files,
121 void* params) OVERRIDE {
122 NOTREACHED() << "Should not be able to select multiple files";
123 }
124
125 virtual void FileSelectionCanceled(void* params) OVERRIDE {
126 callback_.Run(base::FilePath());
127 Release(); // Balanced in Show().
128 }
129
130 private:
131 friend class base::RefCounted<SelectDirectoryDialog>;
132 virtual ~SelectDirectoryDialog() {}
133
134 scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
135 WebContents* web_contents_;
136 Callback callback_;
137
138 DISALLOW_COPY_AND_ASSIGN(SelectDirectoryDialog);
139 };
140
77 } // namespace 141 } // namespace
78 142
79 MediaGalleriesGetMediaFileSystemsFunction:: 143 MediaGalleriesGetMediaFileSystemsBase::
80 ~MediaGalleriesGetMediaFileSystemsFunction() {} 144 ~MediaGalleriesGetMediaFileSystemsBase() {}
81 145
82 bool MediaGalleriesGetMediaFileSystemsFunction::RunImpl() { 146 void MediaGalleriesGetMediaFileSystemsBase::ReadPrefsAndShowDialog() {
83 if (!ApiIsAccessible(&error_)) 147 // The MediaFileSystemRegistry only updates preferences for extensions
84 return false; 148 // that it knows are in use. Since this may be the first call to
85 149 // chrome.{getMediaFileSystems, manageMediaLocations} for this extension,
86 media_galleries::UsageCount(media_galleries::GET_MEDIA_FILE_SYSTEMS); 150 // call GetMediaFileSystemsForExtension() here solely so that
87 scoped_ptr<GetMediaFileSystems::Params> params( 151 // MediaFileSystemRegistry will send preference changes.
88 GetMediaFileSystems::Params::Create(*args_)); 152 GetMediaFileSystemsForExtension(base::Bind(
89 EXTENSION_FUNCTION_VALIDATE(params.get()); 153 &MediaGalleriesGetMediaFileSystemsBase::AlwaysShowDialog, this));
90 MediaGalleries::GetMediaFileSystemsInteractivity interactive =
91 MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NO;
92 if (params->details.get() && params->details->interactive != MediaGalleries::
93 GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NONE) {
94 interactive = params->details->interactive;
95 }
96
97 MediaGalleriesPreferences* preferences =
98 media_file_system_registry()->GetPreferences(GetProfile());
99 preferences->EnsureInitialized(base::Bind(
100 &MediaGalleriesGetMediaFileSystemsFunction::OnPreferencesInit,
101 this,
102 interactive));
103 return true;
104 } 154 }
105 155
106 void MediaGalleriesGetMediaFileSystemsFunction::OnPreferencesInit( 156 void MediaGalleriesGetMediaFileSystemsBase::ShowDialog() {
107 MediaGalleries::GetMediaFileSystemsInteractivity interactive) { 157 media_galleries::UsageCount(media_galleries::SHOW_DIALOG);
108 switch (interactive) {
109 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_YES: {
110 // The MediaFileSystemRegistry only updates preferences for extensions
111 // that it knows are in use. Since this may be the first call to
112 // chrome.getMediaFileSystems for this extension, call
113 // GetMediaFileSystemsForExtension() here solely so that
114 // MediaFileSystemRegistry will send preference changes.
115 GetMediaFileSystemsForExtension(base::Bind(
116 &MediaGalleriesGetMediaFileSystemsFunction::AlwaysShowDialog, this));
117 return;
118 }
119 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_IF_NEEDED: {
120 GetMediaFileSystemsForExtension(base::Bind(
121 &MediaGalleriesGetMediaFileSystemsFunction::ShowDialogIfNoGalleries,
122 this));
123 return;
124 }
125 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NO:
126 GetAndReturnGalleries();
127 return;
128 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NONE:
129 NOTREACHED();
130 }
131 SendResponse(false);
132 }
133 158
134 void MediaGalleriesGetMediaFileSystemsFunction::AlwaysShowDialog( 159 WebContents* contents = GetWebContents();
135 const std::vector<MediaFileSystemInfo>& /*filesystems*/) { 160 if (!contents) {
136 ShowDialog();
137 }
138
139 void MediaGalleriesGetMediaFileSystemsFunction::ShowDialogIfNoGalleries(
140 const std::vector<MediaFileSystemInfo>& filesystems) {
141 if (filesystems.empty())
142 ShowDialog();
143 else
144 ReturnGalleries(filesystems);
145 }
146
147 void MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries() {
148 GetMediaFileSystemsForExtension(base::Bind(
149 &MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries, this));
150 }
151
152 void MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries(
153 const std::vector<MediaFileSystemInfo>& filesystems) {
154 content::RenderViewHost* rvh = render_view_host();
155 if (!rvh) {
156 SendResponse(false); 161 SendResponse(false);
157 return; 162 return;
158 } 163 }
164
165 // Controller will delete itself.
166 new MediaGalleriesDialogController(
167 contents, *GetExtension(), base::Bind(
168 &MediaGalleriesGetMediaFileSystemsBase::GetAndReturnGalleries, this));
169 }
170
171 void MediaGalleriesGetMediaFileSystemsBase::GetAndReturnGalleries() {
172 GetMediaFileSystemsForExtension(base::Bind(
173 &MediaGalleriesGetMediaFileSystemsBase::ReturnGalleries, this));
174 }
175
176 void MediaGalleriesGetMediaFileSystemsBase::ReturnGalleries(
177 const std::vector<MediaFileSystemInfo>& filesystems) {
178 scoped_ptr<base::ListValue> list(ConstructFileSystemList(filesystems));
179 if (!list.get()) {
180 SendResponse(false);
181 return;
182 }
183
184 SetResult(list.release());
185 SendResponse(true);
186 }
187
188 base::ListValue* MediaGalleriesGetMediaFileSystemsBase::ConstructFileSystemList(
189 const std::vector<MediaFileSystemInfo>& filesystems) {
190 content::RenderViewHost* rvh = render_view_host();
191 if (!rvh)
192 return NULL;
193
159 MediaGalleriesPermission::CheckParam read_param( 194 MediaGalleriesPermission::CheckParam read_param(
160 MediaGalleriesPermission::kReadPermission); 195 MediaGalleriesPermission::kReadPermission);
161 bool has_read_permission = PermissionsData::CheckAPIPermissionWithParam( 196 bool has_read_permission = PermissionsData::CheckAPIPermissionWithParam(
162 GetExtension(), APIPermission::kMediaGalleries, &read_param); 197 GetExtension(), APIPermission::kMediaGalleries, &read_param);
163 MediaGalleriesPermission::CheckParam copy_to_param( 198 MediaGalleriesPermission::CheckParam copy_to_param(
164 MediaGalleriesPermission::kCopyToPermission); 199 MediaGalleriesPermission::kCopyToPermission);
165 bool has_copy_to_permission = PermissionsData::CheckAPIPermissionWithParam( 200 bool has_copy_to_permission = PermissionsData::CheckAPIPermissionWithParam(
166 GetExtension(), APIPermission::kMediaGalleries, &copy_to_param); 201 GetExtension(), APIPermission::kMediaGalleries, &copy_to_param);
167 MediaGalleriesPermission::CheckParam delete_param( 202 MediaGalleriesPermission::CheckParam delete_param(
168 MediaGalleriesPermission::kDeletePermission); 203 MediaGalleriesPermission::kDeletePermission);
169 bool has_delete_permission = PermissionsData::CheckAPIPermissionWithParam( 204 bool has_delete_permission = PermissionsData::CheckAPIPermissionWithParam(
170 GetExtension(), APIPermission::kMediaGalleries, &delete_param); 205 GetExtension(), APIPermission::kMediaGalleries, &delete_param);
171 206
172 const int child_id = rvh->GetProcess()->GetID(); 207 const int child_id = rvh->GetProcess()->GetID();
173 base::ListValue* list = new base::ListValue(); 208 scoped_ptr<base::ListValue> list(new base::ListValue());
174 for (size_t i = 0; i < filesystems.size(); i++) { 209 for (size_t i = 0; i < filesystems.size(); i++) {
175 scoped_ptr<base::DictionaryValue> file_system_dict_value( 210 scoped_ptr<base::DictionaryValue> file_system_dict_value(
176 new base::DictionaryValue()); 211 new base::DictionaryValue());
177 212
178 // Send the file system id so the renderer can create a valid FileSystem 213 // Send the file system id so the renderer can create a valid FileSystem
179 // object. 214 // object.
180 file_system_dict_value->SetStringWithoutPathExpansion( 215 file_system_dict_value->SetStringWithoutPathExpansion(
181 "fsid", filesystems[i].fsid); 216 "fsid", filesystems[i].fsid);
182 217
183 file_system_dict_value->SetStringWithoutPathExpansion( 218 file_system_dict_value->SetStringWithoutPathExpansion(
(...skipping 23 matching lines...) Expand all
207 policy->GrantReadFileSystem(child_id, filesystems[i].fsid); 242 policy->GrantReadFileSystem(child_id, filesystems[i].fsid);
208 if (has_delete_permission) { 243 if (has_delete_permission) {
209 policy->GrantDeleteFromFileSystem(child_id, filesystems[i].fsid); 244 policy->GrantDeleteFromFileSystem(child_id, filesystems[i].fsid);
210 if (has_copy_to_permission) { 245 if (has_copy_to_permission) {
211 policy->GrantCopyIntoFileSystem(child_id, filesystems[i].fsid); 246 policy->GrantCopyIntoFileSystem(child_id, filesystems[i].fsid);
212 } 247 }
213 } 248 }
214 } 249 }
215 } 250 }
216 251
217 // The custom JS binding will use this list to create DOMFileSystem objects. 252 return list.release();
218 SetResult(list);
219 SendResponse(true);
220 } 253 }
221 254
222 void MediaGalleriesGetMediaFileSystemsFunction::ShowDialog() { 255 void MediaGalleriesGetMediaFileSystemsBase::GetMediaFileSystemsForExtension(
223 media_galleries::UsageCount(media_galleries::SHOW_DIALOG);
224 WebContents* contents = WebContents::FromRenderViewHost(render_view_host());
225 WebContentsModalDialogManager* web_contents_modal_dialog_manager =
226 WebContentsModalDialogManager::FromWebContents(contents);
227 if (!web_contents_modal_dialog_manager) {
228 // If there is no WebContentsModalDialogManager, then this contents is
229 // probably the background page for an app. Try to find a shell window to
230 // host the dialog.
231 apps::ShellWindow* window = apps::ShellWindowRegistry::Get(
232 GetProfile())->GetCurrentShellWindowForApp(GetExtension()->id());
233 if (!window) {
234 SendResponse(false);
235 return;
236 }
237 contents = window->web_contents();
238 }
239
240 // Controller will delete itself.
241 base::Closure cb = base::Bind(
242 &MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries, this);
243 new MediaGalleriesDialogController(contents, *GetExtension(), cb);
244 }
245
246 void MediaGalleriesGetMediaFileSystemsFunction::GetMediaFileSystemsForExtension(
247 const MediaFileSystemsCallback& cb) { 256 const MediaFileSystemsCallback& cb) {
248 if (!render_view_host()) { 257 if (!render_view_host()) {
249 cb.Run(std::vector<MediaFileSystemInfo>()); 258 cb.Run(std::vector<MediaFileSystemInfo>());
250 return; 259 return;
251 } 260 }
252 MediaFileSystemRegistry* registry = media_file_system_registry(); 261 DCHECK(GetMediaGalleriesPreferences()->IsInitialized());
253 DCHECK(registry->GetPreferences(GetProfile())->IsInitialized()); 262 media_file_system_registry()->GetMediaFileSystemsForExtension(
254 registry->GetMediaFileSystemsForExtension(
255 render_view_host(), GetExtension(), cb); 263 render_view_host(), GetExtension(), cb);
256 } 264 }
257 265
266 WebContents* MediaGalleriesGetMediaFileSystemsBase::GetWebContents() {
267 WebContents* contents = WebContents::FromRenderViewHost(render_view_host());
268 WebContentsModalDialogManager* web_contents_modal_dialog_manager =
269 WebContentsModalDialogManager::FromWebContents(contents);
270 if (web_contents_modal_dialog_manager)
271 return contents;
272
273 // If there is no WebContentsModalDialogManager, then this contents is
274 // probably the background page for an app. Try to find a shell window to
275 // host the dialog.
276 apps::ShellWindow* window = apps::ShellWindowRegistry::Get(
277 GetProfile())->GetCurrentShellWindowForApp(GetExtension()->id());
278 return window ? window->web_contents() : NULL;
279 }
280
281 MediaGalleriesPreferences*
282 MediaGalleriesGetMediaFileSystemsBase::GetMediaGalleriesPreferences() {
283 return media_file_system_registry()->GetPreferences(GetProfile());
284 }
285
286 void MediaGalleriesGetMediaFileSystemsBase::AlwaysShowDialog(
287 const std::vector<MediaFileSystemInfo>& /*filesystems*/) {
288 ShowDialog();
289 }
290
291
292 MediaGalleriesGetMediaFileSystemsFunction::
293 ~MediaGalleriesGetMediaFileSystemsFunction() {}
294
295 bool MediaGalleriesGetMediaFileSystemsFunction::RunImpl() {
296 if (!ApiIsAccessible(&error_))
297 return false;
298
299 media_galleries::UsageCount(media_galleries::GET_MEDIA_FILE_SYSTEMS);
300 scoped_ptr<GetMediaFileSystems::Params> params(
301 GetMediaFileSystems::Params::Create(*args_));
302 EXTENSION_FUNCTION_VALIDATE(params.get());
303 MediaGalleries::GetMediaFileSystemsInteractivity interactive =
304 MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NO;
305 if (params->details.get() && params->details->interactive != MediaGalleries::
306 GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NONE) {
307 interactive = params->details->interactive;
308 }
309
310 MediaGalleriesPreferences* preferences = GetMediaGalleriesPreferences();
311 preferences->EnsureInitialized(base::Bind(
312 &MediaGalleriesGetMediaFileSystemsFunction::OnPreferencesInit,
313 this,
314 interactive));
315 return true;
316 }
317
318 void MediaGalleriesGetMediaFileSystemsFunction::OnPreferencesInit(
319 MediaGalleries::GetMediaFileSystemsInteractivity interactive) {
320 switch (interactive) {
321 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_YES: {
322 ReadPrefsAndShowDialog();
vandebo (ex-Chrome) 2013/12/18 20:15:53 Shouldn't this just be ShowDialog since the prefs
323 return;
324 }
325 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_IF_NEEDED: {
326 GetMediaFileSystemsForExtension(base::Bind(
327 &MediaGalleriesGetMediaFileSystemsFunction::ShowDialogIfNoGalleries,
328 this));
329 return;
330 }
331 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NO:
332 GetAndReturnGalleries();
333 return;
334 case MediaGalleries::GET_MEDIA_FILE_SYSTEMS_INTERACTIVITY_NONE:
335 NOTREACHED();
336 }
337 SendResponse(false);
338 }
339
340 void MediaGalleriesGetMediaFileSystemsFunction::ShowDialogIfNoGalleries(
341 const std::vector<MediaFileSystemInfo>& filesystems) {
342 if (filesystems.empty())
343 ShowDialog();
344 else
345 ReturnGalleries(filesystems);
346 }
347
348
258 MediaGalleriesGetAllMediaFileSystemMetadataFunction:: 349 MediaGalleriesGetAllMediaFileSystemMetadataFunction::
259 ~MediaGalleriesGetAllMediaFileSystemMetadataFunction() {} 350 ~MediaGalleriesGetAllMediaFileSystemMetadataFunction() {}
260 351
261 bool MediaGalleriesGetAllMediaFileSystemMetadataFunction::RunImpl() { 352 bool MediaGalleriesGetAllMediaFileSystemMetadataFunction::RunImpl() {
262 if (!ApiIsAccessible(&error_)) 353 if (!ApiIsAccessible(&error_))
263 return false; 354 return false;
264 355
265 media_galleries::UsageCount( 356 media_galleries::UsageCount(
266 media_galleries::GET_ALL_MEDIA_FILE_SYSTEM_METADATA); 357 media_galleries::GET_ALL_MEDIA_FILE_SYSTEM_METADATA);
267 MediaGalleriesPreferences* preferences = 358 MediaGalleriesPreferences* preferences =
268 media_file_system_registry()->GetPreferences(GetProfile()); 359 media_file_system_registry()->GetPreferences(GetProfile());
269 preferences->EnsureInitialized(base::Bind( 360 preferences->EnsureInitialized(base::Bind(
270 &MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnPreferencesInit, 361 &MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnPreferencesInit,
271 this)); 362 this));
272 return true; 363 return true;
273 } 364 }
274 365
275 void MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnPreferencesInit() { 366 void MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnPreferencesInit() {
276 MediaFileSystemRegistry* registry = media_file_system_registry(); 367 MediaGalleriesPreferences* prefs =
277 MediaGalleriesPreferences* prefs = registry->GetPreferences(GetProfile()); 368 media_file_system_registry()->GetPreferences(GetProfile());
278 DCHECK(prefs->IsInitialized()); 369 DCHECK(prefs->IsInitialized());
279 MediaGalleryPrefIdSet permitted_gallery_ids = 370 MediaGalleryPrefIdSet permitted_gallery_ids =
280 prefs->GalleriesForExtension(*GetExtension()); 371 prefs->GalleriesForExtension(*GetExtension());
281 372
282 MediaStorageUtil::DeviceIdSet* device_ids = new MediaStorageUtil::DeviceIdSet; 373 MediaStorageUtil::DeviceIdSet* device_ids = new MediaStorageUtil::DeviceIdSet;
283 const MediaGalleriesPrefInfoMap& galleries = prefs->known_galleries(); 374 const MediaGalleriesPrefInfoMap& galleries = prefs->known_galleries();
284 for (MediaGalleryPrefIdSet::const_iterator it = permitted_gallery_ids.begin(); 375 for (MediaGalleryPrefIdSet::const_iterator it = permitted_gallery_ids.begin();
285 it != permitted_gallery_ids.end(); ++it) { 376 it != permitted_gallery_ids.end(); ++it) {
286 MediaGalleriesPrefInfoMap::const_iterator gallery_it = galleries.find(*it); 377 MediaGalleriesPrefInfoMap::const_iterator gallery_it = galleries.find(*it);
287 DCHECK(gallery_it != galleries.end()); 378 DCHECK(gallery_it != galleries.end());
288 device_ids->insert(gallery_it->second.device_id); 379 device_ids->insert(gallery_it->second.device_id);
289 } 380 }
290 381
291 MediaStorageUtil::FilterAttachedDevices( 382 MediaStorageUtil::FilterAttachedDevices(
292 device_ids, 383 device_ids,
293 base::Bind( 384 base::Bind(
294 &MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnGetGalleries, 385 &MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnGetGalleries,
295 this, 386 this,
296 permitted_gallery_ids, 387 permitted_gallery_ids,
297 base::Owned(device_ids))); 388 base::Owned(device_ids)));
298 } 389 }
299 390
300 void MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnGetGalleries( 391 void MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnGetGalleries(
301 const MediaGalleryPrefIdSet& permitted_gallery_ids, 392 const MediaGalleryPrefIdSet& permitted_gallery_ids,
302 const MediaStorageUtil::DeviceIdSet* available_devices) { 393 const MediaStorageUtil::DeviceIdSet* available_devices) {
303 MediaFileSystemRegistry* registry = media_file_system_registry(); 394 MediaGalleriesPreferences* prefs =
304 MediaGalleriesPreferences* prefs = registry->GetPreferences(GetProfile()); 395 media_file_system_registry()->GetPreferences(GetProfile());
305 396
306 base::ListValue* list = new base::ListValue(); 397 base::ListValue* list = new base::ListValue();
307 const MediaGalleriesPrefInfoMap& galleries = prefs->known_galleries(); 398 const MediaGalleriesPrefInfoMap& galleries = prefs->known_galleries();
308 for (MediaGalleryPrefIdSet::const_iterator it = permitted_gallery_ids.begin(); 399 for (MediaGalleryPrefIdSet::const_iterator it = permitted_gallery_ids.begin();
309 it != permitted_gallery_ids.end(); ++it) { 400 it != permitted_gallery_ids.end(); ++it) {
310 MediaGalleriesPrefInfoMap::const_iterator gallery_it = galleries.find(*it); 401 MediaGalleriesPrefInfoMap::const_iterator gallery_it = galleries.find(*it);
311 DCHECK(gallery_it != galleries.end()); 402 DCHECK(gallery_it != galleries.end());
312 const MediaGalleryPrefInfo& gallery = gallery_it->second; 403 const MediaGalleryPrefInfo& gallery = gallery_it->second;
313 MediaGalleries::MediaFileSystemMetadata metadata; 404 MediaGalleries::MediaFileSystemMetadata metadata;
314 metadata.name = base::UTF16ToUTF8(gallery.GetGalleryDisplayName()); 405 metadata.name = base::UTF16ToUTF8(gallery.GetGalleryDisplayName());
315 metadata.gallery_id = base::Uint64ToString(gallery.pref_id); 406 metadata.gallery_id = base::Uint64ToString(gallery.pref_id);
316 metadata.is_removable = StorageInfo::IsRemovableDevice(gallery.device_id); 407 metadata.is_removable = StorageInfo::IsRemovableDevice(gallery.device_id);
317 metadata.is_media_device = StorageInfo::IsMediaDevice(gallery.device_id); 408 metadata.is_media_device = StorageInfo::IsMediaDevice(gallery.device_id);
318 metadata.is_available = ContainsKey(*available_devices, gallery.device_id); 409 metadata.is_available = ContainsKey(*available_devices, gallery.device_id);
319 list->Append(metadata.ToValue().release()); 410 list->Append(metadata.ToValue().release());
320 } 411 }
321 412
322 SetResult(list); 413 SetResult(list);
323 SendResponse(true); 414 SendResponse(true);
324 } 415 }
325 416
417 MediaGalleriesManageMediaLocationsFunction::
418 ~MediaGalleriesManageMediaLocationsFunction() {}
419
420 bool MediaGalleriesManageMediaLocationsFunction::RunImpl() {
421 if (!ApiIsAccessible(&error_))
422 return false;
423
424 media_galleries::UsageCount(media_galleries::MANAGE_MEDIA_LOCATIONS);
425 scoped_ptr<ManageMediaLocations::Params> params(
426 ManageMediaLocations::Params::Create(*args_));
427 EXTENSION_FUNCTION_VALIDATE(params.get());
428 if (params->details.type == MediaGalleries::MANAGE_REQUEST_TYPE_NONE)
429 EXTENSION_FUNCTION_ERROR(kInvalidManageRequestType); // returns false
430
431 MediaGalleriesPreferences* preferences = GetMediaGalleriesPreferences();
432 preferences->EnsureInitialized(base::Bind(
433 &MediaGalleriesManageMediaLocationsFunction::OnPreferencesInit,
434 this,
435 params->details.type));
436 return true;
437 }
438
439 void MediaGalleriesManageMediaLocationsFunction::OnPreferencesInit(
440 MediaGalleries::ManageRequestType request_type) {
441 switch (request_type) {
442 case MediaGalleries::MANAGE_REQUEST_TYPE_MANAGE: {
443 ReadPrefsAndShowDialog();
444 return;
445 }
446 case MediaGalleries::MANAGE_REQUEST_TYPE_DIRECTORY_PROMPT: {
447 WebContents* contents = GetWebContents();
448 if (!contents) {
449 SendResponse(false);
450 return;
451 }
452 base::FilePath last_used_path =
453 extensions::file_system_api::GetLastChooseEntryDirectory(
454 extensions::ExtensionPrefs::Get(GetProfile()),
455 GetExtension()->id());
456 SelectDirectoryDialog::Callback cb = base::Bind(
457 &MediaGalleriesManageMediaLocationsFunction::OnDirectorySelected,
458 this);
459 scoped_refptr<SelectDirectoryDialog> select_directory_dialog =
460 new SelectDirectoryDialog(contents, cb);
461 select_directory_dialog->Show(last_used_path);
462 return;
463 }
464 case MediaGalleries::MANAGE_REQUEST_TYPE_NONE:
465 NOTREACHED();
466 }
467 SendResponse(false);
468 }
469
470 void MediaGalleriesManageMediaLocationsFunction::OnDirectorySelected(
471 const base::FilePath& selected_directory) {
472 if (selected_directory.empty()) {
473 // User cancelled case.
474 GetAndReturnGalleries();
475 return;
476 }
477
478 extensions::file_system_api::SetLastChooseEntryDirectory(
479 extensions::ExtensionPrefs::Get(GetProfile()),
480 GetExtension()->id(),
481 selected_directory);
482
483 MediaGalleryPrefInfo gallery;
484 MediaGalleriesPreferences* preferences = GetMediaGalleriesPreferences();
485 MediaGalleryPrefId pref_id =
486 preferences->AddGalleryByPath(selected_directory);
487 preferences->SetGalleryPermissionForExtension(*GetExtension(), pref_id, true);
488
489 GetMediaFileSystemsForExtension(base::Bind(
490 &MediaGalleriesManageMediaLocationsFunction::ReturnGalleriesAndId,
491 this,
492 pref_id));
493 }
494
495 void MediaGalleriesManageMediaLocationsFunction::ReturnGalleriesAndId(
496 MediaGalleryPrefId pref_id,
497 const std::vector<MediaFileSystemInfo>& filesystems) {
498 scoped_ptr<base::ListValue> list(ConstructFileSystemList(filesystems));
499 if (!list.get()) {
500 SendResponse(false);
501 return;
502 }
503
504 std::string fsid;
505 for (size_t i = 0; i < filesystems.size(); ++i) {
506 if (filesystems[i].pref_id == pref_id) {
507 fsid = filesystems[i].fsid;
vandebo (ex-Chrome) 2013/12/18 20:15:53 If the just added directory "isn't attached," we w
508 break;
509 }
510 }
511 list->AppendString(fsid);
512 SetResult(list.release());
513 SendResponse(true);
514 }
515
326 } // namespace extensions 516 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698