Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / android / javatests / src / org / chromium / chrome / browser / RepostFormWarningTest.java
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.chrome.browser;
6
7 import android.app.AlertDialog;
8 import android.test.suitebuilder.annotation.MediumTest;
9 import android.test.suitebuilder.annotation.SmallTest;
10
11 import org.chromium.base.test.util.Feature;
12 import org.chromium.chrome.shell.ChromeShellTab;
13 import org.chromium.chrome.shell.ChromeShellTestBase;
14 import org.chromium.chrome.test.util.TestHttpServerClient;
15 import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
16
17 import java.util.concurrent.TimeoutException;
18
19 /**
20  * Integration tests verifying that form resubmission dialogs are correctly displayed and handled.
21  */
22 public class RepostFormWarningTest extends ChromeShellTestBase {
23     // Active tab.
24     private ChromeShellTab mTab;
25     // Callback helper that manages waiting for pageloads to finish.
26     private TestCallbackHelperContainer mCallbackHelper;
27
28     @Override
29     public void setUp() throws Exception {
30         super.setUp();
31
32         mTab = launchChromeShellWithBlankPage().getActiveTab();
33         mCallbackHelper = new TestCallbackHelperContainer(mTab.getContentViewCore());
34
35         // Wait for the initial load of about://blank to finish.
36         mCallbackHelper.getOnPageFinishedHelper().waitForCallback(0);
37     }
38
39     /** Verifies that the form resubmission warning is not displayed upon first POST navigation. */
40     @MediumTest
41     @Feature({"Navigation"})
42     public void testFormFirstNavigation() throws Throwable {
43         // Load the url posting data for the first time.
44         postNavigation();
45         mCallbackHelper.getOnPageFinishedHelper().waitForCallback(1);
46         getInstrumentation().waitForIdleSync();
47
48         // Verify that the form resubmission warning was not shown.
49         assertNull("Form resubmission warning shown upon first load.",
50                 RepostFormWarningDialog.getCurrentDialog());
51     }
52
53     /** Verifies that confirming the form reload performs the reload. */
54     @MediumTest
55     @Feature({"Navigation"})
56     public void testFormResubmissionContinue() throws Throwable {
57         // Load the url posting data for the first time.
58         postNavigation();
59         mCallbackHelper.getOnPageFinishedHelper().waitForCallback(1);
60
61         // Trigger a reload and wait for the warning to be displayed.
62         reload();
63         getInstrumentation().waitForIdleSync();
64         AlertDialog dialog = (AlertDialog) RepostFormWarningDialog.getCurrentDialog();
65         assertNotNull("Form resubmission warning not shown upon reload.", dialog);
66
67         // Click "Continue" and verify that the page is reloaded.
68         clickButton(dialog, AlertDialog.BUTTON_POSITIVE);
69         mCallbackHelper.getOnPageFinishedHelper().waitForCallback(2);
70
71         // Verify that the reference to the dialog in RepostFormWarningDialog was cleared.
72         assertNull("Form resubmission warning dialog was not dismissed correctly.",
73                 RepostFormWarningDialog.getCurrentDialog());
74     }
75
76     /**
77      * Verifies that cancelling the form reload prevents it from happening. Currently the test waits
78      * after the "Cancel" button is clicked to verify that the load was not triggered, which blocks
79      * for CallbackHelper's default timeout upon each execution.
80      */
81     @SmallTest
82     @Feature({"Navigation"})
83     public void testFormResubmissionCancel() throws Throwable {
84         // Load the url posting data for the first time.
85         postNavigation();
86         mCallbackHelper.getOnPageFinishedHelper().waitForCallback(1);
87
88         // Trigger a reload and wait for the warning to be displayed.
89         reload();
90         getInstrumentation().waitForIdleSync();
91         AlertDialog dialog = (AlertDialog) RepostFormWarningDialog.getCurrentDialog();
92         assertNotNull("Form resubmission warning not shown upon reload.", dialog);
93
94         // Click "Cancel" and verify that the page is not reloaded.
95         clickButton(dialog, AlertDialog.BUTTON_NEGATIVE);
96         boolean timedOut = false;
97         try {
98             mCallbackHelper.getOnPageFinishedHelper().waitForCallback(2);
99         } catch (TimeoutException ex) {
100             timedOut = true;
101         }
102         assertTrue("Page was reloaded despite selecting Cancel.", timedOut);
103
104         // Verify that the reference to the dialog in RepostFormWarningDialog was cleared.
105         assertNull("Form resubmission warning dialog was not dismissed correctly.",
106                 RepostFormWarningDialog.getCurrentDialog());
107     }
108
109     /** Performs a POST navigation in mTab. */
110     private void postNavigation() throws Throwable {
111         final String url = "chrome/test/data/empty.html";
112         final byte[] postData = new byte[] { 42 };
113
114         runTestOnUiThread(new Runnable() {
115             @Override
116             public void run() {
117                 mTab.loadUrlWithSanitization(TestHttpServerClient.getUrl(url), postData);
118             }
119         });
120     }
121
122     /** Reloads mTab. */
123     private void reload() throws Throwable {
124         runTestOnUiThread(new Runnable() {
125             @Override
126             public void run() {
127                 mTab.reload();
128             }
129         });
130     }
131
132     /** Clicks the given button in the given dialog. */
133     private void clickButton(final AlertDialog dialog, final int buttonId) throws Throwable {
134         runTestOnUiThread(new Runnable() {
135             @Override
136             public void run() {
137                 dialog.getButton(buttonId).performClick();
138             }
139         });
140     }
141 }