1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5package org.chromium.android_webview.test; 6 7import android.test.suitebuilder.annotation.MediumTest; 8 9import org.chromium.android_webview.AwContents; 10import org.chromium.base.test.util.Feature; 11import org.chromium.content.browser.test.util.TestCallbackHelperContainer; 12 13/** 14 * Tests for the ContentViewClient.onPageStarted() method. 15 */ 16public class ClientOnPageStartedTest extends AwTestBase { 17 18 private TestAwContentsClient mContentsClient; 19 private AwContents mAwContents; 20 21 @Override 22 public void setUp() throws Exception { 23 super.setUp(); 24 setTestAwContentsClient(new TestAwContentsClient()); 25 } 26 27 private void setTestAwContentsClient(TestAwContentsClient contentsClient) throws Exception { 28 mContentsClient = contentsClient; 29 final AwTestContainerView testContainerView = 30 createAwTestContainerViewOnMainSync(mContentsClient); 31 mAwContents = testContainerView.getAwContents(); 32 } 33 34 @MediumTest 35 @Feature({"AndroidWebView"}) 36 public void testOnPageStartedPassesCorrectUrl() throws Throwable { 37 TestCallbackHelperContainer.OnPageStartedHelper onPageStartedHelper = 38 mContentsClient.getOnPageStartedHelper(); 39 40 String html = "<html><body>Simple page.</body></html>"; 41 int currentCallCount = onPageStartedHelper.getCallCount(); 42 loadDataAsync(mAwContents, html, "text/html", false); 43 44 onPageStartedHelper.waitForCallback(currentCallCount); 45 assertEquals("data:text/html," + html, onPageStartedHelper.getUrl()); 46 } 47 48 @MediumTest 49 @Feature({"AndroidWebView"}) 50 public void testOnPageStartedCalledOnceOnError() throws Throwable { 51 class LocalTestClient extends TestAwContentsClient { 52 private boolean mIsOnReceivedErrorCalled = false; 53 private boolean mIsOnPageStartedCalled = false; 54 private boolean mAllowAboutBlank = false; 55 56 @Override 57 public void onReceivedError(int errorCode, String description, String failingUrl) { 58 assertEquals("onReceivedError called twice for " + failingUrl, 59 false, mIsOnReceivedErrorCalled); 60 mIsOnReceivedErrorCalled = true; 61 assertEquals("onPageStarted not called before onReceivedError for " + failingUrl, 62 true, mIsOnPageStartedCalled); 63 super.onReceivedError(errorCode, description, failingUrl); 64 } 65 66 @Override 67 public void onPageStarted(String url) { 68 if (mAllowAboutBlank && "about:blank".equals(url)) { 69 super.onPageStarted(url); 70 return; 71 } 72 assertEquals("onPageStarted called twice for " + url, 73 false, mIsOnPageStartedCalled); 74 mIsOnPageStartedCalled = true; 75 assertEquals("onReceivedError called before onPageStarted for " + url, 76 false, mIsOnReceivedErrorCalled); 77 super.onPageStarted(url); 78 } 79 80 void setAllowAboutBlank() { 81 mAllowAboutBlank = true; 82 } 83 } 84 85 LocalTestClient testContentsClient = new LocalTestClient(); 86 setTestAwContentsClient(testContentsClient); 87 88 TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper = 89 mContentsClient.getOnReceivedErrorHelper(); 90 TestCallbackHelperContainer.OnPageStartedHelper onPageStartedHelper = 91 mContentsClient.getOnPageStartedHelper(); 92 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = 93 mContentsClient.getOnPageFinishedHelper(); 94 95 String invalidUrl = "http://localhost:7/non_existent"; 96 loadUrlSync(mAwContents, onPageFinishedHelper, invalidUrl); 97 98 assertEquals(invalidUrl, onReceivedErrorHelper.getFailingUrl()); 99 assertEquals(invalidUrl, onPageStartedHelper.getUrl()); 100 101 // Rather than wait a fixed time to see that another onPageStarted callback isn't issued 102 // we load a valid page. Since callbacks arrive sequentially, this will ensure that 103 // any extra calls of onPageStarted / onReceivedError will arrive to our client. 104 testContentsClient.setAllowAboutBlank(); 105 loadUrlSync(mAwContents, onPageFinishedHelper, "about:blank"); 106 } 107} 108