| Index: android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
|
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
|
| index e9117a9d0901e7315153dd418f3c359806b88c08..f9299eed35bea940f8f6efe91f36720e30bd76ba 100644
|
| --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
|
| @@ -26,6 +26,7 @@ import org.chromium.content.browser.test.util.CallbackHelper;
|
| import org.chromium.content.browser.test.util.Criteria;
|
| import org.chromium.content.browser.test.util.CriteriaHelper;
|
| import org.chromium.content.browser.test.util.HistoryUtils;
|
| +import org.chromium.content.common.DeviceInfo;
|
| import org.chromium.net.test.util.TestWebServer;
|
|
|
| import java.util.regex.Matcher;
|
| @@ -1051,6 +1052,59 @@ public class AwSettingsTest extends AndroidWebViewTestBase {
|
| private TestWebServer mWebServer;
|
| }
|
|
|
| + // To verify whether UseWideViewport works, we check, if the page width specified
|
| + // in the "meta viewport" tag is applied. When UseWideViewport is turned off, the
|
| + // "viewport" tag is ignored, and the layout width is set to device width in DIP pixels.
|
| + // We specify a very high width value to make sure that it doesn't intersect with
|
| + // device screen widths (in DIP pixels).
|
| + class AwSettingsUseWideViewportTestHelper extends AwSettingsTestHelper<Boolean> {
|
| + static private final String VIEWPORT_TAG_LAYOUT_WIDTH = "3000";
|
| +
|
| + AwSettingsUseWideViewportTestHelper(
|
| + AwContents awContents,
|
| + TestAwContentsClient contentViewClient) throws Throwable {
|
| + super(awContents, contentViewClient, true);
|
| + }
|
| +
|
| + @Override
|
| + protected Boolean getAlteredValue() {
|
| + return ENABLED;
|
| + }
|
| +
|
| + @Override
|
| + protected Boolean getInitialValue() {
|
| + return DISABLED;
|
| + }
|
| +
|
| + @Override
|
| + protected Boolean getCurrentValue() {
|
| + return mContentSettings.getUseWideViewPort();
|
| + }
|
| +
|
| + @Override
|
| + protected void setCurrentValue(Boolean value) {
|
| + mContentSettings.setUseWideViewPort(value);
|
| + }
|
| +
|
| + @Override
|
| + protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
|
| + loadDataSync(getData());
|
| + final String bodyWidth = getTitleOnUiThread();
|
| + if (value) {
|
| + assertTrue(bodyWidth, VIEWPORT_TAG_LAYOUT_WIDTH.equals(bodyWidth));
|
| + } else {
|
| + assertFalse(bodyWidth, VIEWPORT_TAG_LAYOUT_WIDTH.equals(bodyWidth));
|
| + }
|
| + }
|
| +
|
| + private String getData() {
|
| + return "<html><head>" +
|
| + "<meta name='viewport' content='width=" + VIEWPORT_TAG_LAYOUT_WIDTH + "' />" +
|
| + "</head>" +
|
| + "<body onload='document.title=document.body.clientWidth'></body></html>";
|
| + }
|
| + }
|
| +
|
| // The test verifies that JavaScript is disabled upon WebView
|
| // creation without accessing ContentSettings. If the test passes,
|
| // it means that WebView-specific web preferences configuration
|
| @@ -2390,6 +2444,75 @@ public class AwSettingsTest extends AndroidWebViewTestBase {
|
| }
|
| }
|
|
|
| + @SmallTest
|
| + @Feature({"AndroidWebView", "Preferences"})
|
| + public void testUseWideViewportTwoViews() throws Throwable {
|
| + ViewPair views = createViews(NORMAL_VIEW, NORMAL_VIEW);
|
| + runPerViewSettingsTest(
|
| + new AwSettingsUseWideViewportTestHelper(views.getContents0(), views.getClient0()),
|
| + new AwSettingsUseWideViewportTestHelper(views.getContents1(), views.getClient1()));
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AndroidWebView", "Preferences"})
|
| + public void testUseWideViewportLayoutWidth() throws Throwable {
|
| + final TestAwContentsClient contentClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView =
|
| + createAwTestContainerViewOnMainSync(contentClient);
|
| + final AwContents awContents = testContainerView.getAwContents();
|
| + ContentSettings settings = getContentSettingsOnUiThread(awContents);
|
| + CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
|
| +
|
| + final String pageTemplate = "<html><head>%s</head>" +
|
| + "<body onload='document.title=document.body.clientWidth'></body></html>";
|
| + final String pageNoViewport = String.format(pageTemplate, "");
|
| + final String pageViewportDeviceWidth = String.format(
|
| + pageTemplate,
|
| + "<meta name='viewport' content='width=device-width' />");
|
| + final String viewportTagSpecifiedWidth = "3000";
|
| + final String pageViewportSpecifiedWidth = String.format(
|
| + pageTemplate,
|
| + "<meta name='viewport' content='width=" + viewportTagSpecifiedWidth + "' />");
|
| +
|
| + DeviceInfo deviceInfo = DeviceInfo.create(getInstrumentation().getTargetContext());
|
| + int displayWidth = (int) (deviceInfo.getWidth() / deviceInfo.getDPIScale());
|
| +
|
| + settings.setJavaScriptEnabled(true);
|
| + assertFalse(settings.getUseWideViewPort());
|
| + // When UseWideViewPort is off, "meta viewport" tags are ignored,
|
| + // and the layout width is set to device width in CSS pixels.
|
| + // Thus, all 3 pages will have the same body width.
|
| + loadDataSync(awContents, onPageFinishedHelper, pageNoViewport, "text/html", false);
|
| + int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
|
| + // Avoid rounding errors.
|
| + assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
|
| + Math.abs(displayWidth - actualWidth) <= 1);
|
| + loadDataSync(awContents, onPageFinishedHelper, pageViewportDeviceWidth, "text/html", false);
|
| + actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
|
| + assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
|
| + Math.abs(displayWidth - actualWidth) <= 1);
|
| + loadDataSync(
|
| + awContents, onPageFinishedHelper, pageViewportSpecifiedWidth, "text/html", false);
|
| + actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
|
| + assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
|
| + Math.abs(displayWidth - actualWidth) <= 1);
|
| +
|
| + settings.setUseWideViewPort(true);
|
| + // When UseWideViewPort is on, "meta viewport" tag is used.
|
| + // If there is no viewport tag, or width isn't specified,
|
| + // then layout width is set to max(980, <device-width-in-DIP-pixels>)
|
| + loadDataSync(awContents, onPageFinishedHelper, pageNoViewport, "text/html", false);
|
| + actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
|
| + assertTrue("Expected: >= 980 , Actual: " + actualWidth, actualWidth >= 980);
|
| + loadDataSync(awContents, onPageFinishedHelper, pageViewportDeviceWidth, "text/html", false);
|
| + actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
|
| + assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
|
| + Math.abs(displayWidth - actualWidth) <= 1);
|
| + loadDataSync(
|
| + awContents, onPageFinishedHelper, pageViewportSpecifiedWidth, "text/html", false);
|
| + assertEquals(viewportTagSpecifiedWidth, getTitleOnUiThread(awContents));
|
| + }
|
| +
|
| static class ViewPair {
|
| private final AwContents contents0;
|
| private final TestAwContentsClient client0;
|
|
|