146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_permission_controller.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/base_paths.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/path_service.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/stl_util.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/browser_process.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/extensions/api/file_system/file_system_api.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_histograms.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_gallery_context_menu.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/storage_monitor/storage_info.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/storage_monitor/storage_monitor.h" 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/web_contents.h" 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/browser/extension_prefs.h" 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/extension.h" 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/media_galleries_permission.h" 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/models/simple_menu_model.h" 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/text/bytes_formatting.h" 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using extensions::APIPermission; 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using extensions::Extension; 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using storage_monitor::StorageInfo; 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using storage_monitor::StorageMonitor; 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace { 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Comparator for sorting gallery entries. Sort Removable entries above 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// non-removable ones. Within those two groups, sort on media counts 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// if populated, otherwise on paths. 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool GalleriesVectorComparator( 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleriesDialogController::Entry& a, 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleriesDialogController::Entry& b) { 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (StorageInfo::IsRemovableDevice(a.pref_info.device_id) != 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StorageInfo::IsRemovableDevice(b.pref_info.device_id)) { 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return StorageInfo::IsRemovableDevice(a.pref_info.device_id); 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int a_media_count = a.pref_info.audio_count + a.pref_info.image_count + 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) a.pref_info.video_count; 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int b_media_count = b.pref_info.audio_count + b.pref_info.image_count + 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) b.pref_info.video_count; 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (a_media_count != b_media_count) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return a_media_count > b_media_count; 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return a.pref_info.AbsolutePath() < b.pref_info.AbsolutePath(); 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::MediaGalleriesPermissionController( 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::WebContents* web_contents, 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension& extension, 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& on_finish) 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : web_contents_(web_contents), 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension_(&extension), 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) on_finish_(on_finish), 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_( 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) g_browser_process->media_file_system_registry()->GetPreferences( 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetProfile())), 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) create_dialog_callback_(base::Bind(&MediaGalleriesDialog::Create)) { 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Passing unretained pointer is safe, since the dialog controller 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // is self-deleting, and so won't be deleted until it can be shown 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // and then closed. 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->EnsureInitialized( 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&MediaGalleriesPermissionController::OnPreferencesInitialized, 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Unretained is safe because |this| owns |context_menu_|. 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) context_menu_.reset( 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new MediaGalleryContextMenu( 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&MediaGalleriesPermissionController::DidForgetEntry, 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this)))); 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnPreferencesInitialized() { 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (StorageMonitor::GetInstance()) 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) StorageMonitor::GetInstance()->AddObserver(this); 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |preferences_| may be NULL in tests. 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (preferences_) { 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->AddGalleryChangeObserver(this); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InitializePermissions(); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_.reset(create_dialog_callback_.Run(this)); 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::MediaGalleriesPermissionController( 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const extensions::Extension& extension, 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* preferences, 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const CreateDialogCallback& create_dialog_callback, 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& on_finish) 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : web_contents_(NULL), 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension_(&extension), 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) on_finish_(on_finish), 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_(preferences), 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) create_dialog_callback_(create_dialog_callback) { 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnPreferencesInitialized(); 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::~MediaGalleriesPermissionController() { 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (StorageMonitor::GetInstance()) 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) StorageMonitor::GetInstance()->RemoveObserver(this); 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |preferences_| may be NULL in tests. 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (preferences_) 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->RemoveGalleryChangeObserver(this); 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (select_folder_dialog_.get()) 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) select_folder_dialog_->ListenerDestroyed(); 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesPermissionController::GetHeader() const { 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_MEDIA_GALLERIES_DIALOG_HEADER, 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::UTF8ToUTF16(extension_->name())); 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesPermissionController::GetSubtext() const { 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::MediaGalleriesPermission::CheckParam copy_to_param( 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::MediaGalleriesPermission::kCopyToPermission); 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::MediaGalleriesPermission::CheckParam delete_param( 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::MediaGalleriesPermission::kDeletePermission); 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const extensions::PermissionsData* permission_data = 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension_->permissions_data(); 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool has_copy_to_permission = permission_data->CheckAPIPermissionWithParam( 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) APIPermission::kMediaGalleries, ©_to_param); 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool has_delete_permission = permission_data->CheckAPIPermissionWithParam( 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) APIPermission::kMediaGalleries, &delete_param); 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int id; 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (has_copy_to_permission) 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) id = IDS_MEDIA_GALLERIES_DIALOG_SUBTEXT_READ_WRITE; 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else if (has_delete_permission) 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) id = IDS_MEDIA_GALLERIES_DIALOG_SUBTEXT_READ_DELETE; 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) id = IDS_MEDIA_GALLERIES_DIALOG_SUBTEXT_READ_ONLY; 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return l10n_util::GetStringFUTF16(id, base::UTF8ToUTF16(extension_->name())); 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaGalleriesPermissionController::IsAcceptAllowed() const { 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!toggled_galleries_.empty() || !forgotten_galleries_.empty()) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin(); 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter != new_galleries_.end(); 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++iter) { 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (iter->second.selected) 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaGalleriesPermissionController::ShouldShowFolderViewer( 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Entry& entry) const { 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::vector<base::string16> 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::GetSectionHeaders() const { 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<base::string16> result; 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.push_back(base::string16()); // First section has no header. 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.push_back( 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_PERMISSION_SUGGESTIONS)); 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return result; 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Note: sorts by display criterion: GalleriesVectorComparator. 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesDialogController::Entries 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::GetSectionEntries(size_t index) const { 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK_GT(2U, index); // This dialog only has two sections. 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool existing = !index; 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesDialogController::Entries result; 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::const_iterator iter = known_galleries_.begin(); 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter != known_galleries_.end(); ++iter) { 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaGalleryPrefId pref_id = GetPrefId(iter->first); 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!ContainsKey(forgotten_galleries_, iter->first) && 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) existing == ContainsKey(pref_permitted_galleries_, pref_id)) { 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.push_back(iter->second); 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (existing) { 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin(); 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) iter != new_galleries_.end(); ++iter) { 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.push_back(iter->second); 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::sort(result.begin(), result.end(), GalleriesVectorComparator); 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return result; 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::GetAuxiliaryButtonText() const { 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY); 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// This is the 'Add Folder' button. 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidClickAuxiliaryButton() { 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath default_path = 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::file_system_api::GetLastChooseEntryDirectory( 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::ExtensionPrefs::Get(GetProfile()), extension_->id()); 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (default_path.empty()) 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathService::Get(base::DIR_USER_DESKTOP, &default_path); 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) select_folder_dialog_ = 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::SelectFileDialog::Create(this, new ChromeSelectFilePolicy(NULL)); 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) select_folder_dialog_->SelectFile( 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::SelectFileDialog::SELECT_FOLDER, 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY_TITLE), 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) default_path, 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NULL, 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 0, 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath::StringType(), 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) web_contents_->GetTopLevelNativeWindow(), 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NULL); 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidToggleEntry( 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id, bool selected) { 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Check known galleries. 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryPermissionsMap::iterator iter = known_galleries_.find(gallery_id); 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (iter != known_galleries_.end()) { 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (iter->second.selected == selected) 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter->second.selected = selected; 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) toggled_galleries_[gallery_id] = selected; 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter = new_galleries_.find(gallery_id); 24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (iter != new_galleries_.end()) 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter->second.selected = selected; 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Don't sort -- the dialog is open, and we don't want to adjust any 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // positions for future updates to the dialog contents until they are 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // redrawn. 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidClickOpenFolderViewer( 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id) { 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NOTREACHED(); 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DidForgetEntry( 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id) { 25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::UsageCount(media_galleries::DIALOG_FORGET_GALLERY); 25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!new_galleries_.erase(gallery_id)) { 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(ContainsKey(known_galleries_, gallery_id)); 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) forgotten_galleries_.insert(gallery_id); 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_->UpdateGalleries(); 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::string16 MediaGalleriesPermissionController::GetAcceptButtonText() const { 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_MEDIA_GALLERIES_DIALOG_CONFIRM); 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::DialogFinished(bool accepted) { 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The dialog has finished, so there is no need to watch for more updates 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // from |preferences_|. 27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |preferences_| may be NULL in tests. 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (preferences_) 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->RemoveGalleryChangeObserver(this); 27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (accepted) 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SavePermissions(); 27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) on_finish_.Run(); 28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete this; 28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)content::WebContents* MediaGalleriesPermissionController::WebContents() { 28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return web_contents_; 28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::FileSelected( 28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::FilePath& path, 29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int /*index*/, 29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void* /*params*/) { 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |web_contents_| is NULL in tests. 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (web_contents_) { 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::file_system_api::SetLastChooseEntryDirectory( 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::ExtensionPrefs::Get(GetProfile()), 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_->id(), 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path); 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Try to find it in the prefs. 30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefInfo gallery; 30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(preferences_); 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool gallery_exists = preferences_->LookUpGalleryByPath(path, &gallery); 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (gallery_exists && !gallery.IsBlackListedType()) { 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The prefs are in sync with |known_galleries_|, so it should exist in 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |known_galleries_| as well. User selecting a known gallery effectively 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // just sets the gallery to permitted. 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id = GetDialogId(gallery.pref_id); 30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryPermissionsMap::iterator iter = known_galleries_.find(gallery_id); 31046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(iter != known_galleries_.end()); 31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter->second.selected = true; 31246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) forgotten_galleries_.erase(gallery_id); 31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_->UpdateGalleries(); 31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 31546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Try to find it in |new_galleries_| (user added same folder twice). 31846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::iterator iter = new_galleries_.begin(); 31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter != new_galleries_.end(); ++iter) { 32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (iter->second.pref_info.path == gallery.path && 32146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter->second.pref_info.device_id == gallery.device_id) { 32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter->second.selected = true; 32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_->UpdateGalleries(); 32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 32746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Lastly, if not found, add a new gallery to |new_galleries_|. 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // prefId == kInvalidMediaGalleryPrefId for completely new galleries. 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The old prefId is retained for blacklisted galleries. 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gallery.pref_id = GetDialogId(gallery.pref_id); 33246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_galleries_[gallery.pref_id] = Entry(gallery, true); 33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_->UpdateGalleries(); 33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 33646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnRemovableStorageAttached( 33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const StorageInfo& info) { 33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnDeviceEvent(info.device_id()); 33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 34046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnRemovableStorageDetached( 34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const StorageInfo& info) { 34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnDeviceEvent(info.device_id()); 34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnPermissionAdded( 34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* /* prefs */, 34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& extension_id, 34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId /* pref_id */) { 35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (extension_id != extension_->id()) 35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnPreferencesEvent(); 35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnPermissionRemoved( 35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* /* prefs */, 35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& extension_id, 35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId /* pref_id */) { 35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (extension_id != extension_->id()) 36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnPreferencesEvent(); 36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnGalleryAdded( 36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* /* prefs */, 36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId /* pref_id */) { 36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnPreferencesEvent(); 36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnGalleryRemoved( 37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* /* prefs */, 37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId /* pref_id */) { 37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnPreferencesEvent(); 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::OnGalleryInfoUpdated( 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* prefs, 37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) { 37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(preferences_); 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleriesPrefInfoMap& pref_galleries = 38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->known_galleries(); 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPrefInfoMap::const_iterator pref_it = 38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pref_galleries.find(pref_id); 38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (pref_it == pref_galleries.end()) 38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleryPrefInfo& gallery_info = pref_it->second; 38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateGalleriesOnDeviceEvent(gallery_info.device_id); 38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::InitializePermissions() { 39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) known_galleries_.clear(); 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(preferences_); 39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleriesPrefInfoMap& galleries = preferences_->known_galleries(); 39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (MediaGalleriesPrefInfoMap::const_iterator iter = galleries.begin(); 39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter != galleries.end(); 39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++iter) { 39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleryPrefInfo& gallery = iter->second; 39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (gallery.IsBlackListedType()) 39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) continue; 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id = GetDialogId(gallery.pref_id); 40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) known_galleries_[gallery_id] = Entry(gallery, false); 40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) known_galleries_[gallery_id].pref_info.pref_id = gallery_id; 40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pref_permitted_galleries_ = preferences_->GalleriesForExtension(*extension_); 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (MediaGalleryPrefIdSet::iterator iter = pref_permitted_galleries_.begin(); 409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) iter != pref_permitted_galleries_.end(); 410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ++iter) { 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id = GetDialogId(*iter); 41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(ContainsKey(known_galleries_, gallery_id)); 41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) known_galleries_[gallery_id].selected = true; 41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Preserve state of toggled galleries. 417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (ToggledGalleryMap::const_iterator iter = toggled_galleries_.begin(); 418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) iter != toggled_galleries_.end(); 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ++iter) { 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) known_galleries_[iter->first].selected = iter->second; 421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::SavePermissions() { 42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(preferences_); 42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::UsageCount(media_galleries::SAVE_DIALOG); 42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::const_iterator iter = known_galleries_.begin(); 42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter != known_galleries_.end(); ++iter) { 42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id = GetPrefId(iter->first); 43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (ContainsKey(forgotten_galleries_, iter->first)) { 43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->ForgetGalleryById(pref_id); 43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool changed = preferences_->SetGalleryPermissionForExtension( 43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *extension_, pref_id, iter->second.selected); 43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (changed) { 43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (iter->second.selected) { 43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::UsageCount( 43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::DIALOG_PERMISSION_ADDED); 43946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 44046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::UsageCount( 44146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::DIALOG_PERMISSION_REMOVED); 44246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 44346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 44446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 44546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 44646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 44746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::const_iterator iter = new_galleries_.begin(); 44846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) iter != new_galleries_.end(); ++iter) { 44946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_galleries::UsageCount(media_galleries::DIALOG_GALLERY_ADDED); 45046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If the user added a gallery then unchecked it, forget about it. 45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!iter->second.selected) 45246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) continue; 45346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const MediaGalleryPrefInfo& gallery = iter->second.pref_info; 45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId id = preferences_->AddGallery( 45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gallery.device_id, gallery.path, MediaGalleryPrefInfo::kUserAdded, 45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gallery.volume_label, gallery.vendor_name, gallery.model_name, 45846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gallery.total_size_in_bytes, gallery.last_attach_time, 0, 0, 0); 45946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) preferences_->SetGalleryPermissionForExtension(*extension_, id, true); 46046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 46146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 46246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 46346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::UpdateGalleriesOnPreferencesEvent() { 46446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Merge in the permissions from |preferences_|. Afterwards, 46546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |known_galleries_| may contain galleries that no longer belong there, 46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // but the code below will put |known_galleries_| back in a consistent state. 46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InitializePermissions(); 46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::set<GalleryDialogId> new_galleries_to_remove; 47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Look for duplicate entries in |new_galleries_| in case one was added 47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // in another dialog. 47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::iterator it = known_galleries_.begin(); 47346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) it != known_galleries_.end(); 47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++it) { 47546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Entry& gallery = it->second; 47646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (GalleryPermissionsMap::iterator new_it = new_galleries_.begin(); 47746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_it != new_galleries_.end(); 47846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++new_it) { 47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (new_it->second.pref_info.path == gallery.pref_info.path && 48046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_it->second.pref_info.device_id == gallery.pref_info.device_id) { 48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Found duplicate entry. Get the existing permission from it and then 48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // remove it. 48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gallery.selected = new_it->second.selected; 48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_galleries_to_remove.insert(new_it->first); 48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) break; 48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (std::set<GalleryDialogId>::const_iterator it = 49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_galleries_to_remove.begin(); 49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) it != new_galleries_to_remove.end(); 49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ++it) { 49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_galleries_.erase(*it); 49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_->UpdateGalleries(); 49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaGalleriesPermissionController::UpdateGalleriesOnDeviceEvent( 50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& device_id) { 50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dialog_->UpdateGalleries(); 50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ui::MenuModel* MediaGalleriesPermissionController::GetContextMenu( 50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId gallery_id) { 50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) context_menu_->set_pref_id(gallery_id); 50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return context_menu_.get(); 50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GalleryDialogId MediaGalleriesPermissionController::GetDialogId( 51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) { 51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return id_map_.GetDialogId(pref_id); 51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 51446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleryPrefId MediaGalleriesPermissionController::GetPrefId( 516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GalleryDialogId id) const { 51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return id_map_.GetPrefId(id); 51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 51946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)Profile* MediaGalleriesPermissionController::GetProfile() { 52146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return Profile::FromBrowserContext(web_contents_->GetBrowserContext()); 52246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::DialogIdMap() 52546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : next_dialog_id_(1) { 52646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Dialog id of 0 is invalid, so fill the slot. 52746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) forward_mapping_.push_back(kInvalidMediaGalleryPrefId); 52846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 52946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::~DialogIdMap() { 53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GalleryDialogId 53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::GetDialogId( 53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) { 53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::map<GalleryDialogId, MediaGalleryPrefId>::const_iterator it = 53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) back_map_.find(pref_id); 53846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (it != back_map_.end()) 53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return it->second; 54046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 54146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId result = next_dialog_id_++; 54246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK_EQ(result, forward_mapping_.size()); 54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) forward_mapping_.push_back(pref_id); 54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (pref_id != kInvalidMediaGalleryPrefId) 54546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) back_map_[pref_id] = result; 54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return result; 54746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleryPrefId 55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesPermissionController::DialogIdMap::GetPrefId( 551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GalleryDialogId id) const { 55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK_LT(id, next_dialog_id_); 55346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return forward_mapping_[id]; 55446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 55546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 55646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// MediaGalleries dialog ------------------------------------------------------- 55746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 55846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaGalleriesDialog::~MediaGalleriesDialog() {} 559