OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/tabs/tab.h" | 5 #include "chrome/browser/ui/views/tabs/tab.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/alias.h" | 10 #include "base/debug/alias.h" |
11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
12 #include "chrome/browser/defaults.h" | 12 #include "chrome/browser/defaults.h" |
13 #include "chrome/browser/themes/theme_properties.h" | 13 #include "chrome/browser/themes/theme_properties.h" |
14 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
15 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" | 15 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" |
16 #include "chrome/browser/ui/tabs/tab_resources.h" | 16 #include "chrome/browser/ui/tabs/tab_resources.h" |
17 #include "chrome/browser/ui/view_ids.h" | 17 #include "chrome/browser/ui/view_ids.h" |
18 #include "chrome/browser/ui/views/tabs/tab_controller.h" | 18 #include "chrome/browser/ui/views/tabs/tab_controller.h" |
19 #include "chrome/browser/ui/views/theme_image_mapper.h" | 19 #include "chrome/browser/ui/views/theme_image_mapper.h" |
20 #include "chrome/browser/ui/views/touch_uma/touch_uma.h" | 20 #include "chrome/browser/ui/views/touch_uma/touch_uma.h" |
21 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
22 #include "grit/generated_resources.h" | 22 #include "grit/generated_resources.h" |
23 #include "grit/theme_resources.h" | 23 #include "grit/theme_resources.h" |
24 #include "grit/ui_resources.h" | 24 #include "grit/ui_resources.h" |
25 #include "third_party/skia/include/effects/SkGradientShader.h" | 25 #include "third_party/skia/include/effects/SkGradientShader.h" |
26 #include "ui/base/accessibility/accessible_view_state.h" | 26 #include "ui/base/accessibility/accessible_view_state.h" |
27 #include "ui/base/animation/animation_container.h" | |
28 #include "ui/base/animation/multi_animation.h" | |
29 #include "ui/base/animation/slide_animation.h" | |
30 #include "ui/base/animation/throb_animation.h" | |
31 #include "ui/base/l10n/l10n_util.h" | 27 #include "ui/base/l10n/l10n_util.h" |
32 #include "ui/base/layout.h" | 28 #include "ui/base/layout.h" |
33 #include "ui/base/models/list_selection_model.h" | 29 #include "ui/base/models/list_selection_model.h" |
34 #include "ui/base/resource/resource_bundle.h" | 30 #include "ui/base/resource/resource_bundle.h" |
35 #include "ui/base/theme_provider.h" | 31 #include "ui/base/theme_provider.h" |
| 32 #include "ui/gfx/animation/animation_container.h" |
| 33 #include "ui/gfx/animation/multi_animation.h" |
| 34 #include "ui/gfx/animation/slide_animation.h" |
| 35 #include "ui/gfx/animation/throb_animation.h" |
36 #include "ui/gfx/canvas.h" | 36 #include "ui/gfx/canvas.h" |
37 #include "ui/gfx/color_analysis.h" | 37 #include "ui/gfx/color_analysis.h" |
38 #include "ui/gfx/favicon_size.h" | 38 #include "ui/gfx/favicon_size.h" |
39 #include "ui/gfx/font.h" | 39 #include "ui/gfx/font.h" |
40 #include "ui/gfx/image/image_skia_operations.h" | 40 #include "ui/gfx/image/image_skia_operations.h" |
41 #include "ui/gfx/path.h" | 41 #include "ui/gfx/path.h" |
42 #include "ui/gfx/text_elider.h" | 42 #include "ui/gfx/text_elider.h" |
43 #include "ui/views/controls/button/image_button.h" | 43 #include "ui/views/controls/button/image_button.h" |
44 #include "ui/views/widget/tooltip_manager.h" | 44 #include "ui/views/widget/tooltip_manager.h" |
45 #include "ui/views/widget/widget.h" | 45 #include "ui/views/widget/widget.h" |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 return chrome::GetHostDesktopTypeForNativeView( | 307 return chrome::GetHostDesktopTypeForNativeView( |
308 widget ? widget->GetNativeView() : NULL); | 308 widget ? widget->GetNativeView() : NULL); |
309 } | 309 } |
310 | 310 |
311 } // namespace | 311 } // namespace |
312 | 312 |
313 //////////////////////////////////////////////////////////////////////////////// | 313 //////////////////////////////////////////////////////////////////////////////// |
314 // FaviconCrashAnimation | 314 // FaviconCrashAnimation |
315 // | 315 // |
316 // A custom animation subclass to manage the favicon crash animation. | 316 // A custom animation subclass to manage the favicon crash animation. |
317 class Tab::FaviconCrashAnimation : public ui::LinearAnimation, | 317 class Tab::FaviconCrashAnimation : public gfx::LinearAnimation, |
318 public ui::AnimationDelegate { | 318 public gfx::AnimationDelegate { |
319 public: | 319 public: |
320 explicit FaviconCrashAnimation(Tab* target) | 320 explicit FaviconCrashAnimation(Tab* target) |
321 : ui::LinearAnimation(1000, 25, this), | 321 : gfx::LinearAnimation(1000, 25, this), |
322 target_(target) { | 322 target_(target) { |
323 } | 323 } |
324 virtual ~FaviconCrashAnimation() {} | 324 virtual ~FaviconCrashAnimation() {} |
325 | 325 |
326 // ui::Animation overrides: | 326 // gfx::Animation overrides: |
327 virtual void AnimateToState(double state) OVERRIDE { | 327 virtual void AnimateToState(double state) OVERRIDE { |
328 const double kHidingOffset = 27; | 328 const double kHidingOffset = 27; |
329 | 329 |
330 if (state < .5) { | 330 if (state < .5) { |
331 target_->SetFaviconHidingOffset( | 331 target_->SetFaviconHidingOffset( |
332 static_cast<int>(floor(kHidingOffset * 2.0 * state))); | 332 static_cast<int>(floor(kHidingOffset * 2.0 * state))); |
333 } else { | 333 } else { |
334 target_->DisplayCrashedFavicon(); | 334 target_->DisplayCrashedFavicon(); |
335 target_->SetFaviconHidingOffset( | 335 target_->SetFaviconHidingOffset( |
336 static_cast<int>( | 336 static_cast<int>( |
337 floor(kHidingOffset - ((state - .5) * 2.0 * kHidingOffset)))); | 337 floor(kHidingOffset - ((state - .5) * 2.0 * kHidingOffset)))); |
338 } | 338 } |
339 } | 339 } |
340 | 340 |
341 // ui::AnimationDelegate overrides: | 341 // gfx::AnimationDelegate overrides: |
342 virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE { | 342 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE { |
343 target_->SetFaviconHidingOffset(0); | 343 target_->SetFaviconHidingOffset(0); |
344 } | 344 } |
345 | 345 |
346 private: | 346 private: |
347 Tab* target_; | 347 Tab* target_; |
348 | 348 |
349 DISALLOW_COPY_AND_ASSIGN(FaviconCrashAnimation); | 349 DISALLOW_COPY_AND_ASSIGN(FaviconCrashAnimation); |
350 }; | 350 }; |
351 | 351 |
352 //////////////////////////////////////////////////////////////////////////////// | 352 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 AddChildView(close_button_); | 492 AddChildView(close_button_); |
493 | 493 |
494 set_context_menu_controller(this); | 494 set_context_menu_controller(this); |
495 | 495 |
496 tab_audio_indicator_.reset(new TabAudioIndicator(this)); | 496 tab_audio_indicator_.reset(new TabAudioIndicator(this)); |
497 } | 497 } |
498 | 498 |
499 Tab::~Tab() { | 499 Tab::~Tab() { |
500 } | 500 } |
501 | 501 |
502 void Tab::set_animation_container(ui::AnimationContainer* container) { | 502 void Tab::set_animation_container(gfx::AnimationContainer* container) { |
503 animation_container_ = container; | 503 animation_container_ = container; |
504 hover_controller_.SetAnimationContainer(container); | 504 hover_controller_.SetAnimationContainer(container); |
505 tab_audio_indicator_->SetAnimationContainer(container); | 505 tab_audio_indicator_->SetAnimationContainer(container); |
506 } | 506 } |
507 | 507 |
508 bool Tab::IsActive() const { | 508 bool Tab::IsActive() const { |
509 return controller() ? controller()->IsActiveTab(this) : true; | 509 return controller() ? controller()->IsActiveTab(this) : true; |
510 } | 510 } |
511 | 511 |
512 bool Tab::IsSelected() const { | 512 bool Tab::IsSelected() const { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 // need to advance the animation frame. | 571 // need to advance the animation frame. |
572 return; | 572 return; |
573 } | 573 } |
574 | 574 |
575 TabRendererData::NetworkState old_state = data_.network_state; | 575 TabRendererData::NetworkState old_state = data_.network_state; |
576 data_.network_state = state; | 576 data_.network_state = state; |
577 AdvanceLoadingAnimation(old_state, state); | 577 AdvanceLoadingAnimation(old_state, state); |
578 } | 578 } |
579 | 579 |
580 void Tab::StartPulse() { | 580 void Tab::StartPulse() { |
581 ui::ThrobAnimation* animation = new ui::ThrobAnimation(this); | 581 gfx::ThrobAnimation* animation = new gfx::ThrobAnimation(this); |
582 animation->SetSlideDuration(kPulseDurationMs); | 582 animation->SetSlideDuration(kPulseDurationMs); |
583 if (animation_container_.get()) | 583 if (animation_container_.get()) |
584 animation->SetContainer(animation_container_.get()); | 584 animation->SetContainer(animation_container_.get()); |
585 animation->StartThrobbing(std::numeric_limits<int>::max()); | 585 animation->StartThrobbing(std::numeric_limits<int>::max()); |
586 tab_animation_.reset(animation); | 586 tab_animation_.reset(animation); |
587 } | 587 } |
588 | 588 |
589 void Tab::StopPulse() { | 589 void Tab::StopPulse() { |
590 if (!tab_animation_.get()) | 590 if (!tab_animation_.get()) |
591 return; | 591 return; |
592 tab_animation_->Stop(); | 592 tab_animation_->Stop(); |
593 tab_animation_.reset(NULL); | 593 tab_animation_.reset(NULL); |
594 } | 594 } |
595 | 595 |
596 void Tab::StartMiniTabTitleAnimation() { | 596 void Tab::StartMiniTabTitleAnimation() { |
597 // We can only do this animation if the tab is mini because we will | 597 // We can only do this animation if the tab is mini because we will |
598 // upcast tab_animation back to MultiAnimation when we draw. | 598 // upcast tab_animation back to MultiAnimation when we draw. |
599 if (!data().mini) | 599 if (!data().mini) |
600 return; | 600 return; |
601 if (!tab_animation_.get()) { | 601 if (!tab_animation_.get()) { |
602 ui::MultiAnimation::Parts parts; | 602 gfx::MultiAnimation::Parts parts; |
603 parts.push_back( | 603 parts.push_back( |
604 ui::MultiAnimation::Part(kMiniTitleChangeAnimationDuration1MS, | 604 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration1MS, |
605 ui::Tween::EASE_OUT)); | 605 gfx::Tween::EASE_OUT)); |
606 parts.push_back( | 606 parts.push_back( |
607 ui::MultiAnimation::Part(kMiniTitleChangeAnimationDuration2MS, | 607 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration2MS, |
608 ui::Tween::ZERO)); | 608 gfx::Tween::ZERO)); |
609 parts.push_back( | 609 parts.push_back( |
610 ui::MultiAnimation::Part(kMiniTitleChangeAnimationDuration3MS, | 610 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration3MS, |
611 ui::Tween::EASE_IN)); | 611 gfx::Tween::EASE_IN)); |
612 parts[0].start_time_ms = kMiniTitleChangeAnimationStart1MS; | 612 parts[0].start_time_ms = kMiniTitleChangeAnimationStart1MS; |
613 parts[0].end_time_ms = kMiniTitleChangeAnimationEnd1MS; | 613 parts[0].end_time_ms = kMiniTitleChangeAnimationEnd1MS; |
614 parts[2].start_time_ms = kMiniTitleChangeAnimationStart3MS; | 614 parts[2].start_time_ms = kMiniTitleChangeAnimationStart3MS; |
615 parts[2].end_time_ms = kMiniTitleChangeAnimationEnd3MS; | 615 parts[2].end_time_ms = kMiniTitleChangeAnimationEnd3MS; |
616 base::TimeDelta timeout = | 616 base::TimeDelta timeout = |
617 base::TimeDelta::FromMilliseconds(kMiniTitleChangeAnimationIntervalMS); | 617 base::TimeDelta::FromMilliseconds(kMiniTitleChangeAnimationIntervalMS); |
618 ui::MultiAnimation* animation = new ui::MultiAnimation(parts, timeout); | 618 gfx::MultiAnimation* animation = new gfx::MultiAnimation(parts, timeout); |
619 if (animation_container_.get()) | 619 if (animation_container_.get()) |
620 animation->SetContainer(animation_container_.get()); | 620 animation->SetContainer(animation_container_.get()); |
621 animation->set_delegate(this); | 621 animation->set_delegate(this); |
622 tab_animation_.reset(animation); | 622 tab_animation_.reset(animation); |
623 } | 623 } |
624 tab_animation_->Start(); | 624 tab_animation_->Start(); |
625 } | 625 } |
626 | 626 |
627 void Tab::StopMiniTabTitleAnimation() { | 627 void Tab::StopMiniTabTitleAnimation() { |
628 if (!tab_animation_.get()) | 628 if (!tab_animation_.get()) |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 void Tab::ScheduleAudioIndicatorPaint() { | 684 void Tab::ScheduleAudioIndicatorPaint() { |
685 // No need to schedule a paint if another animation is active. The other | 685 // No need to schedule a paint if another animation is active. The other |
686 // animation will do its own scheduling. | 686 // animation will do its own scheduling. |
687 if (!icon_animation_) | 687 if (!icon_animation_) |
688 ScheduleIconPaint(); | 688 ScheduleIconPaint(); |
689 } | 689 } |
690 | 690 |
691 //////////////////////////////////////////////////////////////////////////////// | 691 //////////////////////////////////////////////////////////////////////////////// |
692 // Tab, AnimationDelegate overrides: | 692 // Tab, AnimationDelegate overrides: |
693 | 693 |
694 void Tab::AnimationProgressed(const ui::Animation* animation) { | 694 void Tab::AnimationProgressed(const gfx::Animation* animation) { |
695 // Ignore if the pulse animation is being performed on active tab because | 695 // Ignore if the pulse animation is being performed on active tab because |
696 // it repaints the same image. See |Tab::PaintTabBackground()|. | 696 // it repaints the same image. See |Tab::PaintTabBackground()|. |
697 if (animation == tab_animation_.get() && IsActive()) | 697 if (animation == tab_animation_.get() && IsActive()) |
698 return; | 698 return; |
699 SchedulePaint(); | 699 SchedulePaint(); |
700 } | 700 } |
701 | 701 |
702 void Tab::AnimationCanceled(const ui::Animation* animation) { | 702 void Tab::AnimationCanceled(const gfx::Animation* animation) { |
703 SchedulePaint(); | 703 SchedulePaint(); |
704 } | 704 } |
705 | 705 |
706 void Tab::AnimationEnded(const ui::Animation* animation) { | 706 void Tab::AnimationEnded(const gfx::Animation* animation) { |
707 SchedulePaint(); | 707 SchedulePaint(); |
708 } | 708 } |
709 | 709 |
710 //////////////////////////////////////////////////////////////////////////////// | 710 //////////////////////////////////////////////////////////////////////////////// |
711 // Tab, views::ButtonListener overrides: | 711 // Tab, views::ButtonListener overrides: |
712 | 712 |
713 void Tab::ButtonPressed(views::Button* sender, const ui::Event& event) { | 713 void Tab::ButtonPressed(views::Button* sender, const ui::Event& event) { |
714 const CloseTabSource source = | 714 const CloseTabSource source = |
715 (event.type() == ui::ET_MOUSE_RELEASED && | 715 (event.type() == ui::ET_MOUSE_RELEASED && |
716 (event.flags() & ui::EF_FROM_TOUCH) == 0) ? CLOSE_TAB_FROM_MOUSE : | 716 (event.flags() & ui::EF_FROM_TOUCH) == 0) ? CLOSE_TAB_FROM_MOUSE : |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 } | 1163 } |
1164 } | 1164 } |
1165 | 1165 |
1166 void Tab::PaintTabBackground(gfx::Canvas* canvas) { | 1166 void Tab::PaintTabBackground(gfx::Canvas* canvas) { |
1167 if (IsActive()) { | 1167 if (IsActive()) { |
1168 PaintActiveTabBackground(canvas); | 1168 PaintActiveTabBackground(canvas); |
1169 } else { | 1169 } else { |
1170 if (tab_animation_.get() && | 1170 if (tab_animation_.get() && |
1171 tab_animation_->is_animating() && | 1171 tab_animation_->is_animating() && |
1172 data().mini) { | 1172 data().mini) { |
1173 ui::MultiAnimation* animation = | 1173 gfx::MultiAnimation* animation = |
1174 static_cast<ui::MultiAnimation*>(tab_animation_.get()); | 1174 static_cast<gfx::MultiAnimation*>(tab_animation_.get()); |
1175 PaintInactiveTabBackgroundWithTitleChange(canvas, animation); | 1175 PaintInactiveTabBackgroundWithTitleChange(canvas, animation); |
1176 } else { | 1176 } else { |
1177 PaintInactiveTabBackground(canvas); | 1177 PaintInactiveTabBackground(canvas); |
1178 } | 1178 } |
1179 | 1179 |
1180 double throb_value = GetThrobValue(); | 1180 double throb_value = GetThrobValue(); |
1181 if (throb_value > 0) { | 1181 if (throb_value > 0) { |
1182 canvas->SaveLayerAlpha(static_cast<int>(throb_value * 0xff), | 1182 canvas->SaveLayerAlpha(static_cast<int>(throb_value * 0xff), |
1183 GetLocalBounds()); | 1183 GetLocalBounds()); |
1184 PaintActiveTabBackground(canvas); | 1184 PaintActiveTabBackground(canvas); |
1185 canvas->Restore(); | 1185 canvas->Restore(); |
1186 } | 1186 } |
1187 } | 1187 } |
1188 } | 1188 } |
1189 | 1189 |
1190 void Tab::PaintInactiveTabBackgroundWithTitleChange( | 1190 void Tab::PaintInactiveTabBackgroundWithTitleChange( |
1191 gfx::Canvas* canvas, | 1191 gfx::Canvas* canvas, |
1192 ui::MultiAnimation* animation) { | 1192 gfx::MultiAnimation* animation) { |
1193 // Render the inactive tab background. We'll use this for clipping. | 1193 // Render the inactive tab background. We'll use this for clipping. |
1194 gfx::Canvas background_canvas(size(), canvas->scale_factor(), false); | 1194 gfx::Canvas background_canvas(size(), canvas->scale_factor(), false); |
1195 PaintInactiveTabBackground(&background_canvas); | 1195 PaintInactiveTabBackground(&background_canvas); |
1196 | 1196 |
1197 gfx::ImageSkia background_image(background_canvas.ExtractImageRep()); | 1197 gfx::ImageSkia background_image(background_canvas.ExtractImageRep()); |
1198 | 1198 |
1199 // Draw a radial gradient to hover_canvas. | 1199 // Draw a radial gradient to hover_canvas. |
1200 gfx::Canvas hover_canvas(size(), canvas->scale_factor(), false); | 1200 gfx::Canvas hover_canvas(size(), canvas->scale_factor(), false); |
1201 int radius = kMiniTitleChangeGradientRadius; | 1201 int radius = kMiniTitleChangeGradientRadius; |
1202 int x0 = width() + radius - kMiniTitleChangeInitialXOffset; | 1202 int x0 = width() + radius - kMiniTitleChangeInitialXOffset; |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 icon_animation_->Stop(); | 1710 icon_animation_->Stop(); |
1711 icon_animation_.reset(); | 1711 icon_animation_.reset(); |
1712 } | 1712 } |
1713 | 1713 |
1714 void Tab::StartCrashAnimation() { | 1714 void Tab::StartCrashAnimation() { |
1715 icon_animation_.reset(new FaviconCrashAnimation(this)); | 1715 icon_animation_.reset(new FaviconCrashAnimation(this)); |
1716 icon_animation_->Start(); | 1716 icon_animation_->Start(); |
1717 } | 1717 } |
1718 | 1718 |
1719 void Tab::StartRecordingAnimation() { | 1719 void Tab::StartRecordingAnimation() { |
1720 ui::ThrobAnimation* animation = new ui::ThrobAnimation(this); | 1720 gfx::ThrobAnimation* animation = new gfx::ThrobAnimation(this); |
1721 animation->SetTweenType(ui::Tween::EASE_IN_OUT); | 1721 animation->SetTweenType(gfx::Tween::EASE_IN_OUT); |
1722 animation->SetThrobDuration(kRecordingDurationMs); | 1722 animation->SetThrobDuration(kRecordingDurationMs); |
1723 animation->StartThrobbing(-1); | 1723 animation->StartThrobbing(-1); |
1724 icon_animation_.reset(animation); | 1724 icon_animation_.reset(animation); |
1725 } | 1725 } |
1726 | 1726 |
1727 bool Tab::IsPerformingCrashAnimation() const { | 1727 bool Tab::IsPerformingCrashAnimation() const { |
1728 return icon_animation_.get() && data_.IsCrashed(); | 1728 return icon_animation_.get() && data_.IsCrashed(); |
1729 } | 1729 } |
1730 | 1730 |
1731 void Tab::ScheduleIconPaint() { | 1731 void Tab::ScheduleIconPaint() { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1834 const gfx::ImageSkia& image) { | 1834 const gfx::ImageSkia& image) { |
1835 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE); | 1835 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE); |
1836 ImageCacheEntry entry; | 1836 ImageCacheEntry entry; |
1837 entry.resource_id = resource_id; | 1837 entry.resource_id = resource_id; |
1838 entry.scale_factor = scale_factor; | 1838 entry.scale_factor = scale_factor; |
1839 entry.image = image; | 1839 entry.image = image; |
1840 image_cache_->push_front(entry); | 1840 image_cache_->push_front(entry); |
1841 if (image_cache_->size() > kMaxImageCacheSize) | 1841 if (image_cache_->size() > kMaxImageCacheSize) |
1842 image_cache_->pop_back(); | 1842 image_cache_->pop_back(); |
1843 } | 1843 } |
OLD | NEW |