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

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: Created 6 years, 11 months 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/platform_file.h" 15 #include "base/platform_file.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/utf_string_conversions.h" 18 #include "base/strings/utf_string_conversions.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "chrome/browser/browser_process.h" 20 #include "chrome/browser/browser_process.h"
21 #include "chrome/browser/extensions/api/file_system/file_system_api.h"
21 #include "chrome/browser/extensions/blob_reader.h" 22 #include "chrome/browser/extensions/blob_reader.h"
23 #include "chrome/browser/extensions/extension_prefs.h"
22 #include "chrome/browser/media_galleries/media_file_system_registry.h" 24 #include "chrome/browser/media_galleries/media_file_system_registry.h"
23 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" 25 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
24 #include "chrome/browser/media_galleries/media_galleries_histograms.h" 26 #include "chrome/browser/media_galleries/media_galleries_histograms.h"
25 #include "chrome/browser/media_galleries/media_galleries_preferences.h" 27 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
28 #include "chrome/browser/platform_util.h"
26 #include "chrome/browser/profiles/profile.h" 29 #include "chrome/browser/profiles/profile.h"
27 #include "chrome/browser/storage_monitor/storage_info.h" 30 #include "chrome/browser/storage_monitor/storage_info.h"
28 #include "chrome/browser/ui/chrome_select_file_policy.h" 31 #include "chrome/browser/ui/chrome_select_file_policy.h"
29 #include "chrome/common/extensions/api/media_galleries.h" 32 #include "chrome/common/extensions/api/media_galleries.h"
30 #include "chrome/common/extensions/permissions/media_galleries_permission.h" 33 #include "chrome/common/extensions/permissions/media_galleries_permission.h"
31 #include "chrome/common/pref_names.h" 34 #include "chrome/common/pref_names.h"
32 #include "components/web_modal/web_contents_modal_dialog_manager.h" 35 #include "components/web_modal/web_contents_modal_dialog_manager.h"
33 #include "content/public/browser/browser_thread.h" 36 #include "content/public/browser/browser_thread.h"
34 #include "content/public/browser/child_process_security_policy.h" 37 #include "content/public/browser/child_process_security_policy.h"
35 #include "content/public/browser/render_process_host.h" 38 #include "content/public/browser/render_process_host.h"
36 #include "content/public/browser/render_view_host.h" 39 #include "content/public/browser/render_view_host.h"
37 #include "content/public/browser/web_contents.h" 40 #include "content/public/browser/web_contents.h"
41 #include "content/public/browser/web_contents_view.h"
38 #include "extensions/common/extension.h" 42 #include "extensions/common/extension.h"
39 #include "extensions/common/permissions/api_permission.h" 43 #include "extensions/common/permissions/api_permission.h"
40 #include "extensions/common/permissions/permissions_data.h" 44 #include "extensions/common/permissions/permissions_data.h"
45 #include "grit/generated_resources.h"
41 #include "net/base/mime_sniffer.h" 46 #include "net/base/mime_sniffer.h"
47 #include "ui/base/l10n/l10n_util.h"
42 48
43 using content::WebContents; 49 using content::WebContents;
44 using web_modal::WebContentsModalDialogManager; 50 using web_modal::WebContentsModalDialogManager;
45 51
46 namespace extensions { 52 namespace extensions {
47 53
48 namespace MediaGalleries = api::media_galleries; 54 namespace MediaGalleries = api::media_galleries;
49 namespace GetMediaFileSystems = MediaGalleries::GetMediaFileSystems; 55 namespace GetMediaFileSystems = MediaGalleries::GetMediaFileSystems;
50 56
51 namespace { 57 namespace {
(...skipping 17 matching lines...) Expand all
69 return false; 75 return false;
70 } 76 }
71 77
72 return true; 78 return true;
73 } 79 }
74 80
75 MediaFileSystemRegistry* media_file_system_registry() { 81 MediaFileSystemRegistry* media_file_system_registry() {
76 return g_browser_process->media_file_system_registry(); 82 return g_browser_process->media_file_system_registry();
77 } 83 }
78 84
85 WebContents* GetWebContents(content::RenderViewHost* rvh,
86 Profile* profile,
87 const std::string& app_id) {
88 WebContents* contents = WebContents::FromRenderViewHost(rvh);
89 WebContentsModalDialogManager* web_contents_modal_dialog_manager =
90 WebContentsModalDialogManager::FromWebContents(contents);
91 if (!web_contents_modal_dialog_manager) {
92 // If there is no WebContentsModalDialogManager, then this contents is
93 // probably the background page for an app. Try to find a shell window to
94 // host the dialog.
95 apps::ShellWindow* window = apps::ShellWindowRegistry::Get(
96 profile)->GetCurrentShellWindowForApp(app_id);
97 contents = window ? window->web_contents() : NULL;
98 }
99 return contents;
100 }
101
102 base::ListValue* ConstructFileSystemList(
103 content::RenderViewHost* rvh,
104 const Extension* extension,
105 const std::vector<MediaFileSystemInfo>& filesystems) {
106 if (!rvh)
107 return NULL;
108
109 MediaGalleriesPermission::CheckParam read_param(
110 MediaGalleriesPermission::kReadPermission);
111 bool has_read_permission = PermissionsData::CheckAPIPermissionWithParam(
112 extension, APIPermission::kMediaGalleries, &read_param);
113 MediaGalleriesPermission::CheckParam copy_to_param(
114 MediaGalleriesPermission::kCopyToPermission);
115 bool has_copy_to_permission = PermissionsData::CheckAPIPermissionWithParam(
116 extension, APIPermission::kMediaGalleries, &copy_to_param);
117 MediaGalleriesPermission::CheckParam delete_param(
118 MediaGalleriesPermission::kDeletePermission);
119 bool has_delete_permission = PermissionsData::CheckAPIPermissionWithParam(
120 extension, APIPermission::kMediaGalleries, &delete_param);
121
122 const int child_id = rvh->GetProcess()->GetID();
123 scoped_ptr<base::ListValue> list(new base::ListValue());
124 for (size_t i = 0; i < filesystems.size(); ++i) {
125 scoped_ptr<base::DictionaryValue> file_system_dict_value(
126 new base::DictionaryValue());
127
128 // Send the file system id so the renderer can create a valid FileSystem
129 // object.
130 file_system_dict_value->SetStringWithoutPathExpansion(
131 "fsid", filesystems[i].fsid);
132
133 file_system_dict_value->SetStringWithoutPathExpansion(
134 kNameKey, filesystems[i].name);
135 file_system_dict_value->SetStringWithoutPathExpansion(
136 kGalleryIdKey,
137 base::Uint64ToString(filesystems[i].pref_id));
138 if (!filesystems[i].transient_device_id.empty()) {
139 file_system_dict_value->SetStringWithoutPathExpansion(
140 kDeviceIdKey, filesystems[i].transient_device_id);
141 }
142 file_system_dict_value->SetBooleanWithoutPathExpansion(
143 kIsRemovableKey, filesystems[i].removable);
144 file_system_dict_value->SetBooleanWithoutPathExpansion(
145 kIsMediaDeviceKey, filesystems[i].media_device);
146 file_system_dict_value->SetBooleanWithoutPathExpansion(
147 kIsAvailableKey, true);
148
149 list->Append(file_system_dict_value.release());
150
151 if (filesystems[i].path.empty())
152 continue;
153
154 if (has_read_permission) {
155 content::ChildProcessSecurityPolicy* policy =
156 content::ChildProcessSecurityPolicy::GetInstance();
157 policy->GrantReadFileSystem(child_id, filesystems[i].fsid);
158 if (has_delete_permission) {
159 policy->GrantDeleteFromFileSystem(child_id, filesystems[i].fsid);
160 if (has_copy_to_permission) {
161 policy->GrantCopyIntoFileSystem(child_id, filesystems[i].fsid);
162 }
163 }
164 }
165 }
166
167 return list.release();
168 }
169
170 class SelectDirectoryDialog : public ui::SelectFileDialog::Listener,
171 public base::RefCounted<SelectDirectoryDialog> {
172 public:
173 // Selected file path, or an empty path if the user canceled.
174 typedef base::Callback<void(const base::FilePath&)> Callback;
175
176 SelectDirectoryDialog(WebContents* web_contents, const Callback& callback)
177 : web_contents_(web_contents),
178 callback_(callback) {
179 select_file_dialog_ = ui::SelectFileDialog::Create(
180 this, new ChromeSelectFilePolicy(web_contents));
181 }
182
183 void Show(const base::FilePath& default_path) {
184 AddRef(); // Balanced in the two reachable listener outcomes.
185 select_file_dialog_->SelectFile(
186 ui::SelectFileDialog::SELECT_FOLDER,
187 l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY_TITLE),
188 default_path,
189 NULL,
190 0,
191 base::FilePath::StringType(),
192 platform_util::GetTopLevel(web_contents_->GetView()->GetNativeView()),
193 NULL);
194 }
195
196 // ui::SelectFileDialog::Listener implementation.
197 virtual void FileSelected(const base::FilePath& path,
198 int index,
199 void* params) OVERRIDE {
200 callback_.Run(path);
201 Release(); // Balanced in Show().
202 }
203
204 virtual void MultiFilesSelected(const std::vector<base::FilePath>& files,
205 void* params) OVERRIDE {
206 NOTREACHED() << "Should not be able to select multiple files";
207 }
208
209 virtual void FileSelectionCanceled(void* params) OVERRIDE {
210 callback_.Run(base::FilePath());
211 Release(); // Balanced in Show().
212 }
213
214 private:
215 friend class base::RefCounted<SelectDirectoryDialog>;
216 virtual ~SelectDirectoryDialog() {}
217
218 scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
219 WebContents* web_contents_;
220 Callback callback_;
221
222 DISALLOW_COPY_AND_ASSIGN(SelectDirectoryDialog);
223 };
224
79 } // namespace 225 } // namespace
80 226
81 MediaGalleriesGetMediaFileSystemsFunction:: 227 MediaGalleriesGetMediaFileSystemsFunction::
82 ~MediaGalleriesGetMediaFileSystemsFunction() {} 228 ~MediaGalleriesGetMediaFileSystemsFunction() {}
83 229
84 bool MediaGalleriesGetMediaFileSystemsFunction::RunImpl() { 230 bool MediaGalleriesGetMediaFileSystemsFunction::RunImpl() {
85 if (!ApiIsAccessible(&error_)) 231 if (!ApiIsAccessible(&error_))
86 return false; 232 return false;
87 233
88 media_galleries::UsageCount(media_galleries::GET_MEDIA_FILE_SYSTEMS); 234 media_galleries::UsageCount(media_galleries::GET_MEDIA_FILE_SYSTEMS);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 ReturnGalleries(filesystems); 292 ReturnGalleries(filesystems);
147 } 293 }
148 294
149 void MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries() { 295 void MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries() {
150 GetMediaFileSystemsForExtension(base::Bind( 296 GetMediaFileSystemsForExtension(base::Bind(
151 &MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries, this)); 297 &MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries, this));
152 } 298 }
153 299
154 void MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries( 300 void MediaGalleriesGetMediaFileSystemsFunction::ReturnGalleries(
155 const std::vector<MediaFileSystemInfo>& filesystems) { 301 const std::vector<MediaFileSystemInfo>& filesystems) {
156 content::RenderViewHost* rvh = render_view_host(); 302 scoped_ptr<base::ListValue> list(
157 if (!rvh) { 303 ConstructFileSystemList(render_view_host(), GetExtension(), filesystems));
304 if (!list.get()) {
158 SendResponse(false); 305 SendResponse(false);
159 return; 306 return;
160 } 307 }
161 MediaGalleriesPermission::CheckParam read_param(
162 MediaGalleriesPermission::kReadPermission);
163 bool has_read_permission = PermissionsData::CheckAPIPermissionWithParam(
164 GetExtension(), APIPermission::kMediaGalleries, &read_param);
165 MediaGalleriesPermission::CheckParam copy_to_param(
166 MediaGalleriesPermission::kCopyToPermission);
167 bool has_copy_to_permission = PermissionsData::CheckAPIPermissionWithParam(
168 GetExtension(), APIPermission::kMediaGalleries, &copy_to_param);
169 MediaGalleriesPermission::CheckParam delete_param(
170 MediaGalleriesPermission::kDeletePermission);
171 bool has_delete_permission = PermissionsData::CheckAPIPermissionWithParam(
172 GetExtension(), APIPermission::kMediaGalleries, &delete_param);
173
174 const int child_id = rvh->GetProcess()->GetID();
175 base::ListValue* list = new base::ListValue();
176 for (size_t i = 0; i < filesystems.size(); i++) {
177 scoped_ptr<base::DictionaryValue> file_system_dict_value(
178 new base::DictionaryValue());
179
180 // Send the file system id so the renderer can create a valid FileSystem
181 // object.
182 file_system_dict_value->SetStringWithoutPathExpansion(
183 "fsid", filesystems[i].fsid);
184
185 file_system_dict_value->SetStringWithoutPathExpansion(
186 kNameKey, filesystems[i].name);
187 file_system_dict_value->SetStringWithoutPathExpansion(
188 kGalleryIdKey,
189 base::Uint64ToString(filesystems[i].pref_id));
190 if (!filesystems[i].transient_device_id.empty()) {
191 file_system_dict_value->SetStringWithoutPathExpansion(
192 kDeviceIdKey, filesystems[i].transient_device_id);
193 }
194 file_system_dict_value->SetBooleanWithoutPathExpansion(
195 kIsRemovableKey, filesystems[i].removable);
196 file_system_dict_value->SetBooleanWithoutPathExpansion(
197 kIsMediaDeviceKey, filesystems[i].media_device);
198 file_system_dict_value->SetBooleanWithoutPathExpansion(
199 kIsAvailableKey, true);
200
201 list->Append(file_system_dict_value.release());
202
203 if (filesystems[i].path.empty())
204 continue;
205
206 if (has_read_permission) {
207 content::ChildProcessSecurityPolicy* policy =
208 content::ChildProcessSecurityPolicy::GetInstance();
209 policy->GrantReadFileSystem(child_id, filesystems[i].fsid);
210 if (has_delete_permission) {
211 policy->GrantDeleteFromFileSystem(child_id, filesystems[i].fsid);
212 if (has_copy_to_permission) {
213 policy->GrantCopyIntoFileSystem(child_id, filesystems[i].fsid);
214 }
215 }
216 }
217 }
218 308
219 // The custom JS binding will use this list to create DOMFileSystem objects. 309 // The custom JS binding will use this list to create DOMFileSystem objects.
220 SetResult(list); 310 SetResult(list.release());
221 SendResponse(true); 311 SendResponse(true);
222 } 312 }
223 313
224 void MediaGalleriesGetMediaFileSystemsFunction::ShowDialog() { 314 void MediaGalleriesGetMediaFileSystemsFunction::ShowDialog() {
225 media_galleries::UsageCount(media_galleries::SHOW_DIALOG); 315 media_galleries::UsageCount(media_galleries::SHOW_DIALOG);
226 WebContents* contents = WebContents::FromRenderViewHost(render_view_host()); 316 const Extension* extension = GetExtension();
227 WebContentsModalDialogManager* web_contents_modal_dialog_manager = 317 WebContents* contents =
228 WebContentsModalDialogManager::FromWebContents(contents); 318 GetWebContents(render_view_host(), GetProfile(), extension->id());
229 if (!web_contents_modal_dialog_manager) {
230 // If there is no WebContentsModalDialogManager, then this contents is
231 // probably the background page for an app. Try to find a shell window to
232 // host the dialog.
233 apps::ShellWindow* window = apps::ShellWindowRegistry::Get(
234 GetProfile())->GetCurrentShellWindowForApp(GetExtension()->id());
235 if (!window) {
236 SendResponse(false);
237 return;
238 }
239 contents = window->web_contents();
240 }
241 319
242 // Controller will delete itself. 320 // Controller will delete itself.
243 base::Closure cb = base::Bind( 321 base::Closure cb = base::Bind(
244 &MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries, this); 322 &MediaGalleriesGetMediaFileSystemsFunction::GetAndReturnGalleries, this);
245 new MediaGalleriesDialogController(contents, *GetExtension(), cb); 323 new MediaGalleriesDialogController(contents, *extension, cb);
246 } 324 }
247 325
248 void MediaGalleriesGetMediaFileSystemsFunction::GetMediaFileSystemsForExtension( 326 void MediaGalleriesGetMediaFileSystemsFunction::GetMediaFileSystemsForExtension(
249 const MediaFileSystemsCallback& cb) { 327 const MediaFileSystemsCallback& cb) {
250 if (!render_view_host()) { 328 if (!render_view_host()) {
251 cb.Run(std::vector<MediaFileSystemInfo>()); 329 cb.Run(std::vector<MediaFileSystemInfo>());
252 return; 330 return;
253 } 331 }
254 MediaFileSystemRegistry* registry = media_file_system_registry(); 332 MediaFileSystemRegistry* registry = media_file_system_registry();
255 DCHECK(registry->GetPreferences(GetProfile())->IsInitialized()); 333 DCHECK(registry->GetPreferences(GetProfile())->IsInitialized());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 metadata.is_removable = StorageInfo::IsRemovableDevice(gallery.device_id); 396 metadata.is_removable = StorageInfo::IsRemovableDevice(gallery.device_id);
319 metadata.is_media_device = StorageInfo::IsMediaDevice(gallery.device_id); 397 metadata.is_media_device = StorageInfo::IsMediaDevice(gallery.device_id);
320 metadata.is_available = ContainsKey(*available_devices, gallery.device_id); 398 metadata.is_available = ContainsKey(*available_devices, gallery.device_id);
321 list->Append(metadata.ToValue().release()); 399 list->Append(metadata.ToValue().release());
322 } 400 }
323 401
324 SetResult(list); 402 SetResult(list);
325 SendResponse(true); 403 SendResponse(true);
326 } 404 }
327 405
406 MediaGalleriesAddUserSelectedFolderFunction::
407 ~MediaGalleriesAddUserSelectedFolderFunction() {}
408
409 bool MediaGalleriesAddUserSelectedFolderFunction::RunImpl() {
410 if (!ApiIsAccessible(&error_))
411 return false;
412
413 media_galleries::UsageCount(media_galleries::ADD_USER_SELECTED_FOLDER);
414 MediaGalleriesPreferences* preferences =
415 media_file_system_registry()->GetPreferences(GetProfile());
416 preferences->EnsureInitialized(base::Bind(
417 &MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit,
418 this));
419 return true;
420 }
421
422 void MediaGalleriesAddUserSelectedFolderFunction::OnPreferencesInit() {
423 Profile* profile = GetProfile();
424 const std::string& app_id = GetExtension()->id();
425 WebContents* contents = GetWebContents(render_view_host(), profile, app_id);
426 base::FilePath last_used_path =
427 extensions::file_system_api::GetLastChooseEntryDirectory(
428 extensions::ExtensionPrefs::Get(profile), app_id);
429 SelectDirectoryDialog::Callback callback = base::Bind(
430 &MediaGalleriesAddUserSelectedFolderFunction::OnDirectorySelected, this);
431 scoped_refptr<SelectDirectoryDialog> select_directory_dialog =
432 new SelectDirectoryDialog(contents, callback);
433 select_directory_dialog->Show(last_used_path);
434 }
435
436 void MediaGalleriesAddUserSelectedFolderFunction::OnDirectorySelected(
437 const base::FilePath& selected_directory) {
438 if (selected_directory.empty()) {
439 // User cancelled case.
440 GetMediaFileSystemsForExtension(base::Bind(
441 &MediaGalleriesAddUserSelectedFolderFunction::ReturnGalleriesAndId,
442 this,
443 kInvalidMediaGalleryPrefId));
444 return;
445 }
446
447 extensions::file_system_api::SetLastChooseEntryDirectory(
448 extensions::ExtensionPrefs::Get(GetProfile()),
449 GetExtension()->id(),
450 selected_directory);
451
452 MediaGalleriesPreferences* preferences =
453 media_file_system_registry()->GetPreferences(GetProfile());
454 MediaGalleryPrefId pref_id =
455 preferences->AddGalleryByPath(selected_directory);
456 preferences->SetGalleryPermissionForExtension(*GetExtension(), pref_id, true);
457
458 GetMediaFileSystemsForExtension(base::Bind(
459 &MediaGalleriesAddUserSelectedFolderFunction::ReturnGalleriesAndId,
460 this,
461 pref_id));
462 }
463
464 void MediaGalleriesAddUserSelectedFolderFunction::ReturnGalleriesAndId(
465 MediaGalleryPrefId pref_id,
466 const std::vector<MediaFileSystemInfo>& filesystems) {
467 scoped_ptr<base::ListValue> list(
468 ConstructFileSystemList(render_view_host(), GetExtension(), filesystems));
469 if (!list.get()) {
470 SendResponse(false);
471 return;
472 }
473
474 std::string fsid;
475 if (pref_id != kInvalidMediaGalleryPrefId) {
476 for (size_t i = 0; i < filesystems.size(); ++i) {
477 if (filesystems[i].pref_id == pref_id) {
478 fsid = filesystems[i].fsid;
479 break;
480 }
481 }
482 }
483 base::DictionaryValue* results = new base::DictionaryValue;
484 results->SetWithoutPathExpansion("mediaFileSystems", list.release());
485 results->SetStringWithoutPathExpansion("selectedFileSystemName", fsid);
vandebo (ex-Chrome) 2014/01/09 16:17:29 It looks like this value gets to the user unmolest
Lei Zhang 2014/01/10 00:16:13 Nope, fixed in patch set 9.
486 SetResult(results);
487 SendResponse(true);
488 }
489
490 void
491 MediaGalleriesAddUserSelectedFolderFunction::GetMediaFileSystemsForExtension(
492 const MediaFileSystemsCallback& cb) {
493 if (!render_view_host()) {
494 cb.Run(std::vector<MediaFileSystemInfo>());
495 return;
496 }
497 MediaFileSystemRegistry* registry = media_file_system_registry();
498 DCHECK(registry->GetPreferences(GetProfile())->IsInitialized());
499 registry->GetMediaFileSystemsForExtension(
500 render_view_host(), GetExtension(), cb);
501 }
502
328 MediaGalleriesGetMetadataFunction::~MediaGalleriesGetMetadataFunction() {} 503 MediaGalleriesGetMetadataFunction::~MediaGalleriesGetMetadataFunction() {}
329 504
330 bool MediaGalleriesGetMetadataFunction::RunImpl() { 505 bool MediaGalleriesGetMetadataFunction::RunImpl() {
331 if (!ApiIsAccessible(&error_)) 506 if (!ApiIsAccessible(&error_))
332 return false; 507 return false;
333 508
334 std::string blob_uuid; 509 std::string blob_uuid;
335 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &blob_uuid)); 510 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &blob_uuid));
336 511
337 const base::Value* options_value = NULL; 512 const base::Value* options_value = NULL;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 if (mime_type_sniffed) 555 if (mime_type_sniffed)
381 metadata.mime_type = mime_type; 556 metadata.mime_type = mime_type;
382 557
383 // TODO(tommycli): Kick off SafeMediaMetadataParser if |mime_type_only| false. 558 // TODO(tommycli): Kick off SafeMediaMetadataParser if |mime_type_only| false.
384 559
385 SetResult(metadata.ToValue().release()); 560 SetResult(metadata.ToValue().release());
386 SendResponse(true); 561 SendResponse(true);
387 } 562 }
388 563
389 } // namespace extensions 564 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698