| Index: chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
|
| index 7961f36b03d7f52943ff01c9a22d99e2948fda6b..b8172538e5a61e6a8796f4434b5988794e32bf61 100644
|
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
|
| @@ -32,7 +32,6 @@ 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.JavaScriptUtils;
|
| -import org.chromium.content_public.browser.WebContents;
|
|
|
| import java.util.List;
|
| import java.util.concurrent.TimeoutException;
|
| @@ -69,6 +68,7 @@ public class PushMessagingTest
|
| }
|
| });
|
| mPushTestPage = getTestServer().getURL(PUSH_TEST_PAGE);
|
| + loadUrl(mPushTestPage);
|
| }
|
|
|
| @Override
|
| @@ -89,37 +89,98 @@ public class PushMessagingTest
|
| }
|
|
|
| /**
|
| - * Verifies that PushManager.subscribe() requests permission successfully.
|
| + * Verifies that PushManager.subscribe() fails if Notifications permission was already denied.
|
| */
|
| @MediumTest
|
| @Feature({"Browser", "PushMessaging"})
|
| - public void testPushPermissionInfobar() throws InterruptedException, TimeoutException {
|
| + public void testNotificationsPermissionDenied() throws InterruptedException, TimeoutException {
|
| + // Deny Notifications permission before trying to subscribe Push.
|
| + setNotificationContentSettingForCurrentOrigin(ContentSetting.BLOCK);
|
| + assertEquals("\"denied\"", runScriptBlocking("Notification.permission"));
|
| +
|
| + // Reload page to ensure the block is persisted.
|
| loadUrl(mPushTestPage);
|
| - WebContents webContents = getActivity().getActivityTab().getWebContents();
|
| +
|
| + // PushManager.subscribePush() should fail immediately without showing an infobar.
|
| + runScriptAndWaitForTitle("subscribePush()",
|
| + "subscribe fail: NotAllowedError: Registration failed - permission denied");
|
| assertEquals(0, getInfoBars().size());
|
|
|
| - // Notifications permission should not yet be granted.
|
| - assertEquals("\"default\"", JavaScriptUtils.executeJavaScriptAndWaitForResult(
|
| - webContents, "Notification.permission"));
|
| + // Notifications permission should still be denied.
|
| + assertEquals("\"denied\"", runScriptBlocking("Notification.permission"));
|
| + }
|
| +
|
| + /**
|
| + * Verifies that PushManager.subscribe() fails if permission is dismissed or blocked.
|
| + */
|
| + @MediumTest
|
| + @Feature({"Browser", "PushMessaging"})
|
| + public void testPushPermissionDenied() throws InterruptedException, TimeoutException {
|
| + // Notifications permission should initially be prompt.
|
| + assertEquals("\"default\"", runScriptBlocking("Notification.permission"));
|
|
|
| // PushManager.subscribePush() should show the notifications infobar.
|
| - JavaScriptUtils.executeJavaScript(webContents, "subscribePush()");
|
| - CriteriaHelper.pollUiThread(new Criteria() {
|
| - @Override
|
| - public boolean isSatisfied() {
|
| - return !getInfoBars().isEmpty();
|
| - }
|
| - });
|
| - List<InfoBar> infoBars = getInfoBars();
|
| - assertEquals(1, infoBars.size());
|
| + assertEquals(0, getInfoBars().size());
|
| + runScript("subscribePush()");
|
| + InfoBar infoBar = getInfobarBlocking();
|
| +
|
| + // Dismissing the infobar should cause subscribe() to fail.
|
| + assertTrue(InfoBarUtil.clickCloseButton(infoBar));
|
| + waitForInfobarToClose();
|
| + waitForTitle(getActivity().getActivityTab(),
|
| + "subscribe fail: NotAllowedError: Registration failed - permission denied");
|
| +
|
| + // Notifications permission should still be prompt.
|
| + assertEquals("\"default\"", runScriptBlocking("Notification.permission"));
|
| +
|
| + runScriptAndWaitForTitle("sendToTest('reset title')", "reset title");
|
| +
|
| + // PushManager.subscribePush() should show the notifications infobar again.
|
| + runScript("subscribePush()");
|
| + infoBar = getInfobarBlocking();
|
| +
|
| + // Denying the infobar should cause subscribe() to fail.
|
| + assertTrue(InfoBarUtil.clickSecondaryButton(infoBar));
|
| + waitForInfobarToClose();
|
| + waitForTitle(getActivity().getActivityTab(),
|
| + "subscribe fail: NotAllowedError: Registration failed - permission denied");
|
| +
|
| + // This should have caused notifications permission to become denied.
|
| + assertEquals("\"denied\"", runScriptBlocking("Notification.permission"));
|
| +
|
| + // Reload page to ensure the block is persisted.
|
| + loadUrl(mPushTestPage);
|
| +
|
| + // PushManager.subscribePush() should now fail immediately without showing an infobar.
|
| + runScriptAndWaitForTitle("subscribePush()",
|
| + "subscribe fail: NotAllowedError: Registration failed - permission denied");
|
| + assertEquals(0, getInfoBars().size());
|
| +
|
| + // Notifications permission should still be denied.
|
| + assertEquals("\"denied\"", runScriptBlocking("Notification.permission"));
|
| + }
|
| +
|
| + /**
|
| + * Verifies that PushManager.subscribe() requests permission correctly.
|
| + */
|
| + @MediumTest
|
| + @Feature({"Browser", "PushMessaging"})
|
| + public void testPushPermissionGranted() throws InterruptedException, TimeoutException {
|
| + // Notifications permission should initially be prompt.
|
| + assertEquals("\"default\"", runScriptBlocking("Notification.permission"));
|
| +
|
| + // PushManager.subscribePush() should show the notifications infobar.
|
| + assertEquals(0, getInfoBars().size());
|
| + runScript("subscribePush()");
|
| + InfoBar infoBar = getInfobarBlocking();
|
|
|
| // Accepting the infobar should cause subscribe() to succeed.
|
| - assertTrue(InfoBarUtil.clickPrimaryButton(infoBars.get(0)));
|
| + assertTrue(InfoBarUtil.clickPrimaryButton(infoBar));
|
| + waitForInfobarToClose();
|
| waitForTitle(getActivity().getActivityTab(), "subscribe ok");
|
|
|
| // This should have caused notifications permission to become granted.
|
| - assertEquals("\"granted\"", JavaScriptUtils.executeJavaScriptAndWaitForResult(
|
| - webContents, "Notification.permission"));
|
| + assertEquals("\"granted\"", runScriptBlocking("Notification.permission"));
|
| }
|
|
|
| /**
|
| @@ -128,7 +189,6 @@ public class PushMessagingTest
|
| @MediumTest
|
| @Feature({"Browser", "PushMessaging"})
|
| public void testPushAndShowNotification() throws InterruptedException, TimeoutException {
|
| - loadUrl(mPushTestPage);
|
| setNotificationContentSettingForCurrentOrigin(ContentSetting.ALLOW);
|
| runScriptAndWaitForTitle("subscribePush()", "subscribe ok");
|
|
|
| @@ -147,8 +207,7 @@ public class PushMessagingTest
|
| @LargeTest
|
| @Feature({"Browser", "PushMessaging"})
|
| public void testDefaultNotification() throws InterruptedException, TimeoutException {
|
| - // Load the push test page into the first tab.
|
| - loadUrl(mPushTestPage);
|
| + // Start off using the tab loaded in setUp().
|
| assertEquals(1, getActivity().getCurrentTabModel().getCount());
|
| Tab tab = getActivity().getActivityTab();
|
| assertEquals(mPushTestPage, tab.getUrl());
|
| @@ -187,6 +246,21 @@ public class PushMessagingTest
|
| }
|
|
|
| /**
|
| + * Runs {@code script} in the current tab but does not wait for the result.
|
| + */
|
| + private void runScript(String script) {
|
| + JavaScriptUtils.executeJavaScript(getActivity().getActivityTab().getWebContents(), script);
|
| + }
|
| +
|
| + /**
|
| + * Runs {@code script} in the current tab and returns its synchronous result in JSON format.
|
| + */
|
| + private String runScriptBlocking(String script) throws InterruptedException, TimeoutException {
|
| + return JavaScriptUtils.executeJavaScriptAndWaitForResult(
|
| + getActivity().getActivityTab().getWebContents(), script);
|
| + }
|
| +
|
| + /**
|
| * Runs {@code script} in the current tab and waits for the tab title to change to
|
| * {@code expectedTitle}.
|
| */
|
| @@ -234,4 +308,26 @@ public class PushMessagingTest
|
| assertEquals(expectedTitle, tab.getTitle());
|
| }
|
| }
|
| +
|
| + private InfoBar getInfobarBlocking() throws InterruptedException {
|
| + CriteriaHelper.pollUiThread(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return !getInfoBars().isEmpty();
|
| + }
|
| + });
|
| + List<InfoBar> infoBars = getInfoBars();
|
| + assertEquals(1, infoBars.size());
|
| + return infoBars.get(0);
|
| + }
|
| +
|
| + private void waitForInfobarToClose() throws InterruptedException {
|
| + CriteriaHelper.pollUiThread(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return getInfoBars().isEmpty();
|
| + }
|
| + });
|
| + assertEquals(0, getInfoBars().size());
|
| + }
|
| }
|
|
|