diff options
18 files changed, 30 insertions, 12 deletions
diff --git a/android_webview/browser/aw_javascript_dialog_manager.cc b/android_webview/browser/aw_javascript_dialog_manager.cc index 1690eac..d9ec1c1 100644 --- a/android_webview/browser/aw_javascript_dialog_manager.cc +++ b/android_webview/browser/aw_javascript_dialog_manager.cc @@ -21,6 +21,7 @@ void AwJavaScriptDialogManager::RunJavaScriptDialog( content::JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) { AwContentsClientBridgeBase* bridge = diff --git a/android_webview/browser/aw_javascript_dialog_manager.h b/android_webview/browser/aw_javascript_dialog_manager.h index f8db746..0abb432 100644 --- a/android_webview/browser/aw_javascript_dialog_manager.h +++ b/android_webview/browser/aw_javascript_dialog_manager.h @@ -22,6 +22,7 @@ class AwJavaScriptDialogManager : public content::JavaScriptDialogManager { content::JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) OVERRIDE; virtual void RunBeforeUnloadDialog( 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 index beb56fd..356b012 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/test/ModalDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/test/ModalDialogTest.java @@ -234,17 +234,15 @@ public class ModalDialogTest extends ChromiumTestShellTestBase { public void testDisableRepeatedDialogs() throws InterruptedException, TimeoutException, ExecutionException { OnEvaluateJavaScriptResultHelper scriptEvent = - executeJavaScriptAndWaitForDialog("alert('Android');"); + executeJavaScriptAndWaitForDialog("alert('Android');alert('Android');"); - // Show a dialog once. + // A dialog should appear. 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');"); + // Another dialog should appear with the option to suppress subsequent dialogs. jsDialog = getCurrentDialog(); assertNotNull("No dialog showing.", jsDialog); final AlertDialog dialog = jsDialog.getDialogForTest(); diff --git a/chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.cc b/chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.cc index 682a2d9..37e6859 100644 --- a/chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.cc +++ b/chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.cc @@ -47,6 +47,7 @@ class ChromeJavaScriptDialogManager : public JavaScriptDialogManager, content::JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) OVERRIDE; @@ -130,6 +131,7 @@ void ChromeJavaScriptDialogManager::RunJavaScriptDialog( content::JavaScriptMessageType message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) { *did_suppress_message = false; @@ -146,10 +148,11 @@ void ChromeJavaScriptDialogManager::RunJavaScriptDialog( extra_data->last_javascript_message_dismissal_; bool display_suppress_checkbox = false; // Show a checkbox offering to suppress further messages if this message is - // being displayed within kJavaScriptMessageExpectedDelay of the last one. + // being displayed within kJavaScriptMessageExpectedDelay of the last one and + // the dialog was not requested via an explicit user gesture. if (time_since_last_message < base::TimeDelta::FromMilliseconds( - chrome::kJavaScriptMessageExpectedDelay)) { + chrome::kJavaScriptMessageExpectedDelay) && !user_gesture) { display_suppress_checkbox = true; } else { display_suppress_checkbox = false; diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index 96e60e1..bb92c9e 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc @@ -1549,6 +1549,7 @@ void BrowserPluginGuest::RunJavaScriptDialog( JavaScriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) { if (permission_request_map_.size() >= kNumMaxOutstandingPermissionRequests) { diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index 74624ef..15d28d2 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h @@ -213,6 +213,7 @@ class CONTENT_EXPORT BrowserPluginGuest JavaScriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) OVERRIDE; virtual void RunBeforeUnloadDialog( diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index 21b22b3..5cb5172 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -262,6 +262,7 @@ class CONTENT_EXPORT RenderViewHostDelegate { const string16& default_prompt, const GURL& frame_url, JavaScriptMessageType type, + bool user_gesture, IPC::Message* reply_msg, bool* did_suppress_message) {} diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index d373e7d..d2be3e3 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -1435,13 +1435,14 @@ void RenderViewHostImpl::OnRunJavaScriptMessage( const string16& default_prompt, const GURL& frame_url, JavaScriptMessageType type, + bool user_gesture, IPC::Message* reply_msg) { // While a JS message dialog is showing, tabs in the same process shouldn't // process input events. GetProcess()->SetIgnoreInputEvents(true); StopHangMonitorTimeout(); delegate_->RunJavaScriptMessage(this, message, default_prompt, frame_url, - type, reply_msg, + type, user_gesture, reply_msg, &are_javascript_messages_suppressed_); } diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 94f2079..649d83a 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h @@ -539,6 +539,7 @@ class CONTENT_EXPORT RenderViewHostImpl const string16& default_prompt, const GURL& frame_url, JavaScriptMessageType type, + bool user_gesture, IPC::Message* reply_msg); void OnRunBeforeUnloadConfirm(const GURL& frame_url, const string16& message, diff --git a/content/browser/web_contents/render_view_host_manager_unittest.cc b/content/browser/web_contents/render_view_host_manager_unittest.cc index ea35e6b..77d6533 100644 --- a/content/browser/web_contents/render_view_host_manager_unittest.cc +++ b/content/browser/web_contents/render_view_host_manager_unittest.cc @@ -304,7 +304,7 @@ TEST_F(RenderViewHostManagerTest, FilterMessagesWhileSwappedOut) { ntp_process_host->sink().ClearMessages(); ViewHostMsg_RunJavaScriptMessage js_msg( rvh()->GetRoutingID(), msg, msg, kChromeURL, - JAVASCRIPT_MESSAGE_TYPE_CONFIRM, &result, &unused); + JAVASCRIPT_MESSAGE_TYPE_CONFIRM, false, &result, &unused); js_msg.EnableMessagePumping(); EXPECT_TRUE(ntp_rvh->OnMessageReceived(js_msg)); EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 5917a44..801084f 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -3356,6 +3356,7 @@ void WebContentsImpl::RunJavaScriptMessage( const string16& default_prompt, const GURL& frame_url, JavaScriptMessageType javascript_message_type, + bool user_gesture, IPC::Message* reply_msg, bool* did_suppress_message) { // Suppress JavaScript dialogs when requested. Also suppress messages when @@ -3379,6 +3380,7 @@ void WebContentsImpl::RunJavaScriptMessage( javascript_message_type, message, default_prompt, + user_gesture, base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh, diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 55f377b..abc52e2 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -398,6 +398,7 @@ class CONTENT_EXPORT WebContentsImpl const string16& default_prompt, const GURL& frame_url, JavaScriptMessageType type, + bool user_gesture, IPC::Message* reply_msg, bool* did_suppress_message) OVERRIDE; virtual void RunBeforeUnloadConfirm(RenderViewHost* rvh, diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc index aded7ae..b20cf66 100644 --- a/content/browser/web_contents/web_contents_impl_unittest.cc +++ b/content/browser/web_contents/web_contents_impl_unittest.cc @@ -2014,7 +2014,7 @@ TEST_F(WebContentsImplTest, NoJSMessageOnInterstitials) { bool did_suppress_message = false; contents()->RunJavaScriptMessage(contents()->GetRenderViewHost(), ASCIIToUTF16("This is an informative message"), ASCIIToUTF16("OK"), - kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message, + kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, false, dummy_message, &did_suppress_message); EXPECT_TRUE(did_suppress_message); } diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 362320b..6273f84 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -1800,11 +1800,12 @@ IPC_MESSAGE_ROUTED0(ViewHostMsg_RouteCloseEvent) IPC_MESSAGE_ROUTED1(ViewHostMsg_RouteMessageEvent, ViewMsg_PostMessage_Params) -IPC_SYNC_MESSAGE_ROUTED4_2(ViewHostMsg_RunJavaScriptMessage, +IPC_SYNC_MESSAGE_ROUTED5_2(ViewHostMsg_RunJavaScriptMessage, string16 /* in - alert message */, string16 /* in - default prompt */, GURL /* in - originating page URL */, content::JavaScriptMessageType /* in - type */, + bool /* in - user_gesture */, bool /* out - success */, string16 /* out - user_input field */) diff --git a/content/public/browser/javascript_dialog_manager.h b/content/public/browser/javascript_dialog_manager.h index 778893d..c9e1792 100644 --- a/content/public/browser/javascript_dialog_manager.h +++ b/content/public/browser/javascript_dialog_manager.h @@ -35,6 +35,7 @@ class CONTENT_EXPORT JavaScriptDialogManager { JavaScriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) = 0; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 6b3ca9f..b786849 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -2226,13 +2226,16 @@ bool RenderViewImpl::RunJavaScriptMessage(JavaScriptMessageType type, const string16& default_value, const GURL& frame_url, string16* result) { + bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); bool success = false; string16 result_temp; if (!result) result = &result_temp; SendAndRunNestedMessageLoop(new ViewHostMsg_RunJavaScriptMessage( - routing_id_, message, default_value, frame_url, type, &success, result)); + routing_id_, message, default_value, frame_url, type, user_gesture, + &success, result)); + WebUserGestureIndicator::consumeUserGesture(); return success; } diff --git a/content/shell/browser/shell_javascript_dialog_manager.cc b/content/shell/browser/shell_javascript_dialog_manager.cc index 1476f7c..b250d18 100644 --- a/content/shell/browser/shell_javascript_dialog_manager.cc +++ b/content/shell/browser/shell_javascript_dialog_manager.cc @@ -29,6 +29,7 @@ void ShellJavaScriptDialogManager::RunJavaScriptDialog( JavaScriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) { if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { diff --git a/content/shell/browser/shell_javascript_dialog_manager.h b/content/shell/browser/shell_javascript_dialog_manager.h index 763736f..30d23d5 100644 --- a/content/shell/browser/shell_javascript_dialog_manager.h +++ b/content/shell/browser/shell_javascript_dialog_manager.h @@ -27,6 +27,7 @@ class ShellJavaScriptDialogManager : public JavaScriptDialogManager { JavaScriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, + bool user_gesture, const DialogClosedCallback& callback, bool* did_suppress_message) OVERRIDE; |