| Index: ui/views/controls/menu/menu_runner.cc
|
| diff --git a/ui/views/controls/menu/menu_runner.cc b/ui/views/controls/menu/menu_runner.cc
|
| index 16ad24eebe6e59db0fb912dff29a57f5c6354924..9308cc92fa17948f16d0b14ee9343be64eb91497 100644
|
| --- a/ui/views/controls/menu/menu_runner.cc
|
| +++ b/ui/views/controls/menu/menu_runner.cc
|
| @@ -6,10 +6,12 @@
|
|
|
| #include <set>
|
|
|
| +#include "base/metrics/histogram.h"
|
| #include "ui/views/controls/button/menu_button.h"
|
| #include "ui/views/controls/menu/menu_controller.h"
|
| #include "ui/views/controls/menu/menu_controller_delegate.h"
|
| #include "ui/views/controls/menu/menu_delegate.h"
|
| +#include "ui/views/controls/menu/submenu_view.h"
|
| #include "ui/views/widget/widget.h"
|
|
|
| #if defined(OS_WIN)
|
| @@ -20,6 +22,35 @@ namespace views {
|
|
|
| namespace internal {
|
|
|
| +void RecordSelectedIndexes(const MenuItemView* menu_item) {
|
| + if (!menu_item)
|
| + return;
|
| + const MenuItemView* parent = menu_item->GetParentMenuItem();
|
| + if (!parent)
|
| + return;
|
| +
|
| + SubmenuView* submenu = parent->GetSubmenu();
|
| + for (int i = 0; i < submenu->GetMenuItemCount(); ++i) {
|
| + if (submenu->GetMenuItemAt(i) == menu_item) {
|
| + HISTOGRAM_COUNTS_100("MenuSelection.Index", i);
|
| + break;
|
| + }
|
| + }
|
| +
|
| + RecordSelectedIndexes(parent);
|
| +}
|
| +
|
| +void RecordMenuStats(MenuItemView* result, base::TimeDelta time_elapsed) {
|
| + // Report if user made a selection.
|
| + HISTOGRAM_BOOLEAN("MenuSelection", result != NULL);
|
| +
|
| + if (result) {
|
| + // Report how much time it took to make a selection.
|
| + HISTOGRAM_TIMES("MenuSelection.Time", time_elapsed);
|
| + RecordSelectedIndexes(result);
|
| + }
|
| +}
|
| +
|
| // Manages the menu. To destroy a MenuRunnerImpl invoke Release(). Release()
|
| // deletes immediately if the menu isn't showing. If the menu is showing
|
| // Release() cancels the menu and when the nested RunMenuAt() call returns
|
| @@ -158,6 +189,7 @@ MenuRunner::RunResult MenuRunnerImpl::RunMenuAt(
|
| controller = NULL;
|
| }
|
| }
|
| +
|
| running_ = true;
|
| for_drop_ = (types & MenuRunner::FOR_DROP) != 0;
|
| bool has_mnemonics = (types & MenuRunner::HAS_MNEMONICS) != 0 && !for_drop_;
|
| @@ -176,6 +208,7 @@ MenuRunner::RunResult MenuRunnerImpl::RunMenuAt(
|
| !for_drop_ && ShouldShowMnemonics(button));
|
|
|
| // Run the loop.
|
| + base::TimeTicks start_time = base::TimeTicks::Now();
|
| int mouse_event_flags = 0;
|
| MenuItemView* result = controller->Run(parent, button, menu_, bounds, anchor,
|
| (types & MenuRunner::CONTEXT_MENU) != 0,
|
| @@ -185,7 +218,7 @@ MenuRunner::RunResult MenuRunnerImpl::RunMenuAt(
|
| // Drop menus return immediately. We finish processing in DropMenuClosed.
|
| return MenuRunner::NORMAL_EXIT;
|
| }
|
| -
|
| + RecordMenuStats(result, base::TimeTicks::Now() - start_time);
|
| return MenuDone(result, mouse_event_flags);
|
| }
|
|
|
|
|