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 d3ffc5f38edb460d0befa9f539e5de1207efc9b3..6df01e27b9814d564359ce6c8ec0fe113a9aa4ed 100644 |
--- a/chrome/browser/ui/views/tabs/tab.cc |
+++ b/chrome/browser/ui/views/tabs/tab.cc |
@@ -165,7 +165,8 @@ class Tab::FaviconCrashAnimation : public gfx::LinearAnimation, |
// gfx::Animation overrides: |
void AnimateToState(double state) override { |
- const double kHidingOffset = 27; |
+ const double kHidingOffset = |
+ Tab::GetMinimumInactiveSize().height() - GetLayoutInsets(TAB).height(); |
if (state < .5) { |
// Animate the normal icon down. |
@@ -173,18 +174,13 @@ class Tab::FaviconCrashAnimation : public gfx::LinearAnimation, |
static_cast<int>(floor(kHidingOffset * 2.0 * state))); |
} else { |
// Animate the crashed icon up. |
- target_->DisplayCrashedFavicon(); |
+ target_->set_should_display_crashed_favicon(); |
target_->SetFaviconHidingOffset( |
static_cast<int>( |
floor(kHidingOffset - ((state - .5) * 2.0 * kHidingOffset)))); |
} |
} |
- // gfx::AnimationDelegate overrides: |
- void AnimationCanceled(const gfx::Animation* animation) override { |
- target_->SetFaviconHidingOffset(0); |
- } |
- |
private: |
Tab* target_; |
@@ -471,36 +467,37 @@ void Tab::SetData(const TabRendererData& data) { |
title_->SetText(title); |
if (data_.IsCrashed()) { |
- if (!should_display_crashed_favicon_ && !IsPerformingCrashAnimation()) { |
+ if (!should_display_crashed_favicon_ && !crash_icon_animation_) { |
data_.media_state = TAB_MEDIA_STATE_NONE; |
+ bool start_crash_animation = true; |
#if defined(OS_CHROMEOS) |
// On Chrome OS, we reload killed tabs automatically when the user |
// switches to them. Don't display animations for these unless they're |
// selected (i.e. in the foreground) -- we won't reload these |
// automatically since we don't want to get into a crash loop. |
- if (IsSelected() || |
- (data_.crashed_status |
- != base::TERMINATION_STATUS_PROCESS_WAS_KILLED && |
- data_.crashed_status |
- != base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM)) { |
- StartCrashAnimation(); |
- } |
-#else |
- StartCrashAnimation(); |
+ start_crash_animation = IsSelected() || |
+ (data_.crashed_status != |
+ base::TERMINATION_STATUS_PROCESS_WAS_KILLED && |
+ data_.crashed_status != |
+ base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM); |
#endif |
+ if (start_crash_animation) { |
+ crash_icon_animation_.reset(new FaviconCrashAnimation(this)); |
+ crash_icon_animation_->Start(); |
+ } |
} |
} else { |
- if (IsPerformingCrashAnimation()) |
- StopCrashAnimation(); |
- ResetCrashedFavicon(); |
+ if (crash_icon_animation_) |
+ crash_icon_animation_.reset(); |
+ should_display_crashed_favicon_ = false; |
+ favicon_hiding_offset_ = 0; |
} |
if (data_.media_state != old.media_state) |
media_indicator_button_->TransitionToMediaState(data_.media_state); |
- if (old.pinned != data_.pinned) { |
- StopAndDeleteAnimation(pinned_title_change_animation_.Pass()); |
- } |
+ if (old.pinned != data_.pinned) |
+ StopPinnedTabTitleAnimation(); |
DataChanged(old); |
@@ -1347,11 +1344,12 @@ void Tab::PaintActiveTabBackground(gfx::Canvas* canvas) { |
void Tab::PaintIcon(gfx::Canvas* canvas) { |
gfx::Rect bounds = favicon_bounds_; |
+ bounds.set_x(GetMirroredXForRect(bounds)); |
+ bounds.Offset(0, favicon_hiding_offset_); |
+ bounds.Intersect(GetInteriorBounds()); |
if (bounds.IsEmpty()) |
return; |
- bounds.set_x(GetMirroredXForRect(bounds)); |
- |
if (data().network_state != TabRendererData::NETWORK_STATE_NONE) { |
// Paint network activity (aka throbber) animation frame. |
ui::ThemeProvider* tp = GetThemeProvider(); |
@@ -1488,27 +1486,6 @@ void Tab::SetFaviconHidingOffset(int offset) { |
ScheduleIconPaint(); |
} |
-void Tab::DisplayCrashedFavicon() { |
- should_display_crashed_favicon_ = true; |
-} |
- |
-void Tab::ResetCrashedFavicon() { |
- should_display_crashed_favicon_ = false; |
-} |
- |
-void Tab::StopCrashAnimation() { |
- crash_icon_animation_.reset(); |
-} |
- |
-void Tab::StartCrashAnimation() { |
- crash_icon_animation_.reset(new FaviconCrashAnimation(this)); |
- crash_icon_animation_->Start(); |
-} |
- |
-bool Tab::IsPerformingCrashAnimation() const { |
- return crash_icon_animation_.get() && data_.IsCrashed(); |
-} |
- |
void Tab::OnButtonColorMaybeChanged() { |
// The theme provider may be null if we're not currently in a widget |
// hierarchy. |
@@ -1537,8 +1514,8 @@ void Tab::ScheduleIconPaint() { |
if (bounds.IsEmpty()) |
return; |
- // Extends the area to the bottom when sad_favicon is animating. |
- if (IsPerformingCrashAnimation()) |
+ // Extends the area to the bottom when the crash animation is in progress. |
+ if (crash_icon_animation_) |
bounds.set_height(height() - bounds.y()); |
bounds.set_x(GetMirroredXForRect(bounds)); |
SchedulePaintInRect(bounds); |