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
3 // found in the LICENSE file.
5 package org.chromium.android_webview.test;
7 import android.view.View;
8 import android.view.View.MeasureSpec;
9 import android.test.InstrumentationTestCase;
10 import android.test.suitebuilder.annotation.SmallTest;
12 import org.chromium.android_webview.AwLayoutSizer;
13 import org.chromium.base.test.util.Feature;
15 public class AwLayoutSizerTest extends InstrumentationTestCase {
16 static class LayoutSizerDelegate implements AwLayoutSizer.Delegate {
17 public int requestLayoutCallCount;
18 public boolean setMeasuredDimensionCalled;
19 public int measuredWidth;
20 public int measuredHeight;
21 public int fixedLayoutWidth;
22 public int fixedLayoutHeight;
23 public boolean heightWrapContent;
26 public void requestLayout() {
27 requestLayoutCallCount++;
31 public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
32 setMeasuredDimensionCalled = true;
33 this.measuredWidth = measuredWidth;
34 this.measuredHeight = measuredHeight;
38 public void setFixedLayoutSize(int widthDip, int heightDip) {
39 fixedLayoutWidth = widthDip;
40 fixedLayoutHeight = heightDip;
44 public boolean isLayoutParamsHeightWrapContent() {
45 return heightWrapContent;
49 private static final int FIRST_CONTENT_WIDTH = 101;
50 private static final int FIRST_CONTENT_HEIGHT = 389;
51 private static final int SECOND_CONTENT_WIDTH = 103;
52 private static final int SECOND_CONTENT_HEIGHT = 397;
54 private static final int SMALLER_CONTENT_SIZE = 25;
55 private static final int AT_MOST_MEASURE_SIZE = 50;
56 private static final int TOO_LARGE_CONTENT_SIZE = 100;
58 private static final float INITIAL_PAGE_SCALE = 1.0f;
59 private static final double DIP_SCALE = 1.0;
62 @Feature({"AndroidWebView"})
63 public void testCanQueryContentSize() {
64 AwLayoutSizer layoutSizer = new AwLayoutSizer();
65 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
66 layoutSizer.setDelegate(delegate);
67 layoutSizer.setDIPScale(DIP_SCALE);
69 final int contentWidth = 101;
70 final int contentHeight = 389;
72 layoutSizer.onContentSizeChanged(contentWidth, contentHeight);
73 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
74 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
75 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
77 assertTrue(delegate.setMeasuredDimensionCalled);
78 assertEquals(contentWidth, delegate.measuredWidth & View.MEASURED_SIZE_MASK);
79 assertEquals(contentHeight, delegate.measuredHeight & View.MEASURED_SIZE_MASK);
83 @Feature({"AndroidWebView"})
84 public void testContentSizeChangeRequestsLayout() {
85 AwLayoutSizer layoutSizer = new AwLayoutSizer();
86 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
87 layoutSizer.setDelegate(delegate);
88 layoutSizer.setDIPScale(DIP_SCALE);
90 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
91 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
92 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
93 layoutSizer.onContentSizeChanged(SECOND_CONTENT_WIDTH, SECOND_CONTENT_WIDTH);
95 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
99 @Feature({"AndroidWebView"})
100 public void testContentSizeChangeDoesNotRequestLayoutIfMeasuredExcatly() {
101 AwLayoutSizer layoutSizer = new AwLayoutSizer();
102 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
103 layoutSizer.setDelegate(delegate);
104 layoutSizer.setDIPScale(DIP_SCALE);
106 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
107 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
108 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
109 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
110 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
111 layoutSizer.onContentSizeChanged(SECOND_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
113 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
117 @Feature({"AndroidWebView"})
118 public void testDuplicateContentSizeChangeDoesNotRequestLayout() {
119 AwLayoutSizer layoutSizer = new AwLayoutSizer();
120 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
121 layoutSizer.setDelegate(delegate);
122 layoutSizer.setDIPScale(DIP_SCALE);
124 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
125 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
126 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
127 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
128 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
129 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
131 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
135 @Feature({"AndroidWebView"})
136 public void testContentHeightGrowsTillAtMostSize() {
137 AwLayoutSizer layoutSizer = new AwLayoutSizer();
138 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
139 layoutSizer.setDelegate(delegate);
140 layoutSizer.setDIPScale(DIP_SCALE);
142 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
143 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
144 layoutSizer.onMeasure(
145 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
146 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
147 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth);
148 assertEquals(SMALLER_CONTENT_SIZE, delegate.measuredHeight);
150 layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
151 layoutSizer.onMeasure(
152 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
153 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
154 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth & View.MEASURED_SIZE_MASK);
155 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredHeight & View.MEASURED_SIZE_MASK);
159 @Feature({"AndroidWebView"})
160 public void testContentHeightGrowthRequestsLayoutInAtMostSizeMode() {
161 AwLayoutSizer layoutSizer = new AwLayoutSizer();
162 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
163 layoutSizer.setDelegate(delegate);
164 layoutSizer.setDIPScale(DIP_SCALE);
166 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
167 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
168 layoutSizer.onMeasure(
169 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
170 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
171 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth);
172 assertEquals(SMALLER_CONTENT_SIZE, delegate.measuredHeight);
174 int requestLayoutCallCount = delegate.requestLayoutCallCount;
175 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, AT_MOST_MEASURE_SIZE - 1);
176 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
178 // Test that crossing the AT_MOST_MEASURE_SIZE threshold results in a requestLayout.
179 requestLayoutCallCount = delegate.requestLayoutCallCount;
180 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, AT_MOST_MEASURE_SIZE + 1);
181 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
185 @Feature({"AndroidWebView"})
186 public void testContentHeightShrinksAfterAtMostSize() {
187 AwLayoutSizer layoutSizer = new AwLayoutSizer();
188 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
189 layoutSizer.setDelegate(delegate);
190 layoutSizer.setDIPScale(DIP_SCALE);
192 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
193 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
194 layoutSizer.onMeasure(
195 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
196 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
197 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth);
198 assertEquals(SMALLER_CONTENT_SIZE, delegate.measuredHeight);
200 layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
201 layoutSizer.onMeasure(
202 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
203 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
204 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth & View.MEASURED_SIZE_MASK);
205 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredHeight & View.MEASURED_SIZE_MASK);
207 int requestLayoutCallCount = delegate.requestLayoutCallCount;
208 layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE + 1);
209 layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
210 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
212 requestLayoutCallCount = delegate.requestLayoutCallCount;
213 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
214 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
215 layoutSizer.onMeasure(
216 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
217 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
218 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth);
219 assertEquals(SMALLER_CONTENT_SIZE, delegate.measuredHeight);
223 @Feature({"AndroidWebView"})
224 public void testScaleChangeRequestsLayout() {
225 AwLayoutSizer layoutSizer = new AwLayoutSizer();
226 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
227 layoutSizer.setDelegate(delegate);
228 layoutSizer.setDIPScale(DIP_SCALE);
230 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
231 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
232 layoutSizer.onMeasure(
233 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.EXACTLY),
234 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
235 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
236 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE + 0.5f);
238 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
242 @Feature({"AndroidWebView"})
243 public void testDuplicateScaleChangeDoesNotRequestLayout() {
244 AwLayoutSizer layoutSizer = new AwLayoutSizer();
245 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
246 layoutSizer.setDelegate(delegate);
247 layoutSizer.setDIPScale(DIP_SCALE);
249 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
250 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
251 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
252 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
253 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
254 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
256 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
260 @Feature({"AndroidWebView"})
261 public void testScaleChangeGrowsTillAtMostSize() {
262 AwLayoutSizer layoutSizer = new AwLayoutSizer();
263 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
264 layoutSizer.setDelegate(delegate);
265 layoutSizer.setDIPScale(DIP_SCALE);
267 final float tooLargePageScale = 3.00f;
269 layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
270 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
271 layoutSizer.onMeasure(
272 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
273 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
274 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth);
275 assertEquals(SMALLER_CONTENT_SIZE, delegate.measuredHeight);
277 layoutSizer.onPageScaleChanged(tooLargePageScale);
278 layoutSizer.onMeasure(
279 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
280 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
281 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredWidth & View.MEASURED_SIZE_MASK);
282 assertEquals(AT_MOST_MEASURE_SIZE, delegate.measuredHeight & View.MEASURED_SIZE_MASK);
286 @Feature({"AndroidWebView"})
287 public void testFreezeAndUnfreezeDoesntCauseLayout() {
288 AwLayoutSizer layoutSizer = new AwLayoutSizer();
289 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
290 layoutSizer.setDelegate(delegate);
291 layoutSizer.setDIPScale(DIP_SCALE);
293 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
294 layoutSizer.freezeLayoutRequests();
295 layoutSizer.unfreezeLayoutRequests();
296 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
300 @Feature({"AndroidWebView"})
301 public void testFreezeInhibitsLayoutRequest() {
302 AwLayoutSizer layoutSizer = new AwLayoutSizer();
303 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
304 layoutSizer.setDelegate(delegate);
305 layoutSizer.setDIPScale(DIP_SCALE);
307 layoutSizer.freezeLayoutRequests();
308 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
309 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
310 layoutSizer.onContentSizeChanged(SECOND_CONTENT_WIDTH, SECOND_CONTENT_WIDTH);
311 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
315 @Feature({"AndroidWebView"})
316 public void testUnfreezeIssuesLayoutRequest() {
317 AwLayoutSizer layoutSizer = new AwLayoutSizer();
318 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
319 layoutSizer.setDelegate(delegate);
320 layoutSizer.setDIPScale(DIP_SCALE);
322 layoutSizer.freezeLayoutRequests();
323 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
324 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
325 layoutSizer.onContentSizeChanged(SECOND_CONTENT_WIDTH, SECOND_CONTENT_WIDTH);
326 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
327 layoutSizer.unfreezeLayoutRequests();
328 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
332 @Feature({"AndroidWebView"})
333 public void testViewportWithExactMeasureSpec() {
334 AwLayoutSizer layoutSizer = new AwLayoutSizer();
335 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
336 layoutSizer.setDelegate(delegate);
338 final float dipScale = 2.0f;
339 final int measuredWidth = 800;
340 final int measuredHeight = 400;
342 layoutSizer.setDIPScale(dipScale);
344 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
345 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
346 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY),
347 MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY));
348 assertEquals(measuredWidth, delegate.measuredWidth & View.MEASURED_SIZE_MASK);
349 assertEquals(measuredHeight, delegate.measuredHeight & View.MEASURED_SIZE_MASK);
351 layoutSizer.onSizeChanged(measuredWidth, measuredHeight, 0, 0);
353 assertEquals(0, delegate.fixedLayoutWidth);
354 assertEquals(0, delegate.fixedLayoutHeight);
356 layoutSizer.onPageScaleChanged(2.0f);
358 assertEquals(0, delegate.fixedLayoutWidth);
359 assertEquals(0, delegate.fixedLayoutHeight);
363 @Feature({"AndroidWebView"})
364 public void testViewportDipSizeOverrideRounding() {
365 AwLayoutSizer layoutSizer = new AwLayoutSizer();
366 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
367 layoutSizer.setDelegate(delegate);
369 final float dipScale = 0.666f;
371 int contentWidth = 9;
372 int contentHeight = 6;
374 layoutSizer.setDIPScale(dipScale);
375 layoutSizer.onContentSizeChanged(contentWidth, contentHeight);
376 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
377 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
378 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
380 assertTrue(delegate.setMeasuredDimensionCalled);
381 int measuredWidth = delegate.measuredWidth & View.MEASURED_SIZE_MASK;
382 int measuredHeight = delegate.measuredHeight & View.MEASURED_SIZE_MASK;
383 assertFalse((int) Math.ceil(measuredWidth / dipScale) == contentWidth);
384 assertFalse((int) Math.ceil(measuredHeight / dipScale) == contentHeight);
386 layoutSizer.onSizeChanged(measuredWidth, measuredHeight, 0, 0);
390 @Feature({"AndroidWebView"})
391 public void testViewportWithUnspecifiedMeasureSpec() {
392 AwLayoutSizer layoutSizer = new AwLayoutSizer();
393 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
394 layoutSizer.setDelegate(delegate);
396 final float dipScale = 1.5f;
397 final int pageScale = 2;
398 final int dipAndPageScale = (int) (dipScale * pageScale);
400 int contentWidth = 800;
401 int contentHeight = 400;
402 int atMostWidth = contentWidth * dipAndPageScale;
403 int atMostHeight = contentHeight * dipAndPageScale;
405 layoutSizer.setDIPScale(dipScale);
406 layoutSizer.onContentSizeChanged(contentWidth, contentHeight);
407 layoutSizer.onPageScaleChanged(pageScale);
408 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
409 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
411 assertTrue(delegate.setMeasuredDimensionCalled);
412 int measuredWidth = delegate.measuredWidth & View.MEASURED_SIZE_MASK;
413 int measuredHeight = delegate.measuredHeight & View.MEASURED_SIZE_MASK;
415 int sizeWidth = measuredWidth;
416 int sizeHeight = measuredHeight;
417 layoutSizer.onSizeChanged(sizeWidth, sizeHeight, 0, 0);
419 assertEquals(contentWidth, delegate.fixedLayoutWidth);
420 assertEquals(AwLayoutSizer.FIXED_LAYOUT_HEIGHT, delegate.fixedLayoutHeight);
422 sizeWidth = measuredWidth * 2;
423 sizeHeight = measuredHeight * 2;
424 layoutSizer.onSizeChanged(sizeWidth, sizeHeight, 0, 0);
426 assertEquals(sizeWidth / dipAndPageScale, delegate.fixedLayoutWidth);
427 assertEquals(AwLayoutSizer.FIXED_LAYOUT_HEIGHT, delegate.fixedLayoutHeight);
429 sizeWidth = measuredWidth / 2;
430 sizeHeight = measuredHeight / 2;
431 layoutSizer.onSizeChanged(sizeWidth, sizeHeight, 0, 0);
433 assertEquals(sizeWidth / dipAndPageScale, delegate.fixedLayoutWidth);
434 assertEquals(AwLayoutSizer.FIXED_LAYOUT_HEIGHT, delegate.fixedLayoutHeight);
438 @Feature({"AndroidWebView"})
439 public void testViewportWithAtMostMeasureSpec() {
440 AwLayoutSizer layoutSizer = new AwLayoutSizer();
441 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
442 delegate.heightWrapContent = true;
443 layoutSizer.setDelegate(delegate);
445 final float dipScale = 1.5f;
446 final int pageScale = 2;
447 final int dipAndPageScale = (int) (dipScale * pageScale);
449 int contentWidth = 800;
450 int contentHeight = 400;
451 int contentWidthPix = contentWidth * dipAndPageScale;
452 int contentHeightPix = contentHeight * dipAndPageScale;
454 layoutSizer.setDIPScale(dipScale);
455 layoutSizer.onContentSizeChanged(contentWidth, contentHeight);
456 layoutSizer.onPageScaleChanged(pageScale);
457 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(contentWidthPix, MeasureSpec.EXACTLY),
458 MeasureSpec.makeMeasureSpec(contentHeightPix * 2, MeasureSpec.AT_MOST));
460 assertTrue(delegate.setMeasuredDimensionCalled);
461 int measuredWidth = delegate.measuredWidth & View.MEASURED_SIZE_MASK;
462 int measuredHeight = delegate.measuredHeight & View.MEASURED_SIZE_MASK;
464 int sizeWidth = measuredWidth;
465 int sizeHeight = measuredHeight;
466 layoutSizer.onSizeChanged(sizeWidth, sizeHeight, 0, 0);
468 assertEquals(contentWidth, delegate.fixedLayoutWidth);
469 assertEquals(AwLayoutSizer.FIXED_LAYOUT_HEIGHT, delegate.fixedLayoutHeight);
473 @Feature({"AndroidWebView"})
474 public void testFixedLayoutViewportGoesBackToZeroWithWrapContentMeasureSpec() {
475 AwLayoutSizer layoutSizer = new AwLayoutSizer();
476 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
477 layoutSizer.setDelegate(delegate);
478 layoutSizer.setDIPScale(DIP_SCALE);
480 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
481 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
482 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
483 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
484 layoutSizer.onSizeChanged((int) (FIRST_CONTENT_WIDTH * DIP_SCALE),
485 (int) (FIRST_CONTENT_HEIGHT * DIP_SCALE), 0, 0);
487 assertTrue(delegate.fixedLayoutWidth != 0);
488 assertEquals(AwLayoutSizer.FIXED_LAYOUT_HEIGHT, delegate.fixedLayoutHeight);
490 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, AwLayoutSizer.FIXED_LAYOUT_HEIGHT);
491 layoutSizer.onSizeChanged((int) (FIRST_CONTENT_WIDTH * DIP_SCALE),
492 (int) (FIRST_CONTENT_HEIGHT * DIP_SCALE), 0, 0);
493 assertTrue(delegate.fixedLayoutWidth != 0);
494 assertEquals(0, delegate.fixedLayoutHeight);
496 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, 0);
497 layoutSizer.onSizeChanged((int) (FIRST_CONTENT_WIDTH * DIP_SCALE),
498 (int) (FIRST_CONTENT_HEIGHT * DIP_SCALE), 0, 0);
499 assertTrue(delegate.fixedLayoutWidth != 0);
500 assertEquals(0, delegate.fixedLayoutHeight);
504 @Feature({"AndroidWebView"})
505 public void testFixedLayoutSizeUpdatedOnPageScaleChangeItNoLayoutRequest() {
506 AwLayoutSizer layoutSizer = new AwLayoutSizer();
507 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
508 delegate.heightWrapContent = true;
509 layoutSizer.setDelegate(delegate);
510 layoutSizer.setDIPScale(DIP_SCALE);
512 layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
513 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
514 layoutSizer.onMeasure(
515 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
516 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
517 layoutSizer.onSizeChanged(AT_MOST_MEASURE_SIZE, AT_MOST_MEASURE_SIZE, 0, 0);
519 assertTrue(delegate.fixedLayoutWidth != 0);
520 final int fixedLayoutWidth = delegate.fixedLayoutWidth;
521 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
522 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE * 2f);
523 assertEquals(requestLayoutCallCount, delegate.requestLayoutCallCount);
524 assertEquals(fixedLayoutWidth / 2, delegate.fixedLayoutWidth);
528 @Feature({"AndroidWebView"})
529 public void testFixedLayoutSizeUpdatedIfNoSizeChangeAfterLayoutRequested() {
530 AwLayoutSizer layoutSizer = new AwLayoutSizer();
531 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
532 layoutSizer.setDelegate(delegate);
533 layoutSizer.setDIPScale(DIP_SCALE);
535 layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
536 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
537 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
538 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
540 layoutSizer.onSizeChanged((int) (FIRST_CONTENT_WIDTH * DIP_SCALE),
541 (int) (FIRST_CONTENT_HEIGHT * DIP_SCALE), 0, 0);
543 assertTrue(delegate.fixedLayoutWidth != 0);
544 final int fixedLayoutWidth = delegate.fixedLayoutWidth;
545 final int requestLayoutCallCount = delegate.requestLayoutCallCount;
546 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE * 0.5f);
547 assertEquals(requestLayoutCallCount + 1, delegate.requestLayoutCallCount);
548 assertEquals(fixedLayoutWidth, delegate.fixedLayoutWidth);
550 // onMeasure and onLayoutChange should always be called as a result of the AwLayoutSizer
551 // calling Delegate.requestLayout.
552 layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
553 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
554 layoutSizer.onLayoutChange();
556 assertEquals(fixedLayoutWidth * 2, delegate.fixedLayoutWidth);
560 @Feature({"AndroidWebView"})
561 public void testFixedLayoutSizeDoesNotDependOnMeasureSpec() {
562 AwLayoutSizer layoutSizer = new AwLayoutSizer();
563 LayoutSizerDelegate delegate = new LayoutSizerDelegate();
564 delegate.heightWrapContent = false;
565 layoutSizer.setDelegate(delegate);
566 layoutSizer.setDIPScale(DIP_SCALE);
568 layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
569 layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
570 layoutSizer.onMeasure(
571 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
572 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
573 layoutSizer.onSizeChanged(AT_MOST_MEASURE_SIZE, AT_MOST_MEASURE_SIZE, 0, 0);
575 assertEquals(0, delegate.fixedLayoutWidth);
576 assertEquals(0, delegate.fixedLayoutHeight);