| 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..228350fa12cad54b97ae342c52aadc781c9b4938 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,29 @@ bool IsWebContentsForemost(content::WebContents* web_contents) {
|
| // JavaScriptDialogTabHelper::OnDialogClosed(), which, after doing the callback,
|
| // again calls ClearDialogInfo() to remove observers.
|
|
|
| +enum class JavaScriptDialogTabHelper::DismissalCause {
|
| + // This is used for a UMA histogram. Please never alter existing values, only
|
| + // append new ones.
|
| + 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 +146,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 +230,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 +245,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 +254,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 +299,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)
|
|
|