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

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

Issue 23513039: Replace animated tab audio indicator with static tab audio indicator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed review comments from sky@. Also, rebased. Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.cc ('k') | chrome/chrome_browser_ui.gypi » ('j') | 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 #include "chrome/browser/ui/views/tabs/tab_controller.h" 6 #include "chrome/browser/ui/views/tabs/tab_controller.h"
7 7
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/base/models/list_selection_model.h" 10 #include "ui/base/models/list_selection_model.h"
11 #include "ui/views/controls/button/image_button.h" 11 #include "ui/views/controls/button/image_button.h"
12 #include "ui/views/test/views_test_base.h" 12 #include "ui/views/test/views_test_base.h"
13 #include "ui/views/widget/widget.h" 13 #include "ui/views/widget/widget.h"
14 14
15 using views::Widget; 15 using views::Widget;
16 16
17 class FakeTabController : public TabController { 17 class FakeTabController : public TabController {
18 public: 18 public:
19 FakeTabController() : immersive_style_(false) { 19 FakeTabController() : immersive_style_(false), active_tab_(false) {
20 } 20 }
21 virtual ~FakeTabController() {} 21 virtual ~FakeTabController() {}
22 22
23 void set_immersive_style(bool value) { immersive_style_ = value; } 23 void set_immersive_style(bool value) { immersive_style_ = value; }
24 void set_active_tab(bool value) { active_tab_ = value; }
24 25
25 virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE { 26 virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE {
26 return selection_model_; 27 return selection_model_;
27 } 28 }
28 virtual bool SupportsMultipleSelection() OVERRIDE { return false; } 29 virtual bool SupportsMultipleSelection() OVERRIDE { return false; }
29 virtual void SelectTab(Tab* tab) OVERRIDE {} 30 virtual void SelectTab(Tab* tab) OVERRIDE {}
30 virtual void ExtendSelectionTo(Tab* tab) OVERRIDE {} 31 virtual void ExtendSelectionTo(Tab* tab) OVERRIDE {}
31 virtual void ToggleSelected(Tab* tab) OVERRIDE {} 32 virtual void ToggleSelected(Tab* tab) OVERRIDE {}
32 virtual void AddSelectionFromAnchorTo(Tab* tab) OVERRIDE {} 33 virtual void AddSelectionFromAnchorTo(Tab* tab) OVERRIDE {}
33 virtual void CloseTab(Tab* tab, CloseTabSource source) OVERRIDE {} 34 virtual void CloseTab(Tab* tab, CloseTabSource source) OVERRIDE {}
34 virtual void ShowContextMenuForTab(Tab* tab, 35 virtual void ShowContextMenuForTab(Tab* tab,
35 const gfx::Point& p, 36 const gfx::Point& p,
36 ui::MenuSourceType source_type) OVERRIDE {} 37 ui::MenuSourceType source_type) OVERRIDE {}
37 virtual bool IsActiveTab(const Tab* tab) const OVERRIDE { return false; } 38 virtual bool IsActiveTab(const Tab* tab) const OVERRIDE {
39 return active_tab_;
40 }
38 virtual bool IsTabSelected(const Tab* tab) const OVERRIDE { 41 virtual bool IsTabSelected(const Tab* tab) const OVERRIDE {
39 return false; 42 return false;
40 } 43 }
41 virtual bool IsTabPinned(const Tab* tab) const OVERRIDE { return false; } 44 virtual bool IsTabPinned(const Tab* tab) const OVERRIDE { return false; }
42 virtual void MaybeStartDrag( 45 virtual void MaybeStartDrag(
43 Tab* tab, 46 Tab* tab,
44 const ui::LocatedEvent& event, 47 const ui::LocatedEvent& event,
45 const ui::ListSelectionModel& original_selection) OVERRIDE {} 48 const ui::ListSelectionModel& original_selection) OVERRIDE {}
46 virtual void ContinueDrag(views::View* view, 49 virtual void ContinueDrag(views::View* view,
47 const ui::LocatedEvent& event) OVERRIDE {} 50 const ui::LocatedEvent& event) OVERRIDE {}
48 virtual bool EndDrag(EndDragReason reason) OVERRIDE { return false; } 51 virtual bool EndDrag(EndDragReason reason) OVERRIDE { return false; }
49 virtual Tab* GetTabAt(Tab* tab, 52 virtual Tab* GetTabAt(Tab* tab,
50 const gfx::Point& tab_in_tab_coordinates) OVERRIDE { 53 const gfx::Point& tab_in_tab_coordinates) OVERRIDE {
51 return NULL; 54 return NULL;
52 } 55 }
53 virtual void OnMouseEventInTab(views::View* source, 56 virtual void OnMouseEventInTab(views::View* source,
54 const ui::MouseEvent& event) OVERRIDE {} 57 const ui::MouseEvent& event) OVERRIDE {}
55 virtual bool ShouldPaintTab(const Tab* tab, gfx::Rect* clip) OVERRIDE { 58 virtual bool ShouldPaintTab(const Tab* tab, gfx::Rect* clip) OVERRIDE {
56 return true; 59 return true;
57 } 60 }
58 virtual bool IsImmersiveStyle() const OVERRIDE { return immersive_style_; } 61 virtual bool IsImmersiveStyle() const OVERRIDE { return immersive_style_; }
59 62
60 private: 63 private:
61 ui::ListSelectionModel selection_model_; 64 ui::ListSelectionModel selection_model_;
62 bool immersive_style_; 65 bool immersive_style_;
66 bool active_tab_;
63 67
64 DISALLOW_COPY_AND_ASSIGN(FakeTabController); 68 DISALLOW_COPY_AND_ASSIGN(FakeTabController);
65 }; 69 };
66 70
67 class TabTest : public views::ViewsTestBase { 71 class TabTest : public views::ViewsTestBase {
68 public: 72 public:
69 TabTest() {} 73 TabTest() {}
70 virtual ~TabTest() {} 74 virtual ~TabTest() {}
71 75
72 static bool IconAnimationInvariant(const Tab& tab) { 76 static bool IconAnimationInvariant(const Tab& tab) {
73 bool capture_invariant = 77 return tab.data().CaptureActive() == (tab.icon_animation_.get() != NULL);
74 tab.data().CaptureActive() == (tab.icon_animation_.get() != NULL); 78 }
75 bool audio_invariant = 79
76 !tab.data().AudioActive() || tab.tab_audio_indicator_->IsAnimating(); 80 static void CheckForExpectedLayoutAndVisibilityOfElements(const Tab& tab) {
77 return capture_invariant && audio_invariant; 81 // Check whether elements are visible when they are supposed to be, given
82 // Tab size and TabRendererData state.
83 if (tab.data_.mini) {
84 if (tab.data_.CaptureActive())
85 EXPECT_TRUE(tab.ShouldShowIcon());
86 else
87 EXPECT_TRUE(tab.ShouldShowIcon() != tab.ShouldShowAudioIndicator());
88 EXPECT_FALSE(tab.ShouldShowCloseBox());
89 } else if (tab.IsActive()) {
90 EXPECT_TRUE(tab.ShouldShowCloseBox());
91 switch (tab.IconCapacity()) {
92 case 0:
93 case 1:
94 EXPECT_FALSE(tab.ShouldShowIcon());
95 EXPECT_FALSE(tab.ShouldShowAudioIndicator());
96 break;
97 case 2:
98 if (tab.data_.CaptureActive())
99 EXPECT_TRUE(tab.ShouldShowIcon());
100 else
101 EXPECT_TRUE(tab.ShouldShowIcon() != tab.ShouldShowAudioIndicator());
102 break;
103 default:
104 EXPECT_LE(3, tab.IconCapacity());
105 EXPECT_TRUE(tab.ShouldShowIcon());
106 if (tab.data_.CaptureActive()) {
107 EXPECT_FALSE(tab.ShouldShowAudioIndicator());
108 } else {
109 EXPECT_TRUE(tab.data_.AudioActive() ==
110 tab.ShouldShowAudioIndicator());
111 }
112 break;
113 }
114 } else { // Tab not active and not mini tab.
115 switch (tab.IconCapacity()) {
116 case 0:
117 EXPECT_FALSE(tab.ShouldShowCloseBox());
118 EXPECT_FALSE(tab.ShouldShowIcon());
119 EXPECT_FALSE(tab.ShouldShowAudioIndicator());
120 break;
121 case 1:
122 EXPECT_FALSE(tab.ShouldShowCloseBox());
123 if (tab.data_.CaptureActive())
124 EXPECT_TRUE(tab.ShouldShowIcon());
125 else
126 EXPECT_TRUE(tab.ShouldShowIcon() != tab.ShouldShowAudioIndicator());
127 break;
128 default:
129 EXPECT_LE(2, tab.IconCapacity());
130 EXPECT_TRUE(tab.ShouldShowIcon());
131 if (tab.data_.CaptureActive()) {
132 EXPECT_FALSE(tab.ShouldShowAudioIndicator());
133 } else {
134 EXPECT_TRUE(tab.data_.AudioActive() ==
135 tab.ShouldShowAudioIndicator());
136 }
137 break;
138 }
139 }
140
141 // Check positioning of elements with respect to each other, and that they
142 // are fully within the contents bounds.
143 const gfx::Rect contents_bounds = tab.GetContentsBounds();
144 if (tab.ShouldShowIcon()) {
145 EXPECT_LE(contents_bounds.x(), tab.favicon_bounds_.x());
146 if (tab.title_bounds_.width() > 0)
147 EXPECT_LE(tab.favicon_bounds_.right(), tab.title_bounds_.x());
148 EXPECT_LE(contents_bounds.y(), tab.favicon_bounds_.y());
149 EXPECT_LE(tab.favicon_bounds_.bottom(), contents_bounds.bottom());
150 }
151 if (tab.ShouldShowIcon() && tab.ShouldShowAudioIndicator())
152 EXPECT_LE(tab.favicon_bounds_.right(), tab.audio_indicator_bounds_.x());
153 if (tab.ShouldShowAudioIndicator()) {
154 if (tab.title_bounds_.width() > 0)
155 EXPECT_LE(tab.title_bounds_.right(), tab.audio_indicator_bounds_.x());
156 EXPECT_LE(tab.audio_indicator_bounds_.right(), contents_bounds.right());
157 EXPECT_LE(contents_bounds.y(), tab.audio_indicator_bounds_.y());
158 EXPECT_LE(tab.audio_indicator_bounds_.bottom(), contents_bounds.bottom());
159 }
160 if (tab.ShouldShowAudioIndicator() && tab.ShouldShowCloseBox()) {
161 // Note: The audio indicator can overlap the left-insets of the close box,
162 // but should otherwise be to the left of the close button.
163 EXPECT_LE(tab.audio_indicator_bounds_.right(),
164 tab.close_button_->bounds().x() +
165 tab.close_button_->GetInsets().left());
166 }
167 if (tab.ShouldShowCloseBox()) {
168 // Note: The title bounds can overlap the left-insets of the close box,
169 // but should otherwise be to the left of the close button.
170 if (tab.title_bounds_.width() > 0) {
171 EXPECT_LE(tab.title_bounds_.right(),
172 tab.close_button_->bounds().x() +
173 tab.close_button_->GetInsets().left());
174 }
175 EXPECT_LE(tab.close_button_->bounds().right(), contents_bounds.right());
176 EXPECT_LE(contents_bounds.y(), tab.close_button_->bounds().y());
177 EXPECT_LE(tab.close_button_->bounds().bottom(), contents_bounds.bottom());
178 }
78 } 179 }
79 }; 180 };
80 181
81 TEST_F(TabTest, HitTestTopPixel) { 182 TEST_F(TabTest, HitTestTopPixel) {
82 Widget widget; 183 Widget widget;
83 Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW)); 184 Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW));
84 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 185 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
85 params.bounds.SetRect(10, 20, 300, 400); 186 params.bounds.SetRect(10, 20, 300, 400);
86 widget.Init(params); 187 widget.Init(params);
87 188
(...skipping 13 matching lines...) Expand all
101 // If the window is maximized, however, we want clicks in the top edge to 202 // If the window is maximized, however, we want clicks in the top edge to
102 // select the tab. 203 // select the tab.
103 widget.Maximize(); 204 widget.Maximize();
104 EXPECT_TRUE(tab.HitTestPoint(gfx::Point(middle_x, 0))); 205 EXPECT_TRUE(tab.HitTestPoint(gfx::Point(middle_x, 0)));
105 206
106 // But clicks in the area above the slanted sides should still miss. 207 // But clicks in the area above the slanted sides should still miss.
107 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, 0))); 208 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, 0)));
108 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(tab.width() - 1, 0))); 209 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(tab.width() - 1, 0)));
109 } 210 }
110 211
212 TEST_F(TabTest, LayoutAndVisibilityOfElements) {
213 FakeTabController controller;
214 Tab tab(&controller);
215
216 SkBitmap bitmap;
217 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 16, 16);
218 bitmap.allocPixels();
219 TabRendererData data;
220 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
221
222 // Perform layout over all possible combinations, checking for correct
223 // results.
224 for (int is_mini_tab = 0; is_mini_tab < 2; ++is_mini_tab) {
225 for (int is_active_tab = 0; is_active_tab < 2; ++is_active_tab) {
226 for (int audio_state = TabRendererData::AUDIO_STATE_NONE;
227 audio_state <= TabRendererData::AUDIO_STATE_PLAYING; ++audio_state) {
228 for (int capture_state = TabRendererData::CAPTURE_STATE_NONE;
229 capture_state <= TabRendererData::CAPTURE_STATE_PROJECTING;
230 ++capture_state) {
231 SCOPED_TRACE(::testing::Message()
232 << (is_active_tab ? "Active" : "Inactive") << ' '
233 << (is_mini_tab ? "Mini " : "")
234 << "Tab with audio_state=" << audio_state
235 << " and capture_state=" << capture_state);
236 data.mini = !!is_mini_tab;
237 controller.set_active_tab(!!is_active_tab);
238 data.audio_state =
239 static_cast<TabRendererData::AudioState>(audio_state);
240 data.capture_state =
241 static_cast<TabRendererData::CaptureState>(capture_state);
242 tab.SetData(data);
243
244 // Test layout for every width from standard to minimum.
245 gfx::Rect bounds(gfx::Point(0, 0), Tab::GetStandardSize());
246 int min_width;
247 if (is_mini_tab) {
248 bounds.set_width(Tab::GetMiniWidth());
249 min_width = Tab::GetMiniWidth();
250 } else {
251 min_width = is_active_tab ? Tab::GetMinimumSelectedSize().width() :
252 Tab::GetMinimumUnselectedSize().width();
253 }
254 while (bounds.width() >= min_width) {
255 SCOPED_TRACE(::testing::Message()
256 << "bounds=" << bounds.ToString());
257 tab.SetBoundsRect(bounds); // Invokes Tab::Layout().
258 CheckForExpectedLayoutAndVisibilityOfElements(tab);
259 bounds.set_width(bounds.width() - 1);
260 }
261 }
262 }
263 }
264 }
265 }
266
111 // Regression test for http://crbug.com/226253. Calling Layout() more than once 267 // Regression test for http://crbug.com/226253. Calling Layout() more than once
112 // shouldn't change the insets of the close button. 268 // shouldn't change the insets of the close button.
113 TEST_F(TabTest, CloseButtonLayout) { 269 TEST_F(TabTest, CloseButtonLayout) {
114 FakeTabController tab_controller; 270 FakeTabController tab_controller;
115 Tab tab(&tab_controller); 271 Tab tab(&tab_controller);
116 tab.SetBounds(0, 0, 100, 50); 272 tab.SetBounds(0, 0, 100, 50);
117 tab.Layout(); 273 tab.Layout();
118 gfx::Insets close_button_insets = tab.close_button_->GetInsets(); 274 gfx::Insets close_button_insets = tab.close_button_->GetInsets();
119 tab.Layout(); 275 tab.Layout();
120 gfx::Insets close_button_insets_2 = tab.close_button_->GetInsets(); 276 gfx::Insets close_button_insets_2 = tab.close_button_->GetInsets();
121 EXPECT_EQ(close_button_insets.top(), close_button_insets_2.top()); 277 EXPECT_EQ(close_button_insets.top(), close_button_insets_2.top());
122 EXPECT_EQ(close_button_insets.left(), close_button_insets_2.left()); 278 EXPECT_EQ(close_button_insets.left(), close_button_insets_2.left());
123 EXPECT_EQ(close_button_insets.bottom(), close_button_insets_2.bottom()); 279 EXPECT_EQ(close_button_insets.bottom(), close_button_insets_2.bottom());
124 EXPECT_EQ(close_button_insets.right(), close_button_insets_2.right()); 280 EXPECT_EQ(close_button_insets.right(), close_button_insets_2.right());
125 281
126 // Also make sure the close button is sized as large as the tab. 282 // Also make sure the close button is sized as large as the tab.
127 EXPECT_EQ(50, tab.close_button_->bounds().height()); 283 EXPECT_EQ(50, tab.close_button_->bounds().height());
128 } 284 }
129 285
130 TEST_F(TabTest, ActivityIndicators) { 286 TEST_F(TabTest, RecordingAndProjectingActivityIndicators) {
131 FakeTabController controller; 287 FakeTabController controller;
132 Tab tab(&controller); 288 Tab tab(&controller);
289 tab.SetBoundsRect(gfx::Rect(gfx::Point(0, 0), Tab::GetStandardSize()));
133 290
134 SkBitmap bitmap; 291 SkBitmap bitmap;
135 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 292 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 16, 16);
136 bitmap.allocPixels(); 293 bitmap.allocPixels();
137 294
138 TabRendererData data; 295 TabRendererData data;
139 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 296 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
140 tab.SetData(data); 297 tab.SetData(data);
141 298
142 // Audio starts and stops. 299 // Recording starts and stops.
143 data.audio_state = TabRendererData::AUDIO_STATE_PLAYING;
144 tab.SetData(data);
145 EXPECT_TRUE(IconAnimationInvariant(tab));
146 EXPECT_EQ(TabRendererData::AUDIO_STATE_PLAYING, tab.data().audio_state);
147 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state);
148 data.audio_state = TabRendererData::AUDIO_STATE_NONE;
149 tab.SetData(data);
150 EXPECT_TRUE(IconAnimationInvariant(tab));
151 EXPECT_EQ(TabRendererData::AUDIO_STATE_NONE, tab.data().audio_state);
152 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state);
153 EXPECT_TRUE(IconAnimationInvariant(tab));
154
155 // Capture starts and stops.
156 data.capture_state = TabRendererData::CAPTURE_STATE_RECORDING; 300 data.capture_state = TabRendererData::CAPTURE_STATE_RECORDING;
157 tab.SetData(data); 301 tab.SetData(data);
158 EXPECT_TRUE(IconAnimationInvariant(tab)); 302 EXPECT_TRUE(IconAnimationInvariant(tab));
159 EXPECT_EQ(TabRendererData::AUDIO_STATE_NONE, tab.data().audio_state);
160 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state); 303 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state);
161 data.capture_state = TabRendererData::CAPTURE_STATE_NONE; 304 data.capture_state = TabRendererData::CAPTURE_STATE_NONE;
162 tab.SetData(data); 305 tab.SetData(data);
163 EXPECT_TRUE(IconAnimationInvariant(tab)); 306 EXPECT_TRUE(IconAnimationInvariant(tab));
164 EXPECT_EQ(TabRendererData::AUDIO_STATE_NONE, tab.data().audio_state);
165 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state); 307 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state);
166 EXPECT_TRUE(IconAnimationInvariant(tab)); 308 EXPECT_TRUE(IconAnimationInvariant(tab));
167 309
168 // Audio starts then capture starts, then audio stops then capture stops. 310 // Recording starts then tab capture starts, then back to just recording, then
169 data.audio_state = TabRendererData::AUDIO_STATE_PLAYING; 311 // recording stops.
170 tab.SetData(data);
171 data.capture_state = TabRendererData::CAPTURE_STATE_RECORDING; 312 data.capture_state = TabRendererData::CAPTURE_STATE_RECORDING;
172 tab.SetData(data); 313 tab.SetData(data);
173 EXPECT_TRUE(IconAnimationInvariant(tab)); 314 EXPECT_TRUE(IconAnimationInvariant(tab));
174 EXPECT_EQ(TabRendererData::AUDIO_STATE_PLAYING, tab.data().audio_state);
175 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state); 315 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state);
176 316
177 data.title = ASCIIToUTF16("test X"); 317 data.title = ASCIIToUTF16("test X");
178 tab.SetData(data); 318 tab.SetData(data);
179 EXPECT_TRUE(IconAnimationInvariant(tab)); 319 EXPECT_TRUE(IconAnimationInvariant(tab));
180 320
181 data.audio_state = TabRendererData::AUDIO_STATE_NONE; 321 data.capture_state = TabRendererData::CAPTURE_STATE_PROJECTING;
182 tab.SetData(data); 322 tab.SetData(data);
183 EXPECT_TRUE(IconAnimationInvariant(tab)); 323 EXPECT_TRUE(IconAnimationInvariant(tab));
184 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state); 324 EXPECT_EQ(TabRendererData::CAPTURE_STATE_PROJECTING,
185 data.capture_state = TabRendererData::CAPTURE_STATE_NONE; 325 tab.data().capture_state);
186 tab.SetData(data);
187 EXPECT_TRUE(IconAnimationInvariant(tab));
188 EXPECT_EQ(TabRendererData::AUDIO_STATE_NONE, tab.data().audio_state);
189 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state);
190
191 // Audio starts then capture starts, then capture stops then audio stops.
192 data.audio_state = TabRendererData::AUDIO_STATE_PLAYING;
193 tab.SetData(data);
194 data.capture_state = TabRendererData::CAPTURE_STATE_RECORDING;
195 tab.SetData(data);
196 EXPECT_TRUE(IconAnimationInvariant(tab));
197 EXPECT_EQ(TabRendererData::AUDIO_STATE_PLAYING, tab.data().audio_state);
198 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state);
199 326
200 data.title = ASCIIToUTF16("test Y"); 327 data.title = ASCIIToUTF16("test Y");
201 tab.SetData(data); 328 tab.SetData(data);
202 EXPECT_TRUE(IconAnimationInvariant(tab)); 329 EXPECT_TRUE(IconAnimationInvariant(tab));
203 330
331 data.capture_state = TabRendererData::CAPTURE_STATE_RECORDING;
332 tab.SetData(data);
333 EXPECT_TRUE(IconAnimationInvariant(tab));
334 EXPECT_EQ(TabRendererData::CAPTURE_STATE_RECORDING, tab.data().capture_state);
335
204 data.capture_state = TabRendererData::CAPTURE_STATE_NONE; 336 data.capture_state = TabRendererData::CAPTURE_STATE_NONE;
205 tab.SetData(data); 337 tab.SetData(data);
206 EXPECT_TRUE(IconAnimationInvariant(tab)); 338 EXPECT_TRUE(IconAnimationInvariant(tab));
207 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state); 339 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state);
208
209 data.audio_state = TabRendererData::AUDIO_STATE_NONE;
210 tab.SetData(data);
211 EXPECT_TRUE(IconAnimationInvariant(tab));
212 EXPECT_EQ(TabRendererData::AUDIO_STATE_NONE, tab.data().audio_state);
213 EXPECT_EQ(TabRendererData::CAPTURE_STATE_NONE, tab.data().capture_state);
214 EXPECT_TRUE(IconAnimationInvariant(tab));
215 } 340 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.cc ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698