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::set<std::string> resource_identifiers;
87 std::string custom_link;
88 bool custom_link_enabled;
89 std::string manage_link;
90 MediaMenuMap media_menus;
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 OnMediaMenuClicked(content::MediaStreamType type,
118 const std::string& selected_device_id) {}
120 // Called by the view code when the cancel button in clicked by the user.
121 virtual void OnCancelClicked() {}
123 // Called by the view code when the bubble is closed by the user using the
125 virtual void OnDoneClicked() {}
127 // Called by the view code when the save button in clicked by the user.
128 virtual void OnSaveClicked() {}
131 ContentSettingBubbleModel(
132 content::WebContents* web_contents,
134 ContentSettingsType content_type);
136 content::WebContents* web_contents() const { return web_contents_; }
137 Profile* profile() const { return profile_; }
139 void set_title(const std::string& title) { bubble_content_.title = title; }
140 void add_popup(const PopupItem& popup) {
141 bubble_content_.popup_items.push_back(popup);
143 void set_radio_group(const RadioGroup& radio_group) {
144 bubble_content_.radio_group = radio_group;
146 void set_radio_group_enabled(bool enabled) {
147 bubble_content_.radio_group_enabled = enabled;
149 void add_domain_list(const DomainList& domain_list) {
150 bubble_content_.domain_lists.push_back(domain_list);
152 void set_custom_link(const std::string& link) {
153 bubble_content_.custom_link = link;
155 void set_custom_link_enabled(bool enabled) {
156 bubble_content_.custom_link_enabled = enabled;
158 void set_manage_link(const std::string& link) {
159 bubble_content_.manage_link = link;
161 void add_media_menu(content::MediaStreamType type, const MediaMenu& menu) {
162 bubble_content_.media_menus[type] = menu;
164 void set_selected_device(const content::MediaStreamDevice& device) {
165 bubble_content_.media_menus[device.type].selected_device = device;
167 void AddBlockedResource(const std::string& resource_identifier);
170 content::WebContents* web_contents_;
172 ContentSettingsType content_type_;
173 BubbleContent bubble_content_;
174 // A registrar for listening for WEB_CONTENTS_DESTROYED notifications.
175 content::NotificationRegistrar registrar_;
177 DISALLOW_COPY_AND_ASSIGN(ContentSettingBubbleModel);
180 class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel {
182 ContentSettingTitleAndLinkModel(Delegate* delegate,
183 content::WebContents* web_contents,
185 ContentSettingsType content_type);
186 virtual ~ContentSettingTitleAndLinkModel() {}
187 Delegate* delegate() const { return delegate_; }
190 void SetBlockedResources();
192 void SetManageLink();
193 virtual void OnManageLinkClicked() OVERRIDE;
198 class SavePasswordBubbleModel : public ContentSettingTitleAndLinkModel {
200 SavePasswordBubbleModel(Delegate* delegate,
201 content::WebContents* web_contents,
203 virtual ~SavePasswordBubbleModel();
204 virtual void OnCancelClicked() OVERRIDE;
205 virtual void OnDoneClicked() OVERRIDE;
206 virtual void OnSaveClicked() OVERRIDE;
211 TabSpecificContentSettings::PasswordSavingState state_;
213 DISALLOW_COPY_AND_ASSIGN(SavePasswordBubbleModel);
216 class ContentSettingRPHBubbleModel : public ContentSettingTitleAndLinkModel {
218 ContentSettingRPHBubbleModel(Delegate* delegate,
219 content::WebContents* web_contents,
221 ProtocolHandlerRegistry* registry,
222 ContentSettingsType content_type);
224 virtual void OnRadioClicked(int radio_index) OVERRIDE;
225 virtual void OnDoneClicked() OVERRIDE;
228 // These states must match the order of appearance of the radio buttons
229 // in the XIB file for the Mac port.
236 void RegisterProtocolHandler();
237 void UnregisterProtocolHandler();
238 void IgnoreProtocolHandler();
239 void ClearOrSetPreviousHandler();
242 ProtocolHandlerRegistry* registry_;
243 ProtocolHandler pending_handler_;
244 ProtocolHandler previous_handler_;
247 #endif // CHROME_BROWSER_UI_CONTENT_SETTINGS_CONTENT_SETTING_BUBBLE_MODEL_H_