Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: chrome/android/javatests/src/org/chromium/chrome/browser/ModalDialogTest.java

Issue 2801813005: Only show a beforeunload dialog if a frame has had a user gesture since its load. (Closed)
Patch Set: aw Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser; 5 package org.chromium.chrome.browser;
6 6
7 import android.content.DialogInterface; 7 import android.content.DialogInterface;
8 import android.support.test.filters.MediumTest; 8 import android.support.test.filters.MediumTest;
9 import android.support.v7.app.AlertDialog; 9 import android.support.v7.app.AlertDialog;
10 import android.util.Log; 10 import android.util.Log;
11 import android.view.View; 11 import android.view.View;
12 import android.widget.Button; 12 import android.widget.Button;
13 import android.widget.CheckBox; 13 import android.widget.CheckBox;
14 import android.widget.EditText; 14 import android.widget.EditText;
15 15
16 import org.chromium.base.ThreadUtils; 16 import org.chromium.base.ThreadUtils;
17 import org.chromium.base.test.util.CallbackHelper;
17 import org.chromium.base.test.util.Feature; 18 import org.chromium.base.test.util.Feature;
18 import org.chromium.base.test.util.RetryOnFailure; 19 import org.chromium.base.test.util.RetryOnFailure;
19 import org.chromium.base.test.util.UrlUtils; 20 import org.chromium.base.test.util.UrlUtils;
20 import org.chromium.chrome.R; 21 import org.chromium.chrome.R;
21 import org.chromium.chrome.test.ChromeActivityTestCaseBase; 22 import org.chromium.chrome.test.ChromeActivityTestCaseBase;
22 import org.chromium.content.browser.test.util.Criteria; 23 import org.chromium.content.browser.test.util.Criteria;
23 import org.chromium.content.browser.test.util.CriteriaHelper; 24 import org.chromium.content.browser.test.util.CriteriaHelper;
24 import org.chromium.content.browser.test.util.TestCallbackHelperContainer; 25 import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
25 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnEval uateJavaScriptResultHelper; 26 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnEval uateJavaScriptResultHelper;
27 import org.chromium.content_public.browser.GestureStateListener;
26 28
27 import java.util.concurrent.Callable; 29 import java.util.concurrent.Callable;
28 import java.util.concurrent.ExecutionException; 30 import java.util.concurrent.ExecutionException;
29 import java.util.concurrent.TimeoutException; 31 import java.util.concurrent.TimeoutException;
30 32
31 /** 33 /**
32 * Test suite for displaying and functioning of modal dialogs. 34 * Test suite for displaying and functioning of modal dialogs.
33 */ 35 */
34 @RetryOnFailure 36 @RetryOnFailure
35 public class ModalDialogTest extends ChromeActivityTestCaseBase<ChromeActivity> { 37 public class ModalDialogTest extends ChromeActivityTestCaseBase<ChromeActivity> {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 assertTrue("Failed to find prompt view in prompt dialog.", result); 162 assertTrue("Failed to find prompt view in prompt dialog.", result);
161 163
162 clickOk(jsDialog); 164 clickOk(jsDialog);
163 assertTrue("JavaScript execution should continue after closing prompt.", 165 assertTrue("JavaScript execution should continue after closing prompt.",
164 scriptEvent.waitUntilHasValue()); 166 scriptEvent.waitUntilHasValue());
165 167
166 String resultString = scriptEvent.getJsonResultAndClear(); 168 String resultString = scriptEvent.getJsonResultAndClear();
167 assertEquals("Invalid return value.", '"' + promptText + '"', resultStri ng); 169 assertEquals("Invalid return value.", '"' + promptText + '"', resultStri ng);
168 } 170 }
169 171
172 private static class TapGestureStateListener extends GestureStateListener {
173 private CallbackHelper mCallbackHelper = new CallbackHelper();
174
175 public int getCallCount() {
176 return mCallbackHelper.getCallCount();
177 }
178
179 public void waitForTap(int currentCallCount)
180 throws InterruptedException, TimeoutException {
181 mCallbackHelper.waitForCallback(currentCallCount);
182 }
183
184 @Override
185 public void onSingleTap(boolean consumed) {
186 mCallbackHelper.notifyCalled();
187 }
188 }
189
190 /**
191 * Taps on a view and waits for a callback.
192 */
193 private void tapViewAndWait() throws InterruptedException, TimeoutException {
194 final TapGestureStateListener tapGestureStateListener =
195 new TapGestureStateListener();
196 int callCount = tapGestureStateListener.getCallCount();
197 getActivity().getCurrentContentViewCore()
198 .addGestureStateListener(tapGestureStateListener);
199
200 singleClickView(getActivity().getActivityTab().getView());
201 tapGestureStateListener.waitForTap(callCount);
202 }
203
170 /** 204 /**
171 * Verifies beforeunload dialogs are shown and they block/allow navigation 205 * Verifies beforeunload dialogs are shown and they block/allow navigation
172 * as appropriate. 206 * as appropriate.
173 */ 207 */
174 @MediumTest 208 @MediumTest
175 @Feature({"Browser", "Main"}) 209 @Feature({"Browser", "Main"})
176 public void testBeforeUnloadDialog() 210 public void testBeforeUnloadDialog()
177 throws InterruptedException, TimeoutException, ExecutionException { 211 throws InterruptedException, TimeoutException, ExecutionException {
178 loadUrl(BEFORE_UNLOAD_URL); 212 loadUrl(BEFORE_UNLOAD_URL);
213 // JavaScript onbeforeunload dialogs require a user gesture.
214 tapViewAndWait();
179 executeJavaScriptAndWaitForDialog("history.back();"); 215 executeJavaScriptAndWaitForDialog("history.back();");
180 216
181 JavascriptAppModalDialog jsDialog = getCurrentDialog(); 217 JavascriptAppModalDialog jsDialog = getCurrentDialog();
182 assertNotNull("No dialog showing.", jsDialog); 218 assertNotNull("No dialog showing.", jsDialog);
183 checkButtonPresenceVisibilityText(jsDialog, 0, R.string.cancel, "Cancel" ); 219 checkButtonPresenceVisibilityText(jsDialog, 0, R.string.cancel, "Cancel" );
184 clickCancel(jsDialog); 220 clickCancel(jsDialog);
185 221
186 assertEquals(BEFORE_UNLOAD_URL, getActivity().getCurrentContentViewCore( ) 222 assertEquals(BEFORE_UNLOAD_URL, getActivity().getCurrentContentViewCore( )
187 .getWebContents().getUrl()); 223 .getWebContents().getUrl());
188 executeJavaScriptAndWaitForDialog("history.back();"); 224 executeJavaScriptAndWaitForDialog("history.back();");
(...skipping 10 matching lines...) Expand all
199 assertEquals(EMPTY_PAGE, getActivity().getCurrentContentViewCore() 235 assertEquals(EMPTY_PAGE, getActivity().getCurrentContentViewCore()
200 .getWebContents().getUrl()); 236 .getWebContents().getUrl());
201 } 237 }
202 238
203 /** 239 /**
204 * Verifies that when showing a beforeunload dialogs as a result of a page 240 * Verifies that when showing a beforeunload dialogs as a result of a page
205 * reload, the correct UI strings are used. 241 * reload, the correct UI strings are used.
206 */ 242 */
207 @MediumTest 243 @MediumTest
208 @Feature({"Browser", "Main"}) 244 @Feature({"Browser", "Main"})
209 public void testBeforeUnloadOnReloadDialog() throws InterruptedException, Ex ecutionException { 245 public void testBeforeUnloadOnReloadDialog()
246 throws InterruptedException, TimeoutException, ExecutionException {
210 loadUrl(BEFORE_UNLOAD_URL); 247 loadUrl(BEFORE_UNLOAD_URL);
248 // JavaScript onbeforeunload dialogs require a user gesture.
249 tapViewAndWait();
211 executeJavaScriptAndWaitForDialog("window.location.reload();"); 250 executeJavaScriptAndWaitForDialog("window.location.reload();");
212 251
213 JavascriptAppModalDialog jsDialog = getCurrentDialog(); 252 JavascriptAppModalDialog jsDialog = getCurrentDialog();
214 assertNotNull("No dialog showing.", jsDialog); 253 assertNotNull("No dialog showing.", jsDialog);
215 254
216 checkButtonPresenceVisibilityText(jsDialog, 0, R.string.cancel, "Cancel" ); 255 checkButtonPresenceVisibilityText(jsDialog, 0, R.string.cancel, "Cancel" );
217 checkButtonPresenceVisibilityText(jsDialog, 2, R.string.reload, "Reload" ); 256 checkButtonPresenceVisibilityText(jsDialog, 2, R.string.reload, "Reload" );
218 } 257 }
219 258
220 /** 259 /**
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 button.getVisibility()); 438 button.getVisibility());
400 assertEquals("'" + readableName + "' button has wrong text", 439 assertEquals("'" + readableName + "' button has wrong text",
401 getActivity().getResources().getString(expectedTextResourceId), 440 getActivity().getResources().getString(expectedTextResourceId),
402 button.getText().toString()); 441 button.getText().toString());
403 } 442 }
404 443
405 private TestCallbackHelperContainer getActiveTabTestCallbackHelperContainer( ) { 444 private TestCallbackHelperContainer getActiveTabTestCallbackHelperContainer( ) {
406 return new TestCallbackHelperContainer(getActivity().getCurrentContentVi ewCore()); 445 return new TestCallbackHelperContainer(getActivity().getCurrentContentVi ewCore());
407 } 446 }
408 } 447 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698