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

Side by Side Diff: content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc

Issue 1861733002: Add touch drag UMA latency metric. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Actually fix tests. Created 4 years, 8 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/test/histogram_tester.h" 5 #include "base/test/histogram_tester.h"
6 #include "content/browser/renderer_host/input/render_widget_host_latency_tracker .h" 6 #include "content/browser/renderer_host/input/render_widget_host_latency_tracker .h"
7 #include "content/common/input/synthetic_web_input_event_builders.h" 7 #include "content/common/input/synthetic_web_input_event_builders.h"
8 #include "content/public/browser/native_web_keyboard_event.h" 8 #include "content/public/browser/native_web_keyboard_event.h"
9 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
10 11
12 using base::Bucket;
11 using blink::WebInputEvent; 13 using blink::WebInputEvent;
14 using testing::ElementsAre;
12 15
13 namespace content { 16 namespace content {
14 namespace { 17 namespace {
15 18
16 void AddFakeComponents(const RenderWidgetHostLatencyTracker& tracker, 19 void AddFakeComponents(const RenderWidgetHostLatencyTracker& tracker,
17 ui::LatencyInfo* latency) { 20 ui::LatencyInfo* latency) {
18 latency->AddLatencyNumberWithTimestamp( 21 latency->AddLatencyNumberWithTimestamp(
19 ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0, base::TimeTicks::Now(), 1); 22 ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0, base::TimeTicks::Now(), 1);
20 latency->AddLatencyNumberWithTimestamp( 23 latency->AddLatencyNumberWithTimestamp(
21 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0, 24 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 << size << " entries, but had " 70 << size << " entries, but had "
68 << histogram_size; 71 << histogram_size;
69 } 72 }
70 } 73 }
71 74
72 RenderWidgetHostLatencyTracker* tracker() { return &tracker_; } 75 RenderWidgetHostLatencyTracker* tracker() { return &tracker_; }
73 void ResetHistograms() { 76 void ResetHistograms() {
74 histogram_tester_.reset(new base::HistogramTester()); 77 histogram_tester_.reset(new base::HistogramTester());
75 } 78 }
76 79
80 const base::HistogramTester& histogram_tester() {
81 return *histogram_tester_;
82 }
83
77 private: 84 private:
78 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostLatencyTrackerTest); 85 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostLatencyTrackerTest);
79 const int kTestRoutingId = 3; 86 const int kTestRoutingId = 3;
80 const int kTestProcessId = 1; 87 const int kTestProcessId = 1;
81 scoped_ptr<base::HistogramTester> histogram_tester_; 88 scoped_ptr<base::HistogramTester> histogram_tester_;
82 RenderWidgetHostLatencyTracker tracker_; 89 RenderWidgetHostLatencyTracker tracker_;
83 }; 90 };
84 91
85 TEST_F(RenderWidgetHostLatencyTrackerTest, TestHistograms) { 92 TEST_F(RenderWidgetHostLatencyTrackerTest, TestHistograms) {
86 for (bool rendering_on_main : { false, true }) { 93 for (bool rendering_on_main : { false, true }) {
87 ResetHistograms(); 94 ResetHistograms();
88 { 95 {
89 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollUpdate( 96 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollUpdate(
90 5.f, -5.f, 0, blink::WebGestureDeviceTouchscreen); 97 5.f, -5.f, 0, blink::WebGestureDeviceTouchscreen);
91 scroll.timeStampSeconds = 98 scroll.timeStampSeconds =
92 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 99 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
93 ui::LatencyInfo scroll_latency; 100 ui::LatencyInfo scroll_latency;
94 AddFakeComponents(*tracker(), &scroll_latency); 101 AddFakeComponents(*tracker(), &scroll_latency);
95 AddRenderingScheduledComponent(&scroll_latency, rendering_on_main); 102 AddRenderingScheduledComponent(&scroll_latency, rendering_on_main);
96 tracker()->OnInputEvent(scroll, &scroll_latency); 103 tracker()->OnInputEvent(scroll, &scroll_latency);
97 EXPECT_TRUE(scroll_latency.FindLatency( 104 EXPECT_TRUE(scroll_latency.FindLatency(
98 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, 105 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
99 tracker()->latency_component_id(), nullptr)); 106 tracker()->latency_component_id(), nullptr));
100 EXPECT_TRUE(scroll_latency.FindLatency( 107 EXPECT_TRUE(scroll_latency.FindLatency(
101 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); 108 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr));
102 EXPECT_EQ(1U, scroll_latency.input_coordinates_size()); 109 EXPECT_EQ(1U, scroll_latency.input_coordinates_size());
103 tracker()->OnInputEventAck(scroll, &scroll_latency); 110 tracker()->OnInputEventAck(scroll, &scroll_latency, false);
104 } 111 }
105 112
106 { 113 {
107 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( 114 auto wheel = SyntheticWebMouseWheelEventBuilder::Build(
108 blink::WebMouseWheelEvent::PhaseChanged); 115 blink::WebMouseWheelEvent::PhaseChanged);
109 wheel.timeStampSeconds = 116 wheel.timeStampSeconds =
110 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 117 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
111 ui::LatencyInfo wheel_latency; 118 ui::LatencyInfo wheel_latency;
112 AddFakeComponents(*tracker(), &wheel_latency); 119 AddFakeComponents(*tracker(), &wheel_latency);
113 AddRenderingScheduledComponent(&wheel_latency, rendering_on_main); 120 AddRenderingScheduledComponent(&wheel_latency, rendering_on_main);
114 tracker()->OnInputEvent(wheel, &wheel_latency); 121 tracker()->OnInputEvent(wheel, &wheel_latency);
115 EXPECT_TRUE(wheel_latency.FindLatency( 122 EXPECT_TRUE(wheel_latency.FindLatency(
116 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, 123 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
117 tracker()->latency_component_id(), nullptr)); 124 tracker()->latency_component_id(), nullptr));
118 EXPECT_TRUE(wheel_latency.FindLatency( 125 EXPECT_TRUE(wheel_latency.FindLatency(
119 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); 126 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr));
120 EXPECT_EQ(1U, wheel_latency.input_coordinates_size()); 127 EXPECT_EQ(1U, wheel_latency.input_coordinates_size());
121 tracker()->OnInputEventAck(wheel, &wheel_latency); 128 tracker()->OnInputEventAck(wheel, &wheel_latency, false);
122 } 129 }
123 130
124 { 131 {
125 SyntheticWebTouchEvent touch; 132 SyntheticWebTouchEvent touch;
126 touch.PressPoint(0, 0); 133 touch.PressPoint(0, 0);
127 touch.PressPoint(1, 1); 134 touch.PressPoint(1, 1);
128 ui::LatencyInfo touch_latency; 135 ui::LatencyInfo touch_latency;
129 AddFakeComponents(*tracker(), &touch_latency); 136 AddFakeComponents(*tracker(), &touch_latency);
130 AddRenderingScheduledComponent(&touch_latency, rendering_on_main); 137 AddRenderingScheduledComponent(&touch_latency, rendering_on_main);
131 tracker()->OnInputEvent(touch, &touch_latency); 138 tracker()->OnInputEvent(touch, &touch_latency);
132 EXPECT_TRUE(touch_latency.FindLatency( 139 EXPECT_TRUE(touch_latency.FindLatency(
133 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, 140 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
134 tracker()->latency_component_id(), nullptr)); 141 tracker()->latency_component_id(), nullptr));
135 EXPECT_TRUE(touch_latency.FindLatency( 142 EXPECT_TRUE(touch_latency.FindLatency(
136 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); 143 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr));
137 EXPECT_EQ(2U, touch_latency.input_coordinates_size()); 144 EXPECT_EQ(2U, touch_latency.input_coordinates_size());
138 tracker()->OnInputEventAck(touch, &touch_latency); 145 tracker()->OnInputEventAck(touch, &touch_latency, false);
139 tracker()->OnFrameSwapped(touch_latency); 146 tracker()->OnFrameSwapped(touch_latency);
140 } 147 }
141 148
142 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelUI", 1)); 149 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelUI", 1));
143 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchUI", 1)); 150 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchUI", 1));
144 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelAcked", 1)); 151 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelAcked", 1));
145 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchAcked", 1)); 152 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchAcked", 1));
146 EXPECT_TRUE( 153 EXPECT_TRUE(
147 HistogramSizeEq("Event.Latency.TouchToFirstScrollUpdateSwapBegin", 1)); 154 HistogramSizeEq("Event.Latency.TouchToFirstScrollUpdateSwapBegin", 1));
148 EXPECT_TRUE( 155 EXPECT_TRUE(
(...skipping 20 matching lines...) Expand all
169 176
170 TEST_F(RenderWidgetHostLatencyTrackerTest, 177 TEST_F(RenderWidgetHostLatencyTrackerTest,
171 LatencyTerminatedOnAckIfRenderingNotScheduled) { 178 LatencyTerminatedOnAckIfRenderingNotScheduled) {
172 { 179 {
173 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollBegin(5.f, -5.f); 180 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollBegin(5.f, -5.f);
174 ui::LatencyInfo scroll_latency; 181 ui::LatencyInfo scroll_latency;
175 AddFakeComponents(*tracker(), &scroll_latency); 182 AddFakeComponents(*tracker(), &scroll_latency);
176 // Don't include the rendering schedule component, since we're testing the 183 // Don't include the rendering schedule component, since we're testing the
177 // case where rendering isn't scheduled. 184 // case where rendering isn't scheduled.
178 tracker()->OnInputEvent(scroll, &scroll_latency); 185 tracker()->OnInputEvent(scroll, &scroll_latency);
179 tracker()->OnInputEventAck(scroll, &scroll_latency); 186 tracker()->OnInputEventAck(scroll, &scroll_latency, false);
180 EXPECT_TRUE(scroll_latency.FindLatency( 187 EXPECT_TRUE(scroll_latency.FindLatency(
181 ui::INPUT_EVENT_LATENCY_TERMINATED_GESTURE_COMPONENT, 0, nullptr)); 188 ui::INPUT_EVENT_LATENCY_TERMINATED_GESTURE_COMPONENT, 0, nullptr));
182 EXPECT_TRUE(scroll_latency.terminated()); 189 EXPECT_TRUE(scroll_latency.terminated());
183 } 190 }
184 191
185 { 192 {
186 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( 193 auto wheel = SyntheticWebMouseWheelEventBuilder::Build(
187 blink::WebMouseWheelEvent::PhaseChanged); 194 blink::WebMouseWheelEvent::PhaseChanged);
188 ui::LatencyInfo wheel_latency; 195 ui::LatencyInfo wheel_latency;
189 AddFakeComponents(*tracker(), &wheel_latency); 196 AddFakeComponents(*tracker(), &wheel_latency);
190 tracker()->OnInputEvent(wheel, &wheel_latency); 197 tracker()->OnInputEvent(wheel, &wheel_latency);
191 tracker()->OnInputEventAck(wheel, &wheel_latency); 198 tracker()->OnInputEventAck(wheel, &wheel_latency, false);
192 EXPECT_TRUE(wheel_latency.FindLatency( 199 EXPECT_TRUE(wheel_latency.FindLatency(
193 ui::INPUT_EVENT_LATENCY_TERMINATED_MOUSE_WHEEL_COMPONENT, 0, nullptr)); 200 ui::INPUT_EVENT_LATENCY_TERMINATED_MOUSE_WHEEL_COMPONENT, 0, nullptr));
194 EXPECT_TRUE(wheel_latency.terminated()); 201 EXPECT_TRUE(wheel_latency.terminated());
195 } 202 }
196 203
197 { 204 {
198 SyntheticWebTouchEvent touch; 205 SyntheticWebTouchEvent touch;
199 touch.PressPoint(0, 0); 206 touch.PressPoint(0, 0);
200 ui::LatencyInfo touch_latency; 207 ui::LatencyInfo touch_latency;
201 AddFakeComponents(*tracker(), &touch_latency); 208 AddFakeComponents(*tracker(), &touch_latency);
202 tracker()->OnInputEvent(touch, &touch_latency); 209 tracker()->OnInputEvent(touch, &touch_latency);
203 tracker()->OnInputEventAck(touch, &touch_latency); 210 tracker()->OnInputEventAck(touch, &touch_latency, false);
204 EXPECT_TRUE(touch_latency.FindLatency( 211 EXPECT_TRUE(touch_latency.FindLatency(
205 ui::INPUT_EVENT_LATENCY_TERMINATED_TOUCH_COMPONENT, 0, nullptr)); 212 ui::INPUT_EVENT_LATENCY_TERMINATED_TOUCH_COMPONENT, 0, nullptr));
206 EXPECT_TRUE(touch_latency.terminated()); 213 EXPECT_TRUE(touch_latency.terminated());
207 tracker()->OnFrameSwapped(touch_latency); 214 tracker()->OnFrameSwapped(touch_latency);
208 } 215 }
209 216
210 { 217 {
211 auto mouse_move = SyntheticWebMouseEventBuilder::Build( 218 auto mouse_move = SyntheticWebMouseEventBuilder::Build(
212 blink::WebMouseEvent::MouseMove); 219 blink::WebMouseEvent::MouseMove);
213 ui::LatencyInfo mouse_latency; 220 ui::LatencyInfo mouse_latency;
214 AddFakeComponents(*tracker(), &mouse_latency); 221 AddFakeComponents(*tracker(), &mouse_latency);
215 tracker()->OnInputEvent(mouse_move, &mouse_latency); 222 tracker()->OnInputEvent(mouse_move, &mouse_latency);
216 tracker()->OnInputEventAck(mouse_move, &mouse_latency); 223 tracker()->OnInputEventAck(mouse_move, &mouse_latency, false);
217 EXPECT_TRUE(mouse_latency.FindLatency( 224 EXPECT_TRUE(mouse_latency.FindLatency(
218 ui::INPUT_EVENT_LATENCY_TERMINATED_MOUSE_COMPONENT, 0, nullptr)); 225 ui::INPUT_EVENT_LATENCY_TERMINATED_MOUSE_COMPONENT, 0, nullptr));
219 EXPECT_TRUE(mouse_latency.terminated()); 226 EXPECT_TRUE(mouse_latency.terminated());
220 } 227 }
221 228
222 { 229 {
223 auto key_event = SyntheticWebKeyboardEventBuilder::Build( 230 auto key_event = SyntheticWebKeyboardEventBuilder::Build(
224 blink::WebKeyboardEvent::Char); 231 blink::WebKeyboardEvent::Char);
225 ui::LatencyInfo key_latency; 232 ui::LatencyInfo key_latency;
226 AddFakeComponents(*tracker(), &key_latency); 233 AddFakeComponents(*tracker(), &key_latency);
227 tracker()->OnInputEvent(key_event, &key_latency); 234 tracker()->OnInputEvent(key_event, &key_latency);
228 tracker()->OnInputEventAck(key_event, &key_latency); 235 tracker()->OnInputEventAck(key_event, &key_latency, false);
229 EXPECT_TRUE(key_latency.FindLatency( 236 EXPECT_TRUE(key_latency.FindLatency(
230 ui::INPUT_EVENT_LATENCY_TERMINATED_KEYBOARD_COMPONENT, 0, nullptr)); 237 ui::INPUT_EVENT_LATENCY_TERMINATED_KEYBOARD_COMPONENT, 0, nullptr));
231 EXPECT_TRUE(key_latency.terminated()); 238 EXPECT_TRUE(key_latency.terminated());
232 } 239 }
233 240
234 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelUI", 1)); 241 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelUI", 1));
235 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchUI", 1)); 242 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchUI", 1));
236 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelAcked", 1)); 243 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.WheelAcked", 1));
237 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchAcked", 1)); 244 EXPECT_TRUE(HistogramSizeEq("Event.Latency.Browser.TouchAcked", 1));
238 EXPECT_TRUE( 245 EXPECT_TRUE(
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 tracker()->latency_component_id(), nullptr)); 362 tracker()->latency_component_id(), nullptr));
356 EXPECT_FALSE(scroll_latency.FindLatency( 363 EXPECT_FALSE(scroll_latency.FindLatency(
357 ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT, 364 ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT,
358 tracker()->latency_component_id(), nullptr)); 365 tracker()->latency_component_id(), nullptr));
359 EXPECT_TRUE(scroll_latency.FindLatency( 366 EXPECT_TRUE(scroll_latency.FindLatency(
360 ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, 367 ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT,
361 tracker()->latency_component_id(), nullptr)); 368 tracker()->latency_component_id(), nullptr));
362 EXPECT_EQ(3U, scroll_latency.latency_components().size()); 369 EXPECT_EQ(3U, scroll_latency.latency_components().size());
363 } 370 }
364 371
372 TEST_F(RenderWidgetHostLatencyTrackerTest, TouchBlockingAndQueueingTime) {
373 for (bool blocking : {false, true}) {
374 SyntheticWebTouchEvent event;
375 event.PressPoint(1, 1);
376
377 ui::LatencyInfo latency_start;
378 tracker()->OnInputEvent(event, &latency_start);
379 tracker()->OnForwardEventToRenderer(event, &latency_start);
380 tracker()->OnInputEventAck(event, &latency_start, blocking);
381
382 ui::LatencyInfo latency_move;
383 event.MovePoint(0, 20, 20);
384 tracker()->OnInputEvent(event, &latency_move);
385 tracker()->OnForwardEventToRenderer(event, &latency_move);
386
387 EXPECT_TRUE(latency_move.FindLatency(
388 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr));
389 EXPECT_TRUE(
390 latency_move.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
391 tracker()->latency_component_id(), nullptr));
392 EXPECT_TRUE(latency_move.FindLatency(
393 ui::INPUT_EVENT_LATENCY_REACHED_RWH_COMPONENT, 0, nullptr));
394
395 EXPECT_EQ(3U, latency_move.latency_components().size());
396
397 ui::LatencyInfo fake_latency_move;
398 fake_latency_move.AddLatencyNumberWithTimestamp(
399 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
400 tracker()->latency_component_id(), 0,
401 base::TimeTicks() + base::TimeDelta::FromMicroseconds(1), 1);
402
403 fake_latency_move.AddLatencyNumberWithTimestamp(
404 ui::INPUT_EVENT_LATENCY_REACHED_RWH_COMPONENT, 0, 0,
405 base::TimeTicks() + base::TimeDelta::FromMicroseconds(5), 1);
406
407 fake_latency_move.AddLatencyNumberWithTimestamp(
408 ui::INPUT_EVENT_LATENCY_ACK_RWH_COMPONENT, 0, 0,
409 base::TimeTicks() + base::TimeDelta::FromMicroseconds(12), 1);
410
411 // Call ComputeInputLatencyHistograms directly to avoid OnInputEventAck
412 // overwriting components.
413 tracker()->ComputeInputLatencyHistograms(event.type,
414 tracker()->latency_component_id(),
415 fake_latency_move, blocking);
416 }
417
418 EXPECT_THAT(histogram_tester().GetAllSamples(
419 "Event.Latency.QueueingTime.TouchMoveDefaultPrevented"),
420 ElementsAre(Bucket(4, 1)));
421 EXPECT_THAT(histogram_tester().GetAllSamples(
422 "Event.Latency.QueueingTime.TouchMoveDefaultAllowed"),
423 ElementsAre(Bucket(4, 1)));
424 EXPECT_THAT(histogram_tester().GetAllSamples(
425 "Event.Latency.BlockingTime.TouchMoveDefaultPrevented"),
426 ElementsAre(Bucket(7, 1)));
427 EXPECT_THAT(histogram_tester().GetAllSamples(
428 "Event.Latency.BlockingTime.TouchMoveDefaultAllowed"),
429 ElementsAre(Bucket(7, 1)));
430 }
431
365 } // namespace content 432 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698