Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Unified Diff: chrome/browser/ui/views/tabs/tab.cc

Issue 2126103003: Change chrome:// favicons in tabstrip based on theming. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2785
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.h ('k') | ui/base/default_theme_provider.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/tabs/tab.cc
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index 7c1262c79c8fd33eaaa2971c442fc08f7c5c0ad9..c76f68ce3437911c58368c7bbb32e4e5370cfdb4 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -23,8 +23,10 @@
#include "chrome/browser/ui/views/tabs/tab_controller.h"
#include "chrome/browser/ui/views/touch_uma/touch_uma.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/user_metrics.h"
+#include "content/public/common/url_constants.h"
#include "grit/components_scaled_resources.h"
#include "grit/components_strings.h"
#include "grit/theme_resources.h"
@@ -137,6 +139,14 @@ void DrawHighlight(gfx::Canvas* canvas,
paint);
}
+// Returns whether the favicon for the given URL should be colored according to
+// the browser theme.
+bool ShouldThemifyFaviconForUrl(const GURL& url) {
+ return url.SchemeIs(content::kChromeUIScheme) &&
+ url.host() != chrome::kChromeUIHelpHost &&
+ url.host() != chrome::kChromeUIUberHost;
+}
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -163,7 +173,7 @@ class Tab::FaviconCrashAnimation : public gfx::LinearAnimation,
static_cast<int>(floor(kHidingOffset * 2.0 * state)));
} else {
// Animate the crashed icon up.
- target_->set_should_display_crashed_favicon();
+ target_->SetShouldDisplayCrashedFavicon(true);
target_->SetFaviconHidingOffset(
static_cast<int>(
floor(kHidingOffset - ((state - .5) * 2.0 * kHidingOffset))));
@@ -610,7 +620,7 @@ void Tab::SetData(const TabRendererData& data) {
if (!data_.IsCrashed()) {
crash_icon_animation_->Stop();
- should_display_crashed_favicon_ = false;
+ SetShouldDisplayCrashedFavicon(false);
favicon_hiding_offset_ = 0;
} else if (!should_display_crashed_favicon_ &&
!crash_icon_animation_->is_animating()) {
@@ -982,6 +992,7 @@ void Tab::Layout() {
void Tab::OnThemeChanged() {
LoadTabImages();
OnButtonColorMaybeChanged();
+ favicon_ = gfx::ImageSkia();
}
const char* Tab::GetClassName() const {
@@ -1164,6 +1175,12 @@ void Tab::MaybeAdjustLeftForPinnedTab(gfx::Rect* bounds) const {
}
void Tab::DataChanged(const TabRendererData& old) {
+ // We may overzealously reset the favicon cache here but this check eliminates
+ // at least some unnecessary re-computations and fixes the behavior of
+ // about:crash.
+ if (!old.favicon.BackedBySameObjectAs(data().favicon))
+ favicon_ = gfx::ImageSkia();
+
if (data().alert_state != old.alert_state || data().title != old.title)
TooltipTextChanged();
@@ -1423,18 +1440,17 @@ void Tab::PaintTabFill(gfx::Canvas* canvas,
void Tab::PaintPinnedTabTitleChangedIndicatorAndIcon(
gfx::Canvas* canvas,
- const gfx::ImageSkia& favicon,
const gfx::Rect& favicon_draw_bounds) {
// The pinned tab title changed indicator consists of two parts:
// . a clear (totally transparent) part over the bottom right (or left in rtl)
// of the favicon. This is done by drawing the favicon to a canvas, then
// drawing the clear part on top of the favicon.
// . a circle in the bottom right (or left in rtl) of the favicon.
- if (!favicon.isNull()) {
+ if (!favicon_.isNull()) {
const float kIndicatorCropRadius = 4.5;
gfx::Canvas icon_canvas(gfx::Size(gfx::kFaviconSize, gfx::kFaviconSize),
canvas->image_scale(), false);
- icon_canvas.DrawImageInt(favicon, 0, 0);
+ icon_canvas.DrawImageInt(favicon_, 0, 0);
SkPaint clear_paint;
clear_paint.setAntiAlias(true);
clear_paint.setXfermodeMode(SkXfermode::kClear_Mode);
@@ -1470,21 +1486,34 @@ void Tab::PaintIcon(gfx::Canvas* canvas) {
if (bounds.IsEmpty())
return;
- if (data().network_state != TabRendererData::NETWORK_STATE_NONE) {
- // Throbber will do its own painting.
+ // Throbber will do its own painting.
+ if (data().network_state != TabRendererData::NETWORK_STATE_NONE)
return;
+
+ // Ensure that |favicon_| is created.
+ if (favicon_.isNull()) {
+ ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
+ favicon_ = should_display_crashed_favicon_
+ ? *rb->GetImageSkiaNamed(IDR_CRASH_SAD_FAVICON)
+ : data().favicon;
+ // Themify the icon if it's a chrome:// page or if it's the sadtab favicon.
+ // This ensures chrome:// pages are visible over the tab background. This is
+ // similar to code in the bookmarks bar.
+ if (!favicon_.isNull() &&
+ (should_display_crashed_favicon_ ||
+ favicon_.BackedBySameObjectAs(
+ *rb->GetImageSkiaNamed(IDR_DEFAULT_FAVICON)) ||
+ ShouldThemifyFaviconForUrl(data().url))) {
+ favicon_ = gfx::ImageSkiaOperations::CreateHSLShiftedImage(
+ favicon_, GetThemeProvider()->GetTint(ThemeProperties::TINT_BUTTONS));
+ }
}
- const gfx::ImageSkia& favicon =
- should_display_crashed_favicon_
- ? *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
- IDR_CRASH_SAD_FAVICON)
- : data().favicon;
if (showing_pinned_tab_title_changed_indicator_ &&
!should_display_crashed_favicon_) {
- PaintPinnedTabTitleChangedIndicatorAndIcon(canvas, favicon, bounds);
- } else if (!favicon.isNull()) {
- canvas->DrawImageInt(favicon, 0, 0, bounds.width(), bounds.height(),
+ PaintPinnedTabTitleChangedIndicatorAndIcon(canvas, bounds);
+ } else if (!favicon_.isNull()) {
+ canvas->DrawImageInt(favicon_, 0, 0, bounds.width(), bounds.height(),
bounds.x(), bounds.y(), bounds.width(),
bounds.height(), false);
}
@@ -1598,6 +1627,14 @@ double Tab::GetThrobValue() {
return val;
}
+void Tab::SetShouldDisplayCrashedFavicon(bool value) {
+ if (value == should_display_crashed_favicon_)
+ return;
+
+ should_display_crashed_favicon_ = value;
+ favicon_ = gfx::ImageSkia();
+}
+
void Tab::SetFaviconHidingOffset(int offset) {
favicon_hiding_offset_ = offset;
ScheduleIconPaint();
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.h ('k') | ui/base/default_theme_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698