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

Side by Side Diff: chrome/browser/ui/views/tabs/tab.cc

Issue 382693002: Fix possible bad cast in Tab (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: PassAs Created 6 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 icon_height, filter, paint); 178 icon_height, filter, paint);
179 } 179 }
180 180
181 chrome::HostDesktopType GetHostDesktopType(views::View* view) { 181 chrome::HostDesktopType GetHostDesktopType(views::View* view) {
182 // Widget is NULL when tabs are detached. 182 // Widget is NULL when tabs are detached.
183 views::Widget* widget = view->GetWidget(); 183 views::Widget* widget = view->GetWidget();
184 return chrome::GetHostDesktopTypeForNativeView( 184 return chrome::GetHostDesktopTypeForNativeView(
185 widget ? widget->GetNativeView() : NULL); 185 widget ? widget->GetNativeView() : NULL);
186 } 186 }
187 187
188 // Stop()s |animation| and then deletes it. We do this rather than just deleting
189 // so that the delegate is notified before the destruction.
190 void StopAndDeleteAnimation(scoped_ptr<gfx::Animation> animation) {
191 if (animation)
192 animation->Stop();
193 }
194
188 } // namespace 195 } // namespace
189 196
190 //////////////////////////////////////////////////////////////////////////////// 197 ////////////////////////////////////////////////////////////////////////////////
191 // FaviconCrashAnimation 198 // FaviconCrashAnimation
192 // 199 //
193 // A custom animation subclass to manage the favicon crash animation. 200 // A custom animation subclass to manage the favicon crash animation.
194 class Tab::FaviconCrashAnimation : public gfx::LinearAnimation, 201 class Tab::FaviconCrashAnimation : public gfx::LinearAnimation,
195 public gfx::AnimationDelegate { 202 public gfx::AnimationDelegate {
196 public: 203 public:
197 explicit FaviconCrashAnimation(Tab* target) 204 explicit FaviconCrashAnimation(Tab* target)
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 ResetCrashedFavicon(); 481 ResetCrashedFavicon();
475 } 482 }
476 483
477 if (data_.media_state != old.media_state) { 484 if (data_.media_state != old.media_state) {
478 if (data_.media_state != TAB_MEDIA_STATE_NONE) 485 if (data_.media_state != TAB_MEDIA_STATE_NONE)
479 animating_media_state_ = data_.media_state; 486 animating_media_state_ = data_.media_state;
480 StartMediaIndicatorAnimation(); 487 StartMediaIndicatorAnimation();
481 } 488 }
482 489
483 if (old.mini != data_.mini) { 490 if (old.mini != data_.mini) {
484 if (tab_animation_.get() && tab_animation_->is_animating()) { 491 StopAndDeleteAnimation(
485 tab_animation_->Stop(); 492 mini_title_change_animation_.PassAs<gfx::Animation>());
486 tab_animation_.reset(NULL);
487 }
488 } 493 }
489 494
490 DataChanged(old); 495 DataChanged(old);
491 496
492 Layout(); 497 Layout();
493 SchedulePaint(); 498 SchedulePaint();
494 } 499 }
495 500
496 void Tab::UpdateLoadingAnimation(TabRendererData::NetworkState state) { 501 void Tab::UpdateLoadingAnimation(TabRendererData::NetworkState state) {
497 if (state == data_.network_state && 502 if (state == data_.network_state &&
498 state == TabRendererData::NETWORK_STATE_NONE) { 503 state == TabRendererData::NETWORK_STATE_NONE) {
499 // If the network state is none and hasn't changed, do nothing. Otherwise we 504 // If the network state is none and hasn't changed, do nothing. Otherwise we
500 // need to advance the animation frame. 505 // need to advance the animation frame.
501 return; 506 return;
502 } 507 }
503 508
504 TabRendererData::NetworkState old_state = data_.network_state; 509 TabRendererData::NetworkState old_state = data_.network_state;
505 data_.network_state = state; 510 data_.network_state = state;
506 AdvanceLoadingAnimation(old_state, state); 511 AdvanceLoadingAnimation(old_state, state);
507 } 512 }
508 513
509 void Tab::StartPulse() { 514 void Tab::StartPulse() {
510 gfx::ThrobAnimation* animation = new gfx::ThrobAnimation(this); 515 pulse_animation_.reset(new gfx::ThrobAnimation(this));
511 animation->SetSlideDuration(kPulseDurationMs); 516 pulse_animation_->SetSlideDuration(kPulseDurationMs);
512 if (animation_container_.get()) 517 if (animation_container_)
513 animation->SetContainer(animation_container_.get()); 518 pulse_animation_->SetContainer(animation_container_.get());
514 animation->StartThrobbing(std::numeric_limits<int>::max()); 519 pulse_animation_->StartThrobbing(std::numeric_limits<int>::max());
515 tab_animation_.reset(animation);
516 } 520 }
517 521
518 void Tab::StopPulse() { 522 void Tab::StopPulse() {
519 if (!tab_animation_.get()) 523 StopAndDeleteAnimation(pulse_animation_.PassAs<gfx::Animation>());
520 return;
521 tab_animation_->Stop();
522 tab_animation_.reset(NULL);
523 } 524 }
524 525
525 void Tab::StartMiniTabTitleAnimation() { 526 void Tab::StartMiniTabTitleAnimation() {
526 // We can only do this animation if the tab is mini because we will
527 // upcast tab_animation back to MultiAnimation when we draw.
528 if (!data().mini) 527 if (!data().mini)
529 return; 528 return;
530 if (!tab_animation_.get()) { 529 if (!mini_title_change_animation_) {
531 gfx::MultiAnimation::Parts parts; 530 gfx::MultiAnimation::Parts parts;
532 parts.push_back( 531 parts.push_back(
533 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration1MS, 532 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration1MS,
534 gfx::Tween::EASE_OUT)); 533 gfx::Tween::EASE_OUT));
535 parts.push_back( 534 parts.push_back(
536 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration2MS, 535 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration2MS,
537 gfx::Tween::ZERO)); 536 gfx::Tween::ZERO));
538 parts.push_back( 537 parts.push_back(
539 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration3MS, 538 gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration3MS,
540 gfx::Tween::EASE_IN)); 539 gfx::Tween::EASE_IN));
541 parts[0].start_time_ms = kMiniTitleChangeAnimationStart1MS; 540 parts[0].start_time_ms = kMiniTitleChangeAnimationStart1MS;
542 parts[0].end_time_ms = kMiniTitleChangeAnimationEnd1MS; 541 parts[0].end_time_ms = kMiniTitleChangeAnimationEnd1MS;
543 parts[2].start_time_ms = kMiniTitleChangeAnimationStart3MS; 542 parts[2].start_time_ms = kMiniTitleChangeAnimationStart3MS;
544 parts[2].end_time_ms = kMiniTitleChangeAnimationEnd3MS; 543 parts[2].end_time_ms = kMiniTitleChangeAnimationEnd3MS;
545 base::TimeDelta timeout = 544 base::TimeDelta timeout =
546 base::TimeDelta::FromMilliseconds(kMiniTitleChangeAnimationIntervalMS); 545 base::TimeDelta::FromMilliseconds(kMiniTitleChangeAnimationIntervalMS);
547 gfx::MultiAnimation* animation = new gfx::MultiAnimation(parts, timeout); 546 mini_title_change_animation_.reset(new gfx::MultiAnimation(parts, timeout));
548 if (animation_container_.get()) 547 if (animation_container_)
549 animation->SetContainer(animation_container_.get()); 548 mini_title_change_animation_->SetContainer(animation_container_.get());
550 animation->set_delegate(this); 549 mini_title_change_animation_->set_delegate(this);
551 tab_animation_.reset(animation);
552 } 550 }
553 tab_animation_->Start(); 551 mini_title_change_animation_->Start();
554 } 552 }
555 553
556 void Tab::StopMiniTabTitleAnimation() { 554 void Tab::StopMiniTabTitleAnimation() {
557 if (!tab_animation_.get()) 555 StopAndDeleteAnimation(mini_title_change_animation_.PassAs<gfx::Animation>());
558 return;
559 tab_animation_->Stop();
560 tab_animation_.reset(NULL);
561 } 556 }
562 557
563 // static 558 // static
564 gfx::Size Tab::GetBasicMinimumUnselectedSize() { 559 gfx::Size Tab::GetBasicMinimumUnselectedSize() {
565 InitTabResources(); 560 InitTabResources();
566 561
567 gfx::Size minimum_size; 562 gfx::Size minimum_size;
568 minimum_size.set_width(kLeftPadding + kRightPadding); 563 minimum_size.set_width(kLeftPadding + kRightPadding);
569 // Since we use image images, the real minimum height of the image is 564 // Since we use image images, the real minimum height of the image is
570 // defined most accurately by the height of the end cap images. 565 // defined most accurately by the height of the end cap images.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 int Tab::GetImmersiveHeight() { 601 int Tab::GetImmersiveHeight() {
607 return kImmersiveTabHeight; 602 return kImmersiveTabHeight;
608 } 603 }
609 604
610 //////////////////////////////////////////////////////////////////////////////// 605 ////////////////////////////////////////////////////////////////////////////////
611 // Tab, AnimationDelegate overrides: 606 // Tab, AnimationDelegate overrides:
612 607
613 void Tab::AnimationProgressed(const gfx::Animation* animation) { 608 void Tab::AnimationProgressed(const gfx::Animation* animation) {
614 // Ignore if the pulse animation is being performed on active tab because 609 // Ignore if the pulse animation is being performed on active tab because
615 // it repaints the same image. See |Tab::PaintTabBackground()|. 610 // it repaints the same image. See |Tab::PaintTabBackground()|.
616 if (animation == tab_animation_.get() && IsActive()) 611 if (animation == pulse_animation_.get() && IsActive())
617 return; 612 return;
618 SchedulePaint(); 613 SchedulePaint();
619 } 614 }
620 615
621 void Tab::AnimationCanceled(const gfx::Animation* animation) { 616 void Tab::AnimationCanceled(const gfx::Animation* animation) {
622 if (media_indicator_animation_ == animation) 617 if (media_indicator_animation_ == animation)
623 animating_media_state_ = data_.media_state; 618 animating_media_state_ = data_.media_state;
624 SchedulePaint(); 619 SchedulePaint();
625 } 620 }
626 621
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 1032 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1038 close_button_->SetBackground(close_button_color_, 1033 close_button_->SetBackground(close_button_color_,
1039 rb.GetImageSkiaNamed(IDR_CLOSE_1), 1034 rb.GetImageSkiaNamed(IDR_CLOSE_1),
1040 rb.GetImageSkiaNamed(IDR_CLOSE_1_MASK)); 1035 rb.GetImageSkiaNamed(IDR_CLOSE_1_MASK));
1041 } 1036 }
1042 } 1037 }
1043 1038
1044 void Tab::PaintImmersiveTab(gfx::Canvas* canvas) { 1039 void Tab::PaintImmersiveTab(gfx::Canvas* canvas) {
1045 // Use transparency for the draw-attention animation. 1040 // Use transparency for the draw-attention animation.
1046 int alpha = 255; 1041 int alpha = 255;
1047 if (tab_animation_ && 1042 if (pulse_animation_ && pulse_animation_->is_animating() && !data().mini) {
1048 tab_animation_->is_animating() && 1043 alpha = pulse_animation_->CurrentValueBetween(
1049 !data().mini) {
1050 alpha = tab_animation_->CurrentValueBetween(
1051 255, static_cast<int>(255 * kImmersiveTabMinThrobOpacity)); 1044 255, static_cast<int>(255 * kImmersiveTabMinThrobOpacity));
1052 } 1045 }
1053 1046
1054 // Draw a gray rectangle to represent the tab. This works for mini-tabs as 1047 // Draw a gray rectangle to represent the tab. This works for mini-tabs as
1055 // well as regular ones. The active tab has a brigher bar. 1048 // well as regular ones. The active tab has a brigher bar.
1056 SkColor color = 1049 SkColor color =
1057 IsActive() ? kImmersiveActiveTabColor : kImmersiveInactiveTabColor; 1050 IsActive() ? kImmersiveActiveTabColor : kImmersiveInactiveTabColor;
1058 gfx::Rect bar_rect = GetImmersiveBarRect(); 1051 gfx::Rect bar_rect = GetImmersiveBarRect();
1059 canvas->FillRect(bar_rect, SkColorSetA(color, alpha)); 1052 canvas->FillRect(bar_rect, SkColorSetA(color, alpha));
1060 1053
(...skipping 23 matching lines...) Expand all
1084 bar_rect.x(), 0, left_eye_width, kImmersiveBarHeight); 1077 bar_rect.x(), 0, left_eye_width, kImmersiveBarHeight);
1085 canvas->FillRect(left_eye_rect, kEyeColor); 1078 canvas->FillRect(left_eye_rect, kEyeColor);
1086 } 1079 }
1087 } 1080 }
1088 } 1081 }
1089 1082
1090 void Tab::PaintTabBackground(gfx::Canvas* canvas) { 1083 void Tab::PaintTabBackground(gfx::Canvas* canvas) {
1091 if (IsActive()) { 1084 if (IsActive()) {
1092 PaintActiveTabBackground(canvas); 1085 PaintActiveTabBackground(canvas);
1093 } else { 1086 } else {
1094 if (tab_animation_.get() && 1087 if (mini_title_change_animation_ &&
1095 tab_animation_->is_animating() && 1088 mini_title_change_animation_->is_animating()) {
1096 data().mini) { 1089 PaintInactiveTabBackgroundWithTitleChange(canvas);
1097 gfx::MultiAnimation* animation =
1098 static_cast<gfx::MultiAnimation*>(tab_animation_.get());
1099 PaintInactiveTabBackgroundWithTitleChange(canvas, animation);
1100 } else { 1090 } else {
1101 PaintInactiveTabBackground(canvas); 1091 PaintInactiveTabBackground(canvas);
1102 } 1092 }
1103 1093
1104 double throb_value = GetThrobValue(); 1094 double throb_value = GetThrobValue();
1105 if (throb_value > 0) { 1095 if (throb_value > 0) {
1106 canvas->SaveLayerAlpha(static_cast<int>(throb_value * 0xff), 1096 canvas->SaveLayerAlpha(static_cast<int>(throb_value * 0xff),
1107 GetLocalBounds()); 1097 GetLocalBounds());
1108 PaintActiveTabBackground(canvas); 1098 PaintActiveTabBackground(canvas);
1109 canvas->Restore(); 1099 canvas->Restore();
1110 } 1100 }
1111 } 1101 }
1112 } 1102 }
1113 1103
1114 void Tab::PaintInactiveTabBackgroundWithTitleChange( 1104 void Tab::PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas) {
1115 gfx::Canvas* canvas,
1116 gfx::MultiAnimation* animation) {
1117 // Render the inactive tab background. We'll use this for clipping. 1105 // Render the inactive tab background. We'll use this for clipping.
1118 gfx::Canvas background_canvas(size(), canvas->image_scale(), false); 1106 gfx::Canvas background_canvas(size(), canvas->image_scale(), false);
1119 PaintInactiveTabBackground(&background_canvas); 1107 PaintInactiveTabBackground(&background_canvas);
1120 1108
1121 gfx::ImageSkia background_image(background_canvas.ExtractImageRep()); 1109 gfx::ImageSkia background_image(background_canvas.ExtractImageRep());
1122 1110
1123 // Draw a radial gradient to hover_canvas. 1111 // Draw a radial gradient to hover_canvas.
1124 gfx::Canvas hover_canvas(size(), canvas->image_scale(), false); 1112 gfx::Canvas hover_canvas(size(), canvas->image_scale(), false);
1125 int radius = kMiniTitleChangeGradientRadius; 1113 int radius = kMiniTitleChangeGradientRadius;
1126 int x0 = width() + radius - kMiniTitleChangeInitialXOffset; 1114 int x0 = width() + radius - kMiniTitleChangeInitialXOffset;
1127 int x1 = radius; 1115 int x1 = radius;
1128 int x2 = -radius; 1116 int x2 = -radius;
1129 int x; 1117 int x;
1130 if (animation->current_part_index() == 0) { 1118 if (mini_title_change_animation_->current_part_index() == 0) {
1131 x = animation->CurrentValueBetween(x0, x1); 1119 x = mini_title_change_animation_->CurrentValueBetween(x0, x1);
1132 } else if (animation->current_part_index() == 1) { 1120 } else if (mini_title_change_animation_->current_part_index() == 1) {
1133 x = x1; 1121 x = x1;
1134 } else { 1122 } else {
1135 x = animation->CurrentValueBetween(x1, x2); 1123 x = mini_title_change_animation_->CurrentValueBetween(x1, x2);
1136 } 1124 }
1137 SkPoint center_point; 1125 SkPoint center_point;
1138 center_point.iset(x, 0); 1126 center_point.iset(x, 0);
1139 SkColor colors[2] = { kMiniTitleChangeGradientColor1, 1127 SkColor colors[2] = { kMiniTitleChangeGradientColor1,
1140 kMiniTitleChangeGradientColor2 }; 1128 kMiniTitleChangeGradientColor2 };
1141 skia::RefPtr<SkShader> shader = skia::AdoptRef( 1129 skia::RefPtr<SkShader> shader = skia::AdoptRef(
1142 SkGradientShader::CreateRadial( 1130 SkGradientShader::CreateRadial(
1143 center_point, SkIntToScalar(radius), colors, NULL, 2, 1131 center_point, SkIntToScalar(radius), colors, NULL, 2,
1144 SkShader::kClamp_TileMode)); 1132 SkShader::kClamp_TileMode));
1145 SkPaint paint; 1133 SkPaint paint;
1146 paint.setShader(shader.get()); 1134 paint.setShader(shader.get());
1147 hover_canvas.DrawRect(gfx::Rect(x - radius, -radius, radius * 2, radius * 2), 1135 hover_canvas.DrawRect(gfx::Rect(x - radius, -radius, radius * 2, radius * 2),
1148 paint); 1136 paint);
1149 1137
1150 // Draw the radial gradient clipped to the background into hover_image. 1138 // Draw the radial gradient clipped to the background into hover_image.
1151 gfx::ImageSkia hover_image = gfx::ImageSkiaOperations::CreateMaskedImage( 1139 gfx::ImageSkia hover_image = gfx::ImageSkiaOperations::CreateMaskedImage(
1152 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image); 1140 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image);
1153 1141
1154 // Draw the tab background to the canvas. 1142 // Draw the tab background to the canvas.
1155 canvas->DrawImageInt(background_image, 0, 0); 1143 canvas->DrawImageInt(background_image, 0, 0);
1156 1144
1157 // And then the gradient on top of that. 1145 // And then the gradient on top of that.
1158 if (animation->current_part_index() == 2) { 1146 if (mini_title_change_animation_->current_part_index() == 2) {
1159 uint8 alpha = animation->CurrentValueBetween(255, 0); 1147 uint8 alpha = mini_title_change_animation_->CurrentValueBetween(255, 0);
1160 canvas->DrawImageInt(hover_image, 0, 0, alpha); 1148 canvas->DrawImageInt(hover_image, 0, 0, alpha);
1161 } else { 1149 } else {
1162 canvas->DrawImageInt(hover_image, 0, 0); 1150 canvas->DrawImageInt(hover_image, 0, 0);
1163 } 1151 }
1164 } 1152 }
1165 1153
1166 void Tab::PaintInactiveTabBackground(gfx::Canvas* canvas) { 1154 void Tab::PaintInactiveTabBackground(gfx::Canvas* canvas) {
1167 int tab_id; 1155 int tab_id;
1168 int frame_id; 1156 int frame_id;
1169 views::Widget* widget = GetWidget(); 1157 views::Widget* widget = GetWidget();
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 IconCapacity(), data().mini, IsActive(), data().show_icon, 1450 IconCapacity(), data().mini, IsActive(), data().show_icon,
1463 animating_media_state_); 1451 animating_media_state_);
1464 } 1452 }
1465 1453
1466 bool Tab::ShouldShowCloseBox() const { 1454 bool Tab::ShouldShowCloseBox() const {
1467 return chrome::ShouldTabShowCloseButton( 1455 return chrome::ShouldTabShowCloseButton(
1468 IconCapacity(), data().mini, IsActive()); 1456 IconCapacity(), data().mini, IsActive());
1469 } 1457 }
1470 1458
1471 double Tab::GetThrobValue() { 1459 double Tab::GetThrobValue() {
1472 bool is_selected = IsSelected(); 1460 const bool is_selected = IsSelected();
1473 double min = is_selected ? kSelectedTabOpacity : 0; 1461 const double min = is_selected ? kSelectedTabOpacity : 0;
1474 double scale = is_selected ? kSelectedTabThrobScale : 1; 1462 const double scale = is_selected ? kSelectedTabThrobScale : 1;
1475 1463
1476 if (!data().mini) { 1464 // Showing both the pulse and title change animation at the same time is too
1477 if (tab_animation_.get() && tab_animation_->is_animating()) 1465 // much.
1478 return tab_animation_->GetCurrentValue() * kHoverOpacity * scale + min; 1466 if (pulse_animation_ && pulse_animation_->is_animating() &&
1467 (!mini_title_change_animation_ ||
1468 !mini_title_change_animation_->is_animating())) {
1469 return pulse_animation_->GetCurrentValue() * kHoverOpacity * scale + min;
1479 } 1470 }
1480 1471
1481 if (hover_controller_.ShouldDraw()) { 1472 if (hover_controller_.ShouldDraw()) {
1482 return kHoverOpacity * hover_controller_.GetAnimationValue() * scale + 1473 return kHoverOpacity * hover_controller_.GetAnimationValue() * scale +
1483 min; 1474 min;
1484 } 1475 }
1485 1476
1486 return is_selected ? kSelectedTabOpacity : 0; 1477 return is_selected ? kSelectedTabOpacity : 0;
1487 } 1478 }
1488 1479
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1615 const gfx::ImageSkia& image) { 1606 const gfx::ImageSkia& image) {
1616 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE); 1607 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE);
1617 ImageCacheEntry entry; 1608 ImageCacheEntry entry;
1618 entry.resource_id = resource_id; 1609 entry.resource_id = resource_id;
1619 entry.scale_factor = scale_factor; 1610 entry.scale_factor = scale_factor;
1620 entry.image = image; 1611 entry.image = image;
1621 image_cache_->push_front(entry); 1612 image_cache_->push_front(entry);
1622 if (image_cache_->size() > kMaxImageCacheSize) 1613 if (image_cache_->size() > kMaxImageCacheSize)
1623 image_cache_->pop_back(); 1614 image_cache_->pop_back();
1624 } 1615 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698