OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/renderer_context_menu/render_view_context_menu.h" | 5 #include "chrome/browser/renderer_context_menu/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 |
11 #include "apps/app_load_service.h" | 11 #include "apps/app_load_service.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
15 #include "base/prefs/pref_member.h" | 15 #include "base/prefs/pref_member.h" |
16 #include "base/prefs/pref_service.h" | 16 #include "base/prefs/pref_service.h" |
17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
18 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
19 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
20 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
| 21 #include "base/time/time.h" |
21 #include "chrome/app/chrome_command_ids.h" | 22 #include "chrome/app/chrome_command_ids.h" |
22 #include "chrome/browser/app_mode/app_mode_utils.h" | 23 #include "chrome/browser/app_mode/app_mode_utils.h" |
23 #include "chrome/browser/autocomplete/autocomplete_classifier.h" | 24 #include "chrome/browser/autocomplete/autocomplete_classifier.h" |
24 #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" | 25 #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" |
25 #include "chrome/browser/browser_process.h" | 26 #include "chrome/browser/browser_process.h" |
26 #include "chrome/browser/chrome_notification_types.h" | 27 #include "chrome/browser/chrome_notification_types.h" |
27 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" | 28 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" |
28 #include "chrome/browser/devtools/devtools_window.h" | 29 #include "chrome/browser/devtools/devtools_window.h" |
29 #include "chrome/browser/download/download_service.h" | 30 #include "chrome/browser/download/download_service.h" |
30 #include "chrome/browser/download/download_service_factory.h" | 31 #include "chrome/browser/download/download_service_factory.h" |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 return; | 411 return; |
411 | 412 |
412 base::string16 printable_selection_text = PrintableSelectionText(); | 413 base::string16 printable_selection_text = PrintableSelectionText(); |
413 EscapeAmpersands(&printable_selection_text); | 414 EscapeAmpersands(&printable_selection_text); |
414 | 415 |
415 // Get a list of extension id's that have context menu items, and sort by the | 416 // Get a list of extension id's that have context menu items, and sort by the |
416 // top level context menu title of the extension. | 417 // top level context menu title of the extension. |
417 std::set<MenuItem::ExtensionKey> ids = menu_manager->ExtensionIds(); | 418 std::set<MenuItem::ExtensionKey> ids = menu_manager->ExtensionIds(); |
418 std::vector<base::string16> sorted_menu_titles; | 419 std::vector<base::string16> sorted_menu_titles; |
419 std::map<base::string16, std::string> map_ids; | 420 std::map<base::string16, std::string> map_ids; |
420 for (std::set<MenuItem::ExtensionKey>::iterator iter = ids.begin(); | 421 for (std::set<MenuItem::ExtensionKey>::iterator i = ids.begin(); |
421 iter != ids.end(); | 422 i != ids.end(); |
422 ++iter) { | 423 ++i) { |
423 const Extension* extension = | 424 const Extension* extension = |
424 service->GetExtensionById(iter->extension_id, false); | 425 service->GetExtensionById(i->extension_id, false); |
425 // Platform apps have their context menus created directly in | 426 // Platform apps have their context menus created directly in |
426 // AppendPlatformAppItems. | 427 // AppendPlatformAppItems. |
427 if (extension && !extension->is_platform_app()) { | 428 if (extension && !extension->is_platform_app()) { |
428 base::string16 menu_title = extension_items_.GetTopLevelContextMenuTitle( | 429 base::string16 menu_title = extension_items_.GetTopLevelContextMenuTitle( |
429 *iter, printable_selection_text); | 430 *i, printable_selection_text); |
430 map_ids[menu_title] = iter->extension_id; | 431 map_ids[menu_title] = i->extension_id; |
431 sorted_menu_titles.push_back(menu_title); | 432 sorted_menu_titles.push_back(menu_title); |
432 } | 433 } |
433 } | 434 } |
434 if (sorted_menu_titles.empty()) | 435 if (sorted_menu_titles.empty()) |
435 return; | 436 return; |
436 | 437 |
437 const std::string app_locale = g_browser_process->GetApplicationLocale(); | 438 const std::string app_locale = g_browser_process->GetApplicationLocale(); |
438 l10n_util::SortStrings16(app_locale, &sorted_menu_titles); | 439 l10n_util::SortStrings16(app_locale, &sorted_menu_titles); |
439 | 440 |
440 int index = 0; | 441 int index = 0; |
| 442 base::TimeTicks begin = base::TimeTicks::Now(); |
441 for (size_t i = 0; i < sorted_menu_titles.size(); ++i) { | 443 for (size_t i = 0; i < sorted_menu_titles.size(); ++i) { |
442 const std::string& id = map_ids[sorted_menu_titles[i]]; | 444 const std::string& id = map_ids[sorted_menu_titles[i]]; |
443 const MenuItem::ExtensionKey extension_key(id); | 445 const MenuItem::ExtensionKey extension_key(id); |
444 extension_items_.AppendExtensionItems(extension_key, | 446 extension_items_.AppendExtensionItems( |
445 printable_selection_text, | 447 extension_key, printable_selection_text, &index); |
446 &index, | |
447 false); // is_action_menu | |
448 } | 448 } |
| 449 |
| 450 UMA_HISTOGRAM_TIMES("Extensions.ContextMenus_BuildTime", |
| 451 base::TimeTicks::Now() - begin); |
| 452 UMA_HISTOGRAM_COUNTS("Extensions.ContextMenus_ItemCount", index); |
449 } | 453 } |
450 | 454 |
451 void RenderViewContextMenu::AppendCurrentExtensionItems() { | 455 void RenderViewContextMenu::AppendCurrentExtensionItems() { |
452 // Avoid appending extension related items when |extension| is null. | 456 // Avoid appending extension related items when |extension| is null. |
453 // For Panel, this happens when the panel is navigated to a url outside of the | 457 // For Panel, this happens when the panel is navigated to a url outside of the |
454 // extension's package. | 458 // extension's package. |
455 const Extension* extension = GetExtension(); | 459 const Extension* extension = GetExtension(); |
456 if (extension) { | 460 if (extension) { |
457 // Only add extension items from this extension. | 461 // Only add extension items from this extension. |
458 int index = 0; | 462 int index = 0; |
459 const MenuItem::ExtensionKey key( | 463 const MenuItem::ExtensionKey key( |
460 extension->id(), WebViewGuest::GetViewInstanceId(source_web_contents_)); | 464 extension->id(), WebViewGuest::GetViewInstanceId(source_web_contents_)); |
461 extension_items_.AppendExtensionItems(key, | 465 extension_items_.AppendExtensionItems( |
462 PrintableSelectionText(), | 466 key, PrintableSelectionText(), &index); |
463 &index, | |
464 false); // is_action_menu | |
465 } | 467 } |
466 } | 468 } |
467 | 469 |
468 void RenderViewContextMenu::InitMenu() { | 470 void RenderViewContextMenu::InitMenu() { |
469 RenderViewContextMenuBase::InitMenu(); | 471 RenderViewContextMenuBase::InitMenu(); |
470 | 472 |
471 if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) | 473 if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) |
472 AppendPageItems(); | 474 AppendPageItems(); |
473 | 475 |
474 if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_FRAME)) { | 476 if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_FRAME)) { |
(...skipping 1303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1778 source_web_contents_->GetRenderViewHost()-> | 1780 source_web_contents_->GetRenderViewHost()-> |
1779 ExecuteMediaPlayerActionAtLocation(location, action); | 1781 ExecuteMediaPlayerActionAtLocation(location, action); |
1780 } | 1782 } |
1781 | 1783 |
1782 void RenderViewContextMenu::PluginActionAt( | 1784 void RenderViewContextMenu::PluginActionAt( |
1783 const gfx::Point& location, | 1785 const gfx::Point& location, |
1784 const WebPluginAction& action) { | 1786 const WebPluginAction& action) { |
1785 source_web_contents_->GetRenderViewHost()-> | 1787 source_web_contents_->GetRenderViewHost()-> |
1786 ExecutePluginActionAtLocation(location, action); | 1788 ExecutePluginActionAtLocation(location, action); |
1787 } | 1789 } |
OLD | NEW |