Implement tests regarding loading of network resources and data url images.
The following settings are tested:
blockNetworkImage
blockNetworkLoads
loadsImagesAutomatically
Bug:5853667
Change-Id: I8b8ace17f75e8ff1a25fc76c3ab98ece0ea2b8a6
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index afdce87..27fa5a0 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -39,6 +39,18 @@
private static final int WEBVIEW_TIMEOUT = 5000;
private static final String LOG_TAG = "WebSettingsTest";
+ private final String EMPTY_IMAGE_HEIGHT = "0";
+ private final String NETWORK_IMAGE_HEIGHT = "48"; // See getNetworkImageHtml()
+ private final String DATA_URL_IMAGE_HTML = "<html>" +
+ "<head><script>function updateTitle(){" +
+ "document.title=document.getElementById('img').naturalHeight;}</script></head>" +
+ "<body onload='updateTitle()'>" +
+ "<img id='img' onload='updateTitle()' src='data:image/png;base64,iVBORw0KGgoAAA" +
+ "ANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAAAXNSR0IArs4c6QAAAA1JREFUCB0BAgD9/wAAAAIAAc3j" +
+ "0SsAAAAASUVORK5CYII=" +
+ "'></body></html>";
+ private final String DATA_URL_IMAGE_HEIGHT = "1";
+
private WebSettings mSettings;
private CtsTestServer mWebServer;
private WebViewOnUiThread mOnUiThread;
@@ -184,28 +196,6 @@
assertEquals(TestHtmlConstants.WEBPAGE_NOT_AVAILABLE_TITLE, mOnUiThread.getTitle());
}
- public void testAccessBlockNetworkImage() throws Exception {
- String url = TestHtmlConstants.EMBEDDED_IMG_URL;
- final String ext = MimeTypeMap.getFileExtensionFromUrl(url);
-
- mOnUiThread.clearCache(true);
- assertFalse(mSettings.getBlockNetworkImage());
- assertTrue(mSettings.getLoadsImagesAutomatically());
- loadAssetUrl(url);
- new PollingCheck() {
- @Override
- protected boolean check() {
- return !mWebServer.getLastRequestUrl().endsWith(ext);
- }
- }.run();
-
- mOnUiThread.clearCache(true);
- mSettings.setBlockNetworkImage(true);
- assertTrue(mSettings.getBlockNetworkImage());
- loadAssetUrl(url);
- assertTrue(mWebServer.getLastRequestUrl().endsWith(ext));
- }
-
public void testAccessCacheMode() throws Exception {
assertEquals(WebSettings.LOAD_DEFAULT, mSettings.getCacheMode());
@@ -395,23 +385,6 @@
assertTrue(mSettings.getLightTouchEnabled());
}
- public void testAccessLoadsImagesAutomatically() throws Exception {
- mOnUiThread.clearCache(true);
- assertTrue(mSettings.getLoadsImagesAutomatically());
- String url = TestHtmlConstants.EMBEDDED_IMG_URL;
- String ext = MimeTypeMap.getFileExtensionFromUrl(url);
- loadAssetUrl(url);
- Thread.sleep(1000);
- assertFalse(mWebServer.getLastRequestUrl().endsWith(ext));
-
- mOnUiThread.clearCache(true);
- mSettings.setLoadsImagesAutomatically(false);
- assertFalse(mSettings.getLoadsImagesAutomatically());
- loadAssetUrl(url);
- Thread.sleep(1000);
- assertTrue(mWebServer.getLastRequestUrl().endsWith(ext));
- }
-
public void testAccessMinimumFontSize() {
assertEquals(8, mSettings.getMinimumFontSize());
@@ -607,6 +580,102 @@
}.run();
}
+ public void testLoadsImagesAutomatically() throws Throwable {
+ assertTrue(mSettings.getLoadsImagesAutomatically());
+
+ startWebServer();
+ mSettings.setJavaScriptEnabled(true);
+
+ // Check that by default network and data url images are loaded.
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+ assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+ // Check that with auto-loading turned off no images are loaded.
+ // Also check that images are loaded automatically once we enable the setting,
+ // without reloading the page.
+ mSettings.setLoadsImagesAutomatically(false);
+ mOnUiThread.clearCache(true);
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mSettings.setLoadsImagesAutomatically(true);
+ waitForNonEmptyImage();
+ assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+ mSettings.setLoadsImagesAutomatically(false);
+ mOnUiThread.clearCache(true);
+ mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+ assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mSettings.setLoadsImagesAutomatically(true);
+ waitForNonEmptyImage();
+ assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ }
+
+ public void testBlockNetworkImage() throws Throwable {
+ assertFalse(mSettings.getBlockNetworkImage());
+
+ startWebServer();
+ mSettings.setJavaScriptEnabled(true);
+
+ // Check that by default network and data url images are loaded.
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+ assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+ // Check that only network images are blocked, data url images are still loaded.
+ // Also check that network images are loaded automatically once we disable the setting,
+ // without reloading the page.
+ mSettings.setBlockNetworkImage(true);
+ mOnUiThread.clearCache(true);
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mSettings.setBlockNetworkImage(false);
+ waitForNonEmptyImage();
+ assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+ mSettings.setBlockNetworkImage(true);
+ mOnUiThread.clearCache(true);
+ mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+ assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ }
+
+ public void testBlockNetworkLoads() throws Throwable {
+ assertFalse(mSettings.getBlockNetworkLoads());
+
+ startWebServer();
+ mSettings.setJavaScriptEnabled(true);
+
+ // Check that by default network resources and data url images are loaded.
+ mOnUiThread.loadUrlAndWaitForCompletion(
+ mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+ assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+ assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+ // Check that only network resources are blocked, data url images are still loaded.
+ mSettings.setBlockNetworkLoads(true);
+ mOnUiThread.clearCache(true);
+ mOnUiThread.loadUrlAndWaitForCompletion(
+ mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+ assertEquals(TestHtmlConstants.WEBPAGE_NOT_AVAILABLE_TITLE, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+ assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+ // Check that network resources are loaded once we disable the setting and reload the page.
+ mSettings.setBlockNetworkLoads(false);
+ mOnUiThread.loadUrlAndWaitForCompletion(
+ mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+ assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
+ mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+ assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+ }
+
/**
* Starts the internal web server. The server will be shut down automatically
* during tearDown().
@@ -632,4 +701,23 @@
String url = mWebServer.getAssetUrl(asset);
mOnUiThread.loadUrlAndWaitForCompletion(url);
}
+
+ private String getNetworkImageHtml() {
+ return "<html>" +
+ "<head><script>function updateTitle(){" +
+ "document.title=document.getElementById('img').naturalHeight;}</script></head>" +
+ "<body onload='updateTitle()'>" +
+ "<img id='img' onload='updateTitle()' src='" +
+ mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL) +
+ "'></body></html>";
+ }
+
+ private void waitForNonEmptyImage() {
+ new PollingCheck(WEBVIEW_TIMEOUT) {
+ @Override
+ protected boolean check() {
+ return !EMPTY_IMAGE_HEIGHT.equals(mOnUiThread.getTitle());
+ }
+ }.run();
+ }
}