| Index: android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
|
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
|
| index f283b2dc1f54a176abb65a5a9f8dcc995cbb49a7..eed3e5aa1de3d93035091f64a70ceee856624ce5 100644
|
| --- a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
|
| @@ -5,18 +5,25 @@
|
| package org.chromium.android_webview.test;
|
|
|
| import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.util.Pair;
|
|
|
| import org.apache.http.Header;
|
| import org.apache.http.HttpRequest;
|
|
|
| import org.chromium.android_webview.AwContents;
|
| +import org.chromium.android_webview.AwSettings;
|
| +import org.chromium.android_webview.test.util.CommonResources;
|
| +import org.chromium.android_webview.test.util.JSUtils;
|
| import org.chromium.base.test.util.Feature;
|
| import org.chromium.content.browser.LoadUrlParams;
|
| import org.chromium.content.browser.test.util.CallbackHelper;
|
| +import org.chromium.content.browser.test.util.HistoryUtils;
|
| import org.chromium.net.test.util.TestWebServer;
|
|
|
| import java.util.concurrent.TimeUnit;
|
| +import java.util.ArrayList;
|
| import java.util.HashMap;
|
| +import java.util.List;
|
| import java.util.Map;
|
|
|
| /**
|
| @@ -93,6 +100,40 @@ public class LoadUrlTest extends AwTestBase {
|
| TimeUnit.SECONDS);
|
| }
|
|
|
| + private static List<Pair<String, String>> createHeadersList(String[] namesAndValues) {
|
| + List<Pair<String, String>> result = new ArrayList<Pair<String, String>>();
|
| + for (int i = 0; i < namesAndValues.length; i += 2)
|
| + result.add(Pair.create(namesAndValues[i], namesAndValues[i + 1]));
|
| + return result;
|
| + }
|
| +
|
| + private static Map<String, String> createHeadersMap(String[] namesAndValues) {
|
| + Map<String, String> result = new HashMap<String, String>();
|
| + for (int i = 0; i < namesAndValues.length; i += 2)
|
| + result.put(namesAndValues[i], namesAndValues[i + 1]);
|
| + return result;
|
| + }
|
| +
|
| + private void validateRequestHeaders(String[] refNamesAndValues,
|
| + HttpRequest request) {
|
| + for (int i = 0; i < refNamesAndValues.length; i += 2) {
|
| + Header[] matchingHeaders = request.getHeaders(refNamesAndValues[i]);
|
| + assertEquals(1, matchingHeaders.length);
|
| +
|
| + Header header = matchingHeaders[0];
|
| + assertEquals(refNamesAndValues[i].toLowerCase(), header.getName());
|
| + assertEquals(refNamesAndValues[i + 1], header.getValue());
|
| + }
|
| + }
|
| +
|
| + private void validateNoRequestHeaders(String[] refNamesAndValues,
|
| + HttpRequest request) {
|
| + for (int i = 0; i < refNamesAndValues.length; i += 2) {
|
| + Header[] matchingHeaders = request.getHeaders(refNamesAndValues[i]);
|
| + assertEquals(0, matchingHeaders.length);
|
| + }
|
| + }
|
| +
|
| @SmallTest
|
| @Feature({"AndroidWebView"})
|
| public void testLoadUrlWithExtraHeaders() throws Throwable {
|
| @@ -104,30 +145,187 @@ public class LoadUrlTest extends AwTestBase {
|
| TestWebServer webServer = null;
|
| try {
|
| webServer = new TestWebServer(false);
|
| + final String imagePath = "/" + CommonResources.FAVICON_FILENAME;
|
| + webServer.setResponseBase64(imagePath,
|
| + CommonResources.FAVICON_DATA_BASE64, CommonResources.getImagePngHeaders(true));
|
| final String path = "/load_url_with_extra_headers_test.html";
|
| - final String url = webServer.setResponse(path, "<html><body>foo</body></html>", null);
|
| + final String url = webServer.setResponse(
|
| + path,
|
| + CommonResources.getOnImageLoadedHtml(CommonResources.FAVICON_FILENAME),
|
| + null);
|
| + String[] extraHeaders = {
|
| + "X-ExtraHeaders1", "extra-header-data1",
|
| + "x-extraHeaders2", "EXTRA-HEADER-DATA2"
|
| + };
|
|
|
| - String[] headerNames = {"X-ExtraHeaders1", "x-extraHeaders2"};
|
| - String[] headerValues = {"extra-header-data1", "EXTRA-HEADER-DATA2"};
|
| - Map<String, String> extraHeaders = new HashMap<String, String>();
|
| - for (int i = 0; i < headerNames.length; ++i) {
|
| - extraHeaders.put(headerNames[i], headerValues[i]);
|
| - }
|
| + loadUrlWithExtraHeadersSync(awContents,
|
| + contentsClient.getOnPageFinishedHelper(),
|
| + url,
|
| + createHeadersMap(extraHeaders));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| + // Verify that extra headers are only passed for the main resource.
|
| + validateNoRequestHeaders(extraHeaders, webServer.getLastRequest(imagePath));
|
| + } finally {
|
| + if (webServer != null) webServer.shutdown();
|
| + }
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testNoOverridingOfExistingHeaders() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView =
|
| + createAwTestContainerViewOnMainSync(contentsClient);
|
| + final AwContents awContents = testContainerView.getAwContents();
|
| +
|
| + TestWebServer webServer = null;
|
| + try {
|
| + webServer = new TestWebServer(false);
|
| + final String path = "/no_overriding_of_existing_headers_test.html";
|
| + final String url = webServer.setResponse(
|
| + path,
|
| + "<html><body>foo</body></html>",
|
| + null);
|
| + String[] extraHeaders = {
|
| + "user-agent", "007"
|
| + };
|
|
|
| loadUrlWithExtraHeadersSync(awContents,
|
| contentsClient.getOnPageFinishedHelper(),
|
| url,
|
| - extraHeaders);
|
| + createHeadersMap(extraHeaders));
|
| + Header[] matchingHeaders = webServer.getLastRequest(path).getHeaders(extraHeaders[0]);
|
| + assertEquals(1, matchingHeaders.length);
|
| + Header header = matchingHeaders[0];
|
| + assertEquals(extraHeaders[0].toLowerCase(), header.getName().toLowerCase());
|
| + // Just check that the value is there, and it's not the one we provided.
|
| + assertTrue(header.getValue().length() > 0);
|
| + assertFalse(extraHeaders[1].equals(header.getValue()));
|
| + } finally {
|
| + if (webServer != null) webServer.shutdown();
|
| + }
|
| + }
|
|
|
| - HttpRequest request = webServer.getLastRequest(path);
|
| - for (int i = 0; i < headerNames.length; ++i) {
|
| - Header[] matchingHeaders = request.getHeaders(headerNames[i]);
|
| - assertEquals(1, matchingHeaders.length);
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testReloadWithExtraHeaders() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView =
|
| + createAwTestContainerViewOnMainSync(contentsClient);
|
| + final AwContents awContents = testContainerView.getAwContents();
|
|
|
| - Header header = matchingHeaders[0];
|
| - assertEquals(headerNames[i].toLowerCase(), header.getName());
|
| - assertEquals(headerValues[i], header.getValue());
|
| - }
|
| + TestWebServer webServer = null;
|
| + try {
|
| + webServer = new TestWebServer(false);
|
| + final String path = "/reload_with_extra_headers_test.html";
|
| + final String url = webServer.setResponse(path,
|
| + "<html><body>foo</body></html>",
|
| + createHeadersList(new String[] { "cache-control", "no-cache, no-store" }));
|
| + String[] extraHeaders = {
|
| + "X-ExtraHeaders1", "extra-header-data1",
|
| + "x-extraHeaders2", "EXTRA-HEADER-DATA2"
|
| + };
|
| +
|
| + loadUrlWithExtraHeadersSync(awContents,
|
| + contentsClient.getOnPageFinishedHelper(),
|
| + url,
|
| + createHeadersMap(extraHeaders));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| +
|
| + reloadSync(awContents, contentsClient.getOnPageFinishedHelper());
|
| + assertEquals(2, webServer.getRequestCount(path));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| + } finally {
|
| + if (webServer != null) webServer.shutdown();
|
| + }
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testRedirectAndReloadWithExtraHeaders() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView =
|
| + createAwTestContainerViewOnMainSync(contentsClient);
|
| + final AwContents awContents = testContainerView.getAwContents();
|
| +
|
| + TestWebServer webServer = null;
|
| + try {
|
| + webServer = new TestWebServer(false);
|
| + final String path = "/redirect_and_reload_with_extra_headers_test.html";
|
| + final String url = webServer.setResponse(path,
|
| + "<html><body>foo</body></html>",
|
| + createHeadersList(new String[] { "cache-control", "no-cache, no-store" }));
|
| + final String redirectedPath = "/redirected.html";
|
| + final String redirectedUrl = webServer.setRedirect(redirectedPath, path);
|
| + String[] extraHeaders = {
|
| + "X-ExtraHeaders1", "extra-header-data1",
|
| + "x-extraHeaders2", "EXTRA-HEADER-DATA2"
|
| + };
|
| +
|
| + loadUrlWithExtraHeadersSync(awContents,
|
| + contentsClient.getOnPageFinishedHelper(),
|
| + redirectedUrl,
|
| + createHeadersMap(extraHeaders));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(redirectedPath));
|
| +
|
| + // WebView will only reload the main page.
|
| + reloadSync(awContents, contentsClient.getOnPageFinishedHelper());
|
| + assertEquals(2, webServer.getRequestCount(path));
|
| + // No extra headers. This is consistent with legacy behavior.
|
| + validateNoRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| + } finally {
|
| + if (webServer != null) webServer.shutdown();
|
| + }
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AndroidWebView"})
|
| + public void testRendererNavigationAndGoBackWithExtraHeaders() throws Throwable {
|
| + final TestAwContentsClient contentsClient = new TestAwContentsClient();
|
| + final AwTestContainerView testContainerView =
|
| + createAwTestContainerViewOnMainSync(contentsClient);
|
| + final AwContents awContents = testContainerView.getAwContents();
|
| + final AwSettings settings = getAwSettingsOnUiThread(awContents);
|
| + settings.setJavaScriptEnabled(true);
|
| +
|
| + TestWebServer webServer = null;
|
| + try {
|
| + webServer = new TestWebServer(false);
|
| + final String nextPath = "/next.html";
|
| + final String nextUrl = webServer.setResponse(nextPath,
|
| + "<html><body>Next!</body></html>",
|
| + null);
|
| + final String path = "/renderer_nav_and_go_back_with_extra_headers_test.html";
|
| + final String url = webServer.setResponse(path,
|
| + "<html><body><a id=\"next\" href=\"next.html\">Next!</a></body></html>",
|
| + createHeadersList(new String[] { "cache-control", "no-cache, no-store" }));
|
| + String[] extraHeaders = {
|
| + "X-ExtraHeaders1", "extra-header-data1",
|
| + "x-extraHeaders2", "EXTRA-HEADER-DATA2"
|
| + };
|
| +
|
| + loadUrlWithExtraHeadersSync(awContents,
|
| + contentsClient.getOnPageFinishedHelper(),
|
| + url,
|
| + createHeadersMap(extraHeaders));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| +
|
| + int currentCallCount = contentsClient.getOnPageFinishedHelper().getCallCount();
|
| + JSUtils.clickOnLinkUsingJs(this,
|
| + awContents,
|
| + contentsClient.getOnEvaluateJavaScriptResultHelper(),
|
| + "next");
|
| + contentsClient.getOnPageFinishedHelper().waitForCallback(
|
| + currentCallCount, 1, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
|
| + // No extra headers for the page navigated via clicking.
|
| + validateNoRequestHeaders(extraHeaders, webServer.getLastRequest(nextPath));
|
| +
|
| + HistoryUtils.goBackSync(getInstrumentation(),
|
| + awContents.getContentViewCore(),
|
| + contentsClient.getOnPageFinishedHelper());
|
| + assertEquals(2, webServer.getRequestCount(path));
|
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path));
|
| } finally {
|
| if (webServer != null) webServer.shutdown();
|
| }
|
|
|