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.
5 #ifndef CHROME_BROWSER_UI_CONTENT_SETTINGS_CONTENT_SETTING_BUBBLE_MODEL_H_
6 #define CHROME_BROWSER_UI_CONTENT_SETTINGS_CONTENT_SETTING_BUBBLE_MODEL_H_
13 #include "base/compiler_specific.h"
14 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
15 #include "chrome/common/content_settings.h"
16 #include "chrome/common/custom_handlers/protocol_handler.h"
17 #include "content/public/browser/notification_observer.h"
18 #include "content/public/browser/notification_registrar.h"
19 #include "content/public/common/media_stream_request.h"
20 #include "ui/gfx/image/image.h"
23 class ContentSettingBubbleModelDelegate
;
25 class ProtocolHandlerRegistry
;
31 // This model provides data for ContentSettingBubble, and also controls
32 // the action triggered when the allow / block radio buttons are triggered.
33 class ContentSettingBubbleModel
: public content::NotificationObserver
{
35 typedef ContentSettingBubbleModelDelegate Delegate
;
38 PopupItem(const gfx::Image
& image
, const std::string
& title
, int32 popup_id
)
39 : image(image
), title(title
), popup_id(popup_id
) {}
45 typedef std::vector
<PopupItem
> PopupItems
;
47 typedef std::vector
<std::string
> RadioItems
;
54 RadioItems radio_items
;
63 std::set
<std::string
> hosts
;
71 content::MediaStreamDevice default_device
;
72 content::MediaStreamDevice selected_device
;
75 typedef std::map
<content::MediaStreamType
, MediaMenu
> MediaMenuMap
;
77 struct BubbleContent
{
82 PopupItems popup_items
;
83 RadioGroup radio_group
;
84 bool radio_group_enabled
;
85 std::vector
<DomainList
> domain_lists
;
86 std::string custom_link
;
87 bool custom_link_enabled
;
88 std::string manage_link
;
89 MediaMenuMap media_menus
;
90 std::string learn_more_link
;
93 DISALLOW_COPY_AND_ASSIGN(BubbleContent
);
96 static ContentSettingBubbleModel
* CreateContentSettingBubbleModel(
98 content::WebContents
* web_contents
,
100 ContentSettingsType content_type
);
102 virtual ~ContentSettingBubbleModel();
104 ContentSettingsType
content_type() const { return content_type_
; }
106 const BubbleContent
& bubble_content() const { return bubble_content_
; }
108 // content::NotificationObserver:
109 virtual void Observe(int type
,
110 const content::NotificationSource
& source
,
111 const content::NotificationDetails
& details
) OVERRIDE
;
113 virtual void OnRadioClicked(int radio_index
) {}
114 virtual void OnPopupClicked(int index
) {}
115 virtual void OnCustomLinkClicked() {}
116 virtual void OnManageLinkClicked() {}
117 virtual void OnLearnMoreLinkClicked() {}
118 virtual void OnMediaMenuClicked(content::MediaStreamType type
,
119 const std::string
& selected_device_id
) {}
121 // Called by the view code when the bubble is closed by the user using the
123 virtual void OnDoneClicked() {}
126 ContentSettingBubbleModel(
127 content::WebContents
* web_contents
,
129 ContentSettingsType content_type
);
131 content::WebContents
* web_contents() const { return web_contents_
; }
132 Profile
* profile() const { return profile_
; }
134 void set_title(const std::string
& title
) { bubble_content_
.title
= title
; }
135 void add_popup(const PopupItem
& popup
) {
136 bubble_content_
.popup_items
.push_back(popup
);
138 void set_radio_group(const RadioGroup
& radio_group
) {
139 bubble_content_
.radio_group
= radio_group
;
141 void set_radio_group_enabled(bool enabled
) {
142 bubble_content_
.radio_group_enabled
= enabled
;
144 void add_domain_list(const DomainList
& domain_list
) {
145 bubble_content_
.domain_lists
.push_back(domain_list
);
147 void set_custom_link(const std::string
& link
) {
148 bubble_content_
.custom_link
= link
;
150 void set_custom_link_enabled(bool enabled
) {
151 bubble_content_
.custom_link_enabled
= enabled
;
153 void set_manage_link(const std::string
& link
) {
154 bubble_content_
.manage_link
= link
;
156 void set_learn_more_link(const std::string
& link
) {
157 bubble_content_
.learn_more_link
= link
;
159 void add_media_menu(content::MediaStreamType type
, const MediaMenu
& menu
) {
160 bubble_content_
.media_menus
[type
] = menu
;
162 void set_selected_device(const content::MediaStreamDevice
& device
) {
163 bubble_content_
.media_menus
[device
.type
].selected_device
= device
;
165 bool setting_is_managed() {
166 return setting_is_managed_
;
168 void set_setting_is_managed(bool managed
) {
169 setting_is_managed_
= managed
;
173 content::WebContents
* web_contents_
;
175 ContentSettingsType content_type_
;
176 BubbleContent bubble_content_
;
177 // A registrar for listening for WEB_CONTENTS_DESTROYED notifications.
178 content::NotificationRegistrar registrar_
;
179 // A flag that indicates if the content setting managed i.e. can't be
180 // controlled by the user.
181 bool setting_is_managed_
;
183 DISALLOW_COPY_AND_ASSIGN(ContentSettingBubbleModel
);
186 class ContentSettingTitleAndLinkModel
: public ContentSettingBubbleModel
{
188 ContentSettingTitleAndLinkModel(Delegate
* delegate
,
189 content::WebContents
* web_contents
,
191 ContentSettingsType content_type
);
192 virtual ~ContentSettingTitleAndLinkModel() {}
193 Delegate
* delegate() const { return delegate_
; }
197 void SetManageLink();
198 void SetLearnMoreLink();
200 // content::ContentSettingBubbleModel:
201 virtual void OnManageLinkClicked() OVERRIDE
;
202 virtual void OnLearnMoreLinkClicked() OVERRIDE
;
206 class ContentSettingRPHBubbleModel
: public ContentSettingTitleAndLinkModel
{
208 ContentSettingRPHBubbleModel(Delegate
* delegate
,
209 content::WebContents
* web_contents
,
211 ProtocolHandlerRegistry
* registry
,
212 ContentSettingsType content_type
);
214 virtual void OnRadioClicked(int radio_index
) OVERRIDE
;
215 virtual void OnDoneClicked() OVERRIDE
;
218 // These states must match the order of appearance of the radio buttons
219 // in the XIB file for the Mac port.
226 void RegisterProtocolHandler();
227 void UnregisterProtocolHandler();
228 void IgnoreProtocolHandler();
229 void ClearOrSetPreviousHandler();
232 ProtocolHandlerRegistry
* registry_
;
233 ProtocolHandler pending_handler_
;
234 ProtocolHandler previous_handler_
;
237 #endif // CHROME_BROWSER_UI_CONTENT_SETTINGS_CONTENT_SETTING_BUBBLE_MODEL_H_