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)#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_PERMISSION_CONTROLLER_H_ 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_PERMISSION_CONTROLLER_H_ 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <map> 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string> 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector> 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/callback.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/string16.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/storage_monitor/removable_storage_observer.h" 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/native_widget_types.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/shell_dialogs/select_file_dialog.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace content { 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class WebContents; 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace extensions { 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Extension; 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace ui { 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MenuModel; 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MediaGalleriesDialogController; 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MediaGalleryContextMenu; 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Profile; 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Newly added galleries are not added to preferences until the dialog commits, 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// so they do not have a pref id while the dialog is open; leading to 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// complicated code in the dialogs. To solve this complication, the controller 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// maps pref ids into a new space where it can also assign ids to new galleries. 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// The new number space is only valid for the lifetime of the controller. To 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// make it more clear where real pref ids are used and where the fake ids are 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// used, the GalleryDialogId type is used where fake ids are needed. 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef MediaGalleryPrefId GalleryDialogId; 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MediaGalleriesPermissionController 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : public MediaGalleriesDialogController, 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public ui::SelectFileDialog::Listener, 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public storage_monitor::RemovableStorageObserver, 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public MediaGalleriesPreferences::GalleryChangeObserver { 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The constructor creates a dialog controller which owns itself. 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPermissionController(content::WebContents* web_contents, 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const extensions::Extension& extension, 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& on_finish); 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // MediaGalleriesDialogController implementation. 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual base::string16 GetHeader() const OVERRIDE; 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual base::string16 GetSubtext() const OVERRIDE; 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool IsAcceptAllowed() const OVERRIDE; 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool ShouldShowFolderViewer(const Entry& entry) const OVERRIDE; 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual std::vector<base::string16> GetSectionHeaders() const OVERRIDE; 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual Entries GetSectionEntries(size_t index) const OVERRIDE; 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Auxiliary button for this dialog is the 'Add Folder' button. 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual base::string16 GetAuxiliaryButtonText() const OVERRIDE; 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void DidClickAuxiliaryButton() OVERRIDE; 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void DidToggleEntry(GalleryDialogId gallery_id, 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool selected) OVERRIDE; 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void DidClickOpenFolderViewer(GalleryDialogId gallery_id) OVERRIDE; 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void DidForgetEntry(GalleryDialogId gallery_id) OVERRIDE; 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual base::string16 GetAcceptButtonText() const OVERRIDE; 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void DialogFinished(bool accepted) OVERRIDE; 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ui::MenuModel* GetContextMenu(GalleryDialogId gallery_id) OVERRIDE; 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual content::WebContents* WebContents() OVERRIDE; 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class MediaGalleriesPermissionControllerTest; 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef base::Callback<MediaGalleriesDialog* ( 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesDialogController*)> CreateDialogCallback; 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // For use with tests. 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPermissionController( 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const extensions::Extension& extension, 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* preferences, 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const CreateDialogCallback& create_dialog_callback, 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& on_finish); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~MediaGalleriesPermissionController(); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This type keeps track of media galleries already known to the prefs system. 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef std::map<GalleryDialogId, Entry> GalleryPermissionsMap; 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef std::map<GalleryDialogId, bool /*permitted*/> ToggledGalleryMap; 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class DialogIdMap { 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DialogIdMap(); 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ~DialogIdMap(); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId GetDialogId(MediaGalleryPrefId pref_id); 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaGalleryPrefId GetPrefId(GalleryDialogId id) const; 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId next_dialog_id_; 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::map<MediaGalleryPrefId, GalleryDialogId> back_map_; 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<MediaGalleryPrefId> forward_mapping_; 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DialogIdMap); 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Bottom half of constructor -- called when |preferences_| is initialized. 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPreferencesInitialized(); 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // SelectFileDialog::Listener implementation: 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void FileSelected(const base::FilePath& path, 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int index, 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void* params) OVERRIDE; 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // RemovableStorageObserver implementation. 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Used to keep dialog in sync with removable device status. 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnRemovableStorageAttached( 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const storage_monitor::StorageInfo& info) OVERRIDE; 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnRemovableStorageDetached( 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const storage_monitor::StorageInfo& info) OVERRIDE; 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // MediaGalleriesPreferences::GalleryChangeObserver implementations. 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Used to keep the dialog in sync when the preferences change. 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnPermissionAdded(MediaGalleriesPreferences* pref, 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& extension_id, 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref, 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& extension_id, 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnGalleryAdded(MediaGalleriesPreferences* pref, 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref, 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnGalleryInfoUpdated(MediaGalleriesPreferences* pref, 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Populates |known_galleries_| from |preferences_|. Subsequent calls merge 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // into |known_galleries_| and do not change permissions for user toggled 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // galleries. 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void InitializePermissions(); 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Saves state of |known_galleries_|, |new_galleries_| and 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |forgotten_galleries_| to model. 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // NOTE: possible states for a gallery: 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // K N F (K = Known, N = New, F = Forgotten) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // +---+---+---+ 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // | Y | N | N | 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // +---+---+---+ 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // | N | Y | N | 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // +---+---+---+ 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // | Y | N | Y | 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // +---+---+---+ 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SavePermissions(); 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Updates the model and view when |preferences_| changes. Some of the 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // possible changes includes a gallery getting blacklisted, or a new 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // auto detected gallery becoming available. 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void UpdateGalleriesOnPreferencesEvent(); 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Updates the model and view when a device is attached or detached. 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void UpdateGalleriesOnDeviceEvent(const std::string& device_id); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryDialogId GetDialogId(MediaGalleryPrefId pref_id); 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaGalleryPrefId GetPrefId(GalleryDialogId id) const; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Profile* GetProfile(); 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The web contents from which the request originated. 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::WebContents* web_contents_; 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This is just a reference, but it's assumed that it won't become invalid 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // while the dialog is showing. 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const extensions::Extension* extension_; 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Mapping between pref ids and dialog ids. 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DialogIdMap id_map_; 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This map excludes those galleries which have been blacklisted; it only 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // counts active known galleries. 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryPermissionsMap known_galleries_; 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Galleries in |known_galleries_| that the user have toggled. 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ToggledGalleryMap toggled_galleries_; 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The current set of permitted galleries (according to prefs). 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaGalleryPrefIdSet pref_permitted_galleries_; 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Map of new galleries the user added, but have not saved. This list should 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // never overlap with |known_galleries_|. 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GalleryPermissionsMap new_galleries_; 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Galleries in |known_galleries_| that the user has forgotten. 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::set<GalleryDialogId> forgotten_galleries_; 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Callback to run when the dialog closes. 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Closure on_finish_; 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The model that tracks galleries and extensions' permissions. 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This is the authoritative source for gallery information. 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MediaGalleriesPreferences* preferences_; 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The view that's showing. 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<MediaGalleriesDialog> dialog_; 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<ui::SelectFileDialog> select_folder_dialog_; 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<MediaGalleryContextMenu> context_menu_; 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Creates the dialog. Only changed for unit tests. 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateDialogCallback create_dialog_callback_; 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPermissionController); 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_PERMISSION_CONTROLLER_H_ 221