Index: chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java |
index 5845ad57a3d9533996df0b4dfee0ab5758dcdade..a105310bfa3d8405fbf8012937788266ce394da7 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java |
@@ -21,6 +21,7 @@ import org.junit.runner.RunWith; |
import org.chromium.base.ApplicationStatus; |
import org.chromium.base.ContextUtils; |
+import org.chromium.base.ThreadUtils; |
import org.chromium.base.test.util.CommandLineFlags; |
import org.chromium.base.test.util.Feature; |
import org.chromium.base.test.util.RetryOnFailure; |
@@ -35,9 +36,13 @@ import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.chrome.browser.tab.TabIdManager; |
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; |
import org.chromium.chrome.test.MultiActivityTestRule; |
+import org.chromium.chrome.test.util.ActivityUtils; |
import org.chromium.chrome.test.util.ApplicationTestUtils; |
+import org.chromium.chrome.test.util.browser.TabLoadObserver; |
import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.content.browser.test.util.JavaScriptUtils; |
+import org.chromium.content.browser.test.util.TouchCommon; |
import org.chromium.content_public.common.ScreenOrientationValues; |
import org.chromium.net.test.EmbeddedTestServer; |
@@ -267,6 +272,77 @@ public class WebappModeTest { |
}); |
} |
+ /** |
+ * Tests that WebappActivities handle window.open() properly in tabbed mode. |
+ */ |
+ @Test |
+ @MediumTest |
+ @Feature({"Webapps"}) |
+ public void testWebappHandlesWindowOpenInTabbedMode() throws Exception { |
+ triggerWindowOpenAndWaitForLoad(ChromeTabbedActivity.class, getOnClickLinkUrl(), true); |
+ } |
+ |
+ /** |
+ * Tests that WebappActivities handle suppressed window.open() properly in tabbed mode. |
+ */ |
+ @Test |
+ @MediumTest |
+ @Feature({"Webapps"}) |
+ public void testWebappHandlesSuppressedWindowOpenInTabbedMode() throws Exception { |
+ triggerWindowOpenAndWaitForLoad( |
+ ChromeTabbedActivity.class, getHrefNoReferrerLinkUrl(), false); |
+ } |
+ |
+ private <T extends ChromeActivity> void triggerWindowOpenAndWaitForLoad( |
+ Class<T> classToWaitFor, String linkHtml, boolean checkContents) throws Exception { |
+ final WebappActivity firstActivity = |
+ startWebappActivity(WEBAPP_1_ID, WEBAPP_1_URL, WEBAPP_1_TITLE, WEBAPP_ICON); |
+ final int firstWebappId = firstActivity.getActivityTab().getId(); |
+ |
+ // Load up the test page. |
+ new TabLoadObserver(firstActivity.getActivityTab()).fullyLoadUrl(linkHtml); |
+ |
+ // Do a plain click to make the link open in the main browser via a window.open(). |
+ // If the window is opened successfully, javascript on the first page triggers and changes |
+ // its URL as a signal for this test. |
+ Runnable fgTrigger = new Runnable() { |
+ @Override |
+ public void run() { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ View view = firstActivity.findViewById(android.R.id.content).getRootView(); |
+ TouchCommon.singleClickView(view); |
+ } |
+ }); |
+ } |
+ }; |
+ ChromeActivity secondActivity = ActivityUtils.waitForActivity( |
+ InstrumentationRegistry.getInstrumentation(), classToWaitFor, fgTrigger); |
+ mTestRule.waitForFullLoad(secondActivity, "The Google"); |
+ if (checkContents) { |
+ Assert.assertEquals("New WebContents was not created", "SUCCESS", |
+ firstActivity.getActivityTab().getTitle()); |
+ } |
+ Assert.assertNotSame("Wrong Activity in foreground", firstActivity, |
+ ApplicationStatus.getLastTrackedFocusedActivity()); |
+ |
+ // Close the child window to kick the user back to the WebappActivity. |
+ JavaScriptUtils.executeJavaScript( |
+ secondActivity.getActivityTab().getWebContents(), "window.close()"); |
+ CriteriaHelper.pollUiThread(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ Activity lastActivity = ApplicationStatus.getLastTrackedFocusedActivity(); |
+ if (!isWebappActivityReady(lastActivity)) return false; |
+ |
+ WebappActivity webappActivity = (WebappActivity) lastActivity; |
+ return webappActivity.getActivityTab().getId() == firstWebappId; |
+ } |
+ }); |
+ ApplicationTestUtils.waitUntilChromeInForeground(); |
+ } |
+ |
/** |
* Starts a WebappActivity for the given data and waits for it to be initialized. We can't use |
* ActivityUtils.waitForActivity() because of the way WebappActivity is instanced on pre-L |
@@ -296,4 +372,49 @@ public class WebappModeTest { |
return true; |
} |
+ |
+ /** Defines one gigantic link spanning the whole page that creates a new |
+ * window with chrome/test/data/android/google.html. Disallowing a referrer from being |
+ * sent triggers another codepath. |
+ */ |
+ private String getHrefNoReferrerLinkUrl() { |
+ return UrlUtils.encodeHtmlDataUri("<html>" |
+ + " <head>" |
+ + " <title>href no referrer link page</title>" |
+ + " <meta name='viewport'" |
+ + " content='width=device-width initial-scale=0.5, maximum-scale=0.5'>" |
+ + " <style>" |
+ + " body {margin: 0em;} div {width: 100%; height: 100%; background: #011684;}" |
+ + " </style>" |
+ + " </head>" |
+ + " <body>" |
+ + " <a href='" + mTestServer.getURL("/chrome/test/data/android/google.html") |
+ + "' target='_blank' rel='noreferrer'><div></div></a>" |
+ + " </body>"); |
+ } |
+ |
+ /** Returns a URL where clicking the body triggers a window.open() call to open |
+ * chrome/test/data/android/google.html. */ |
+ private String getOnClickLinkUrl() { |
+ return UrlUtils.encodeHtmlDataUri("<html>" |
+ + " <head>" |
+ + " <title>window.open page</title>" |
+ + " <meta name='viewport'" |
+ + " content='width=device-width initial-scale=0.5, maximum-scale=0.5'>" |
+ + " <style>" |
+ + " body {margin: 0em;} div {width: 100%; height: 100%; background: #011684;}" |
+ + " </style>" |
+ + " <script>" |
+ + " function openNewWindow() {" |
+ + " var site = window.open('" |
+ + mTestServer.getURL("/chrome/test/data/android/google.html") + "');" |
+ + " document.title = site ? 'SUCCESS' : 'FAILURE';" |
+ + " }" |
+ + " </script>" |
+ + " </head>" |
+ + " <body id='body'>" |
+ + " <div onclick='openNewWindow()'></div>" |
+ + " </body>" |
+ + "</html>"); |
+ } |
} |