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; ...@@ -14,6 +14,7 @@ import org.chromium.weblayer_private.interfaces.IClientNavigation;
import org.chromium.weblayer_private.interfaces.INavigation; import org.chromium.weblayer_private.interfaces.INavigation;
import org.chromium.weblayer_private.interfaces.INavigationControllerClient; import org.chromium.weblayer_private.interfaces.INavigationControllerClient;
import java.util.Arrays;
import java.util.List; import java.util.List;
@JNINamespace("weblayer") @JNINamespace("weblayer")
...@@ -51,7 +52,8 @@ public final class NavigationImpl extends INavigation.Stub { ...@@ -51,7 +52,8 @@ public final class NavigationImpl extends INavigation.Stub {
@Override @Override
public List<String> getRedirectChain() { public List<String> getRedirectChain() {
throwIfNativeDestroyed(); throwIfNativeDestroyed();
return NavigationImplJni.get().getRedirectChain(mNativeNavigationImpl, NavigationImpl.this); return Arrays.asList(NavigationImplJni.get().getRedirectChain(
mNativeNavigationImpl, NavigationImpl.this));
} }
@Override @Override
...@@ -77,7 +79,7 @@ public final class NavigationImpl extends INavigation.Stub { ...@@ -77,7 +79,7 @@ public final class NavigationImpl extends INavigation.Stub {
void setJavaNavigation(long nativeNavigationImpl, NavigationImpl caller); void setJavaNavigation(long nativeNavigationImpl, NavigationImpl caller);
int getState(long nativeNavigationImpl, NavigationImpl caller); int getState(long nativeNavigationImpl, NavigationImpl caller);
String getUri(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); boolean isSameDocument(long nativeNavigationImpl, NavigationImpl caller);
} }
} }
...@@ -45,7 +45,7 @@ ScopedJavaLocalRef<jstring> NavigationImpl::GetUri( ...@@ -45,7 +45,7 @@ ScopedJavaLocalRef<jstring> NavigationImpl::GetUri(
base::android::ConvertUTF8ToJavaString(env, GetURL().spec())); base::android::ConvertUTF8ToJavaString(env, GetURL().spec()));
} }
ScopedJavaLocalRef<jobject> NavigationImpl::GetRedirectChain( ScopedJavaLocalRef<jobjectArray> NavigationImpl::GetRedirectChain(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) { const base::android::JavaParamRef<jobject>& obj) {
std::vector<std::string> jni_redirects; std::vector<std::string> jni_redirects;
......
...@@ -34,7 +34,7 @@ class NavigationImpl : public Navigation { ...@@ -34,7 +34,7 @@ class NavigationImpl : public Navigation {
base::android::ScopedJavaLocalRef<jstring> GetUri( base::android::ScopedJavaLocalRef<jstring> GetUri(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
base::android::ScopedJavaLocalRef<jobject> GetRedirectChain( base::android::ScopedJavaLocalRef<jobjectArray> GetRedirectChain(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj); const base::android::JavaParamRef<jobject>& obj);
bool IsSameDocument(JNIEnv* env, bool IsSameDocument(JNIEnv* env,
......
...@@ -28,6 +28,7 @@ import org.chromium.weblayer.NavigationController; ...@@ -28,6 +28,7 @@ import org.chromium.weblayer.NavigationController;
import org.chromium.weblayer.shell.InstrumentationActivity; import org.chromium.weblayer.shell.InstrumentationActivity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
...@@ -50,15 +51,12 @@ public class NavigationTest { ...@@ -50,15 +51,12 @@ public class NavigationTest {
public static class NavigationCallbackHelper extends CallbackHelper { public static class NavigationCallbackHelper extends CallbackHelper {
private Uri mUri; private Uri mUri;
private boolean mIsSameDocument; private boolean mIsSameDocument;
private List<Uri> mRedirectChain;
public void notifyCalled(Uri uri) { public void notifyCalled(Navigation navigation) {
mUri = uri; mUri = navigation.getUri();
notifyCalled(); mIsSameDocument = navigation.isSameDocument();
} mRedirectChain = navigation.getRedirectChain();
public void notifyCalled(Uri uri, boolean isSameDocument) {
mUri = uri;
mIsSameDocument = isSameDocument;
notifyCalled(); notifyCalled();
} }
...@@ -73,6 +71,12 @@ public class NavigationTest { ...@@ -73,6 +71,12 @@ public class NavigationTest {
assertEquals(mUri.toString(), uri); assertEquals(mUri.toString(), uri);
assertEquals(mIsSameDocument, isSameDocument); assertEquals(mIsSameDocument, isSameDocument);
} }
public void assertCalledWith(int currentCallCount, List<Uri> redirectChain)
throws TimeoutException {
waitForCallback(currentCallCount);
assertEquals(mRedirectChain, redirectChain);
}
} }
public static class NavigationCallbackValueRecorder { public static class NavigationCallbackValueRecorder {
...@@ -101,8 +105,10 @@ public class NavigationTest { ...@@ -101,8 +105,10 @@ public class NavigationTest {
} }
public NavigationCallbackHelper onStartedCallback = new NavigationCallbackHelper(); public NavigationCallbackHelper onStartedCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onRedirectedCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onReadyToCommitCallback = new NavigationCallbackHelper(); public NavigationCallbackHelper onReadyToCommitCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onCompletedCallback = new NavigationCallbackHelper(); public NavigationCallbackHelper onCompletedCallback = new NavigationCallbackHelper();
public NavigationCallbackHelper onFailedCallback = new NavigationCallbackHelper();
public NavigationCallbackValueRecorder loadStateChangedCallback = public NavigationCallbackValueRecorder loadStateChangedCallback =
new NavigationCallbackValueRecorder(); new NavigationCallbackValueRecorder();
public NavigationCallbackValueRecorder loadProgressChangedCallback = public NavigationCallbackValueRecorder loadProgressChangedCallback =
...@@ -111,17 +117,27 @@ public class NavigationTest { ...@@ -111,17 +117,27 @@ public class NavigationTest {
@Override @Override
public void onNavigationStarted(Navigation navigation) { public void onNavigationStarted(Navigation navigation) {
onStartedCallback.notifyCalled(navigation.getUri()); onStartedCallback.notifyCalled(navigation);
}
@Override
public void onNavigationRedirected(Navigation navigation) {
onRedirectedCallback.notifyCalled(navigation);
} }
@Override @Override
public void onReadyToCommitNavigation(Navigation navigation) { public void onReadyToCommitNavigation(Navigation navigation) {
onReadyToCommitCallback.notifyCalled(navigation.getUri()); onReadyToCommitCallback.notifyCalled(navigation);
} }
@Override @Override
public void onNavigationCompleted(Navigation navigation) { public void onNavigationCompleted(Navigation navigation) {
onCompletedCallback.notifyCalled(navigation.getUri(), navigation.isSameDocument()); onCompletedCallback.notifyCalled(navigation);
}
@Override
public void onNavigationFailed(Navigation navigation) {
onFailedCallback.notifyCalled(navigation);
} }
@Override @Override
...@@ -248,6 +264,83 @@ public class NavigationTest { ...@@ -248,6 +264,83 @@ public class NavigationTest {
curCompletedCount, "data:text,foo#bar", true); 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) { private void setNavigationCallback(InstrumentationActivity activity) {
runOnUiThreadBlocking( 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