Chromium Code Reviews| Index: chrome/browser/tab_contents/render_view_context_menu.cc |
| diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc |
| index 8a46c6e7631df2d894938b7ee2f824f9c0b2a5e4..21d58caab224e2bcdf169a1c8ccb94b32c5b001b 100644 |
| --- a/chrome/browser/tab_contents/render_view_context_menu.cc |
| +++ b/chrome/browser/tab_contents/render_view_context_menu.cc |
| @@ -117,6 +117,97 @@ using extensions::MenuManager; |
| namespace { |
| +// Maps UMA enumeration to IDC. IDC could be changed so we can't use |
| +// just them and |UMA_HISTOGRAM_CUSTOM_ENUMERATION|. |
| +static const struct { |
|
Ilya Sherman
2013/04/10 02:22:42
nit: No need for static. You're already in an ano
Vitaly Buka (NO REVIEWS)
2013/04/10 03:34:55
Done.
|
| + int enum_id; |
| + int command_id; |
| +} kUmaEnumToCommand[] = { |
| + { 0, IDC_CONTENT_CONTEXT_CUSTOM_FIRST }, |
| + { 1, IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST }, |
| + { 2, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST }, |
| + { 3, IDC_CONTENT_CONTEXT_OPENLINKNEWTAB }, |
| + { 4, IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW }, |
| + { 5, IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD }, |
| + { 6, IDC_CONTENT_CONTEXT_SAVELINKAS }, |
| + { 7, IDC_CONTENT_CONTEXT_SAVEAVAS }, |
| + { 8, IDC_CONTENT_CONTEXT_SAVEIMAGEAS }, |
| + { 9, IDC_CONTENT_CONTEXT_COPYLINKLOCATION }, |
| + { 10, IDC_CONTENT_CONTEXT_COPYIMAGELOCATION }, |
| + { 11, IDC_CONTENT_CONTEXT_COPYAVLOCATION }, |
| + { 12, IDC_CONTENT_CONTEXT_COPYIMAGE }, |
| + { 13, IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB }, |
| + { 14, IDC_CONTENT_CONTEXT_OPENAVNEWTAB }, |
| + { 15, IDC_CONTENT_CONTEXT_PLAYPAUSE }, |
| + { 16, IDC_CONTENT_CONTEXT_MUTE }, |
| + { 17, IDC_CONTENT_CONTEXT_LOOP }, |
| + { 18, IDC_CONTENT_CONTEXT_CONTROLS }, |
| + { 19, IDC_CONTENT_CONTEXT_ROTATECW }, |
| + { 20, IDC_CONTENT_CONTEXT_ROTATECCW }, |
| + { 21, IDC_BACK }, |
| + { 22, IDC_FORWARD }, |
| + { 23, IDC_SAVE_PAGE }, |
| + { 24, IDC_RELOAD }, |
| + { 25, IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP }, |
| + { 26, IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP }, |
| + { 27, IDC_PRINT }, |
| + { 28, IDC_VIEW_SOURCE }, |
| + { 29, IDC_CONTENT_CONTEXT_INSPECTELEMENT }, |
| + { 30, IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE }, |
| + { 31, IDC_CONTENT_CONTEXT_VIEWPAGEINFO }, |
| + { 32, IDC_CONTENT_CONTEXT_TRANSLATE }, |
| + { 33, IDC_CONTENT_CONTEXT_RELOADFRAME }, |
| + { 34, IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE }, |
| + { 35, IDC_CONTENT_CONTEXT_VIEWFRAMEINFO }, |
| + { 36, IDC_CONTENT_CONTEXT_UNDO }, |
| + { 37, IDC_CONTENT_CONTEXT_REDO }, |
| + { 38, IDC_CONTENT_CONTEXT_CUT }, |
| + { 39, IDC_CONTENT_CONTEXT_COPY }, |
| + { 40, IDC_CONTENT_CONTEXT_PASTE }, |
|
Vitaly Buka (NO REVIEWS)
2013/04/10 02:50:00
Ilya, I assume it's OK to extend enum in new versi
Ilya Sherman
2013/04/10 02:51:43
Yes, it's safe to extend the enum in new versions
|
| + { 41, IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE }, |
| + { 42, IDC_CONTENT_CONTEXT_DELETE }, |
| + { 43, IDC_CONTENT_CONTEXT_SELECTALL }, |
| + { 44, IDC_CONTENT_CONTEXT_SEARCHWEBFOR }, |
| + { 45, IDC_CONTENT_CONTEXT_GOTOURL }, |
| + { 46, IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS }, |
| + { 47, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS }, |
| + { 48, IDC_CONTENT_CONTEXT_ADDSEARCHENGINE }, |
| + { 49, IDC_CONTENT_CONTEXT_SPEECH_INPUT_FILTER_PROFANITIES }, |
| + { 50, IDC_CONTENT_CONTEXT_SPEECH_INPUT_ABOUT }, |
| +}; |
| + |
| +int GetEnumerationBoundaryValue() { |
|
Ilya Sherman
2013/04/10 02:22:42
nit: Docs.
Lei Zhang
2013/04/10 02:49:57
If you never delete from |kUmaEnumToCommand|, then
Vitaly Buka (NO REVIEWS)
2013/04/10 03:34:55
IDC_ constants can be deleted in future. Otherwise
|
| + int bounadary_value = 0; |
| + for (size_t i = 0; i < arraysize(kUmaEnumToCommand); ++i) { |
| + bounadary_value = std::max(bounadary_value, kUmaEnumToCommand[i].enum_id); |
| + } |
| + return bounadary_value + 1; |
| +} |
| + |
| +void RecordExecutedContextItem(int id) { |
|
Ilya Sherman
2013/04/10 02:22:42
nit: Docs.
Vitaly Buka (NO REVIEWS)
2013/04/10 03:34:55
Done.
|
| + // Collapse large ranges of ids. |
| + if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && |
| + id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { |
| + id = IDC_CONTENT_CONTEXT_CUSTOM_FIRST; |
| + } else if (id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST && |
| + id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) { |
| + id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST; |
| + } else if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST && |
| + id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) { |
| + id = IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST; |
| + } |
| + |
| + for (size_t i = 0; i < arraysize(kUmaEnumToCommand); ++i) { |
| + if (kUmaEnumToCommand[i].command_id == id) { |
| + UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.ExecuteCommand", |
| + kUmaEnumToCommand[i].enum_id, |
| + GetEnumerationBoundaryValue()); |
| + return; |
| + } |
| + } |
| + NOTREACHED(); |
| +} |
| + |
| // Usually a new tab is expected where this function is used, |
| // however users should be able to open a tab in background |
| // or in a new window. |
| @@ -1337,6 +1428,8 @@ void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { |
| return observer->ExecuteCommand(id); |
| } |
| + RecordExecutedContextItem(id); |
| + |
| RenderViewHost* rvh = source_web_contents_->GetRenderViewHost(); |
| // Process custom actions range. |