Index: chrome/android/javatests/src/org/chromium/chrome/browser/test/ModalDialogTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/test/ModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/test/ModalDialogTest.java |
deleted file mode 100644 |
index 722d18f05954ccdc7828ab969ea1d050d90e9036..0000000000000000000000000000000000000000 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/test/ModalDialogTest.java |
+++ /dev/null |
@@ -1,415 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.chrome.browser.test; |
- |
-import android.app.AlertDialog; |
-import android.content.DialogInterface; |
-import android.test.suitebuilder.annotation.MediumTest; |
-import android.util.Log; |
-import android.view.View; |
-import android.widget.Button; |
-import android.widget.CheckBox; |
-import android.widget.EditText; |
- |
-import org.chromium.base.ThreadUtils; |
-import org.chromium.base.test.util.DisabledTest; |
-import org.chromium.base.test.util.Feature; |
-import org.chromium.base.test.util.UrlUtils; |
-import org.chromium.chrome.browser.JavascriptAppModalDialog; |
-import org.chromium.chrome.shell.ChromeShellTestBase; |
-import org.chromium.content.browser.test.util.Criteria; |
-import org.chromium.content.browser.test.util.CriteriaHelper; |
-import org.chromium.content.browser.test.util.TestCallbackHelperContainer; |
-import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper; |
- |
-import java.util.concurrent.Callable; |
-import java.util.concurrent.ExecutionException; |
-import java.util.concurrent.TimeoutException; |
- |
-/** |
- * Test suite for displaying and functioning of modal dialogs. |
- */ |
-public class ModalDialogTest extends ChromeShellTestBase { |
- private static final String TAG = "ModalDialogTest"; |
- private static final String EMPTY_PAGE = UrlUtils.encodeHtmlDataUri( |
- "<html><title>Modal Dialog Test</title><p>Testcase.</p></title></html>"); |
- private static final String BEFORE_UNLOAD_URL = UrlUtils.encodeHtmlDataUri("<html>" |
- + "<head><script>window.onbeforeunload=function() {" |
- + "return 'Are you sure?';" |
- + "};</script></head></html>"); |
- |
- @Override |
- public void setUp() throws Exception { |
- super.setUp(); |
- launchChromeShellWithUrl(EMPTY_PAGE); |
- assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading()); |
- } |
- |
- /** |
- * Verifies modal alert-dialog appearance and that JavaScript execution is |
- * able to continue after dismissal. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testAlertModalDialog() |
- throws InterruptedException, TimeoutException, ExecutionException { |
- final OnEvaluateJavaScriptResultHelper scriptEvent = |
- executeJavaScriptAndWaitForDialog("alert('Hello Android!');"); |
- |
- JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- clickOk(jsDialog); |
- assertTrue("JavaScript execution should continue after closing prompt.", |
- scriptEvent.waitUntilHasValue()); |
- } |
- |
- /** |
- * Verifies that clicking on a button twice doesn't crash. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testAlertModalDialogWithTwoClicks() |
- throws InterruptedException, TimeoutException, ExecutionException { |
- OnEvaluateJavaScriptResultHelper scriptEvent = |
- executeJavaScriptAndWaitForDialog("alert('Hello Android');"); |
- JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- clickOk(jsDialog); |
- clickOk(jsDialog); |
- |
- assertTrue("JavaScript execution should continue after closing prompt.", |
- scriptEvent.waitUntilHasValue()); |
- } |
- |
- /** |
- * Verifies that modal confirm-dialogs display, two buttons are visible and |
- * the return value of [Ok] equals true, [Cancel] equals false. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testConfirmModalDialog() |
- throws InterruptedException, TimeoutException, ExecutionException { |
- OnEvaluateJavaScriptResultHelper scriptEvent = |
- executeJavaScriptAndWaitForDialog("confirm('Android');"); |
- |
- JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- Button[] buttons = getAlertDialogButtons(jsDialog.getDialogForTest()); |
- assertNotNull("No cancel button in confirm dialog.", buttons[0]); |
- assertEquals("Cancel button is not visible.", View.VISIBLE, buttons[0].getVisibility()); |
- if (buttons[1] != null) { |
- assertNotSame("Neutral button visible when it should not.", |
- View.VISIBLE, buttons[1].getVisibility()); |
- } |
- assertNotNull("No OK button in confirm dialog.", buttons[2]); |
- assertEquals("OK button is not visible.", View.VISIBLE, buttons[2].getVisibility()); |
- |
- clickOk(jsDialog); |
- assertTrue("JavaScript execution should continue after closing dialog.", |
- scriptEvent.waitUntilHasValue()); |
- |
- String resultString = scriptEvent.getJsonResultAndClear(); |
- assertEquals("Invalid return value.", "true", resultString); |
- |
- // Try again, pressing cancel this time. |
- scriptEvent = executeJavaScriptAndWaitForDialog("confirm('Android');"); |
- jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- clickCancel(jsDialog); |
- assertTrue("JavaScript execution should continue after closing dialog.", |
- scriptEvent.waitUntilHasValue()); |
- |
- resultString = scriptEvent.getJsonResultAndClear(); |
- assertEquals("Invalid return value.", "false", resultString); |
- } |
- |
- /** |
- * Verifies that modal prompt-dialogs display and the result is returned. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testPromptModalDialog() |
- throws InterruptedException, TimeoutException, ExecutionException { |
- final String promptText = "Hello Android!"; |
- final OnEvaluateJavaScriptResultHelper scriptEvent = |
- executeJavaScriptAndWaitForDialog("prompt('Android', 'default');"); |
- |
- final JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- // Set the text in the prompt field of the dialog. |
- boolean result = ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { |
- @Override |
- public Boolean call() { |
- EditText prompt = (EditText) jsDialog.getDialogForTest().findViewById( |
- org.chromium.chrome.R.id.js_modal_dialog_prompt); |
- if (prompt == null) return false; |
- prompt.setText(promptText); |
- return true; |
- } |
- }); |
- assertTrue("Failed to find prompt view in prompt dialog.", result); |
- |
- clickOk(jsDialog); |
- assertTrue("JavaScript execution should continue after closing prompt.", |
- scriptEvent.waitUntilHasValue()); |
- |
- String resultString = scriptEvent.getJsonResultAndClear(); |
- assertEquals("Invalid return value.", '"' + promptText + '"', resultString); |
- } |
- |
- /** |
- * Verifies beforeunload dialogs are shown and they block/allow navigation |
- * as appropriate. |
- */ |
- //@MediumTest |
- //@Feature({"Browser", "Main"}) |
- @DisabledTest //crbug/270593 |
- public void testBeforeUnloadDialog() |
- throws InterruptedException, TimeoutException, ExecutionException { |
- loadUrlWithSanitization(BEFORE_UNLOAD_URL); |
- executeJavaScriptAndWaitForDialog("history.back();"); |
- |
- JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- checkButtonPresenceVisibilityText( |
- jsDialog, 0, org.chromium.chrome.R.string.stay_on_this_page, |
- "Stay on this page"); |
- clickCancel(jsDialog); |
- |
- assertEquals(BEFORE_UNLOAD_URL, getActivity().getActiveContentViewCore() |
- .getWebContents().getUrl()); |
- executeJavaScriptAndWaitForDialog("history.back();"); |
- |
- jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- checkButtonPresenceVisibilityText( |
- jsDialog, 2, org.chromium.chrome.R.string.leave_this_page, |
- "Leave this page"); |
- |
- final TestCallbackHelperContainer.OnPageFinishedHelper onPageLoaded = |
- getActiveTabTestCallbackHelperContainer().getOnPageFinishedHelper(); |
- int callCount = onPageLoaded.getCallCount(); |
- clickOk(jsDialog); |
- onPageLoaded.waitForCallback(callCount); |
- assertEquals(EMPTY_PAGE, getActivity().getActiveContentViewCore() |
- .getWebContents().getUrl()); |
- } |
- |
- /** |
- * Verifies that when showing a beforeunload dialogs as a result of a page |
- * reload, the correct UI strings are used. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testBeforeUnloadOnReloadDialog() throws InterruptedException, ExecutionException { |
- loadUrlWithSanitization(BEFORE_UNLOAD_URL); |
- executeJavaScriptAndWaitForDialog("window.location.reload();"); |
- |
- JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- checkButtonPresenceVisibilityText( |
- jsDialog, 0, org.chromium.chrome.R.string.dont_reload_this_page, |
- "Don't reload this page"); |
- checkButtonPresenceVisibilityText( |
- jsDialog, 2, org.chromium.chrome.R.string.reload_this_page, |
- "Reload this page"); |
- } |
- |
- /** |
- * Verifies that repeated dialogs give the option to disable dialogs |
- * altogether and then that disabling them works. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testDisableRepeatedDialogs() |
- throws InterruptedException, TimeoutException, ExecutionException { |
- OnEvaluateJavaScriptResultHelper scriptEvent = |
- executeJavaScriptAndWaitForDialog("alert('Android');"); |
- |
- // Show a dialog once. |
- JavascriptAppModalDialog jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- |
- clickCancel(jsDialog); |
- scriptEvent.waitUntilHasValue(); |
- |
- // Show it again, it should have the option to suppress subsequent dialogs. |
- scriptEvent = executeJavaScriptAndWaitForDialog("alert('Android');"); |
- jsDialog = getCurrentDialog(); |
- assertNotNull("No dialog showing.", jsDialog); |
- final AlertDialog dialog = jsDialog.getDialogForTest(); |
- String errorMessage = ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { |
- @Override |
- public String call() { |
- final CheckBox suppress = (CheckBox) dialog.findViewById( |
- org.chromium.chrome.R.id.suppress_js_modal_dialogs); |
- if (suppress == null) return "Suppress checkbox not found."; |
- if (suppress.getVisibility() != View.VISIBLE) { |
- return "Suppress checkbox is not visible."; |
- } |
- suppress.setChecked(true); |
- return null; |
- } |
- }); |
- assertNull(errorMessage, errorMessage); |
- clickCancel(jsDialog); |
- scriptEvent.waitUntilHasValue(); |
- |
- scriptEvent.evaluateJavaScript(getActivity().getActiveContentViewCore().getWebContents(), |
- "alert('Android');"); |
- assertTrue("No further dialog boxes should be shown.", scriptEvent.waitUntilHasValue()); |
- } |
- |
- /** |
- * Displays a dialog and closes the tab in the background before attempting |
- * to accept the dialog. Verifies that the dialog is dismissed when the tab |
- * is closed. |
- */ |
- @MediumTest |
- @Feature({"Browser", "Main"}) |
- public void testDialogDismissedAfterClosingTab() throws InterruptedException { |
- executeJavaScriptAndWaitForDialog("alert('Android')"); |
- |
- ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
- @Override |
- public void run() { |
- getActivity().closeTab(); |
- } |
- }); |
- |
- // Closing the tab should have dismissed the dialog. |
- boolean criteriaSatisfied = CriteriaHelper.pollForCriteria( |
- new JavascriptAppModalDialogShownCriteria(false)); |
- assertTrue("The dialog should have been dismissed when its tab was closed.", |
- criteriaSatisfied); |
- } |
- |
- /** |
- * Asynchronously executes the given code for spawning a dialog and waits |
- * for the dialog to be visible. |
- */ |
- private OnEvaluateJavaScriptResultHelper executeJavaScriptAndWaitForDialog(String script) |
- throws InterruptedException { |
- return executeJavaScriptAndWaitForDialog(new OnEvaluateJavaScriptResultHelper(), script); |
- } |
- |
- /** |
- * Given a JavaScript evaluation helper, asynchronously executes the given |
- * code for spawning a dialog and waits for the dialog to be visible. |
- */ |
- private OnEvaluateJavaScriptResultHelper executeJavaScriptAndWaitForDialog( |
- final OnEvaluateJavaScriptResultHelper helper, String script) |
- throws InterruptedException { |
- helper.evaluateJavaScript(getActivity().getActiveContentViewCore().getWebContents(), |
- script); |
- boolean criteriaSatisfied = CriteriaHelper.pollForCriteria( |
- new JavascriptAppModalDialogShownCriteria(true)); |
- assertTrue("Could not spawn or locate a modal dialog.", criteriaSatisfied); |
- return helper; |
- } |
- |
- /** |
- * Returns an array of the 3 buttons for this dialog, in the order |
- * BUTTON_NEGATIVE, BUTTON_NEUTRAL and BUTTON_POSITIVE. Any of these values |
- * can be null. |
- */ |
- private Button[] getAlertDialogButtons(final AlertDialog dialog) throws ExecutionException { |
- return ThreadUtils.runOnUiThreadBlocking(new Callable<Button[]>() { |
- @Override |
- public Button[] call() { |
- final Button[] buttons = new Button[3]; |
- buttons[0] = dialog.getButton(DialogInterface.BUTTON_NEGATIVE); |
- buttons[1] = dialog.getButton(DialogInterface.BUTTON_NEUTRAL); |
- buttons[2] = dialog.getButton(DialogInterface.BUTTON_POSITIVE); |
- return buttons; |
- } |
- }); |
- } |
- |
- /** |
- * Returns the current JavaScript modal dialog showing or null if no such dialog is currently |
- * showing. |
- */ |
- private JavascriptAppModalDialog getCurrentDialog() throws ExecutionException { |
- return ThreadUtils.runOnUiThreadBlocking(new Callable<JavascriptAppModalDialog>() { |
- @Override |
- public JavascriptAppModalDialog call() { |
- return JavascriptAppModalDialog.getCurrentDialogForTest(); |
- } |
- }); |
- } |
- |
- private static class JavascriptAppModalDialogShownCriteria implements Criteria { |
- private final boolean mShouldBeShown; |
- |
- public JavascriptAppModalDialogShownCriteria(boolean shouldBeShown) { |
- mShouldBeShown = shouldBeShown; |
- } |
- |
- @Override |
- public boolean isSatisfied() { |
- try { |
- return ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { |
- @Override |
- public Boolean call() { |
- final boolean isShown = |
- JavascriptAppModalDialog.getCurrentDialogForTest() != null; |
- return mShouldBeShown == isShown; |
- } |
- }); |
- } catch (ExecutionException e) { |
- Log.e(TAG, "Failed to getCurrentDialog", e); |
- return false; |
- } |
- } |
- } |
- |
- /** |
- * Simulates pressing the OK button of the passed dialog. |
- */ |
- private void clickOk(JavascriptAppModalDialog dialog) { |
- clickButton(dialog, DialogInterface.BUTTON_POSITIVE); |
- } |
- |
- /** |
- * Simulates pressing the Cancel button of the passed dialog. |
- */ |
- private void clickCancel(JavascriptAppModalDialog dialog) { |
- clickButton(dialog, DialogInterface.BUTTON_NEGATIVE); |
- } |
- |
- private void clickButton(final JavascriptAppModalDialog dialog, final int whichButton) { |
- ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
- @Override |
- public void run() { |
- dialog.onClick(null, whichButton); |
- } |
- }); |
- } |
- |
- private void checkButtonPresenceVisibilityText( |
- JavascriptAppModalDialog jsDialog, int buttonIndex, |
- int expectedTextResourceId, String readableName) throws ExecutionException { |
- final Button[] buttons = getAlertDialogButtons(jsDialog.getDialogForTest()); |
- final Button button = buttons[buttonIndex]; |
- assertNotNull("No '" + readableName + "' button in confirm dialog.", button); |
- assertEquals("'" + readableName + "' button is not visible.", |
- View.VISIBLE, |
- button.getVisibility()); |
- assertEquals("'" + readableName + "' button has wrong text", |
- getActivity().getResources().getString(expectedTextResourceId), |
- button.getText().toString()); |
- } |
- |
- private TestCallbackHelperContainer getActiveTabTestCallbackHelperContainer() { |
- return new TestCallbackHelperContainer(getActivity().getActiveTab().getContentViewCore()); |
- } |
-} |