| Index: android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedHttpErrorTest.java
 | 
| diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedHttpErrorTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedHttpErrorTest.java
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..f9400740e5f46748dc0b54313e9b4a650f1f6796
 | 
| --- /dev/null
 | 
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedHttpErrorTest.java
 | 
| @@ -0,0 +1,218 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// 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.os.Build;
 | 
| +import android.test.suitebuilder.annotation.SmallTest;
 | 
| +import android.util.Pair;
 | 
| +
 | 
| +import org.chromium.android_webview.AwContents;
 | 
| +import org.chromium.android_webview.AwContentsClient.AwWebResourceRequest;
 | 
| +import org.chromium.android_webview.AwWebResourceResponse;
 | 
| +import org.chromium.android_webview.test.util.AwTestTouchUtils;
 | 
| +import org.chromium.android_webview.test.util.CommonResources;
 | 
| +import org.chromium.base.test.util.Feature;
 | 
| +import org.chromium.base.test.util.MinAndroidSdkLevel;
 | 
| +import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
 | 
| +import org.chromium.net.test.util.TestWebServer;
 | 
| +
 | 
| +import java.util.ArrayList;
 | 
| +import java.util.List;
 | 
| +import java.util.concurrent.TimeUnit;
 | 
| +
 | 
| +/**
 | 
| + * Tests for the ContentViewClient.onReceivedHttpError() method.
 | 
| + */
 | 
| +@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT)
 | 
