// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/content_setting_image_model.h" #include "base/command_line.h" #include "chrome/browser/content_settings/host_content_settings_map.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/profiles/profile.h" #include "content/browser/tab_contents/tab_contents.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" class ContentSettingBlockedImageModel : public ContentSettingImageModel { public: explicit ContentSettingBlockedImageModel( ContentSettingsType content_settings_type); virtual void UpdateFromTabContents(TabContents* tab_contents); private: static const int kAccessedIconIDs[]; static const int kBlockedIconIDs[]; static const int kBlockedExplanatoryTextIDs[]; static const int kAccessedExplanatoryTextIDs[]; static const int kAccessedTooltipIDs[]; static const int kBlockedTooltipIDs[]; }; class ContentSettingGeolocationImageModel : public ContentSettingImageModel { public: ContentSettingGeolocationImageModel(); virtual void UpdateFromTabContents(TabContents* tab_contents) OVERRIDE; }; class ContentSettingNotificationsImageModel : public ContentSettingImageModel { public: ContentSettingNotificationsImageModel(); virtual void UpdateFromTabContents(TabContents* tab_contents) OVERRIDE; }; class ContentSettingPrerenderImageModel : public ContentSettingImageModel { public: ContentSettingPrerenderImageModel(); virtual void UpdateFromTabContents(TabContents* tab_contents) OVERRIDE; }; const int ContentSettingBlockedImageModel::kBlockedIconIDs[] = { IDR_BLOCKED_COOKIES, IDR_BLOCKED_IMAGES, IDR_BLOCKED_JAVASCRIPT, IDR_BLOCKED_PLUGINS, IDR_BLOCKED_POPUPS, }; const int ContentSettingBlockedImageModel::kAccessedIconIDs[] = { IDR_ACCESSED_COOKIES, 0, 0, 0, 0, }; const int ContentSettingBlockedImageModel::kBlockedExplanatoryTextIDs[] = { 0, 0, 0, 0, IDS_BLOCKED_POPUPS_EXPLANATORY_TEXT, }; const int ContentSettingBlockedImageModel::kAccessedExplanatoryTextIDs[] = { 0, 0, 0, 0, 0, }; const int ContentSettingBlockedImageModel::kBlockedTooltipIDs[] = { IDS_BLOCKED_COOKIES_TITLE, IDS_BLOCKED_IMAGES_TITLE, IDS_BLOCKED_JAVASCRIPT_TITLE, IDS_BLOCKED_PLUGINS_MESSAGE, IDS_BLOCKED_POPUPS_TOOLTIP, }; const int ContentSettingBlockedImageModel::kAccessedTooltipIDs[] = { IDS_ACCESSED_COOKIES_TITLE, 0, 0, 0, 0, }; ContentSettingBlockedImageModel::ContentSettingBlockedImageModel( ContentSettingsType content_settings_type) : ContentSettingImageModel(content_settings_type) { } void ContentSettingBlockedImageModel::UpdateFromTabContents( TabContents* tab_contents) { set_visible(false); if (!tab_contents) return; const int* icon_ids = kBlockedIconIDs; const int* tooltip_ids = kBlockedTooltipIDs; const int* explanatory_string_ids = kBlockedExplanatoryTextIDs; // If a content type is blocked by default and was accessed, display the // accessed icon. TabSpecificContentSettings* content_settings = tab_contents->GetTabSpecificContentSettings(); if (!content_settings->IsContentBlocked(get_content_settings_type())) { if (!content_settings->IsContentAccessed(get_content_settings_type()) || (tab_contents->profile()->GetHostContentSettingsMap()-> GetDefaultContentSetting(get_content_settings_type()) != CONTENT_SETTING_BLOCK)) return; icon_ids = kAccessedIconIDs; tooltip_ids = kAccessedTooltipIDs; explanatory_string_ids = kAccessedExplanatoryTextIDs; } set_visible(true); set_icon(icon_ids[get_content_settings_type()]); set_explanatory_string_id( explanatory_string_ids[get_content_settings_type()]); set_tooltip( l10n_util::GetStringUTF8(tooltip_ids[get_content_settings_type()])); } ContentSettingGeolocationImageModel::ContentSettingGeolocationImageModel() : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_GEOLOCATION) { } void ContentSettingGeolocationImageModel::UpdateFromTabContents( TabContents* tab_contents) { set_visible(false); if (!tab_contents) return; const GeolocationSettingsState& settings_state = tab_contents-> GetTabSpecificContentSettings()->geolocation_settings_state(); if (settings_state.state_map().empty()) return; set_visible(true); // If any embedded site has access the allowed icon takes priority over the // blocked icon. unsigned int tab_state_flags = 0; settings_state.GetDetailedInfo(NULL, &tab_state_flags); bool allowed = !!(tab_state_flags & GeolocationSettingsState::TABSTATE_HAS_ANY_ALLOWED); set_icon(allowed ? IDR_GEOLOCATION_ALLOWED_LOCATIONBAR_ICON : IDR_GEOLOCATION_DENIED_LOCATIONBAR_ICON); set_tooltip(l10n_util::GetStringUTF8(allowed ? IDS_GEOLOCATION_ALLOWED_TOOLTIP : IDS_GEOLOCATION_BLOCKED_TOOLTIP)); } ContentSettingNotificationsImageModel::ContentSettingNotificationsImageModel() : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { } void ContentSettingNotificationsImageModel::UpdateFromTabContents( TabContents* tab_contents) { // Notifications do not have a bubble. set_visible(false); } ContentSettingPrerenderImageModel::ContentSettingPrerenderImageModel() : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_PRERENDER) { set_tooltip(l10n_util::GetStringUTF8(IDS_PRERENDER_SUCCEED_TOOLTIP)); set_icon(IDR_PRERENDER_SUCCEED_ICON); } void ContentSettingPrerenderImageModel::UpdateFromTabContents( TabContents* tab_contents) { bool visibility = false; if (tab_contents) { prerender::PrerenderManager* pm = tab_contents->profile()->GetPrerenderManager(); if (pm && pm->IsTabContentsPrerendered(tab_contents)) visibility = true; } set_visible(visibility); } ContentSettingImageModel::ContentSettingImageModel( ContentSettingsType content_settings_type) : content_settings_type_(content_settings_type), is_visible_(false), icon_(0), explanatory_string_id_(0) { } // static ContentSettingImageModel* ContentSettingImageModel::CreateContentSettingImageModel( ContentSettingsType content_settings_type) { switch (content_settings_type) { case CONTENT_SETTINGS_TYPE_GEOLOCATION: return new ContentSettingGeolocationImageModel(); case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: return new ContentSettingNotificationsImageModel(); case CONTENT_SETTINGS_TYPE_PRERENDER: return new ContentSettingPrerenderImageModel(); default: return new ContentSettingBlockedImageModel(content_settings_type); } }