 Chromium Code Reviews
 Chromium Code Reviews Issue 10479015:
  Pepper Flash settings integration - camera and microphone.  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 10479015:
  Pepper Flash settings integration - camera and microphone.  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| Index: chrome/browser/ui/webui/options2/content_settings_handler2.cc | 
| diff --git a/chrome/browser/ui/webui/options2/content_settings_handler2.cc b/chrome/browser/ui/webui/options2/content_settings_handler2.cc | 
| index af0680f08dfa0c83fadeaafe63de83ae8fa9b7d8..6c94b45d09e76b8d972d9916228eb3a4943cb4d0 100644 | 
| --- a/chrome/browser/ui/webui/options2/content_settings_handler2.cc | 
| +++ b/chrome/browser/ui/webui/options2/content_settings_handler2.cc | 
| @@ -4,8 +4,6 @@ | 
| #include "chrome/browser/ui/webui/options2/content_settings_handler2.h" | 
| -#include <map> | 
| -#include <string> | 
| #include <vector> | 
| #include "base/bind.h" | 
| @@ -41,6 +39,7 @@ | 
| #include "content/public/common/content_switches.h" | 
| #include "grit/generated_resources.h" | 
| #include "grit/locale_settings.h" | 
| +#include "net/base/net_util.h" | 
| #include "ui/base/l10n/l10n_util.h" | 
| #if defined(OS_CHROMEOS) | 
| @@ -51,9 +50,10 @@ using content::UserMetricsAction; | 
| namespace { | 
| -struct ContentSettingsTypeNameEntry { | 
| - ContentSettingsType type; | 
| - const char* name; | 
| +enum ExContentSettingsTypeEnum { | 
| + EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC = | 
| + CONTENT_SETTINGS_NUM_TYPES, | 
| + EX_CONTENT_SETTINGS_NUM_TYPES | 
| }; | 
| typedef std::map<ContentSettingsPattern, ContentSetting> OnePatternSettings; | 
| @@ -65,33 +65,8 @@ const char* kSetting = "setting"; | 
| const char* kOrigin = "origin"; | 
| const char* kSource = "source"; | 
| const char* kEmbeddingOrigin = "embeddingOrigin"; | 
| - | 
| -const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { | 
| - {CONTENT_SETTINGS_TYPE_COOKIES, "cookies"}, | 
| - {CONTENT_SETTINGS_TYPE_IMAGES, "images"}, | 
| - {CONTENT_SETTINGS_TYPE_JAVASCRIPT, "javascript"}, | 
| - {CONTENT_SETTINGS_TYPE_PLUGINS, "plugins"}, | 
| - {CONTENT_SETTINGS_TYPE_POPUPS, "popups"}, | 
| - {CONTENT_SETTINGS_TYPE_GEOLOCATION, "location"}, | 
| - {CONTENT_SETTINGS_TYPE_NOTIFICATIONS, "notifications"}, | 
| - {CONTENT_SETTINGS_TYPE_INTENTS, "intents"}, | 
| - {CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, "auto-select-certificate"}, | 
| - {CONTENT_SETTINGS_TYPE_FULLSCREEN, "fullscreen"}, | 
| - {CONTENT_SETTINGS_TYPE_MOUSELOCK, "mouselock"}, | 
| -}; | 
| -COMPILE_ASSERT(arraysize(kContentSettingsTypeGroupNames) == | 
| - CONTENT_SETTINGS_NUM_TYPES, | 
| - MISSING_CONTENT_SETTINGS_TYPE); | 
| - | 
| -ContentSettingsType ContentSettingsTypeFromGroupName(const std::string& name) { | 
| - for (size_t i = 0; i < arraysize(kContentSettingsTypeGroupNames); ++i) { | 
| - if (name == kContentSettingsTypeGroupNames[i].name) | 
| - return kContentSettingsTypeGroupNames[i].type; | 
| - } | 
| - | 
| - NOTREACHED() << name << " is not a recognized content settings type."; | 
| - return CONTENT_SETTINGS_TYPE_DEFAULT; | 
| -} | 
| +const char* kDefaultProviderID = "default"; | 
| +const char* kPreferencesSource = "preferences"; | 
| std::string ContentSettingToString(ContentSetting setting) { | 
| switch (setting) { | 
| @@ -241,10 +216,109 @@ void AddExceptionsGrantedByHostedApps( | 
| } | 
| } | 
| +ContentSetting FlashPermissionToContentSetting( | 
| + PP_Flash_BrowserOperations_Permission permission) { | 
| + switch (permission) { | 
| + case PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT: | 
| + return CONTENT_SETTING_DEFAULT; | 
| + case PP_FLASH_BROWSEROPERATIONS_PERMISSION_ALLOW: | 
| + return CONTENT_SETTING_ALLOW; | 
| + case PP_FLASH_BROWSEROPERATIONS_PERMISSION_BLOCK: | 
| + return CONTENT_SETTING_BLOCK; | 
| + case PP_FLASH_BROWSEROPERATIONS_PERMISSION_ASK: | 
| + return CONTENT_SETTING_ASK; | 
| + default: | 
| + NOTREACHED(); | 
| + return CONTENT_SETTING_DEFAULT; | 
| + } | 
| +} | 
| + | 
| +PP_Flash_BrowserOperations_Permission FlashPermissionFromContentSetting( | 
| + ContentSetting setting) { | 
| + switch (setting) { | 
| + case CONTENT_SETTING_DEFAULT: | 
| + return PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT; | 
| + case CONTENT_SETTING_ALLOW: | 
| + return PP_FLASH_BROWSEROPERATIONS_PERMISSION_ALLOW; | 
| + case CONTENT_SETTING_BLOCK: | 
| + return PP_FLASH_BROWSEROPERATIONS_PERMISSION_BLOCK; | 
| + case CONTENT_SETTING_ASK: | 
| + return PP_FLASH_BROWSEROPERATIONS_PERMISSION_ASK; | 
| + default: | 
| + NOTREACHED(); | 
| + return PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT; | 
| + } | 
| +} | 
| + | 
| +std::string CanonicalizeHost(const std::string& host) { | 
| + url_canon::CanonHostInfo info; | 
| + return net::CanonicalizeHost(host, &info); | 
| +} | 
| + | 
| +bool IsValidHost(const std::string& host) { | 
| + std::string canonicalized_host = CanonicalizeHost(host); | 
| + return !canonicalized_host.empty(); | 
| +} | 
| + | 
| } // namespace | 
| namespace options2 { | 
| +class ContentSettingsHandler::ExContentSettingsType { | 
| + public: | 
| + explicit ExContentSettingsType(int value) : value_(value) { | 
| + DCHECK(value_ < EX_CONTENT_SETTINGS_NUM_TYPES); | 
| + } | 
| + explicit ExContentSettingsType(ContentSettingsType type) : value_(type) {} | 
| + explicit ExContentSettingsType(ExContentSettingsTypeEnum type) | 
| + : value_(type) {} | 
| + | 
| + bool IsExtraContentSettingsType() const { | 
| + return value_ >= CONTENT_SETTINGS_NUM_TYPES; | 
| + } | 
| + | 
| + operator int() const { return value_; } | 
| + | 
| + ContentSettingsType ToContentSettingsType() const { | 
| + DCHECK(value_ < CONTENT_SETTINGS_NUM_TYPES); | 
| + return static_cast<ContentSettingsType>(value_); | 
| + } | 
| + | 
| + private: | 
| + int value_; | 
| +}; | 
| + | 
| +ContentSettingsHandler::CachedPepperFlashSettings::CachedPepperFlashSettings() | 
| + : default_permission(PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT), | 
| + initialized(false) { | 
| +} | 
| + | 
| +ContentSettingsHandler::CachedPepperFlashSettings::~CachedPepperFlashSettings() { | 
| +} | 
| + | 
| +struct ContentSettingsHandler::ExContentSettingsTypeNameEntry { | 
| + ExContentSettingsType type; | 
| + const char* name; | 
| +}; | 
| + | 
| +const ContentSettingsHandler::ExContentSettingsTypeNameEntry | 
| + ContentSettingsHandler::kExContentSettingsTypeGroupNames[] = { | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_COOKIES), "cookies"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_IMAGES), "images"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_JAVASCRIPT), "javascript"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_PLUGINS), "plugins"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_POPUPS), "popups"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_GEOLOCATION), "location"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_NOTIFICATIONS), "notifications"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_INTENTS), "intents"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE), | 
| + "auto-select-certificate"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_FULLSCREEN), "fullscreen"}, | 
| + {ExContentSettingsType(CONTENT_SETTINGS_TYPE_MOUSELOCK), "mouselock"}, | 
| + {ExContentSettingsType(EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC), | 
| + "pepper_flash_cameramic"}, | 
| +}; | 
| + | 
| ContentSettingsHandler::ContentSettingsHandler() { | 
| } | 
| @@ -324,6 +398,12 @@ void ContentSettingsHandler::GetLocalizedValues( | 
| { "mouselock_allow", IDS_MOUSE_LOCK_ALLOW_RADIO }, | 
| { "mouselock_ask", IDS_MOUSE_LOCK_ASK_RADIO }, | 
| { "mouselock_block", IDS_MOUSE_LOCK_BLOCK_RADIO }, | 
| + // Pepper Flash camera and microphone fileter. | 
| 
csilv
2012/06/05 00:40:21
nit: "filter"
 
yzshen1
2012/06/05 17:28:43
Done.
 | 
| + { "pepper_flash_cameramic_tab_label", | 
| + IDS_PEPPER_FLASH_CAMERAMIC_TAB_LABEL }, | 
| + { "pepper_flash_cameramic_header", IDS_PEPPER_FLASH_CAMERAMIC_HEADER }, | 
| + { "pepper_flash_cameramic_ask", IDS_PEPPER_FLASH_CAMERAMIC_ASK_RADIO }, | 
| + { "pepper_flash_cameramic_block", IDS_PEPPER_FLASH_CAMERAMIC_BLOCK_RADIO }, | 
| #if defined(OS_CHROMEOS) | 
| // Protected Content filter | 
| { "protectedContentTabLabel", IDS_PROTECTED_CONTENT_TAB_LABEL }, | 
| @@ -356,6 +436,8 @@ void ContentSettingsHandler::GetLocalizedValues( | 
| IDS_FULLSCREEN_TAB_LABEL); | 
| RegisterTitle(localized_strings, "mouselock", | 
| IDS_MOUSE_LOCK_TAB_LABEL); | 
| + RegisterTitle(localized_strings, "pepper_flash_cameramic", | 
| + IDS_PEPPER_FLASH_CAMERAMIC_TAB_LABEL); | 
| Profile* profile = Profile::FromWebUI(web_ui()); | 
| localized_strings->SetBoolean( | 
| @@ -389,11 +471,18 @@ void ContentSettingsHandler::InitializeHandler() { | 
| PrefService* prefs = profile->GetPrefs(); | 
| pref_change_registrar_.Init(prefs); | 
| pref_change_registrar_.Add(prefs::kGeolocationContentSettings, this); | 
| + pref_change_registrar_.Add(prefs::kPepperFlashSettingsEnabled, this); | 
| + | 
| + flash_settings_manager_.reset(new PepperFlashSettingsManager(this, profile)); | 
| } | 
| void ContentSettingsHandler::InitializePage() { | 
| UpdateHandlersEnabledRadios(); | 
| UpdateAllExceptionsViewsFromModel(); | 
| + | 
| + flash_cameramic_settings_ = CachedPepperFlashSettings(); | 
| + flash_settings_manager_->GetPermissionSettings( | 
| + PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC); | 
| } | 
| void ContentSettingsHandler::Observe( | 
| @@ -427,18 +516,27 @@ void ContentSettingsHandler::Observe( | 
| content::Details<const ContentSettingsDetails>(details).ptr(); | 
| // TODO(estade): we pretend update_all() is always true. | 
| - if (settings_details->update_all_types()) | 
| + if (settings_details->update_all_types()) { | 
| UpdateAllExceptionsViewsFromModel(); | 
| - else | 
| - UpdateExceptionsViewFromModel(settings_details->type()); | 
| + } else { | 
| + UpdateExceptionsViewFromModel( | 
| + ExContentSettingsType(settings_details->type())); | 
| + } | 
| break; | 
| } | 
| case chrome::NOTIFICATION_PREF_CHANGED: { | 
| const std::string& pref_name = | 
| *content::Details<std::string>(details).ptr(); | 
| - if (pref_name == prefs::kGeolocationContentSettings) | 
| + if (pref_name == prefs::kGeolocationContentSettings) { | 
| UpdateGeolocationExceptionsView(); | 
| + } else if (pref_name == prefs::kPepperFlashSettingsEnabled) { | 
| + if (!flash_cameramic_settings_.initialized) { | 
| + flash_settings_manager_->GetPermissionSettings( | 
| + PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC); | 
| + } | 
| + } | 
| + | 
| break; | 
| } | 
| @@ -457,15 +555,36 @@ void ContentSettingsHandler::Observe( | 
| } | 
| } | 
| +void ContentSettingsHandler::OnGetPermissionSettingsCompleted( | 
| + uint32 /* request_id */, | 
| + bool success, | 
| + PP_Flash_BrowserOperations_Permission default_permission, | 
| + const ppapi::FlashSiteSettings& sites) { | 
| + if (success && !flash_cameramic_settings_.initialized) { | 
| + flash_cameramic_settings_.initialized = true; | 
| + flash_cameramic_settings_.default_permission = default_permission; | 
| + for (ppapi::FlashSiteSettings::const_iterator iter = sites.begin(); | 
| + iter != sites.end(); ++iter) { | 
| + if (IsValidHost(iter->site)) | 
| + flash_cameramic_settings_.sites[iter->site] = iter->permission; | 
| + } | 
| + UpdateExceptionsViewFromModel( | 
| + ExContentSettingsType(EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC)); | 
| + | 
| + web_ui()->CallJavascriptFunction( | 
| + "ContentSettings.enablePepperFlashCameraMicSettings"); | 
| + } | 
| +} | 
| + | 
| void ContentSettingsHandler::UpdateSettingDefaultFromModel( | 
| - ContentSettingsType type) { | 
| + const ExContentSettingsType& type) { | 
| DictionaryValue filter_settings; | 
| std::string provider_id; | 
| - filter_settings.SetString(ContentSettingsTypeToGroupName(type) + ".value", | 
| - GetSettingDefaultFromModel(type, &provider_id)); | 
| filter_settings.SetString( | 
| - ContentSettingsTypeToGroupName(type) + ".managedBy", | 
| - provider_id); | 
| + ExContentSettingsTypeToGroupName(type) + ".value", | 
| + GetSettingDefaultFromModel(type, &provider_id)); | 
| + filter_settings.SetString( | 
| + ExContentSettingsTypeToGroupName(type) + ".managedBy", provider_id); | 
| web_ui()->CallJavascriptFunction( | 
| "ContentSettings.setContentFilterSettingsValue", filter_settings); | 
| @@ -474,17 +593,21 @@ void ContentSettingsHandler::UpdateSettingDefaultFromModel( | 
| } | 
| std::string ContentSettingsHandler::GetSettingDefaultFromModel( | 
| - ContentSettingsType type, std::string* provider_id) { | 
| + const ExContentSettingsType& type, std::string* provider_id) { | 
| Profile* profile = Profile::FromWebUI(web_ui()); | 
| ContentSetting default_setting; | 
| if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { | 
| default_setting = | 
| DesktopNotificationServiceFactory::GetForProfile(profile)-> | 
| GetDefaultContentSetting(provider_id); | 
| + } else if (type == EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC) { | 
| + default_setting = FlashPermissionToContentSetting( | 
| + flash_cameramic_settings_.default_permission); | 
| + *provider_id = kDefaultProviderID; | 
| } else { | 
| default_setting = | 
| profile->GetHostContentSettingsMap()-> | 
| - GetDefaultContentSetting(type, provider_id); | 
| + GetDefaultContentSetting(type.ToContentSettingsType(), provider_id); | 
| } | 
| return ContentSettingToString(default_setting); | 
| @@ -501,25 +624,25 @@ void ContentSettingsHandler::UpdateHandlersEnabledRadios() { | 
| void ContentSettingsHandler::UpdateAllExceptionsViewsFromModel() { | 
| for (int type = CONTENT_SETTINGS_TYPE_DEFAULT + 1; | 
| - type < CONTENT_SETTINGS_NUM_TYPES; ++type) { | 
| + type < EX_CONTENT_SETTINGS_NUM_TYPES; ++type) { | 
| // The content settings type CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE | 
| // is supposed to be set by policy only. Hence there is no user facing UI | 
| // for this content type and we skip it here. | 
| if (type == CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE) | 
| continue; | 
| - UpdateExceptionsViewFromModel(static_cast<ContentSettingsType>(type)); | 
| + UpdateExceptionsViewFromModel(ExContentSettingsType(type)); | 
| } | 
| } | 
| void ContentSettingsHandler::UpdateAllOTRExceptionsViewsFromModel() { | 
| for (int type = CONTENT_SETTINGS_TYPE_DEFAULT + 1; | 
| - type < CONTENT_SETTINGS_NUM_TYPES; ++type) { | 
| - UpdateOTRExceptionsViewFromModel(static_cast<ContentSettingsType>(type)); | 
| + type < EX_CONTENT_SETTINGS_NUM_TYPES; ++type) { | 
| + UpdateOTRExceptionsViewFromModel(ExContentSettingsType(type)); | 
| } | 
| } | 
| void ContentSettingsHandler::UpdateExceptionsViewFromModel( | 
| - ContentSettingsType type) { | 
| + const ExContentSettingsType& type) { | 
| // Don't update intents settings at this point. | 
| // Turn on when enable_web_intents_tag is enabled. | 
| if (type == CONTENT_SETTINGS_TYPE_INTENTS) | 
| @@ -532,22 +655,28 @@ void ContentSettingsHandler::UpdateExceptionsViewFromModel( | 
| case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | 
| UpdateNotificationExceptionsView(); | 
| break; | 
| + case EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC: | 
| + UpdateFlashCameraMicExceptionsView(); | 
| + break; | 
| default: | 
| - UpdateExceptionsViewFromHostContentSettingsMap(type); | 
| + UpdateExceptionsViewFromHostContentSettingsMap( | 
| + type.ToContentSettingsType()); | 
| break; | 
| } | 
| } | 
| void ContentSettingsHandler::UpdateOTRExceptionsViewFromModel( | 
| - ContentSettingsType type) { | 
| + const ExContentSettingsType& type) { | 
| switch (type) { | 
| case CONTENT_SETTINGS_TYPE_GEOLOCATION: | 
| case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | 
| case CONTENT_SETTINGS_TYPE_INTENTS: | 
| case CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE: | 
| + case EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC: | 
| break; | 
| default: | 
| - UpdateExceptionsViewFromOTRHostContentSettingsMap(type); | 
| + UpdateExceptionsViewFromOTRHostContentSettingsMap( | 
| + type.ToContentSettingsType()); | 
| break; | 
| } | 
| } | 
| @@ -571,7 +700,7 @@ void ContentSettingsHandler::UpdateGeolocationExceptionsView() { | 
| // Don't add default settings. | 
| if (i->primary_pattern == ContentSettingsPattern::Wildcard() && | 
| i->secondary_pattern == ContentSettingsPattern::Wildcard() && | 
| - i->source != "preferences") { | 
| + i->source != kPreferencesSource) { | 
| continue; | 
| } | 
| all_patterns_settings[i->primary_pattern][i->secondary_pattern] = | 
| @@ -618,7 +747,8 @@ void ContentSettingsHandler::UpdateGeolocationExceptionsView() { | 
| // This is mainly here to keep this function ideologically parallel to | 
| // UpdateExceptionsViewFromHostContentSettingsMap(). | 
| - UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_GEOLOCATION); | 
| + UpdateSettingDefaultFromModel( | 
| + ExContentSettingsType(CONTENT_SETTINGS_TYPE_GEOLOCATION)); | 
| } | 
| void ContentSettingsHandler::UpdateNotificationExceptionsView() { | 
| @@ -640,7 +770,7 @@ void ContentSettingsHandler::UpdateNotificationExceptionsView() { | 
| // Don't add default settings. | 
| if (i->primary_pattern == ContentSettingsPattern::Wildcard() && | 
| i->secondary_pattern == ContentSettingsPattern::Wildcard() && | 
| - i->source != "preferences") { | 
| + i->source != kPreferencesSource) { | 
| continue; | 
| } | 
| @@ -656,7 +786,31 @@ void ContentSettingsHandler::UpdateNotificationExceptionsView() { | 
| // This is mainly here to keep this function ideologically parallel to | 
| // UpdateExceptionsViewFromHostContentSettingsMap(). | 
| - UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); | 
| + UpdateSettingDefaultFromModel( | 
| + ExContentSettingsType(CONTENT_SETTINGS_TYPE_NOTIFICATIONS)); | 
| +} | 
| + | 
| +void ContentSettingsHandler::UpdateFlashCameraMicExceptionsView() { | 
| + ListValue exceptions; | 
| + for (CachedPepperFlashSettings::SiteMap::iterator iter = | 
| + flash_cameramic_settings_.sites.begin(); | 
| + iter != flash_cameramic_settings_.sites.end(); ++iter) { | 
| + DictionaryValue* exception = new DictionaryValue(); | 
| + exception->SetString(kDisplayPattern, iter->first); | 
| + exception->SetString( | 
| + kSetting, | 
| + ContentSettingToString(FlashPermissionToContentSetting(iter->second))); | 
| + exception->SetString(kSource, kPreferencesSource); | 
| + exceptions.Append(exception); | 
| + } | 
| + | 
| + StringValue type_string(ExContentSettingsTypeToGroupName( | 
| + ExContentSettingsType(EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC))); | 
| + web_ui()->CallJavascriptFunction("ContentSettings.setExceptions", | 
| + type_string, exceptions); | 
| + | 
| + UpdateSettingDefaultFromModel( | 
| + ExContentSettingsType(EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC)); | 
| } | 
| void ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap( | 
| @@ -702,7 +856,7 @@ void ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap( | 
| // The default may also have changed (we won't get a separate notification). | 
| // If it hasn't changed, this call will be harmless. | 
| - UpdateSettingDefaultFromModel(type); | 
| + UpdateSettingDefaultFromModel(ExContentSettingsType(type)); | 
| } | 
| void ContentSettingsHandler::UpdateExceptionsViewFromOTRHostContentSettingsMap( | 
| @@ -798,7 +952,8 @@ void ContentSettingsHandler::SetContentFilter(const ListValue* args) { | 
| } | 
| ContentSetting default_setting = ContentSettingFromString(setting); | 
| - ContentSettingsType content_type = ContentSettingsTypeFromGroupName(group); | 
| + ExContentSettingsType content_type = | 
| + ExContentSettingsTypeFromGroupName(group); | 
| Profile* profile = Profile::FromWebUI(web_ui()); | 
| #if defined(OS_CHROMEOS) | 
| @@ -811,10 +966,17 @@ void ContentSettingsHandler::SetContentFilter(const ListValue* args) { | 
| if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { | 
| DesktopNotificationServiceFactory::GetForProfile(profile)-> | 
| SetDefaultContentSetting(default_setting); | 
| + } else if (content_type == EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC) { | 
| + flash_cameramic_settings_.default_permission = | 
| + FlashPermissionFromContentSetting(default_setting); | 
| + flash_settings_manager_->SetDefaultPermission( | 
| + PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC, | 
| + flash_cameramic_settings_.default_permission, false); | 
| } else { | 
| HostContentSettingsMap* map = profile->GetHostContentSettingsMap(); | 
| - ApplyWhitelist(content_type, default_setting); | 
| - map->SetDefaultContentSetting(content_type, default_setting); | 
| + ContentSettingsType converted_type = content_type.ToContentSettingsType(); | 
| + ApplyWhitelist(converted_type, default_setting); | 
| + map->SetDefaultContentSetting(converted_type, default_setting); | 
| } | 
| switch (content_type) { | 
| case CONTENT_SETTINGS_TYPE_COOKIES: | 
| @@ -853,6 +1015,10 @@ void ContentSettingsHandler::SetContentFilter(const ListValue* args) { | 
| content::RecordAction( | 
| UserMetricsAction("Options_DefaultMouseLockSettingChanged")); | 
| break; | 
| + case EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC: | 
| + content::RecordAction( | 
| + UserMetricsAction("Options_DefaultFlashCameraMicSettingChanged")); | 
| + break; | 
| default: | 
| break; | 
| } | 
| @@ -864,7 +1030,8 @@ void ContentSettingsHandler::RemoveException(const ListValue* args) { | 
| CHECK(args->GetString(arg_i++, &type_string)); | 
| Profile* profile = Profile::FromWebUI(web_ui()); | 
| - ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string); | 
| + ExContentSettingsType type = ExContentSettingsTypeFromGroupName( | 
| + type_string); | 
| if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { | 
| std::string origin; | 
| std::string embedding_origin; | 
| @@ -901,18 +1068,37 @@ void ContentSettingsHandler::RemoveException(const ListValue* args) { | 
| rv = args->GetString(arg_i++, &pattern); | 
| DCHECK(rv); | 
| - HostContentSettingsMap* settings_map = | 
| - mode == "normal" ? GetContentSettingsMap() : | 
| - GetOTRContentSettingsMap(); | 
| - // The settings map could be null if the mode was OTR but the OTR profile | 
| - // got destroyed before we received this message. | 
| - if (settings_map) { | 
| - settings_map->SetContentSetting( | 
| - ContentSettingsPattern::FromString(pattern), | 
| - ContentSettingsPattern::Wildcard(), | 
| - ContentSettingsTypeFromGroupName(type_string), | 
| - "", | 
| - CONTENT_SETTING_DEFAULT); | 
| + if (type == EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC) { | 
| + DCHECK_EQ(mode, "normal"); | 
| + | 
| + CachedPepperFlashSettings::SiteMap::iterator iter = | 
| + flash_cameramic_settings_.sites.find(pattern); | 
| + if (iter != flash_cameramic_settings_.sites.end()) { | 
| + flash_cameramic_settings_.sites.erase(iter); | 
| + ppapi::FlashSiteSettings site_settings(1, | 
| + ppapi::FlashSiteSetting( | 
| + pattern, PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT)); | 
| + flash_settings_manager_->SetSitePermission( | 
| + PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC, | 
| + site_settings); | 
| + } else { | 
| + NOTREACHED(); | 
| + } | 
| + UpdateFlashCameraMicExceptionsView(); | 
| + } else { | 
| + HostContentSettingsMap* settings_map = | 
| + mode == "normal" ? GetContentSettingsMap() : | 
| + GetOTRContentSettingsMap(); | 
| + // The settings map could be null if the mode was OTR but the OTR profile | 
| + // got destroyed before we received this message. | 
| + if (settings_map) { | 
| + settings_map->SetContentSetting( | 
| + ContentSettingsPattern::FromString(pattern), | 
| + ContentSettingsPattern::Wildcard(), | 
| + type.ToContentSettingsType(), | 
| + "", | 
| + CONTENT_SETTING_DEFAULT); | 
| + } | 
| } | 
| } | 
| } | 
| @@ -928,48 +1114,71 @@ void ContentSettingsHandler::SetException(const ListValue* args) { | 
| std::string setting; | 
| CHECK(args->GetString(arg_i++, &setting)); | 
| - ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string); | 
| + ExContentSettingsType type = ExContentSettingsTypeFromGroupName(type_string); | 
| if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION || | 
| type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { | 
| NOTREACHED(); | 
| - return; | 
| - } | 
| + } else if (type == EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC) { | 
| + DCHECK(IsValidHost(pattern)); | 
| - HostContentSettingsMap* settings_map = | 
| - mode == "normal" ? GetContentSettingsMap() : | 
| - GetOTRContentSettingsMap(); | 
| + if (flash_cameramic_settings_.sites.find(pattern) == | 
| + flash_cameramic_settings_.sites.end()) { | 
| + pattern = CanonicalizeHost(pattern); | 
| + } | 
| + PP_Flash_BrowserOperations_Permission permission = | 
| + FlashPermissionFromContentSetting(ContentSettingFromString(setting)); | 
| + flash_cameramic_settings_.sites[pattern] = permission; | 
| + ppapi::FlashSiteSettings | 
| + site_settings(1, ppapi::FlashSiteSetting(pattern, permission)); | 
| + flash_settings_manager_->SetSitePermission( | 
| + PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC, | 
| + site_settings); | 
| + UpdateFlashCameraMicExceptionsView(); | 
| + } else { | 
| + HostContentSettingsMap* settings_map = | 
| + mode == "normal" ? GetContentSettingsMap() : | 
| + GetOTRContentSettingsMap(); | 
| - // The settings map could be null if the mode was OTR but the OTR profile | 
| - // got destroyed before we received this message. | 
| - if (!settings_map) | 
| - return; | 
| - settings_map->SetContentSetting(ContentSettingsPattern::FromString(pattern), | 
| - ContentSettingsPattern::Wildcard(), | 
| - type, | 
| - "", | 
| - ContentSettingFromString(setting)); | 
| + // The settings map could be null if the mode was OTR but the OTR profile | 
| + // got destroyed before we received this message. | 
| + if (!settings_map) | 
| + return; | 
| + settings_map->SetContentSetting(ContentSettingsPattern::FromString(pattern), | 
| + ContentSettingsPattern::Wildcard(), | 
| + type.ToContentSettingsType(), | 
| + "", | 
| + ContentSettingFromString(setting)); | 
| + } | 
| } | 
| void ContentSettingsHandler::CheckExceptionPatternValidity( | 
| const ListValue* args) { | 
| size_t arg_i = 0; | 
| - Value* type; | 
| - CHECK(args->Get(arg_i++, &type)); | 
| + std::string type_string; | 
| + CHECK(args->GetString(arg_i++, &type_string)); | 
| std::string mode_string; | 
| CHECK(args->GetString(arg_i++, &mode_string)); | 
| std::string pattern_string; | 
| CHECK(args->GetString(arg_i++, &pattern_string)); | 
| - ContentSettingsPattern pattern = | 
| - ContentSettingsPattern::FromString(pattern_string); | 
| + ExContentSettingsType type = ExContentSettingsTypeFromGroupName(type_string); | 
| + bool is_valid = false; | 
| + if (type == EX_CONTENT_SETTINGS_TYPE_PEPPER_FLASH_CAMERAMIC) { | 
| + is_valid = IsValidHost(pattern_string); | 
| + } else { | 
| + ContentSettingsPattern pattern = | 
| + ContentSettingsPattern::FromString(pattern_string); | 
| + is_valid = pattern.IsValid(); | 
| + } | 
| + scoped_ptr<Value> type_value(Value::CreateStringValue(type_string)); | 
| scoped_ptr<Value> mode_value(Value::CreateStringValue(mode_string)); | 
| scoped_ptr<Value> pattern_value(Value::CreateStringValue(pattern_string)); | 
| - scoped_ptr<Value> valid_value(Value::CreateBooleanValue(pattern.IsValid())); | 
| + scoped_ptr<Value> valid_value(Value::CreateBooleanValue(is_valid)); | 
| web_ui()->CallJavascriptFunction( | 
| "ContentSettings.patternValidityCheckComplete", | 
| - *type, | 
| + *type_value.get(), | 
| *mode_value.get(), | 
| *pattern_value.get(), | 
| *valid_value.get()); | 
| @@ -978,13 +1187,7 @@ void ContentSettingsHandler::CheckExceptionPatternValidity( | 
| // static | 
| std::string ContentSettingsHandler::ContentSettingsTypeToGroupName( | 
| ContentSettingsType type) { | 
| - for (size_t i = 0; i < arraysize(kContentSettingsTypeGroupNames); ++i) { | 
| - if (type == kContentSettingsTypeGroupNames[i].type) | 
| - return kContentSettingsTypeGroupNames[i].name; | 
| - } | 
| - | 
| - NOTREACHED(); | 
| - return std::string(); | 
| + return ExContentSettingsTypeToGroupName(ExContentSettingsType(type)); | 
| } | 
| HostContentSettingsMap* ContentSettingsHandler::GetContentSettingsMap() { | 
| @@ -1003,4 +1206,33 @@ HostContentSettingsMap* | 
| return NULL; | 
| } | 
| +// static | 
| +ContentSettingsHandler::ExContentSettingsType | 
| + ContentSettingsHandler::ExContentSettingsTypeFromGroupName( | 
| + const std::string& name) { | 
| + COMPILE_ASSERT(arraysize(kExContentSettingsTypeGroupNames) == | 
| + EX_CONTENT_SETTINGS_NUM_TYPES, | 
| + MISSING_CONTENT_SETTINGS_TYPE); | 
| + | 
| + for (size_t i = 0; i < arraysize(kExContentSettingsTypeGroupNames); ++i) { | 
| + if (name == kExContentSettingsTypeGroupNames[i].name) | 
| + return kExContentSettingsTypeGroupNames[i].type; | 
| + } | 
| + | 
| + NOTREACHED() << name << " is not a recognized content settings type."; | 
| + return ExContentSettingsType(CONTENT_SETTINGS_TYPE_DEFAULT); | 
| +} | 
| + | 
| +// static | 
| +std::string ContentSettingsHandler::ExContentSettingsTypeToGroupName( | 
| + const ExContentSettingsType& type) { | 
| + for (size_t i = 0; i < arraysize(kExContentSettingsTypeGroupNames); ++i) { | 
| + if (type == kExContentSettingsTypeGroupNames[i].type) | 
| + return kExContentSettingsTypeGroupNames[i].name; | 
| + } | 
| + | 
| + NOTREACHED(); | 
| + return std::string(); | 
| +} | 
| + | 
| } // namespace options2 |