Skip to content

Commit

Permalink
Revert of Test PostMessage to popup window (patchset chromium#7 id:11…
Browse files Browse the repository at this point in the history
…0001 of https://codereview.chromium.org/964753002/)

Reason for revert:
This landed soon after https://crrev.com/65b9392697befefd009dbe73d75dfe66894d814c which changed the signature of setWebEventHandler

As a result, it broke the linux build bot.
http://build.chromium.org/p/chromium.linux/builders/Android%20Arm64%20Builder%20%28dbg%29/builds/10739

Original issue's description:
> Test PostMessage to popup window
>
> BUG=460998
>
> Committed: https://crrev.com/51c1620185396384cfe6e2f4e3359e57c6431600
> Cr-Commit-Position: refs/heads/master@{#318591}

TBR=sgurun@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=460998

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

Cr-Commit-Position: refs/heads/master@{#318592}
  • Loading branch information
hush authored and Commit bot committed Feb 28, 2015
1 parent 51c1620 commit f3b2cc7
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 153 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@
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;
Expand Down Expand Up @@ -511,59 +509,4 @@ public Boolean call() throws Exception {
});
}

/**
* 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@
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.
*/
Expand All @@ -21,6 +25,9 @@ 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";
Expand All @@ -42,22 +49,67 @@ public void tearDown() throws Exception {
super.tearDown();
}

@SmallTest
@Feature({"AndroidWebView"})
public void testPopupWindow() throws Throwable {
private void triggerPopup() throws Throwable {
enableJavaScriptOnUiThread(mParentContents);
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mParentContents.getSettings().setSupportMultipleWindows(true);
mParentContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
}
});

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>");

+ "}</script>"
+ "<a class=\"full_view\" onclick=\"tryOpenWindow();\">Click me!</a>");
final String popupPageHtml = CommonResources.makeHtmlPageFrom(
"<title>" + POPUP_TITLE + "</title>",
"This is a popup window");

triggerPopup(mParentContents, mParentContentsClient, mWebServer, parentPageHtml,
popupPageHtml, "/popup.html", "tryOpenWindow()");
AwContents popupContents = connectPendingPopup(mParentContents);
assertEquals(POPUP_TITLE, getTitleOnUiThread(popupContents));
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));
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -763,90 +763,4 @@ public void run() {
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);
}
});
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);
}
});
mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(),
new MessagePort[] {channel[1]});
channel[0].postMessage(HELLO, null);
}
});
channelContainer.waitForMessage();
assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
}
}

0 comments on commit f3b2cc7

Please sign in to comment.