Chromium Code Reviews| Index: chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.cc |
| diff --git a/chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.cc b/chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.cc |
| index 6f2c3cdc7320017ebd353ca973b3f0ba1c11ff87..ed6e174edf629b05a1f6477324b69c1a69e8fee0 100644 |
| --- a/chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.cc |
| +++ b/chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.cc |
| @@ -56,14 +56,27 @@ bool IsWebContentsForemost(content::WebContents* web_contents) { |
| // JavaScriptDialogTabHelper::OnDialogClosed(), which, after doing the callback, |
| // again calls ClearDialogInfo() to remove observers. |
| +enum class JavaScriptDialogTabHelper::DismissalCause { |
|
Ilya Sherman
2016/11/29 03:10:35
Please document that this enum is used to back an
Avi (use Gerrit)
2016/11/29 16:10:59
Done.
|
| + TAB_HELPER_DESTROYED = 0, |
| + SUBSEQUENT_DIALOG_SHOWN = 1, |
| + HANDLE_DIALOG_CALLED = 2, |
| + CANCEL_DIALOGS_CALLED = 3, |
| + TAB_HIDDEN = 4, |
| + BROWSER_SWITCHED = 5, |
| + DIALOG_BUTTON_CLICKED = 6, |
| + MAX, |
| +}; |
| + |
| JavaScriptDialogTabHelper::JavaScriptDialogTabHelper( |
| content::WebContents* web_contents) |
| : content::WebContentsObserver(web_contents) { |
| } |
| JavaScriptDialogTabHelper::~JavaScriptDialogTabHelper() { |
| - if (dialog_) |
| - CloseDialog(true /*suppress_callback*/, false, base::string16()); |
| + if (dialog_) { |
| + CloseDialog(true /*suppress_callback*/, false, base::string16(), |
| + DismissalCause::TAB_HELPER_DESTROYED); |
| + } |
| } |
| void JavaScriptDialogTabHelper::SetDialogShownCallbackForTesting( |
| @@ -131,12 +144,14 @@ void JavaScriptDialogTabHelper::RunJavaScriptDialog( |
| if (dialog_) { |
| // There's already a dialog up; clear it out. |
| - CloseDialog(false, false, base::string16()); |
| + CloseDialog(false, false, base::string16(), |
| + DismissalCause::SUBSEQUENT_DIALOG_SHOWN); |
| } |
| base::string16 title = |
| AppModalDialogManager()->GetTitle(alerting_web_contents, origin_url); |
| dialog_callback_ = callback; |
| + message_type_ = message_type; |
| dialog_ = JavaScriptDialog::Create( |
| parent_web_contents, alerting_web_contents, title, message_type, |
| message_text, default_prompt_text, |
| @@ -213,7 +228,8 @@ bool JavaScriptDialogTabHelper::HandleJavaScriptDialog( |
| const base::string16* prompt_override) { |
| if (dialog_) { |
| CloseDialog(false /*suppress_callback*/, accept, |
| - prompt_override ? *prompt_override : base::string16()); |
| + prompt_override ? *prompt_override : base::string16(), |
| + DismissalCause::HANDLE_DIALOG_CALLED); |
| return true; |
| } |
| @@ -227,7 +243,8 @@ void JavaScriptDialogTabHelper::CancelDialogs( |
| bool suppress_callbacks, |
| bool reset_state) { |
| if (dialog_) |
| - CloseDialog(suppress_callbacks, false, base::string16()); |
| + CloseDialog(suppress_callbacks, false, base::string16(), |
| + DismissalCause::CANCEL_DIALOGS_CALLED); |
| // Cancel any app-modal dialogs being run by the app-modal dialog system. |
| return AppModalDialogManager()->CancelDialogs( |
| @@ -235,19 +252,44 @@ void JavaScriptDialogTabHelper::CancelDialogs( |
| } |
| void JavaScriptDialogTabHelper::WasHidden() { |
| - if (dialog_) |
| - CloseDialog(false, false, base::string16()); |
| + if (dialog_) { |
| + CloseDialog(false, false, base::string16(), DismissalCause::TAB_HIDDEN); |
| + } |
| } |
| void JavaScriptDialogTabHelper::OnBrowserSetLastActive(Browser* browser) { |
| - if (dialog_ && !IsWebContentsForemost(web_contents())) |
| - CloseDialog(false, false, base::string16()); |
| + if (dialog_ && !IsWebContentsForemost(web_contents())) { |
| + CloseDialog(false, false, base::string16(), |
| + DismissalCause::BROWSER_SWITCHED); |
| + } |
| +} |
| + |
| +void JavaScriptDialogTabHelper::LogDialogDismissalCause( |
| + JavaScriptDialogTabHelper::DismissalCause cause) { |
| + switch (message_type_) { |
| + case content::JAVASCRIPT_MESSAGE_TYPE_ALERT: |
| + UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Alert", |
| + static_cast<int>(cause), |
| + static_cast<int>(DismissalCause::MAX)); |
| + break; |
| + case content::JAVASCRIPT_MESSAGE_TYPE_CONFIRM: |
| + UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Confirm", |
| + static_cast<int>(cause), |
| + static_cast<int>(DismissalCause::MAX)); |
| + break; |
| + case content::JAVASCRIPT_MESSAGE_TYPE_PROMPT: |
| + UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Prompt", |
| + static_cast<int>(cause), |
| + static_cast<int>(DismissalCause::MAX)); |
| + break; |
| + } |
| } |
| void JavaScriptDialogTabHelper::OnDialogClosed( |
| DialogClosedCallback callback, |
| bool success, |
| const base::string16& user_input) { |
| + LogDialogDismissalCause(DismissalCause::DIALOG_BUTTON_CLICKED); |
| callback.Run(success, user_input); |
| ClearDialogInfo(); |
| @@ -255,8 +297,10 @@ void JavaScriptDialogTabHelper::OnDialogClosed( |
| void JavaScriptDialogTabHelper::CloseDialog(bool suppress_callback, |
| bool success, |
| - const base::string16& user_input) { |
| + const base::string16& user_input, |
| + DismissalCause cause) { |
| DCHECK(dialog_); |
| + LogDialogDismissalCause(cause); |
| dialog_->CloseDialogWithoutCallback(); |
| if (!suppress_callback) |