Chromium Code Reviews| 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 76d226594850b9c2ac0320df2d6a5a0944966d1e..07c13f69a1a9c59935bf7f75cd184d2dd631dbf9 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,29 +145,151 @@ 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" |
|
benm (inactive)
2013/12/09 17:49:11
Maybe add a test case for overwriting a header tha
mnaganov (inactive)
2013/12/10 11:03:31
Done.
|
| + }; |
| - 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 testReloadWithExtraHeaders() 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 = "/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, |
| - extraHeaders); |
| + createHeadersMap(extraHeaders)); |
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path)); |
| - HttpRequest request = webServer.getLastRequest(path); |
| - for (int i = 0; i < headerNames.length; ++i) { |
| - Header[] matchingHeaders = request.getHeaders(headerNames[i]); |
| - assertEquals(1, matchingHeaders.length); |
| + reloadSync(awContents, contentsClient.getOnPageFinishedHelper()); |
| + assertEquals(2, webServer.getRequestCount(path)); |
| + validateRequestHeaders(extraHeaders, webServer.getLastRequest(path)); |
| + } finally { |
| + if (webServer != null) webServer.shutdown(); |
| + } |
| + } |
| - Header header = matchingHeaders[0]; |
| - assertEquals(headerNames[i].toLowerCase(), header.getName()); |
| - assertEquals(headerValues[i], header.getValue()); |
| - } |
| + @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(); |
| } |