blob: 2b52ee78d16f1e138aa0cddfd7ad2dc7254f6dab [file] [log] [blame]
// Copyright 2014 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.support.test.filters.SmallTest;
import org.chromium.android_webview.AwContentsStatics;
import org.chromium.android_webview.AwWebContentsObserver;
import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.ui.base.PageTransition;
/**
* Tests for the AwWebContentsObserver class.
*/
public class AwWebContentsObserverTest extends AwTestBase {
private TestAwContentsClient mContentsClient;
private AwTestContainerView mTestContainerView;
private AwWebContentsObserver mWebContentsObserver;
private static final String EXAMPLE_URL = "http://www.example.com/";
private static final String EXAMPLE_URL_WITH_FRAGMENT = "http://www.example.com/#anchor";
private static final String SYNC_URL = "http://example.org/";
private static final String ERROR_DESCRIPTION = "description";
private String mUnreachableWebDataUrl;
@Override
public void setUp() throws Exception {
super.setUp();
mContentsClient = new TestAwContentsClient();
mTestContainerView = createAwTestContainerViewOnMainSync(mContentsClient);
mUnreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl();
// AwWebContentsObserver constructor must be run on the UI thread.
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mWebContentsObserver = new AwWebContentsObserver(
mTestContainerView.getContentViewCore().getWebContents(),
mTestContainerView.getAwContents(), mContentsClient);
}
});
}
@SmallTest
@Feature({"AndroidWebView"})
public void testOnPageFinished() throws Throwable {
int frameId = 0;
boolean mainFrame = true;
boolean subFrame = false;
final TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mContentsClient.getOnPageFinishedHelper();
int callCount = onPageFinishedHelper.getCallCount();
mWebContentsObserver.didFinishLoad(frameId, EXAMPLE_URL, mainFrame);
mWebContentsObserver.didStopLoading(EXAMPLE_URL);
onPageFinishedHelper.waitForCallback(callCount);
assertEquals("onPageFinished should be called for main frame navigations.", callCount + 1,
onPageFinishedHelper.getCallCount());
assertEquals("onPageFinished should be called for main frame navigations.", EXAMPLE_URL,
onPageFinishedHelper.getUrl());
// In order to check that callbacks are *not* firing, first we execute code
// that shoudn't emit callbacks, then code that emits a callback, and check that we
// have got only one callback, and that its URL is from the last call. Since
// callbacks are serialized, that means we didn't have a callback for the first call.
callCount = onPageFinishedHelper.getCallCount();
mWebContentsObserver.didFinishLoad(frameId, EXAMPLE_URL, subFrame);
mWebContentsObserver.didFinishLoad(frameId, SYNC_URL, mainFrame);
mWebContentsObserver.didStopLoading(SYNC_URL);
onPageFinishedHelper.waitForCallback(callCount);
assertEquals("onPageFinished should only be called for the main frame.", callCount + 1,
onPageFinishedHelper.getCallCount());
assertEquals("onPageFinished should only be called for the main frame.", SYNC_URL,
onPageFinishedHelper.getUrl());
callCount = onPageFinishedHelper.getCallCount();
mWebContentsObserver.didFinishLoad(frameId, mUnreachableWebDataUrl, mainFrame);
mWebContentsObserver.didFinishLoad(frameId, SYNC_URL, mainFrame);
mWebContentsObserver.didStopLoading(SYNC_URL);
onPageFinishedHelper.waitForCallback(callCount);
assertEquals("onPageFinished should not be called for the error url.", callCount + 1,
onPageFinishedHelper.getCallCount());
assertEquals("onPageFinished should not be called for the error url.", SYNC_URL,
onPageFinishedHelper.getUrl());
String baseUrl = null;
boolean isInMainFrame = true;
boolean isErrorPage = false;
boolean hasCommitted = true;
boolean isSamePage = true;
boolean fragmentNavigation = true;
int errorCode = 0;
String errorDescription = "";
int httpStatusCode = 200;
callCount = onPageFinishedHelper.getCallCount();
mWebContentsObserver.didFinishNavigation(EXAMPLE_URL, isInMainFrame, isErrorPage,
hasCommitted, !isSamePage, !fragmentNavigation, PageTransition.TYPED, errorCode,
errorDescription, httpStatusCode);
mWebContentsObserver.didFinishNavigation(EXAMPLE_URL_WITH_FRAGMENT, isInMainFrame,
isErrorPage, hasCommitted, isSamePage, fragmentNavigation, PageTransition.TYPED,
errorCode, errorDescription, httpStatusCode);
onPageFinishedHelper.waitForCallback(callCount);
assertEquals("onPageFinished should be called for main frame fragment navigations.",
callCount + 1, onPageFinishedHelper.getCallCount());
assertEquals("onPageFinished should be called for main frame fragment navigations.",
EXAMPLE_URL_WITH_FRAGMENT, onPageFinishedHelper.getUrl());
callCount = onPageFinishedHelper.getCallCount();
mWebContentsObserver.didFinishNavigation(EXAMPLE_URL, isInMainFrame, isErrorPage,
hasCommitted, !isSamePage, !fragmentNavigation, PageTransition.TYPED, errorCode,
errorDescription, httpStatusCode);
mWebContentsObserver.didFinishLoad(frameId, SYNC_URL, mainFrame);
mWebContentsObserver.didStopLoading(SYNC_URL);
onPageFinishedHelper.waitForCallback(callCount);
onPageFinishedHelper.waitForCallback(callCount);
assertEquals("onPageFinished should be called only for main frame fragment navigations.",
callCount + 1, onPageFinishedHelper.getCallCount());
assertEquals("onPageFinished should be called only for main frame fragment navigations.",
SYNC_URL, onPageFinishedHelper.getUrl());
}
@SmallTest
@Feature({"AndroidWebView"})
public void testDidFinishNavigation() throws Throwable {
String nullUrl = null;
String baseUrl = null;
boolean isInMainFrame = true;
boolean isErrorPage = false;
boolean hasCommitted = true;
boolean isSamePage = true;
boolean fragmentNavigation = false;
int errorCode = 0;
String errorDescription = "";
int httpStatusCode = 200;
TestAwContentsClient.DoUpdateVisitedHistoryHelper doUpdateVisitedHistoryHelper =
mContentsClient.getDoUpdateVisitedHistoryHelper();
int callCount = doUpdateVisitedHistoryHelper.getCallCount();
mWebContentsObserver.didFinishNavigation(nullUrl, isInMainFrame, !isErrorPage, hasCommitted,
!isSamePage, fragmentNavigation, PageTransition.TYPED, errorCode, errorDescription,
httpStatusCode);
doUpdateVisitedHistoryHelper.waitForCallback(callCount);
assertEquals("doUpdateVisitedHistory should be called for any url.", callCount + 1,
doUpdateVisitedHistoryHelper.getCallCount());
assertEquals("doUpdateVisitedHistory should be called for any url.", nullUrl,
doUpdateVisitedHistoryHelper.getUrl());
assertEquals(false, doUpdateVisitedHistoryHelper.getIsReload());
callCount = doUpdateVisitedHistoryHelper.getCallCount();
mWebContentsObserver.didFinishNavigation(EXAMPLE_URL, isInMainFrame, isErrorPage,
hasCommitted, !isSamePage, fragmentNavigation, PageTransition.TYPED, errorCode,
errorDescription, httpStatusCode);
doUpdateVisitedHistoryHelper.waitForCallback(callCount);
assertEquals("doUpdateVisitedHistory should be called for any url.", callCount + 1,
doUpdateVisitedHistoryHelper.getCallCount());
assertEquals("doUpdateVisitedHistory should be called for any url.", EXAMPLE_URL,
doUpdateVisitedHistoryHelper.getUrl());
assertEquals(false, doUpdateVisitedHistoryHelper.getIsReload());
callCount = doUpdateVisitedHistoryHelper.getCallCount();
mWebContentsObserver.didFinishNavigation(EXAMPLE_URL, isInMainFrame, isErrorPage,
hasCommitted, isSamePage, !fragmentNavigation, PageTransition.RELOAD, errorCode,
errorDescription, httpStatusCode);
doUpdateVisitedHistoryHelper.waitForCallback(callCount);
assertEquals("doUpdateVisitedHistory should be called for reloads.", callCount + 1,
doUpdateVisitedHistoryHelper.getCallCount());
assertEquals("doUpdateVisitedHistory should be called for reloads.", EXAMPLE_URL,
doUpdateVisitedHistoryHelper.getUrl());
assertEquals(true, doUpdateVisitedHistoryHelper.getIsReload());
}
}