Commit 3283da00 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

[WebLayer] Add more tests for navigation

Some of our navigation APIs were untested. The tests ended up finding a
crash in getRedirectChain().

Change-Id: I2e0837ace604ee1607cebaa745e07c782cfc4be8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1904753
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#713918}
parent 90e46307
......@@ -14,6 +14,7 @@ import org.chromium.weblayer_private.interfaces.IClientNavigation;
import org.chromium.weblayer_private.interfaces.INavigation;
import org.chromium.weblayer_private.interfaces.INavigationControllerClient;
import java.util.Arrays;
import java.util.List;
@JNINamespace("weblayer")
......@@ -51,7 +52,8 @@ public final class NavigationImpl extends INavigation.Stub {
@Override
public List<String> getRedirectChain() {
throwIfNativeDestroyed();
return NavigationImplJni.get().getRedirectChain(mNativeNavigationImpl, NavigationImpl.this);
return Arrays.asList(NavigationImplJni.get().getRedirectChain(
mNativeNavigationImpl, NavigationImpl.this));
}
@Override
......@@ -77,7 +79,7 @@ public final class NavigationImpl extends INavigation.Stub {
void setJavaNavigation(long nativeNavigationImpl, NavigationImpl caller);
int getState(long nativeNavigationImpl, NavigationImpl caller);
String getUri(long nativeNavigationImpl, NavigationImpl caller);
List<String> getRedirectChain(long nativeNavigationImpl, NavigationImpl caller);
String[] getRedirectChain(long nativeNavigationImpl, NavigationImpl caller);
boolean isSameDocument(long nativeNavigationImpl, NavigationImpl caller);
}
}
......@@ -45,7 +45,7 @@ ScopedJavaLocalRef<jstring> NavigationImpl::GetUri(
base::android::ConvertUTF8ToJavaString(env, GetURL().spec()));
}
ScopedJavaLocalRef<jobject> NavigationImpl::GetRedirectChain(
ScopedJavaLocalRef<jobjectArray> NavigationImpl::GetRedirectChain(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
std::vector<std::string> jni_redirects;
......
......@@ -34,7 +34,7 @@ class NavigationImpl : public Navigation {
base::android::ScopedJavaLocalRef<jstring> GetUri(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
base::android::ScopedJavaLocalRef<jobject> GetRedirectChain(
base::android::ScopedJavaLocalRef<jobjectArray> GetRedirectChain(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
bool IsSameDocument(JNIEnv* env,
......
......@@ -28,6 +28,7 @@ import org.chromium.weblayer.NavigationController;
import org.chromium.weblayer.shell.InstrumentationActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeoutException;
......@@ -50,15 +51,12 @@ public class NavigationTest {
public static class NavigationCallbackHelper extends CallbackHelper {
private Uri mUri;
private boolean mIsSameDocument;
private List<Uri> mRedirectChain;
public void notifyCalled(Uri uri) {
mUri = uri;
notifyCalled();
}
public void notifyCalled(Uri uri, boolean isSameDocument) {
mUri = uri;
mIsSameDocument = isSameDocument;
public void notifyCalled(Navigation navigation) {
mUri = navigation.getUri();
mIsSameDocument = navigation.isSameDocument();
mRedirectChain = navigation.getRedirectChain();
notifyCalled();
}
......@@ -73,6 +71,12 @@ public class NavigationTest {
assertEquals(mUri.toString(), uri);
assertEquals(mIsSameDocument, isSameDocument);
}
public void assertCalledWith(int currentCallCount, List<Uri> redirectChain)
throws TimeoutException {
waitForCallback(currentCallCount);
assertEquals(mRedirectChain, redirectChain);
}
}
public static class NavigationCallbackValueRecorder {
......@@ -101,8 +105,10 @@ public class NavigationTest {
}
public NavigationCallbackHelper onStartedCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onRedirectedCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onReadyToCommitCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onCompletedCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onFailedCallback = new NavigationCallbackHelper();
public NavigationCallbackValueRecorder loadStateChangedCallback =
new NavigationCallbackValueRecorder();
public NavigationCallbackValueRecorder loadProgressChangedCallback =
......@@ -111,17 +117,27 @@ public class NavigationTest {
@Override
public void onNavigationStarted(Navigation navigation) {
onStartedCallback.notifyCalled(navigation.getUri());
onStartedCallback.notifyCalled(navigation);
}
@Override
public void onNavigationRedirected(Navigation navigation) {
onRedirectedCallback.notifyCalled(navigation);
}
@Override
public void onReadyToCommitNavigation(Navigation navigation) {
onReadyToCommitCallback.notifyCalled(navigation.getUri());
onReadyToCommitCallback.notifyCalled(navigation);
}
@Override
public void onNavigationCompleted(Navigation navigation) {
onCompletedCallback.notifyCalled(navigation.getUri(), navigation.isSameDocument());
onCompletedCallback.notifyCalled(navigation);
}
@Override
public void onNavigationFailed(Navigation navigation) {
onFailedCallback.notifyCalled(navigation);
}
@Override
......@@ -248,6 +264,83 @@ public class NavigationTest {
curCompletedCount, "data:text,foo#bar", true);
}
@Test
@SmallTest
public void testReload() throws Exception {
InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1);
setNavigationCallback(activity);
navigateAndWaitForCompletion(
URL1, () -> { activity.getTab().getNavigationController().reload(); });
}
@Test
@SmallTest
public void testStop() throws Exception {
InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1);
setNavigationCallback(activity);
int curFailedCount = mCallback.onFailedCallback.getCallCount();
runOnUiThreadBlocking(() -> {
NavigationController navigationController = activity.getTab().getNavigationController();
navigationController.registerNavigationCallback(new NavigationCallback() {
@Override
public void onNavigationStarted(Navigation navigation) {
navigationController.stop();
}
});
navigationController.navigate(Uri.parse(URL2));
});
mCallback.onFailedCallback.assertCalledWith(curFailedCount, URL2);
}
@Test
@SmallTest
public void testRedirect() throws Exception {
InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1);
setNavigationCallback(activity);
int curRedirectedCount = mCallback.onRedirectedCallback.getCallCount();
String finalUrl = mActivityTestRule.getTestServer().getURL("/echo");
String url = mActivityTestRule.getTestServer().getURL("/server-redirect?" + finalUrl);
navigateAndWaitForCompletion(finalUrl,
() -> { activity.getTab().getNavigationController().navigate(Uri.parse(url)); });
mCallback.onRedirectedCallback.assertCalledWith(
curRedirectedCount, Arrays.asList(Uri.parse(url), Uri.parse(finalUrl)));
}
@Test
@SmallTest
public void testNavigationList() throws Exception {
InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1);
setNavigationCallback(activity);
mActivityTestRule.navigateAndWait(URL2);
mActivityTestRule.navigateAndWait(URL3);
NavigationController navigationController =
runOnUiThreadBlocking(() -> activity.getTab().getNavigationController());
runOnUiThreadBlocking(() -> {
assertEquals(3, navigationController.getNavigationListSize());
assertEquals(2, navigationController.getNavigationListCurrentIndex());
assertEquals(URL1, navigationController.getNavigationEntryDisplayUri(0).toString());
assertEquals(URL2, navigationController.getNavigationEntryDisplayUri(1).toString());
assertEquals(URL3, navigationController.getNavigationEntryDisplayUri(2).toString());
});
navigateAndWaitForCompletion(URL2, () -> { navigationController.goBack(); });
runOnUiThreadBlocking(() -> {
assertEquals(3, navigationController.getNavigationListSize());
assertEquals(1, navigationController.getNavigationListCurrentIndex());
});
}
private void setNavigationCallback(InstrumentationActivity activity) {
runOnUiThreadBlocking(
()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment