- add sources.
[platform/framework/web/crosswalk.git] / src / android_webview / javatests / src / org / chromium / android_webview / test / AwViewportTest.java
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.
4
5 package org.chromium.android_webview.test;
6
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;
13
14 public class AwViewportTest extends AwTestBase {
15
16     @MediumTest
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();
25
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");
32
33         settings.setJavaScriptEnabled(true);
34
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);
40
41         float displayWidth = (float)(deviceInfo.getDisplayWidth());
42         float deviceDpi = (float)(160f * deviceInfo.getDIPScale());
43
44         loadDataSync(awContents, onPageFinishedHelper, pageHighDpi, "text/html", false);
45         actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
46         assertEquals(displayWidth * (240f / deviceDpi), (float)actualWidth, 10f);
47
48         loadDataSync(awContents, onPageFinishedHelper, pageDpi100, "text/html", false);
49         actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
50         assertEquals(displayWidth * (100f / deviceDpi), (float)actualWidth, 10f);
51     }
52
53     @MediumTest
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();
62
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>";
66
67         settings.setJavaScriptEnabled(true);
68         settings.setUseWideViewPort(true);
69
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));
77     }
78
79     @MediumTest
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();
88
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>";
93
94         settings.setJavaScriptEnabled(true);
95
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));
103
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));
109     }
110
111     @MediumTest
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();
120
121         settings.setJavaScriptEnabled(true);
122
123         loadUrlSync(awContents, onPageFinishedHelper, "about:blank");
124
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;
132
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,
145                 contentClient,
146                 "matchMedia(\"screen and (device-width:" + (int)screenWidth + "px)\").matches");
147         assertEquals("true", deviceWidthEqualsScreenWidth);
148
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,
161                 contentClient,
162                 "matchMedia(\"screen and (device-height:" + (int)screenHeight + "px)\").matches");
163         assertEquals("true", deviceHeightEqualsScreenHeight);
164     }
165
166     @MediumTest
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();
175
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);
184
185         settings.setJavaScriptEnabled(true);
186         settings.setUseWideViewPort(true);
187         settings.setBuiltInZoomControls(true);
188         settings.setSupportZoom(true);
189
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));
196     }
197
198     @MediumTest
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();
207
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>",
213                 pageWidth);
214
215         settings.setJavaScriptEnabled(true);
216         settings.setUseWideViewPort(true);
217
218         loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
219         int width = Integer.parseInt(getTitleOnUiThread(awContents));
220         assertEquals(pageWidth, width);
221     }
222 }