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