[go: nahoru, domu]

blob: ad08beb9dc2bee83ec1b1efedb2aad905b8dfcf0 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview.test;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.RequiresApi;
import androidx.test.filters.SmallTest;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.UseParametersRunnerFactory;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwDisplayCutoutController.Insets;
import org.chromium.android_webview.common.AwFeatures;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.net.test.util.TestWebServer;
/** Tests for DisplayCutout. */
@RunWith(Parameterized.class)
@UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
@MinAndroidSdkLevel(Build.VERSION_CODES.P)
@CommandLineFlags.Add({"enable-features=" + AwFeatures.WEBVIEW_DISPLAY_CUTOUT})
@RequiresApi(Build.VERSION_CODES.P)
public class AwDisplayCutoutTest extends AwParameterizedTest {
private static final String TEST_HTML =
"<html><head><style>\n"
+ "body {\n"
+ " margin: 0;\n"
+ " padding: 0pt 0pt 0pt 0pt;\n"
+ "}\n"
+ "div {\n"
+ " margin: 0;\n"
+ " padding: env(safe-area-inset-top) "
+ " env(safe-area-inset-right)"
+ " env(safe-area-inset-bottom)"
+ " env(safe-area-inset-left);\n"
+ "}\n"
+ "</style></head><body>\n"
+ "<div id='text'>"
+ "On notched phones, there should be enough padding on the top"
+ " to not have this text appear under the statusbar/notch.\n"
+ "</div>\n"
+ "</body></html>";
@Rule public AwActivityTestRule mActivityTestRule;
public AwDisplayCutoutTest(AwSettingsMutation param) {
mActivityTestRule =
new AwActivityTestRule(param.getMutation()) {
@Override
public boolean needsHideActionBar() {
// If action bar is showing, WebView cannot be fully occupying the screen.
return true;
}
};
}
private TestWebServer mWebServer;
private TestAwContentsClient mContentsClient;
private AwTestContainerView mContainerView;
private AwContents mAwContents;
@Before
public void setUp() throws Exception {
mWebServer = TestWebServer.start();
mContentsClient = new TestAwContentsClient();
mContainerView = mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
mAwContents = mContainerView.getAwContents();
AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents);
// In pre-R, we need to explicitly set this to draw under notch.
TestThreadUtils.runOnUiThreadBlocking(
() -> {
Activity activity = mActivityTestRule.getActivity();
activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
});
}
@After
public void tearDown() {
mWebServer.shutdown();
}
private void setFullscreen(boolean fullscreen) {
TestThreadUtils.runOnUiThreadBlocking(
() -> {
Activity activity = mActivityTestRule.getActivity();
View decor = activity.getWindow().getDecorView();
int systemUiVisibility = decor.getSystemUiVisibility();
int flags =
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
if (fullscreen) {
activity.getWindow()
.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
systemUiVisibility |= flags;
} else {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
systemUiVisibility &= flags;
}
decor.setSystemUiVisibility(systemUiVisibility);
});
}
@Test
@SmallTest
public void testNoSafeAreaSet() throws Throwable {
setFullscreen(true);
mActivityTestRule.loadHtmlSync(
mAwContents, mContentsClient.getOnPageFinishedHelper(), TEST_HTML);
// Reset safe area just in case we have a notch.
Insets insets = new Insets(0, 0, 0, 0);
TestThreadUtils.runOnUiThreadBlocking(
() -> {
mAwContents.getDisplayCutoutController().onApplyWindowInsetsInternal(insets);
});
final String code =
"window.getComputedStyle(document.getElementById('text'))"
+ ".getPropertyValue('padding-top')";
Assert.assertEquals(
"\"0px\"",
mActivityTestRule.executeJavaScriptAndWaitForResult(
mAwContents, mContentsClient, code));
}
@Test
@SmallTest
public void testSafeAreaSet() throws Throwable {
setFullscreen(true);
mActivityTestRule.loadHtmlSync(
mAwContents, mContentsClient.getOnPageFinishedHelper(), TEST_HTML);
Insets insets = new Insets(0, 130, 0, 0);
TestThreadUtils.runOnUiThreadBlocking(
() -> {
mAwContents.getDisplayCutoutController().onApplyWindowInsetsInternal(insets);
});
final String code =
"window.getComputedStyle(document.getElementById('text'))"
+ ".getPropertyValue('padding-top')";
Assert.assertNotEquals(
"\"0px\"",
mActivityTestRule.executeJavaScriptAndWaitForResult(
mAwContents, mContentsClient, code));
}
}