Commit 95d79560 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

content: fix GestureListenerManagerTest

This test is still mildly flaky. The issue is that while it waits
for a non-empty paint, this is not always enough. This makes the
test additionally wait for loading to complete and more importantly,
waits for a visual update. The latter is a good signal the renderer
will actually process events.

BUG=1091129
TEST=test only change

Change-Id: Iabc6d2dce83985086c56db916c8cc273e3ed65f7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2303554Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789280}
parent 2dea4ffb
......@@ -21,6 +21,7 @@ import org.chromium.content_public.browser.GestureListenerManager;
import org.chromium.content_public.browser.GestureStateListenerWithScroll;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.test.RenderFrameHostTestExt;
import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.browser.test.util.TouchCommon;
......@@ -90,10 +91,25 @@ public class GestureListenerManagerTest {
// This needs to wait for first-paint, otherwise scrolling doesn't happen.
TestCallbackHelperContainer callbackHelperContainer =
new TestCallbackHelperContainer(webContents);
CallbackHelper done = callbackHelperContainer.getOnFirstVisuallyNonEmptyPaintHelper();
mActivityTestRule.loadUrl(webContents.getNavigationController(), callbackHelperContainer,
new LoadUrlParams(TEST_URL));
done.waitForCallback(0);
// Wait for both a paint and the page to finish loading. These may come in any order.
callbackHelperContainer.getOnFirstVisuallyNonEmptyPaintHelper().waitForCallback(0);
callbackHelperContainer.getOnPageFinishedHelper().waitForCallback(0);
// At this point the page has finished loading and a non-empty paint occurred. This does not
// mean the renderer is fully ready to process events (processing events requires layers,
// which may not have been created yet). Wait for a visual update, which should ensure the
// renderer is ready.
CallbackHelper callbackHelper = new CallbackHelper();
TestThreadUtils.runOnUiThreadBlocking(() -> {
new RenderFrameHostTestExt(webContents.getMainFrame())
.updateVisualState((Boolean result) -> {
Assert.assertTrue(result);
callbackHelper.notifyCalled();
});
});
callbackHelper.waitForFirst();
final GestureStateListenerImpl listener = new GestureStateListenerImpl();
TestThreadUtils.runOnUiThreadBlocking(() -> {
......
......@@ -31,7 +31,13 @@ public class RenderFrameHostTestExt {
nativeExecuteJavaScript(mNativeRenderFrameHostTestExt, script, callback);
}
public void updateVisualState(Callback<Boolean> callback) {
nativeUpdateVisualState(mNativeRenderFrameHostTestExt, callback);
}
private native long nativeInit(long renderFrameHostAndroidPtr);
private native void nativeExecuteJavaScript(
long nativeRenderFrameHostTestExt, String script, Callback<String> callback);
private native void nativeUpdateVisualState(
long nativeRenderFrameHostTestExt, Callback<Boolean> callback);
}
......@@ -61,4 +61,14 @@ void RenderFrameHostTestExt::ExecuteJavaScript(
render_frame_host_->ExecuteJavaScriptForTests(script, std::move(callback));
}
void RenderFrameHostTestExt::UpdateVisualState(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& jcallback) {
auto result_callback = base::BindOnce(
&base::android::RunBooleanCallbackAndroid,
base::android::ScopedJavaGlobalRef<jobject>(env, jcallback));
render_frame_host_->InsertVisualStateCallback(std::move(result_callback));
}
} // namespace content
......@@ -22,6 +22,11 @@ class RenderFrameHostTestExt : public base::SupportsUserData::Data {
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jscript,
const base::android::JavaParamRef<jobject>& jcallback);
// This calls InsertVisualStateCallback(). See it for details on the return
// value.
void UpdateVisualState(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& jcallback);
private:
RenderFrameHostImpl* const render_frame_host_;
......
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