1 // Copyright (c) 2010 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.
4
5 #include "chrome/browser/content_setting_image_model.h"
6
7 #include "base/command_line.h"
8 #include "chrome/browser/content_settings/host_content_settings_map.h"
9 #include "chrome/browser/prerender/prerender_manager.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "content/browser/tab_contents/tab_contents.h"
12 #include "grit/generated_resources.h"
13 #include "grit/theme_resources.h"
14 #include "ui/base/l10n/l10n_util.h"
15
16 class ContentSettingBlockedImageModel : public ContentSettingImageModel {
17 public:
18 explicit ContentSettingBlockedImageModel(
19 ContentSettingsType content_settings_type);
20
21 virtual void UpdateFromTabContents(TabContents* tab_contents);
22
23 private:
24 static const int kAccessedIconIDs[];
25 static const int kBlockedIconIDs[];
26 static const int kBlockedExplanatoryTextIDs[];
27 static const int kAccessedExplanatoryTextIDs[];
28 static const int kAccessedTooltipIDs[];
29 static const int kBlockedTooltipIDs[];
30 };
31
32 class ContentSettingGeolocationImageModel : public ContentSettingImageModel {
33 public:
34 ContentSettingGeolocationImageModel();
35
36 virtual void UpdateFromTabContents(TabContents* tab_contents) OVERRIDE;
37 };
38
39 class ContentSettingNotificationsImageModel : public ContentSettingImageModel {
40 public:
41 ContentSettingNotificationsImageModel();
42
43 virtual void UpdateFromTabContents(TabContents* tab_contents) OVERRIDE;
44 };
45
46 class ContentSettingPrerenderImageModel : public ContentSettingImageModel {
47 public:
48 ContentSettingPrerenderImageModel();
49
50 virtual void UpdateFromTabContents(TabContents* tab_contents) OVERRIDE;
51 };
52
53 const int ContentSettingBlockedImageModel::kBlockedIconIDs[] = {
54 IDR_BLOCKED_COOKIES,
55 IDR_BLOCKED_IMAGES,
56 IDR_BLOCKED_JAVASCRIPT,
57 IDR_BLOCKED_PLUGINS,
58 IDR_BLOCKED_POPUPS,
59 };
60
61 const int ContentSettingBlockedImageModel::kAccessedIconIDs[] = {
62 IDR_ACCESSED_COOKIES,
63 0,
64 0,
65 0,
66 0,
67 };
68
69 const int ContentSettingBlockedImageModel::kBlockedExplanatoryTextIDs[] = {
70 0,
71 0,
72 0,
73 0,
74 IDS_BLOCKED_POPUPS_EXPLANATORY_TEXT,
75 };
76
77 const int ContentSettingBlockedImageModel::kAccessedExplanatoryTextIDs[] = {
78 0,
79 0,
80 0,
81 0,
82 0,
83 };
84
85
86 const int ContentSettingBlockedImageModel::kBlockedTooltipIDs[] = {
87 IDS_BLOCKED_COOKIES_TITLE,
88 IDS_BLOCKED_IMAGES_TITLE,
89 IDS_BLOCKED_JAVASCRIPT_TITLE,
90 IDS_BLOCKED_PLUGINS_MESSAGE,
91 IDS_BLOCKED_POPUPS_TOOLTIP,
92 };
93
94 const int ContentSettingBlockedImageModel::kAccessedTooltipIDs[] = {
95 IDS_ACCESSED_COOKIES_TITLE,
96 0,
97 0,
98 0,
99 0,
100 };
101
ContentSettingBlockedImageModel(ContentSettingsType content_settings_type)102 ContentSettingBlockedImageModel::ContentSettingBlockedImageModel(
103 ContentSettingsType content_settings_type)
104 : ContentSettingImageModel(content_settings_type) {
105 }
106
UpdateFromTabContents(TabContents * tab_contents)107 void ContentSettingBlockedImageModel::UpdateFromTabContents(
108 TabContents* tab_contents) {
109 set_visible(false);
110 if (!tab_contents)
111 return;
112
113 const int* icon_ids = kBlockedIconIDs;
114 const int* tooltip_ids = kBlockedTooltipIDs;
115 const int* explanatory_string_ids = kBlockedExplanatoryTextIDs;
116 // If a content type is blocked by default and was accessed, display the
117 // accessed icon.
118 TabSpecificContentSettings* content_settings =
119 tab_contents->GetTabSpecificContentSettings();
120 if (!content_settings->IsContentBlocked(get_content_settings_type())) {
121 if (!content_settings->IsContentAccessed(get_content_settings_type()) ||
122 (tab_contents->profile()->GetHostContentSettingsMap()->
123 GetDefaultContentSetting(get_content_settings_type()) !=
124 CONTENT_SETTING_BLOCK))
125 return;
126 icon_ids = kAccessedIconIDs;
127 tooltip_ids = kAccessedTooltipIDs;
128 explanatory_string_ids = kAccessedExplanatoryTextIDs;
129 }
130 set_visible(true);
131 set_icon(icon_ids[get_content_settings_type()]);
132 set_explanatory_string_id(
133 explanatory_string_ids[get_content_settings_type()]);
134 set_tooltip(
135 l10n_util::GetStringUTF8(tooltip_ids[get_content_settings_type()]));
136 }
137
ContentSettingGeolocationImageModel()138 ContentSettingGeolocationImageModel::ContentSettingGeolocationImageModel()
139 : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_GEOLOCATION) {
140 }
141
UpdateFromTabContents(TabContents * tab_contents)142 void ContentSettingGeolocationImageModel::UpdateFromTabContents(
143 TabContents* tab_contents) {
144 set_visible(false);
145 if (!tab_contents)
146 return;
147 const GeolocationSettingsState& settings_state = tab_contents->
148 GetTabSpecificContentSettings()->geolocation_settings_state();
149 if (settings_state.state_map().empty())
150 return;
151 set_visible(true);
152
153 // If any embedded site has access the allowed icon takes priority over the
154 // blocked icon.
155 unsigned int tab_state_flags = 0;
156 settings_state.GetDetailedInfo(NULL, &tab_state_flags);
157 bool allowed =
158 !!(tab_state_flags & GeolocationSettingsState::TABSTATE_HAS_ANY_ALLOWED);
159 set_icon(allowed ? IDR_GEOLOCATION_ALLOWED_LOCATIONBAR_ICON :
160 IDR_GEOLOCATION_DENIED_LOCATIONBAR_ICON);
161 set_tooltip(l10n_util::GetStringUTF8(allowed ?
162 IDS_GEOLOCATION_ALLOWED_TOOLTIP : IDS_GEOLOCATION_BLOCKED_TOOLTIP));
163 }
164
ContentSettingNotificationsImageModel()165 ContentSettingNotificationsImageModel::ContentSettingNotificationsImageModel()
166 : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
167 }
168
UpdateFromTabContents(TabContents * tab_contents)169 void ContentSettingNotificationsImageModel::UpdateFromTabContents(
170 TabContents* tab_contents) {
171 // Notifications do not have a bubble.
172 set_visible(false);
173 }
174
ContentSettingPrerenderImageModel()175 ContentSettingPrerenderImageModel::ContentSettingPrerenderImageModel()
176 : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_PRERENDER) {
177 set_tooltip(l10n_util::GetStringUTF8(IDS_PRERENDER_SUCCEED_TOOLTIP));
178 set_icon(IDR_PRERENDER_SUCCEED_ICON);
179 }
180
UpdateFromTabContents(TabContents * tab_contents)181 void ContentSettingPrerenderImageModel::UpdateFromTabContents(
182 TabContents* tab_contents) {
183 bool visibility = false;
184 if (tab_contents) {
185 prerender::PrerenderManager* pm =
186 tab_contents->profile()->GetPrerenderManager();
187 if (pm && pm->IsTabContentsPrerendered(tab_contents))
188 visibility = true;
189 }
190 set_visible(visibility);
191 }
192
ContentSettingImageModel(ContentSettingsType content_settings_type)193 ContentSettingImageModel::ContentSettingImageModel(
194 ContentSettingsType content_settings_type)
195 : content_settings_type_(content_settings_type),
196 is_visible_(false),
197 icon_(0),
198 explanatory_string_id_(0) {
199 }
200
201 // static
202 ContentSettingImageModel*
CreateContentSettingImageModel(ContentSettingsType content_settings_type)203 ContentSettingImageModel::CreateContentSettingImageModel(
204 ContentSettingsType content_settings_type) {
205 switch (content_settings_type) {
206 case CONTENT_SETTINGS_TYPE_GEOLOCATION:
207 return new ContentSettingGeolocationImageModel();
208 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
209 return new ContentSettingNotificationsImageModel();
210 case CONTENT_SETTINGS_TYPE_PRERENDER:
211 return new ContentSettingPrerenderImageModel();
212 default:
213 return new ContentSettingBlockedImageModel(content_settings_type);
214 }
215 }
216