diff options
Diffstat (limited to 'chrome/browser/content_setting_bubble_model.cc')
-rw-r--r-- | chrome/browser/content_setting_bubble_model.cc | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/chrome/browser/content_setting_bubble_model.cc b/chrome/browser/content_setting_bubble_model.cc index e361b12..bfa10a0 100644 --- a/chrome/browser/content_setting_bubble_model.cc +++ b/chrome/browser/content_setting_bubble_model.cc @@ -6,6 +6,7 @@ #include "app/l10n_util.h" #include "chrome/browser/blocked_popup_container.h" +#include "chrome/browser/geolocation/geolocation_content_settings_map.h" #include "chrome/browser/host_content_settings_map.h" #include "chrome/browser/pref_service.h" #include "chrome/browser/profile.h" @@ -33,8 +34,10 @@ class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel { IDS_BLOCKED_JAVASCRIPT_TITLE, IDS_BLOCKED_PLUGINS_TITLE, IDS_BLOCKED_POPUPS_TITLE, + 0, // Geolocation does not have an overall title. }; - set_title(l10n_util::GetStringUTF8(kTitleIDs[content_type()])); + if (kTitleIDs[content_type()]) + set_title(l10n_util::GetStringUTF8(kTitleIDs[content_type()])); } void SetManageLink() { @@ -44,6 +47,7 @@ class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel { IDS_BLOCKED_JAVASCRIPT_LINK, IDS_BLOCKED_PLUGINS_LINK, IDS_BLOCKED_POPUPS_LINK, + IDS_GEOLOCATION_BUBBLE_MANAGE_LINK, }; set_manage_link(l10n_util::GetStringUTF8(kLinkIDs[content_type()])); } @@ -80,6 +84,7 @@ class ContentSettingSingleRadioGroup : public ContentSettingTitleAndLinkModel { IDS_BLOCKED_JAVASCRIPT_UNBLOCK, IDS_BLOCKED_PLUGINS_UNBLOCK, IDS_BLOCKED_POPUPS_UNBLOCK, + 0, // We don't manage geolocation here. }; std::string radio_allow_label; radio_allow_label = l10n_util::GetStringFUTF8( @@ -91,6 +96,7 @@ class ContentSettingSingleRadioGroup : public ContentSettingTitleAndLinkModel { IDS_BLOCKED_JAVASCRIPT_NO_ACTION, IDS_BLOCKED_PLUGINS_NO_ACTION, IDS_BLOCKED_POPUPS_NO_ACTION, + 0, // We don't manage geolocation here. }; std::string radio_block_label; radio_block_label = l10n_util::GetStringFUTF8( @@ -149,6 +155,63 @@ class ContentSettingPopupBubbleModel : public ContentSettingSingleRadioGroup { } }; +class ContentSettingDomainListBubbleModel + : public ContentSettingTitleAndLinkModel { + public: + ContentSettingDomainListBubbleModel(TabContents* tab_contents, + Profile* profile, + ContentSettingsType content_type) + : ContentSettingTitleAndLinkModel(tab_contents, profile, content_type) { + DCHECK_EQ(CONTENT_SETTINGS_TYPE_GEOLOCATION, content_type) << + "SetDomains currently only supports geolocation content type"; + SetDomains(); + SetClearLink(); + } + + private: + void MaybeAddDomainList(DomainList* domain_list, int title_id) { + if (!domain_list->hosts.empty()) { + domain_list->title = l10n_util::GetStringUTF8(title_id); + add_domain_list(*domain_list); + } + } + void SetDomains() { + const TabContents::GeolocationContentSettings& settings = + tab_contents()->geolocation_content_settings(); + + // Divide the tab's current geolocation users into sets according to their + // permission state. + DomainList domains[CONTENT_SETTING_NUM_SETTINGS]; + for (TabContents::GeolocationContentSettings::const_iterator it = + settings.begin(); it != settings.end(); ++it) { + domains[it->second].hosts.insert(it->first.host()); + } + MaybeAddDomainList(&domains[CONTENT_SETTING_ALLOW], + IDS_GEOLOCATION_BUBBLE_SECTION_ALLOWED); + MaybeAddDomainList(&domains[CONTENT_SETTING_BLOCK], + IDS_GEOLOCATION_BUBBLE_SECTION_DENIED); + } + void SetClearLink() { + set_clear_link(l10n_util::GetStringUTF8(IDS_GEOLOCATION_BUBBLE_CLEAR_LINK)); + } + virtual void OnClearLinkClicked() { + if (!tab_contents()) + return; + // Reset this embedder's entry to default for each of the requesting + // origins currently on the page. + const GURL& embedder_url = tab_contents()->GetURL(); + const TabContents::GeolocationContentSettings& settings = + tab_contents()->geolocation_content_settings(); + GeolocationContentSettingsMap* settings_map = + profile()->GetGeolocationContentSettingsMap(); + for (TabContents::GeolocationContentSettings::const_iterator it = + settings.begin(); it != settings.end(); ++it) { + settings_map->SetContentSetting(it->first, embedder_url, + CONTENT_SETTING_DEFAULT); + } + } +}; + // static ContentSettingBubbleModel* ContentSettingBubbleModel::CreateContentSettingBubbleModel( @@ -163,6 +226,10 @@ ContentSettingBubbleModel* return new ContentSettingPopupBubbleModel(tab_contents, profile, content_type); } + if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { + return new ContentSettingDomainListBubbleModel(tab_contents, profile, + content_type); + } return new ContentSettingSingleRadioGroup(tab_contents, profile, content_type); } |