1 // Copyright 2013 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.test.suitebuilder.annotation.MediumTest;
8 import org.chromium.android_webview.AwContents;
9 import org.chromium.android_webview.AwSettings;
10 import org.chromium.base.test.util.Feature;
11 import org.chromium.content.browser.test.util.CallbackHelper;
12 import org.chromium.ui.gfx.DeviceDisplayInfo;
14 public class AwViewportTest extends AwTestBase {
17 @Feature({"AndroidWebView"})
18 public void testTargetDensityDpi() throws Throwable {
19 final TestAwContentsClient contentClient = new TestAwContentsClient();
20 final AwTestContainerView testContainerView =
21 createAwTestContainerViewOnMainSync(contentClient);
22 final AwContents awContents = testContainerView.getAwContents();
23 AwSettings settings = getAwSettingsOnUiThread(awContents);
24 CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
26 final String pageTemplate = "<html><head>" +
27 "<meta name='viewport' content='width=device-width, target-densityDpi=%s' />" +
28 "</head><body onload='document.title=document.body.clientWidth'></body></html>";
29 final String pageDeviceDpi = String.format(pageTemplate, "device-dpi");
30 final String pageHighDpi = String.format(pageTemplate, "high-dpi");
31 final String pageDpi100 = String.format(pageTemplate, "100");
33 settings.setJavaScriptEnabled(true);
35 DeviceDisplayInfo deviceInfo =
36 DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
37 loadDataSync(awContents, onPageFinishedHelper, pageDeviceDpi, "text/html", false);
38 int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
39 assertEquals((float)deviceInfo.getDisplayWidth(), (float)actualWidth, 10f);
41 float displayWidth = (float)(deviceInfo.getDisplayWidth());
42 float deviceDpi = (float)(160f * deviceInfo.getDIPScale());
44 loadDataSync(awContents, onPageFinishedHelper, pageHighDpi, "text/html", false);
45 actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
46 assertEquals(displayWidth * (240f / deviceDpi), (float)actualWidth, 10f);
48 loadDataSync(awContents, onPageFinishedHelper, pageDpi100, "text/html", false);
49 actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
50 assertEquals(displayWidth * (100f / deviceDpi), (float)actualWidth, 10f);
54 @Feature({"AndroidWebView"})
55 public void testWideViewportInitialScaleDoesNotExpandFixedLayoutWidth() throws Throwable {
56 final TestAwContentsClient contentClient = new TestAwContentsClient();
57 final AwTestContainerView testContainerView =
58 createAwTestContainerViewOnMainSync(contentClient);
59 final AwContents awContents = testContainerView.getAwContents();
60 AwSettings settings = getAwSettingsOnUiThread(awContents);
61 CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
63 final String page = "<html><head>" +
64 "<meta name='viewport' content='width=device-width, initial-scale=0.5' />" +
65 "</head><body onload='document.title=document.body.clientWidth'></body></html>";
67 settings.setJavaScriptEnabled(true);
68 settings.setUseWideViewPort(true);
70 DeviceDisplayInfo deviceInfo =
71 DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
72 loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
73 float displayWidth = (float)(deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
74 int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
75 assertEquals(displayWidth, (float)actualWidth, 10f);
76 assertEquals(1.0f, getScaleOnUiThread(awContents));
80 @Feature({"AndroidWebView"})
81 public void testZeroValuesQuirk() throws Throwable {
82 final TestAwContentsClient contentClient = new TestAwContentsClient();
83 final AwTestContainerView testContainerView =
84 createAwTestContainerViewOnMainSync(contentClient);
85 final AwContents awContents = testContainerView.getAwContents();
86 AwSettings settings = getAwSettingsOnUiThread(awContents);
87 CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
89 final String page = "<html><head>" +
90 "<meta name='viewport' content='width=0, height=0, initial-scale=0.0, " +
91 " minimum-scale=0.0, maximum-scale=0.0' />" +
92 "</head><body onload='document.title=document.body.clientWidth'></body></html>";
94 settings.setJavaScriptEnabled(true);
96 DeviceDisplayInfo deviceInfo =
97 DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
98 loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
99 float displayWidth = (float)(deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
100 int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
101 assertEquals(displayWidth, (float)actualWidth, 10f);
102 assertEquals(1.0f, getScaleOnUiThread(awContents));
104 settings.setUseWideViewPort(true);
105 loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
106 actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
107 assertEquals(displayWidth, (float)actualWidth, 10f);
108 assertEquals(1.0f, getScaleOnUiThread(awContents));
112 @Feature({"AndroidWebView"})
113 public void testScreenSizeInPhysicalPixelsQuirk() throws Throwable {
114 final TestAwContentsClient contentClient = new TestAwContentsClient();
115 final AwTestContainerView testContainerView =
116 createAwTestContainerViewOnMainSync(contentClient);
117 final AwContents awContents = testContainerView.getAwContents();
118 AwSettings settings = getAwSettingsOnUiThread(awContents);
119 CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
121 settings.setJavaScriptEnabled(true);
123 loadUrlSync(awContents, onPageFinishedHelper, "about:blank");
125 DeviceDisplayInfo deviceInfo =
126 DeviceDisplayInfo.create(getInstrumentation().getTargetContext());
127 float dipScale = (float)deviceInfo.getDIPScale();
128 float physicalDisplayWidth = deviceInfo.getDisplayWidth();
129 float cssDisplayWidth = physicalDisplayWidth / dipScale;
130 float physicalDisplayHeight = deviceInfo.getDisplayHeight();
131 float cssDisplayHeight = physicalDisplayHeight / dipScale;
133 float screenWidth = Integer.parseInt(
134 executeJavaScriptAndWaitForResult(awContents, contentClient, "screen.width"));
135 assertEquals(physicalDisplayWidth, screenWidth, 10f);
136 float screenAvailWidth = Integer.parseInt(
137 executeJavaScriptAndWaitForResult(awContents, contentClient, "screen.availWidth"));
138 assertEquals(physicalDisplayWidth, screenAvailWidth, 10f);
139 float outerWidth = Integer.parseInt(
140 executeJavaScriptAndWaitForResult(awContents, contentClient, "outerWidth"));
141 float innerWidth = Integer.parseInt(
142 executeJavaScriptAndWaitForResult(awContents, contentClient, "innerWidth"));
143 assertEquals(innerWidth * dipScale, outerWidth, 10f);
144 String deviceWidthEqualsScreenWidth = executeJavaScriptAndWaitForResult(awContents,
146 "matchMedia(\"screen and (device-width:" + (int)screenWidth + "px)\").matches");
147 assertEquals("true", deviceWidthEqualsScreenWidth);
149 float screenHeight = Integer.parseInt(
150 executeJavaScriptAndWaitForResult(awContents, contentClient, "screen.height"));
151 assertEquals(physicalDisplayHeight, screenHeight, 10f);
152 float screenAvailHeight = Integer.parseInt(
153 executeJavaScriptAndWaitForResult(awContents, contentClient, "screen.availHeight"));
154 assertEquals(physicalDisplayHeight, screenAvailHeight, 10f);
155 float outerHeight = Integer.parseInt(
156 executeJavaScriptAndWaitForResult(awContents, contentClient, "outerHeight"));
157 float innerHeight = Integer.parseInt(
158 executeJavaScriptAndWaitForResult(awContents, contentClient, "innerHeight"));
159 assertEquals(innerHeight * dipScale, outerHeight, 10f);
160 String deviceHeightEqualsScreenHeight = executeJavaScriptAndWaitForResult(awContents,
162 "matchMedia(\"screen and (device-height:" + (int)screenHeight + "px)\").matches");
163 assertEquals("true", deviceHeightEqualsScreenHeight);
167 @Feature({"AndroidWebView"})
168 public void testMetaMergeContentQuirk() throws Throwable {
169 final TestAwContentsClient contentClient = new TestAwContentsClient();
170 final AwTestContainerView testContainerView =
171 createAwTestContainerViewOnMainSync(contentClient);
172 final AwContents awContents = testContainerView.getAwContents();
173 AwSettings settings = getAwSettingsOnUiThread(awContents);
174 CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
176 final int pageWidth = 3000;
177 final float pageScale = 1.0f;
178 final String page = String.format("<html><head>" +
179 "<meta name='viewport' content='width=%d' />" +
180 "<meta name='viewport' content='initial-scale=%.1f' />" +
181 "<meta name='viewport' content='user-scalable=0' />" +
182 "</head><body onload='document.title=document.body.clientWidth'></body></html>",
183 pageWidth, pageScale);
185 settings.setJavaScriptEnabled(true);
186 settings.setUseWideViewPort(true);
187 settings.setBuiltInZoomControls(true);
188 settings.setSupportZoom(true);
190 loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
191 int width = Integer.parseInt(getTitleOnUiThread(awContents));
192 assertEquals(pageWidth, width);
193 assertEquals(pageScale, getScaleOnUiThread(awContents));
194 assertEquals(false, canZoomInOnUiThread(awContents));
195 assertEquals(false, canZoomOutOnUiThread(awContents));
199 @Feature({"AndroidWebView"})
200 public void testMetaMergeContentQuirkOverrides() throws Throwable {
201 final TestAwContentsClient contentClient = new TestAwContentsClient();
202 final AwTestContainerView testContainerView =
203 createAwTestContainerViewOnMainSync(contentClient);
204 final AwContents awContents = testContainerView.getAwContents();
205 AwSettings settings = getAwSettingsOnUiThread(awContents);
206 CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
208 final int pageWidth = 3000;
209 final String page = String.format("<html><head>" +
210 "<meta name='viewport' content='width=device-width' />" +
211 "<meta name='viewport' content='width=%d' />" +
212 "</head><body onload='document.title=document.body.clientWidth'></body></html>",
215 settings.setJavaScriptEnabled(true);
216 settings.setUseWideViewPort(true);
218 loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
219 int width = Integer.parseInt(getTitleOnUiThread(awContents));
220 assertEquals(pageWidth, width);