| +public class ClientOnReceivedHttpErrorTest extends AwTestBase {
 | 
| +
 | 
| +    private TestAwContentsClient mContentsClient;
 | 
| +    private AwTestContainerView mTestContainerView;
 | 
| +    private AwContents mAwContents;
 | 
| +    private TestWebServer mWebServer;
 | 
| +
 | 
| +    @Override
 | 
| +    public void setUp() throws Exception {
 | 
| +        super.setUp();
 | 
| +        mContentsClient = new TestAwContentsClient();
 | 
| +        mTestContainerView = createAwTestContainerViewOnMainSync(mContentsClient);
 | 
| +        mAwContents = mTestContainerView.getAwContents();
 | 
| +        mWebServer = TestWebServer.start();
 | 
| +    }
 | 
| +
 | 
| +    private void setTestAwContentsClient(TestAwContentsClient contentsClient) throws Exception {
 | 
| +        mContentsClient = contentsClient;
 | 
| +        final AwTestContainerView testContainerView =
 | 
| +                createAwTestContainerViewOnMainSync(mContentsClient);
 | 
| +        mAwContents = testContainerView.getAwContents();
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    protected void tearDown() throws Exception {
 | 
| +        if (mWebServer != null) mWebServer.shutdown();
 | 
| +        super.tearDown();
 | 
| +    }
 | 
| +
 | 
| +    @SmallTest
 | 
| +    @Feature({"AndroidWebView"})
 | 
| +    public void testOnReceivedHttpErrorForMainResource() throws Throwable {
 | 
| +        TestAwContentsClient.OnReceivedHttpErrorHelper onReceivedHttpErrorHelper =
 | 
| +                mContentsClient.getOnReceivedHttpErrorHelper();
 | 
| +
 | 
| +        List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
 | 
| +        headers.add(Pair.create("Content-Type", "text/html; charset=utf-8"));
 | 
| +        headers.add(Pair.create("Coalesce", ""));
 | 
| +        headers.add(Pair.create("Coalesce", "a"));
 | 
| +        headers.add(Pair.create("Coalesce", ""));
 | 
| +        headers.add(Pair.create("Coalesce", "a"));
 | 
| +        final String url = mWebServer.setResponseWithNotFoundStatus("/404.html", headers);
 | 
| +        int onReceivedHttpErrorCallCount = onReceivedHttpErrorHelper.getCallCount();
 | 
| +        loadUrlAsync(mAwContents, url);
 | 
| +
 | 
| +        onReceivedHttpErrorHelper.waitForCallback(onReceivedHttpErrorCallCount,
 | 
| +                1 /* numberOfCallsToWaitFor */,
 | 
| +                WAIT_TIMEOUT_MS,
 | 
| +                TimeUnit.MILLISECONDS);
 | 
| +        AwWebResourceRequest request = onReceivedHttpErrorHelper.getRequest();
 | 
| +        assertNotNull(request);
 | 
| +        assertEquals(url, request.url);
 | 
| +        assertEquals("GET", request.method);
 | 
| +        assertNotNull(request.requestHeaders);
 | 
| +        assertFalse(request.requestHeaders.isEmpty());
 | 
| +        assertTrue(request.isMainFrame);
 | 
| +        assertFalse(request.hasUserGesture);
 | 
| +        AwWebResourceResponse response = onReceivedHttpErrorHelper.getResponse();
 | 
| +        assertEquals(404, response.getStatusCode());
 | 
| +        assertEquals("Not Found", response.getReasonPhrase());
 | 
| +        assertEquals("text/html", response.getMimeType());
 | 
| +        assertEquals("utf-8", response.getCharset());
 | 
| +        assertNotNull(response.getResponseHeaders());
 | 
| +        assertTrue(response.getResponseHeaders().containsKey("Content-Type"));
 | 
| +        assertEquals("text/html; charset=utf-8", response.getResponseHeaders().get("Content-Type"));
 | 
| +        assertTrue(response.getResponseHeaders().containsKey("Coalesce"));
 | 
| +        assertEquals("a, a", response.getResponseHeaders().get("Coalesce"));
 | 
| +    }
 | 
| +
 | 
| +    @SmallTest
 | 
| +    @Feature({"AndroidWebView"})
 | 
| +    public void testOnReceivedHttpErrorForUserGesture() throws Throwable {
 | 
| +        List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
 | 
| +        headers.add(Pair.create("Content-Type", "text/html; charset=utf-8"));
 | 
| +        final String badUrl = mWebServer.setResponseWithNotFoundStatus("/404.html", headers);
 | 
| +        final String pageWithLinkUrl = mWebServer.setResponse("/page_with_link.html",
 | 
| +                CommonResources.makeHtmlPageWithSimpleLinkTo(badUrl), null);
 | 
| +        enableJavaScriptOnUiThread(mAwContents);
 | 
| +        loadUrlAsync(mAwContents, pageWithLinkUrl);
 | 
| +        waitForVisualStateCallback(mAwContents);
 | 
| +
 | 
| +        TestAwContentsClient.OnReceivedHttpErrorHelper onReceivedHttpErrorHelper =
 | 
| +                mContentsClient.getOnReceivedHttpErrorHelper();
 | 
| +        AwTestTouchUtils.simulateTouchCenterOfView(mTestContainerView);
 | 
| +        int onReceivedHttpErrorCallCount = onReceivedHttpErrorHelper.getCallCount();
 | 
| +        onReceivedHttpErrorHelper.waitForCallback(onReceivedHttpErrorCallCount,
 | 
| +                1 /* numberOfCallsToWaitFor */,
 | 
| +                WAIT_TIMEOUT_MS,
 | 
| +                TimeUnit.MILLISECONDS);
 | 
| +        AwWebResourceRequest request = onReceivedHttpErrorHelper.getRequest();
 | 
| +        assertNotNull(request);
 | 
| +        assertEquals(badUrl, request.url);
 | 
| +        assertEquals("GET", request.method);
 | 
| +        assertNotNull(request.requestHeaders);
 | 
| +        assertFalse(request.requestHeaders.isEmpty());
 | 
| +        assertTrue(request.isMainFrame);
 | 
| +        assertTrue(request.hasUserGesture);
 | 
| +        AwWebResourceResponse response = onReceivedHttpErrorHelper.getResponse();
 | 
| +        assertEquals(404, response.getStatusCode());
 | 
| +        assertEquals("Not Found", response.getReasonPhrase());
 | 
| +        assertEquals("text/html", response.getMimeType());
 | 
| +        assertEquals("utf-8", response.getCharset());
 | 
| +        assertNotNull(response.getResponseHeaders());
 | 
| +        assertTrue(response.getResponseHeaders().containsKey("Content-Type"));
 | 
| +        assertEquals("text/html; charset=utf-8", response.getResponseHeaders().get("Content-Type"));
 | 
| +    }
 | 
| +
 | 
| +    @SmallTest
 | 
| +    @Feature({"AndroidWebView"})
 | 
| +    public void testOnReceivedHttpErrorForSubresource() throws Throwable {
 | 
| +        class LocalTestClient extends TestAwContentsClient {
 | 
| +            private boolean mIsOnReceivedHttpErrorCalled = false;
 | 
| +            private boolean mIsOnPageFinishedCalled = false;
 | 
| +
 | 
| +            @Override
 | 
| +            public void onReceivedHttpError(AwWebResourceRequest request,
 | 
| +                    AwWebResourceResponse response) {
 | 
| +                assertEquals("onReceivedHttpError called twice for " + request.url,
 | 
| +                        false, mIsOnReceivedHttpErrorCalled);
 | 
| +                mIsOnReceivedHttpErrorCalled = true;
 | 
| +                super.onReceivedHttpError(request, response);
 | 
| +            }
 | 
| +
 | 
| +            @Override
 | 
| +            public void onPageFinished(String url) {
 | 
| +                mIsOnPageFinishedCalled = true;
 | 
| +                super.onPageFinished(url);
 | 
| +            }
 | 
| +        }
 | 
| +        LocalTestClient testContentsClient = new LocalTestClient();
 | 
| +        setTestAwContentsClient(testContentsClient);
 | 
| +
 | 
| +        TestAwContentsClient.OnReceivedHttpErrorHelper onReceivedHttpErrorHelper =
 | 
| +                mContentsClient.getOnReceivedHttpErrorHelper();
 | 
| +        TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
 | 
| +                mContentsClient.getOnPageFinishedHelper();
 | 
| +
 | 
| +        List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
 | 
| +        headers.add(Pair.create("Content-Type", "text/html; charset=utf-8"));
 | 
| +        final String imageUrl = mWebServer.setResponseWithNotFoundStatus("/404.png", headers);
 | 
| +        final String pageHtml = CommonResources.makeHtmlPageFrom(
 | 
| +                "", "<img src='" + imageUrl + "' class='img.big' />");
 | 
| +        final String pageUrl = mWebServer.setResponse("/page.html", pageHtml, null);
 | 
| +
 | 
| +        loadUrlSync(mAwContents, onPageFinishedHelper, pageUrl);
 | 
| +
 | 
| +        AwWebResourceRequest request = onReceivedHttpErrorHelper.getRequest();
 | 
| +        assertNotNull(request);
 | 
| +        assertEquals(imageUrl, request.url);
 | 
| +        assertEquals("GET", request.method);
 | 
| +        assertNotNull(request.requestHeaders);
 | 
| +        assertFalse(request.requestHeaders.isEmpty());
 | 
| +        assertFalse(request.isMainFrame);
 | 
| +        assertFalse(request.hasUserGesture);
 | 
| +        AwWebResourceResponse response = onReceivedHttpErrorHelper.getResponse();
 | 
| +        assertEquals(404, response.getStatusCode());
 | 
| +        assertEquals("Not Found", response.getReasonPhrase());
 | 
| +        assertEquals("text/html", response.getMimeType());
 | 
| +        assertEquals("utf-8", response.getCharset());
 | 
| +        assertNotNull(response.getResponseHeaders());
 | 
| +        assertTrue(response.getResponseHeaders().containsKey("Content-Type"));
 | 
| +        assertEquals("text/html; charset=utf-8", response.getResponseHeaders().get("Content-Type"));
 | 
| +    }
 | 
| +
 | 
| +    @SmallTest
 | 
| +    @Feature({"AndroidWebView"})
 | 
| +    public void testOnReceivedHttpErrorNotCalledIfNoHttpError() throws Throwable {
 | 
| +        TestAwContentsClient.OnReceivedHttpErrorHelper onReceivedHttpErrorHelper =
 | 
| +                mContentsClient.getOnReceivedHttpErrorHelper();
 | 
| +        TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
 | 
| +                mContentsClient.getOnPageFinishedHelper();
 | 
| +
 | 
| +        final String goodUrl = mWebServer.setResponse("/1.html", CommonResources.ABOUT_HTML, null);
 | 
| +        final String badUrl = mWebServer.setResponseWithNotFoundStatus("/404.html");
 | 
| +
 | 
| +        final int onReceivedHttpErrorCallCount = onReceivedHttpErrorHelper.getCallCount();
 | 
| +        loadUrlSync(mAwContents, onPageFinishedHelper, goodUrl);
 | 
| +
 | 
| +        // Instead of waiting for OnReceivedHttpError not to be called, we schedule
 | 
| +        // a load that will result in a error, and check that we have only got one callback,
 | 
| +        // originating from the last attempt.
 | 
| +        loadUrlAsync(mAwContents, badUrl);
 | 
| +        onReceivedHttpErrorHelper.waitForCallback(onReceivedHttpErrorCallCount,
 | 
| +                1 /* numberOfCallsToWaitFor */,
 | 
| +                WAIT_TIMEOUT_MS,
 | 
| +                TimeUnit.MILLISECONDS);
 | 
| +        assertEquals(onReceivedHttpErrorCallCount + 1, onReceivedHttpErrorHelper.getCallCount());
 | 
| +        assertEquals(badUrl, onReceivedHttpErrorHelper.getRequest().url);
 | 
| +    }
 | 
| +}
 | 
| 
 |