Home | History | Annotate | Download | only in options
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_WEBUI_OPTIONS_CONTENT_SETTINGS_HANDLER_H_
      6 #define CHROME_BROWSER_UI_WEBUI_OPTIONS_CONTENT_SETTINGS_HANDLER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/prefs/pref_change_registrar.h"
     12 #include "chrome/browser/pepper_flash_settings_manager.h"
     13 #include "chrome/browser/ui/webui/options/options_ui.h"
     14 #include "chrome/browser/ui/webui/options/pepper_flash_content_settings_utils.h"
     15 #include "chrome/common/content_settings.h"
     16 #include "chrome/common/content_settings_types.h"
     17 #include "content/public/browser/notification_observer.h"
     18 #include "content/public/browser/notification_registrar.h"
     19 
     20 class HostContentSettingsMap;
     21 class ProtocolHandlerRegistry;
     22 
     23 namespace options {
     24 
     25 class ContentSettingsHandler : public OptionsPageUIHandler,
     26                                public PepperFlashSettingsManager::Client {
     27  public:
     28   ContentSettingsHandler();
     29   virtual ~ContentSettingsHandler();
     30 
     31   // OptionsPageUIHandler implementation.
     32   virtual void GetLocalizedValues(
     33       base::DictionaryValue* localized_strings) OVERRIDE;
     34   virtual void InitializeHandler() OVERRIDE;
     35   virtual void InitializePage() OVERRIDE;
     36   virtual void RegisterMessages() OVERRIDE;
     37 
     38   // content::NotificationObserver implementation.
     39   virtual void Observe(int type,
     40                        const content::NotificationSource& source,
     41                        const content::NotificationDetails& details) OVERRIDE;
     42 
     43   // PepperFlashSettingsManager::Client implementation.
     44   virtual void OnGetPermissionSettingsCompleted(
     45       uint32 request_id,
     46       bool success,
     47       PP_Flash_BrowserOperations_Permission default_permission,
     48       const ppapi::FlashSiteSettings& sites) OVERRIDE;
     49 
     50   // Gets a string identifier for the group name, for use in HTML.
     51   static std::string ContentSettingsTypeToGroupName(ContentSettingsType type);
     52 
     53  private:
     54   // Used to determine whether we should show links to Flash camera and
     55   // microphone settings.
     56   struct MediaSettingsInfo {
     57     MediaSettingsInfo();
     58     ~MediaSettingsInfo();
     59 
     60     // Cached Pepper Flash settings.
     61     ContentSetting flash_default_setting;
     62     MediaExceptions flash_exceptions;
     63     bool flash_settings_initialized;
     64     uint32_t last_flash_refresh_request_id;
     65 
     66     // Whether the links to Flash settings pages are showed.
     67     bool show_flash_default_link;
     68     bool show_flash_exceptions_link;
     69 
     70     // Cached Chrome media settings.
     71     ContentSetting default_setting;
     72     bool policy_disable_audio;
     73     bool policy_disable_video;
     74     bool default_setting_initialized;
     75     MediaExceptions exceptions;
     76     bool exceptions_initialized;
     77   };
     78 
     79   // Used by ShowFlashMediaLink() to specify which link to show/hide.
     80   enum LinkType {
     81     DEFAULT_SETTING = 0,
     82     EXCEPTIONS,
     83   };
     84 
     85   // Functions that call into the page -----------------------------------------
     86 
     87   // Updates the page with the default settings (allow, ask, block, etc.)
     88   void UpdateSettingDefaultFromModel(ContentSettingsType type);
     89 
     90   // Updates the media radio buttons according to the enabled split prefs.
     91   void UpdateMediaSettingsView();
     92 
     93   // Clobbers and rebuilds the specific content setting type exceptions table.
     94   void UpdateExceptionsViewFromModel(ContentSettingsType type);
     95   // Clobbers and rebuilds the specific content setting type exceptions
     96   // OTR table.
     97   void UpdateOTRExceptionsViewFromModel(ContentSettingsType type);
     98   // Clobbers and rebuilds all the exceptions tables in the page (both normal
     99   // and OTR tables).
    100   void UpdateAllExceptionsViewsFromModel();
    101   // As above, but only OTR tables.
    102   void UpdateAllOTRExceptionsViewsFromModel();
    103   // Clobbers and rebuilds just the geolocation exception table.
    104   void UpdateGeolocationExceptionsView();
    105   // Clobbers and rebuilds just the desktop notification exception table.
    106   void UpdateNotificationExceptionsView();
    107   // Clobbers and rebuilds just the Media device exception table.
    108   void UpdateMediaExceptionsView();
    109   // Clobbers and rebuilds just the MIDI SysEx exception table.
    110   void UpdateMIDISysExExceptionsView();
    111   // Clobbers and rebuilds an exception table that's managed by the host content
    112   // settings map.
    113   void UpdateExceptionsViewFromHostContentSettingsMap(ContentSettingsType type);
    114   // As above, but acts on the OTR table for the content setting type.
    115   void UpdateExceptionsViewFromOTRHostContentSettingsMap(
    116       ContentSettingsType type);
    117   // Updates the radio buttons for enabling / disabling handlers.
    118   void UpdateHandlersEnabledRadios();
    119   // Removes one geolocation exception.
    120   void RemoveGeolocationException(const base::ListValue* args,
    121                                   size_t arg_index);
    122   // Removes one notification exception.
    123   void RemoveNotificationException(const base::ListValue* args,
    124                                    size_t arg_index);
    125   // Removes one media camera and microphone exception.
    126   void RemoveMediaException(const base::ListValue* args, size_t arg_index);
    127   // Removes one exception of |type| from the host content settings map.
    128   void RemoveExceptionFromHostContentSettingsMap(
    129       const base::ListValue* args,
    130       size_t arg_index,
    131       ContentSettingsType type);
    132 
    133   // Callbacks used by the page ------------------------------------------------
    134 
    135   // Sets the default value for a specific content type. |args| includes the
    136   // content type and a string describing the new default the user has
    137   // chosen.
    138   void SetContentFilter(const base::ListValue* args);
    139 
    140   // Removes the given row from the table. The first entry in |args| is the
    141   // content type, and the rest of the arguments depend on the content type
    142   // to be removed.
    143   void RemoveException(const base::ListValue* args);
    144 
    145   // Changes the value of an exception. Called after the user is done editing an
    146   // exception.
    147   void SetException(const base::ListValue* args);
    148 
    149   // Called to decide whether a given pattern is valid, or if it should be
    150   // rejected. Called while the user is editing an exception pattern.
    151   void CheckExceptionPatternValidity(const base::ListValue* args);
    152 
    153   // Utility functions ---------------------------------------------------------
    154 
    155   // Applies content settings whitelists to reduce breakage / user confusion.
    156   void ApplyWhitelist(ContentSettingsType content_type,
    157                       ContentSetting default_setting);
    158 
    159   // Gets the HostContentSettingsMap for the normal profile.
    160   HostContentSettingsMap* GetContentSettingsMap();
    161 
    162   // Gets the HostContentSettingsMap for the incognito profile, or NULL if there
    163   // is no active incognito session.
    164   HostContentSettingsMap* GetOTRContentSettingsMap();
    165 
    166   // Gets the default setting in string form. If |provider_id| is not NULL, the
    167   // id of the provider which provided the default setting is assigned to it.
    168   std::string GetSettingDefaultFromModel(ContentSettingsType type,
    169                                          std::string* provider_id);
    170 
    171   // Gets the ProtocolHandlerRegistry for the normal profile.
    172   ProtocolHandlerRegistry* GetProtocolHandlerRegistry();
    173 
    174   void RefreshFlashMediaSettings();
    175 
    176   // Fills in |exceptions| with Values for the given |type| from |map|.
    177   void GetExceptionsFromHostContentSettingsMap(
    178       const HostContentSettingsMap* map,
    179       ContentSettingsType type,
    180       base::ListValue* exceptions);
    181 
    182   void OnPepperFlashPrefChanged();
    183 
    184   void ShowFlashMediaLink(LinkType link_type, bool show);
    185 
    186   void UpdateFlashMediaLinksVisibility();
    187 
    188   // Member variables ---------------------------------------------------------
    189 
    190   content::NotificationRegistrar notification_registrar_;
    191   PrefChangeRegistrar pref_change_registrar_;
    192   scoped_ptr<PepperFlashSettingsManager> flash_settings_manager_;
    193   MediaSettingsInfo media_settings_;
    194 
    195   DISALLOW_COPY_AND_ASSIGN(ContentSettingsHandler);
    196 };
    197 
    198 }  // namespace options
    199 
    200 #endif  // CHROME_BROWSER_UI_WEBUI_OPTIONS_CONTENT_SETTINGS_HANDLER_H_
    201