OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/tab_contents/render_view_context_menu.h" | 5 #include "chrome/browser/tab_contents/render_view_context_menu.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
110 using content::RenderViewHost; | 110 using content::RenderViewHost; |
111 using content::SSLStatus; | 111 using content::SSLStatus; |
112 using content::UserMetricsAction; | 112 using content::UserMetricsAction; |
113 using content::WebContents; | 113 using content::WebContents; |
114 using extensions::Extension; | 114 using extensions::Extension; |
115 using extensions::MenuItem; | 115 using extensions::MenuItem; |
116 using extensions::MenuManager; | 116 using extensions::MenuManager; |
117 | 117 |
118 namespace { | 118 namespace { |
119 | 119 |
120 // Maps UMA enumeration to IDC. IDC could be changed so we can't use | |
121 // just them and |UMA_HISTOGRAM_CUSTOM_ENUMERATION|. | |
122 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.
| |
123 int enum_id; | |
124 int command_id; | |
125 } kUmaEnumToCommand[] = { | |
126 { 0, IDC_CONTENT_CONTEXT_CUSTOM_FIRST }, | |
127 { 1, IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST }, | |
128 { 2, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST }, | |
129 { 3, IDC_CONTENT_CONTEXT_OPENLINKNEWTAB }, | |
130 { 4, IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW }, | |
131 { 5, IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD }, | |
132 { 6, IDC_CONTENT_CONTEXT_SAVELINKAS }, | |
133 { 7, IDC_CONTENT_CONTEXT_SAVEAVAS }, | |
134 { 8, IDC_CONTENT_CONTEXT_SAVEIMAGEAS }, | |
135 { 9, IDC_CONTENT_CONTEXT_COPYLINKLOCATION }, | |
136 { 10, IDC_CONTENT_CONTEXT_COPYIMAGELOCATION }, | |
137 { 11, IDC_CONTENT_CONTEXT_COPYAVLOCATION }, | |
138 { 12, IDC_CONTENT_CONTEXT_COPYIMAGE }, | |
139 { 13, IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB }, | |
140 { 14, IDC_CONTENT_CONTEXT_OPENAVNEWTAB }, | |
141 { 15, IDC_CONTENT_CONTEXT_PLAYPAUSE }, | |
142 { 16, IDC_CONTENT_CONTEXT_MUTE }, | |
143 { 17, IDC_CONTENT_CONTEXT_LOOP }, | |
144 { 18, IDC_CONTENT_CONTEXT_CONTROLS }, | |
145 { 19, IDC_CONTENT_CONTEXT_ROTATECW }, | |
146 { 20, IDC_CONTENT_CONTEXT_ROTATECCW }, | |
147 { 21, IDC_BACK }, | |
148 { 22, IDC_FORWARD }, | |
149 { 23, IDC_SAVE_PAGE }, | |
150 { 24, IDC_RELOAD }, | |
151 { 25, IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP }, | |
152 { 26, IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP }, | |
153 { 27, IDC_PRINT }, | |
154 { 28, IDC_VIEW_SOURCE }, | |
155 { 29, IDC_CONTENT_CONTEXT_INSPECTELEMENT }, | |
156 { 30, IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE }, | |
157 { 31, IDC_CONTENT_CONTEXT_VIEWPAGEINFO }, | |
158 { 32, IDC_CONTENT_CONTEXT_TRANSLATE }, | |
159 { 33, IDC_CONTENT_CONTEXT_RELOADFRAME }, | |
160 { 34, IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE }, | |
161 { 35, IDC_CONTENT_CONTEXT_VIEWFRAMEINFO }, | |
162 { 36, IDC_CONTENT_CONTEXT_UNDO }, | |
163 { 37, IDC_CONTENT_CONTEXT_REDO }, | |
164 { 38, IDC_CONTENT_CONTEXT_CUT }, | |
165 { 39, IDC_CONTENT_CONTEXT_COPY }, | |
166 { 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
| |
167 { 41, IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE }, | |
168 { 42, IDC_CONTENT_CONTEXT_DELETE }, | |
169 { 43, IDC_CONTENT_CONTEXT_SELECTALL }, | |
170 { 44, IDC_CONTENT_CONTEXT_SEARCHWEBFOR }, | |
171 { 45, IDC_CONTENT_CONTEXT_GOTOURL }, | |
172 { 46, IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS }, | |
173 { 47, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS }, | |
174 { 48, IDC_CONTENT_CONTEXT_ADDSEARCHENGINE }, | |
175 { 49, IDC_CONTENT_CONTEXT_SPEECH_INPUT_FILTER_PROFANITIES }, | |
176 { 50, IDC_CONTENT_CONTEXT_SPEECH_INPUT_ABOUT }, | |
177 }; | |
178 | |
179 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
| |
180 int bounadary_value = 0; | |
181 for (size_t i = 0; i < arraysize(kUmaEnumToCommand); ++i) { | |
182 bounadary_value = std::max(bounadary_value, kUmaEnumToCommand[i].enum_id); | |
183 } | |
184 return bounadary_value + 1; | |
185 } | |
186 | |
187 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.
| |
188 // Collapse large ranges of ids. | |
189 if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && | |
190 id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { | |
191 id = IDC_CONTENT_CONTEXT_CUSTOM_FIRST; | |
192 } else if (id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST && | |
193 id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) { | |
194 id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST; | |
195 } else if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST && | |
196 id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) { | |
197 id = IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST; | |
198 } | |
199 | |
200 for (size_t i = 0; i < arraysize(kUmaEnumToCommand); ++i) { | |
201 if (kUmaEnumToCommand[i].command_id == id) { | |
202 UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.ExecuteCommand", | |
203 kUmaEnumToCommand[i].enum_id, | |
204 GetEnumerationBoundaryValue()); | |
205 return; | |
206 } | |
207 } | |
208 NOTREACHED(); | |
209 } | |
210 | |
120 // Usually a new tab is expected where this function is used, | 211 // Usually a new tab is expected where this function is used, |
121 // however users should be able to open a tab in background | 212 // however users should be able to open a tab in background |
122 // or in a new window. | 213 // or in a new window. |
123 WindowOpenDisposition ForceNewTabDispositionFromEventFlags( | 214 WindowOpenDisposition ForceNewTabDispositionFromEventFlags( |
124 int event_flags) { | 215 int event_flags) { |
125 WindowOpenDisposition disposition = | 216 WindowOpenDisposition disposition = |
126 ui::DispositionFromEventFlags(event_flags); | 217 ui::DispositionFromEventFlags(event_flags); |
127 return disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition; | 218 return disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition; |
128 } | 219 } |
129 | 220 |
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1330 void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { | 1421 void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { |
1331 // If this command is is added by one of our observers, we dispatch it to the | 1422 // If this command is is added by one of our observers, we dispatch it to the |
1332 // observer. | 1423 // observer. |
1333 ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); | 1424 ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); |
1334 RenderViewContextMenuObserver* observer; | 1425 RenderViewContextMenuObserver* observer; |
1335 while ((observer = it.GetNext()) != NULL) { | 1426 while ((observer = it.GetNext()) != NULL) { |
1336 if (observer->IsCommandIdSupported(id)) | 1427 if (observer->IsCommandIdSupported(id)) |
1337 return observer->ExecuteCommand(id); | 1428 return observer->ExecuteCommand(id); |
1338 } | 1429 } |
1339 | 1430 |
1431 RecordExecutedContextItem(id); | |
1432 | |
1340 RenderViewHost* rvh = source_web_contents_->GetRenderViewHost(); | 1433 RenderViewHost* rvh = source_web_contents_->GetRenderViewHost(); |
1341 | 1434 |
1342 // Process custom actions range. | 1435 // Process custom actions range. |
1343 if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && | 1436 if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && |
1344 id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { | 1437 id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { |
1345 unsigned action = id - IDC_CONTENT_CONTEXT_CUSTOM_FIRST; | 1438 unsigned action = id - IDC_CONTENT_CONTEXT_CUSTOM_FIRST; |
1346 const content::CustomContextMenuContext& context = params_.custom_context; | 1439 const content::CustomContextMenuContext& context = params_.custom_context; |
1347 #if defined(ENABLE_PLUGINS) | 1440 #if defined(ENABLE_PLUGINS) |
1348 if (context.request_id && !context.is_pepper_menu) { | 1441 if (context.request_id && !context.is_pepper_menu) { |
1349 ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins( | 1442 ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins( |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1892 source_web_contents_->GetRenderViewHost()-> | 1985 source_web_contents_->GetRenderViewHost()-> |
1893 ExecuteMediaPlayerActionAtLocation(location, action); | 1986 ExecuteMediaPlayerActionAtLocation(location, action); |
1894 } | 1987 } |
1895 | 1988 |
1896 void RenderViewContextMenu::PluginActionAt( | 1989 void RenderViewContextMenu::PluginActionAt( |
1897 const gfx::Point& location, | 1990 const gfx::Point& location, |
1898 const WebPluginAction& action) { | 1991 const WebPluginAction& action) { |
1899 source_web_contents_->GetRenderViewHost()-> | 1992 source_web_contents_->GetRenderViewHost()-> |
1900 ExecutePluginActionAtLocation(location, action); | 1993 ExecutePluginActionAtLocation(location, action); |
1901 } | 1994 } |
OLD | NEW |