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 102 ContentSettingBlockedImageModel::ContentSettingBlockedImageModel( 103 ContentSettingsType content_settings_type) 104 : ContentSettingImageModel(content_settings_type) { 105 } 106 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 138 ContentSettingGeolocationImageModel::ContentSettingGeolocationImageModel() 139 : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_GEOLOCATION) { 140 } 141 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 165 ContentSettingNotificationsImageModel::ContentSettingNotificationsImageModel() 166 : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { 167 } 168 169 void ContentSettingNotificationsImageModel::UpdateFromTabContents( 170 TabContents* tab_contents) { 171 // Notifications do not have a bubble. 172 set_visible(false); 173 } 174 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 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 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* 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