• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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