Commit 57091c19 authored by Shimi Zhang's avatar Shimi Zhang Committed by Commit Bot

[JJI] Don't use evaluateJavascript() to validate test

Event listeners for the injected JS object are different
from evaluateJavascript() in a way that evaluateJavascript()
will execute the JavaScript immediately when it reaches to
the renderer, however JJI's event listener posted to the event
loop asynchronously. So we can't expect that a listener is
executed before evaluateJavascript().

This CL changed the validation to relying on the async call
of the listeners instead of using evaluateJavascript().

Bug: 1015023
Test: Run both tests locally 1000 times, didn't see any failure.

Change-Id: I1434b43f5dbc7f2700580c9c053453f5d20398c3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1894248
Commit-Queue: Shimi Zhang <ctzsm@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Reviewed-by: default avatarChangwan Ryu <changwan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#712345}
parent 9dd5ecdc
......@@ -662,20 +662,12 @@ public class JsJavaInteractionTest {
// Listener for myObject.
final String listener1 = "function (event) {"
+ " if (window.listenerResult1) {"
+ " window.listenerResult1 += event.data;"
+ " } else {"
+ " window.listenerResult1 = event.data;"
+ " }"
+ " " + JS_OBJECT_NAME + ".postMessage('ack1' + event.data);"
+ "}";
// Listener for myObject2.
final String listener2 = "function (event) {"
+ " if (window.listenerResult2) {"
+ " window.listenerResult2 += event.data;"
+ " } else {"
+ " window.listenerResult2 = event.data;"
+ " }"
+ " " + JS_OBJECT_NAME_2 + ".postMessage('ack2' + event.data);"
+ "}";
// Add two different js objects.
......@@ -693,19 +685,16 @@ public class JsJavaInteractionTest {
Assert.assertEquals(message, data2.mMessage);
final String hello1 = "hello1";
final String hello2 = "hello2";
// Targeting myObject.
data.mReplyProxy.postMessage(hello1);
data.mReplyProxy.postMessage(HELLO);
// Targeting myObject2.
data2.mReplyProxy.postMessage(hello2);
data2.mReplyProxy.postMessage(HELLO);
TestWebMessageListener.Data replyData1 = mListener.waitForOnPostMessage();
TestWebMessageListener.Data replyData2 = webMessageListener2.waitForOnPostMessage();
Assert.assertEquals(hello1,
getJsObjectValue(
"window.listenerResult1", mActivityTestRule, mAwContents, mContentsClient));
Assert.assertEquals(hello2,
getJsObjectValue(
"window.listenerResult2", mActivityTestRule, mAwContents, mContentsClient));
Assert.assertEquals("ack1" + HELLO, replyData1.mMessage);
Assert.assertEquals("ack2" + HELLO, replyData2.mMessage);
Assert.assertTrue(mListener.hasNoMoreOnPostMessage());
Assert.assertTrue(webMessageListener2.hasNoMoreOnPostMessage());
......@@ -751,19 +740,21 @@ public class JsJavaInteractionTest {
JsReplyProxy proxy = mListener.waitForOnPostMessage().mReplyProxy;
final String listener1 = "function (event) {"
+ " if (window.listenerResult1) {"
+ " window.listenerResult1 += event.data;"
+ " if (window.receivedCount1) {"
+ " window.receivedCount1++;"
+ " } else {"
+ " window.listenerResult1 = event.data;"
+ " window.receivedCount1 = 1;"
+ " }"
+ " " + JS_OBJECT_NAME + ".postMessage('ack1:' + window.receivedCount1);"
+ "}";
final String listener2 = "function (event) {"
+ " if (window.listenerResult2) {"
+ " window.listenerResult2 += event.data;"
+ " if (window.receivedCount2) {"
+ " window.receivedCount2++;"
+ " } else {"
+ " window.listenerResult2 = event.data;"
+ " window.receivedCount2 = 1;"
+ " }"
+ " " + JS_OBJECT_NAME + ".postMessage('ack2:' + window.receivedCount2);"
+ "}";
addEventListener(listener1, "listener1", JS_OBJECT_NAME, mActivityTestRule, mAwContents,
......@@ -772,30 +763,26 @@ public class JsJavaInteractionTest {
mContentsClient);
// Post message to test both listeners receive message.
final String message = "testListener";
proxy.postMessage(message);
proxy.postMessage(HELLO);
TestWebMessageListener.Data replyData1 = mListener.waitForOnPostMessage();
TestWebMessageListener.Data replyData2 = mListener.waitForOnPostMessage();
Assert.assertEquals(message,
getJsObjectValue(
"window.listenerResult1", mActivityTestRule, mAwContents, mContentsClient));
Assert.assertEquals(message,
getJsObjectValue(
"window.listenerResult2", mActivityTestRule, mAwContents, mContentsClient));
Assert.assertEquals("ack1:1", replyData1.mMessage);
Assert.assertEquals("ack2:1", replyData2.mMessage);
removeEventListener(
"listener2", JS_OBJECT_NAME, mActivityTestRule, mAwContents, mContentsClient);
// Post message again to test if remove works.
proxy.postMessage(message);
proxy.postMessage(HELLO);
// listener 1 should add message again.
Assert.assertEquals(message + message,
getJsObjectValue(
"window.listenerResult1", mActivityTestRule, mAwContents, mContentsClient));
// listener 2 result should remain the same.
Assert.assertEquals(message,
getJsObjectValue(
"window.listenerResult2", mActivityTestRule, mAwContents, mContentsClient));
TestWebMessageListener.Data replyData3 = mListener.waitForOnPostMessage();
Assert.assertEquals("ack1:2", replyData3.mMessage);
// Should be no more messages.
Assert.assertTrue(mListener.hasNoMoreOnPostMessage());
}
@Test
......@@ -925,13 +912,6 @@ public class JsJavaInteractionTest {
rule.executeJavaScriptAndWaitForResult(awContents, contentsClient, code);
}
private static String getJsObjectValue(final String jsObjectName, final AwActivityTestRule rule,
final AwContents awContents, final TestAwContentsClient contentsClient)
throws Throwable {
return rule.maybeStripDoubleQuotes(
rule.executeJavaScriptAndWaitForResult(awContents, contentsClient, jsObjectName));
}
private static String parseOrigin(String url) {
final Uri uri = Uri.parse(url);
final StringBuilder sb = new StringBuilder();
......
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