Chromium Code Reviews| 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..abe85bb48d5afaaeb30f170661e2613f3cf98d5c 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,33 @@ namespace views { |
| namespace internal { |
| +void RecordSelectedIndexes(const MenuItemView* menu_item) { |
| + const MenuItemView* parent = menu_item->GetParentMenuItem(); |
|
sky
2013/03/06 22:34:21
menu_item could be NULL.
yefimt
2013/03/06 23:11:57
This function is called only when menu_item is not
|
| + 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 +187,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 +206,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 +216,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); |
| } |