Commit d4f192eb authored by hush's avatar hush Committed by Commit bot

Test PostMessage to popup window

BUG=460998

Committed: https://crrev.com/51c1620185396384cfe6e2f4e3359e57c6431600
Cr-Commit-Position: refs/heads/master@{#318591}

Review URL: https://codereview.chromium.org/964753002

Cr-Commit-Position: refs/heads/master@{#318721}
parent 969bce86
......@@ -21,7 +21,9 @@ import org.chromium.base.test.util.InMemorySharedPreferences;
import org.chromium.content.browser.test.util.CallbackHelper;
import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.net.test.util.TestWebServer;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
......@@ -509,4 +511,59 @@ public class AwTestBase
});
}
/**
* Loads the main html then triggers the popup window.
*/
public void triggerPopup(final AwContents parentAwContents,
TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer,
String mainHtml, String popupHtml, String popupPath, String triggerScript)
throws Exception {
enableJavaScriptOnUiThread(parentAwContents);
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
parentAwContents.getSettings().setSupportMultipleWindows(true);
parentAwContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
}
});
final String parentUrl = testWebServer.setResponse("/popupParent.html", mainHtml, null);
testWebServer.setResponse(popupPath, popupHtml, null);
parentAwContentsClient.getOnCreateWindowHelper().setReturnValue(true);
loadUrlSync(parentAwContents, parentAwContentsClient.getOnPageFinishedHelper(), parentUrl);
TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper =
parentAwContentsClient.getOnCreateWindowHelper();
int currentCallCount = onCreateWindowHelper.getCallCount();
parentAwContents.evaluateJavaScript(triggerScript, null);
onCreateWindowHelper.waitForCallback(
currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
}
/**
* Supplies the popup window with AwContents then waits for the popup window to finish loading.
*/
public AwContents connectPendingPopup(final AwContents parentAwContents) throws Exception {
TestAwContentsClient popupContentsClient;
AwTestContainerView popupContainerView;
final AwContents popupContents;
popupContentsClient = new TestAwContentsClient();
popupContainerView = createAwTestContainerViewOnMainSync(popupContentsClient);
popupContents = popupContainerView.getAwContents();
enableJavaScriptOnUiThread(popupContents);
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
parentAwContents.supplyContentsForPopup(popupContents);
}
});
OnPageFinishedHelper onPageFinishedHelper = popupContentsClient.getOnPageFinishedHelper();
int callCount = onPageFinishedHelper.getCallCount();
onPageFinishedHelper.waitForCallback(callCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
return popupContents;
}
}
......@@ -8,15 +8,11 @@ import android.os.Build;
import android.test.suitebuilder.annotation.SmallTest;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.test.util.AwTestTouchUtils;
import org.chromium.android_webview.test.util.CommonResources;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.net.test.util.TestWebServer;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
/**
* Tests for pop up window flow.
*/
......@@ -25,9 +21,6 @@ public class PopupWindowTest extends AwTestBase {
private TestAwContentsClient mParentContentsClient;
private AwTestContainerView mParentContainerView;
private AwContents mParentContents;
private TestAwContentsClient mPopupContentsClient;
private AwTestContainerView mPopupContainerView;
private AwContents mPopupContents;
private TestWebServer mWebServer;
private static final String POPUP_TITLE = "Popup Window";
......@@ -49,67 +42,22 @@ public class PopupWindowTest extends AwTestBase {
super.tearDown();
}
private void triggerPopup() throws Throwable {
enableJavaScriptOnUiThread(mParentContents);
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mParentContents.getSettings().setSupportMultipleWindows(true);
mParentContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
}
});
@SmallTest
@Feature({"AndroidWebView"})
public void testPopupWindow() throws Throwable {
final String popupPath = "/popup.html";
final String parentPageHtml = CommonResources.makeHtmlPageFrom("",
"<script>"
final String parentPageHtml = CommonResources.makeHtmlPageFrom("", "<script>"
+ "function tryOpenWindow() {"
+ " var newWindow = window.open('" + popupPath + "');"
+ "}</script>"
+ "<a class=\"full_view\" onclick=\"tryOpenWindow();\">Click me!</a>");
+ "}</script>");
final String popupPageHtml = CommonResources.makeHtmlPageFrom(
"<title>" + POPUP_TITLE + "</title>",
"This is a popup window");
final String parentUrl = mWebServer.setResponse("/popupParent.html", parentPageHtml, null);
mWebServer.setResponse(popupPath, popupPageHtml, null);
mParentContentsClient.getOnCreateWindowHelper().setReturnValue(true);
loadUrlSync(mParentContents,
mParentContentsClient.getOnPageFinishedHelper(),
parentUrl);
TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper =
mParentContentsClient.getOnCreateWindowHelper();
int currentCallCount = onCreateWindowHelper.getCallCount();
AwTestTouchUtils.simulateTouchCenterOfView(mParentContainerView);
onCreateWindowHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
TimeUnit.MILLISECONDS);
}
private void connectPendingPopup() throws Exception {
mPopupContentsClient = new TestAwContentsClient();
mPopupContainerView = createAwTestContainerViewOnMainSync(mPopupContentsClient);
mPopupContents = mPopupContainerView.getAwContents();
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mParentContents.supplyContentsForPopup(mPopupContents);
}
});
}
@SmallTest
@Feature({"AndroidWebView"})
public void testPopupWindow() throws Throwable {
triggerPopup();
connectPendingPopup();
poll(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return POPUP_TITLE.equals(getTitleOnUiThread(mPopupContents));
}
});
triggerPopup(mParentContents, mParentContentsClient, mWebServer, parentPageHtml,
popupPageHtml, "/popup.html", "tryOpenWindow()");
AwContents popupContents = connectPendingPopup(mParentContents);
assertEquals(POPUP_TITLE, getTitleOnUiThread(popupContents));
}
}
......@@ -763,4 +763,90 @@ public class PostMessageTest extends AwTestBase {
mMessageObject.waitForMessage();
assertEquals(WORKER_MESSAGE, mMessageObject.getData());
}
private static final String POPUP_MESSAGE = "from_popup";
private static final String POPUP_URL = "/popup.html";
private static final String IFRAME_URL = "/iframe.html";
private static final String MAIN_PAGE_FOR_POPUP_TEST = "<!DOCTYPE html><html>"
+ "<head>"
+ " <script>"
+ " function createPopup() {"
+ " var popupWindow = window.open('" + POPUP_URL + "');"
+ " onmessage = function(e) {"
+ " popupWindow.postMessage(e.data, '*', e.ports);"
+ " };"
+ " }"
+ " </script>"
+ "</head>"
+ "</html>";
// Sends message and ports to the iframe.
private static final String POPUP_PAGE_WITH_IFRAME = "<!DOCTYPE html><html>"
+ "<script>"
+ " onmessage = function(e) {"
+ " var iframe = document.getElementsByTagName('iframe')[0];"
+ " iframe.contentWindow.postMessage('" + POPUP_MESSAGE + "', '*', e.ports);"
+ " };"
+ "</script>"
+ "<body><iframe src='" + IFRAME_URL + "'></iframe></body>"
+ "</html>";
// Test if WebView can post a message from/to a popup window owning a message port.
@SmallTest
@Feature({"AndroidWebView", "Android-PostMessage"})
public void testPostMessageToPopup() throws Throwable {
triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POPUP_TEST, ECHO_PAGE,
POPUP_URL, "createPopup()");
connectPendingPopup(mAwContents);
final ChannelContainer channelContainer = new ChannelContainer();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
MessagePort[] channel = mAwContents.createMessageChannel();
channelContainer.set(channel);
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() {
@Override
public void onMessage(String message) {
channelContainer.setMessage(message);
}
}, null);
mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(),
new MessagePort[] {channel[1]});
channel[0].postMessage(HELLO, null);
}
});
channelContainer.waitForMessage();
assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
}
// Test if WebView can post a message from/to an iframe in a popup window.
@SmallTest
@Feature({"AndroidWebView", "Android-PostMessage"})
public void testPostMessageToIframeInsidePopup() throws Throwable {
mWebServer.setResponse(IFRAME_URL, ECHO_PAGE, null);
triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POPUP_TEST,
POPUP_PAGE_WITH_IFRAME, POPUP_URL, "createPopup()");
connectPendingPopup(mAwContents);
final ChannelContainer channelContainer = new ChannelContainer();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
MessagePort[] channel = mAwContents.createMessageChannel();
channelContainer.set(channel);
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() {
@Override
public void onMessage(String message) {
channelContainer.setMessage(message);
}
}, null);
mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(),
new MessagePort[] {channel[1]});
channel[0].postMessage(HELLO, null);
}
});
channelContainer.waitForMessage();
assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
}
}
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