Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Unified Diff: chrome/browser/ui/content_settings/content_setting_bubble_model.cc

Issue 10584042: Bring up a content settings icon for ungestured registerProtocolHandler call. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Repair merge to head Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 d06e2f0b466ad0fe43679b7f1f656fb4fa972a15..5e82fcde5781a0dcfe0b13fb6ca75e9d655b13c9 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/content_settings/content_settings_utils.h"
#include "chrome/browser/content_settings/cookie_settings.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
+#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
#include "chrome/browser/favicon/favicon_tab_helper.h"
#include "chrome/browser/infobars/infobar_tab_helper.h"
#include "chrome/browser/prefs/pref_service.h"
@@ -128,6 +129,7 @@ class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel {
{CONTENT_SETTINGS_TYPE_POPUPS, IDS_BLOCKED_POPUPS_LINK},
{CONTENT_SETTINGS_TYPE_GEOLOCATION, IDS_GEOLOCATION_BUBBLE_MANAGE_LINK},
{CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, IDS_LEARN_MORE},
+ {CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, IDS_HANDLERS_BUBBLE_MANAGE_LINK}
};
set_manage_link(l10n_util::GetStringUTF8(
GetIdForContentType(kLinkIDs, arraysize(kLinkIDs), content_type())));
@@ -520,26 +522,190 @@ class ContentSettingMixedScriptBubbleModel
ContentSettingMixedScriptBubbleModel(Delegate* delegate,
TabContents* tab_contents,
Profile* profile,
- ContentSettingsType content_type)
- : ContentSettingTitleLinkAndCustomModel(
- delegate, tab_contents, profile, content_type) {
- DCHECK_EQ(content_type, CONTENT_SETTINGS_TYPE_MIXEDSCRIPT);
- set_custom_link_enabled(true);
- }
+ ContentSettingsType content_type);
virtual ~ContentSettingMixedScriptBubbleModel() {}
private:
- virtual void OnCustomLinkClicked() OVERRIDE {
- content::RecordAction(UserMetricsAction("MixedScript_LoadAnyway_Bubble"));
- DCHECK(tab_contents());
- content::RenderViewHost* host =
- tab_contents()->web_contents()->GetRenderViewHost();
- host->Send(new ChromeViewMsg_SetAllowRunningInsecureContent(
- host->GetRoutingID(), true));
- }
+ virtual void OnCustomLinkClicked() OVERRIDE;
+};
+
+ContentSettingMixedScriptBubbleModel::ContentSettingMixedScriptBubbleModel(
+ Delegate* delegate,
+ TabContents* tab_contents,
+ Profile* profile,
+ ContentSettingsType content_type)
+ : ContentSettingTitleLinkAndCustomModel(
+ delegate, tab_contents, profile, content_type) {
+ DCHECK_EQ(content_type, CONTENT_SETTINGS_TYPE_MIXEDSCRIPT);
+ set_custom_link_enabled(true);
+}
+
+void ContentSettingMixedScriptBubbleModel::OnCustomLinkClicked() {
+ content::RecordAction(UserMetricsAction("MixedScript_LoadAnyway_Bubble"));
+ DCHECK(tab_contents());
+ content::RenderViewHost* host =
+ tab_contents()->web_contents()->GetRenderViewHost();
+ host->Send(new ChromeViewMsg_SetAllowRunningInsecureContent(
+ host->GetRoutingID(), true));
+}
+
+class ContentSettingRPHBubbleModel : public ContentSettingTitleAndLinkModel {
+ public:
+ ContentSettingRPHBubbleModel(Delegate* delegate,
+ TabContents* tab_contents,
+ Profile* profile,
+ ContentSettingsType content_type);
+
+ virtual void OnCustomLinkClicked();
Bernhard Bauer 2012/07/02 23:13:15 Nit: add "override"?
Greg Billock 2012/07/03 20:33:03 Done.
+ virtual void OnRadioClicked(int radio_index);
+
+ private:
+ // These states must match the order of appearance of the radio buttons
+ // in the XIB file for the Mac port.
+ enum RPHState {
+ RPH_ALLOW = 0,
+ RPH_BLOCK,
+ RPH_IGNORE,
+ };
+
+ void RegisterProtocolHandler();
+ void UnregisterProtocolHandler();
+ void IgnoreProtocolHandler();
+ void ClearOrSetPreviousHandler();
+
+ int selected_item_;
+ ProtocolHandler pending_handler_;
+ ProtocolHandler previous_handler_;
};
+ContentSettingRPHBubbleModel::ContentSettingRPHBubbleModel(
+ Delegate* delegate,
+ TabContents* tab_contents,
+ Profile* profile,
+ ContentSettingsType content_type)
+ : ContentSettingTitleAndLinkModel(
+ delegate, tab_contents, profile, content_type),
+ selected_item_(0),
+ pending_handler_(ProtocolHandler::EmptyProtocolHandler()),
+ previous_handler_(ProtocolHandler::EmptyProtocolHandler()) {
+ DCHECK_EQ(CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, content_type);
+
+ TabSpecificContentSettings* content_settings =
+ tab_contents->content_settings();
+ pending_handler_ = content_settings->pending_protocol_handler();
+ previous_handler_ = content_settings->previous_protocol_handler();
+
+ string16 protocol;
+ if (pending_handler_.protocol() == "mailto") {
+ protocol = l10n_util::GetStringUTF16(
+ IDS_REGISTER_PROTOCOL_HANDLER_MAILTO_NAME);
+ } else if (pending_handler_.protocol() == "webcal") {
+ protocol = l10n_util::GetStringUTF16(
+ IDS_REGISTER_PROTOCOL_HANDLER_WEBCAL_NAME);
+ } else {
+ protocol = UTF8ToUTF16(pending_handler_.protocol());
+ }
+
+ if (previous_handler_.IsEmpty()) {
+ set_title(l10n_util::GetStringFUTF8(
+ IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM,
+ pending_handler_.title(), UTF8ToUTF16(pending_handler_.url().host()),
+ protocol));
+ } else {
+ set_title(l10n_util::GetStringFUTF8(
+ IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM_REPLACE,
+ pending_handler_.title(), UTF8ToUTF16(pending_handler_.url().host()),
+ protocol, previous_handler_.title()));
+ }
+
+ std::string radio_allow_label =
+ l10n_util::GetStringFUTF8(IDS_REGISTER_PROTOCOL_HANDLER_ACCEPT,
+ pending_handler_.title());
+ std::string radio_deny_label =
+ l10n_util::GetStringUTF8(IDS_REGISTER_PROTOCOL_HANDLER_DENY);
+ std::string radio_ignore_label =
+ l10n_util::GetStringUTF8(IDS_REGISTER_PROTOCOL_HANDLER_IGNORE);
+
+ GURL url = tab_contents->web_contents()->GetURL();
+ RadioGroup radio_group;
+ radio_group.url = url;
+
+ radio_group.radio_items.push_back(radio_allow_label);
+ radio_group.radio_items.push_back(radio_deny_label);
+ radio_group.radio_items.push_back(radio_ignore_label);
+ ContentSetting setting =
+ content_settings->pending_protocol_handler_setting();
+ if (setting == CONTENT_SETTING_ALLOW)
+ radio_group.default_item = RPH_ALLOW;
+ else if (setting == CONTENT_SETTING_BLOCK)
+ radio_group.default_item = RPH_BLOCK;
+ else
+ radio_group.default_item = RPH_IGNORE;
+
+ selected_item_ = radio_group.default_item;
+ set_radio_group_enabled(true);
+ set_radio_group(radio_group);
+}
+
+void ContentSettingRPHBubbleModel::OnCustomLinkClicked() {
+ RegisterProtocolHandler();
Bernhard Bauer 2012/07/02 23:13:15 I think this method isn't called?
Greg Billock 2012/07/03 20:33:03 Done.
+}
+
+void ContentSettingRPHBubbleModel::OnRadioClicked(int radio_index) {
+ if (selected_item_ == radio_index)
+ return;
+
+ selected_item_ = radio_index;
+
+ if (radio_index == RPH_ALLOW)
+ RegisterProtocolHandler();
+ else if (radio_index == RPH_BLOCK)
+ UnregisterProtocolHandler();
+ else if (radio_index == RPH_IGNORE)
+ IgnoreProtocolHandler();
+ else
+ NOTREACHED();
+}
+
+void ContentSettingRPHBubbleModel::RegisterProtocolHandler() {
+ // A no-op if the handler hasn't been ignored, but needed in case the user
+ // selects sequences like register/ignore/register.
+ profile()->GetProtocolHandlerRegistry()->RemoveIgnoredHandler(
+ pending_handler_);
+
+ profile()->GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(
+ pending_handler_);
+ tab_contents()->content_settings()->set_pending_protocol_handler_setting(
+ CONTENT_SETTING_ALLOW);
+}
+
+void ContentSettingRPHBubbleModel::UnregisterProtocolHandler() {
+ profile()->GetProtocolHandlerRegistry()->OnDenyRegisterProtocolHandler(
+ pending_handler_);
+ tab_contents()->content_settings()->set_pending_protocol_handler_setting(
+ CONTENT_SETTING_BLOCK);
+ ClearOrSetPreviousHandler();
+}
+
+void ContentSettingRPHBubbleModel::IgnoreProtocolHandler() {
+ profile()->GetProtocolHandlerRegistry()->OnIgnoreRegisterProtocolHandler(
+ pending_handler_);
+ tab_contents()->content_settings()->set_pending_protocol_handler_setting(
+ CONTENT_SETTING_DEFAULT);
+ ClearOrSetPreviousHandler();
+}
+
+void ContentSettingRPHBubbleModel::ClearOrSetPreviousHandler() {
+ if (previous_handler_.IsEmpty()) {
+ profile()->GetProtocolHandlerRegistry()->ClearDefault(
+ pending_handler_.protocol());
+ } else {
+ profile()->GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(
+ previous_handler_);
+ }
+}
+
// static
ContentSettingBubbleModel*
ContentSettingBubbleModel::CreateContentSettingBubbleModel(
@@ -567,6 +733,10 @@ ContentSettingBubbleModel*
return new ContentSettingMixedScriptBubbleModel(delegate, tab_contents,
profile, content_type);
}
+ if (content_type == CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS) {
+ return new ContentSettingRPHBubbleModel(delegate, tab_contents, profile,
+ content_type);
+ }
return new ContentSettingSingleRadioGroup(delegate, tab_contents, profile,
content_type);
}

Powered by Google App Engine
This is Rietveld 408576698