Index: chrome/browser/ui/content_settings/content_setting_bubble_model.cc |
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc |
index 63e06d9138e3a79485a0e9345bfed068402f52e0..98d00913933f86506df12bbfe1ed868e82d296e4 100644 |
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc |
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc |
@@ -163,6 +163,7 @@ void ContentSettingTitleAndLinkModel::SetManageLink() { |
{CONTENT_SETTINGS_TYPE_MEDIASTREAM, IDS_MEDIASTREAM_BUBBLE_MANAGE_LINK}, |
{CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_PPAPI_BROKER_BUBBLE_MANAGE_LINK}, |
{CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_BLOCKED_DOWNLOADS_LINK}, |
+ {CONTENT_SETTINGS_TYPE_MIDI_SYSEX, IDS_MIDI_SYSEX_BUBBLE_MANAGE_LINK}, |
}; |
set_manage_link(l10n_util::GetStringUTF8( |
GetIdForContentType(kLinkIDs, arraysize(kLinkIDs), content_type()))); |
@@ -1162,6 +1163,93 @@ void ContentSettingRPHBubbleModel::ClearOrSetPreviousHandler() { |
} |
} |
+// TODO(toyoshim): Should share as many code with geolocation as possible. |
+class ContentSettingMIDISysExBubbleModel |
+ : public ContentSettingTitleAndLinkModel { |
+ public: |
+ ContentSettingMIDISysExBubbleModel(Delegate* delegate, |
+ WebContents* web_contents, |
+ Profile* profile, |
+ ContentSettingsType content_type); |
+ virtual ~ContentSettingMIDISysExBubbleModel() {} |
+ |
+ private: |
+ void MaybeAddDomainList(const std::set<std::string>& hosts, int title_id); |
+ void SetDomainsAndCustomLink(); |
+ virtual void OnCustomLinkClicked() OVERRIDE; |
+}; |
+ |
+ContentSettingMIDISysExBubbleModel::ContentSettingMIDISysExBubbleModel( |
+ Delegate* delegate, |
+ WebContents* web_contents, |
+ Profile* profile, |
+ ContentSettingsType content_type) |
+ : ContentSettingTitleAndLinkModel( |
+ delegate, web_contents, profile, content_type) { |
+ DCHECK_EQ(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, content_type); |
+ SetDomainsAndCustomLink(); |
+} |
+ |
+void ContentSettingMIDISysExBubbleModel::MaybeAddDomainList( |
+ const std::set<std::string>& hosts, int title_id) { |
+ if (!hosts.empty()) { |
+ DomainList domain_list; |
+ domain_list.title = l10n_util::GetStringUTF8(title_id); |
+ domain_list.hosts = hosts; |
+ add_domain_list(domain_list); |
+ } |
+} |
+ |
+void ContentSettingMIDISysExBubbleModel::SetDomainsAndCustomLink() { |
+ TabSpecificContentSettings* content_settings = |
+ TabSpecificContentSettings::FromWebContents(web_contents()); |
+ const ContentSettingsUsagesState& usages_state = |
+ content_settings->midi_usages_state(); |
+ ContentSettingsUsagesState::FormattedHostsPerState formatted_hosts_per_state; |
+ unsigned int tab_state_flags = 0; |
+ usages_state.GetDetailedInfo(&formatted_hosts_per_state, &tab_state_flags); |
+ // Divide the tab's current MIDI sysex users into sets according to their |
+ // permission state. |
+ MaybeAddDomainList(formatted_hosts_per_state[CONTENT_SETTING_ALLOW], |
+ IDS_MIDI_SYSEX_BUBBLE_ALLOWED); |
+ |
+ MaybeAddDomainList(formatted_hosts_per_state[CONTENT_SETTING_BLOCK], |
+ IDS_MIDI_SYSEX_BUBBLE_DENIED); |
+ |
+ if (tab_state_flags & ContentSettingsUsagesState::TABSTATE_HAS_EXCEPTION) { |
+ set_custom_link(l10n_util::GetStringUTF8( |
+ IDS_MIDI_SYSEX_BUBBLE_CLEAR_LINK)); |
+ set_custom_link_enabled(true); |
+ } else if (tab_state_flags & |
+ ContentSettingsUsagesState::TABSTATE_HAS_CHANGED) { |
+ set_custom_link(l10n_util::GetStringUTF8( |
+ IDS_MIDI_SYSEX_BUBBLE_REQUIRE_RELOAD_TO_CLEAR)); |
+ } |
+} |
+ |
+void ContentSettingMIDISysExBubbleModel::OnCustomLinkClicked() { |
+ if (!web_contents()) |
+ return; |
+ // Reset this embedder's entry to default for each of the requesting |
+ // origins currently on the page. |
+ TabSpecificContentSettings* content_settings = |
+ TabSpecificContentSettings::FromWebContents(web_contents()); |
+ const ContentSettingsUsagesState::StateMap& state_map = |
+ content_settings->midi_usages_state().state_map(); |
+ HostContentSettingsMap* settings_map = |
+ profile()->GetHostContentSettingsMap(); |
+ |
+ for (ContentSettingsUsagesState::StateMap::const_iterator it = |
+ state_map.begin(); it != state_map.end(); ++it) { |
+ settings_map->SetContentSetting( |
+ ContentSettingsPattern::FromURLNoWildcard(it->first), |
+ ContentSettingsPattern::Wildcard(), |
+ CONTENT_SETTINGS_TYPE_MIDI_SYSEX, |
+ std::string(), |
+ CONTENT_SETTING_DEFAULT); |
+ } |
+} |
+ |
// static |
ContentSettingBubbleModel* |
ContentSettingBubbleModel::CreateContentSettingBubbleModel( |
@@ -1199,6 +1287,10 @@ ContentSettingBubbleModel* |
return new ContentSettingRPHBubbleModel(delegate, web_contents, profile, |
registry, content_type); |
} |
+ if (content_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) { |
+ return new ContentSettingMIDISysExBubbleModel(delegate, web_contents, |
+ profile, content_type); |
+ } |
return new ContentSettingSingleRadioGroup(delegate, web_contents, profile, |
content_type); |
} |