1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "apps/app_load_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/stringprintf.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_classifier.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/download/download_stats.h"
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/devtools_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h"
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/context_menu_content_type_factory.h"
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/spellchecker_submenu_observer.h"
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/spelling_menu_observer.h"
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/search/search.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_host_metrics.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_service.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/retargeting_details.h"
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h"
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/translate/translate_service.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/chrome_pages.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search_engines/search_engine_tab_helper.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/common/content_restriction.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/net/url_util.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/render_messages.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/spellcheck_messages.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_input_type.pb.h"
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h"
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_download_manager.h"
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/translate/core/browser/translate_manager.h"
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_prefs.h"
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_save_info.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/common/menu_item.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/ssl_status.h"
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/url_utils.h"
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h"
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_guest.h"
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h"
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h"
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebContextMenuData.h"
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaPlayerAction.h"
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginAction.h"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/favicon_size.h"
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/point.h"
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/size.h"
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/text_elider.h"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_PRINTING)
105c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/common/print_messages.h"
106c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
107c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
108c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_preview_context_menu_observer.h"
109c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_preview_dialog_controller.h"
110c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_view_manager.h"
111c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else
112c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_view_manager_basic.h"
113c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // defined(ENABLE_FULL_PRINTING)
114c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // defined(ENABLE_PRINTING)
115c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebContextMenuData;
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMediaPlayerAction;
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginAction;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessSecurityPolicy;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManager;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadUrlParameters;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::RenderFrameHost;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SSLStatus;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using extensions::ContextMenuMatcher;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::MenuItem;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::MenuManager;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const int kImageSearchThumbnailMinSize = 300 * 300;
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const int kImageSearchThumbnailMaxWidth = 600;
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const int kImageSearchThumbnailMaxHeight = 600;
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Maps UMA enumeration to IDC. IDC could be changed so we can't use
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// just them and |UMA_HISTOGRAM_CUSTOM_ENUMERATION|.
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Never change mapping or reuse |enum_id|. Always push back new items.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Items that is not used any more by |RenderViewContextMenu.ExecuteCommand|
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// could be deleted, but don't change the rest of |kUmaEnumToControlId|.
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const struct UmaEnumCommandIdPair {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int enum_id;
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int control_id;
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} kUmaEnumToControlId[] = {
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      /*
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        enum id for 0, 1 are detected using
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        RenderViewContextMenu::IsContentCustomCommandId and
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ContextMenuMatcher::IsExtensionsCustomCommandId
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      */
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {2, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST},
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {3, IDC_CONTENT_CONTEXT_OPENLINKNEWTAB},
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {4, IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW},
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {5, IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD},
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {6, IDC_CONTENT_CONTEXT_SAVELINKAS},
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {7, IDC_CONTENT_CONTEXT_SAVEAVAS},
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {8, IDC_CONTENT_CONTEXT_SAVEIMAGEAS},
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {9, IDC_CONTENT_CONTEXT_COPYLINKLOCATION},
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {10, IDC_CONTENT_CONTEXT_COPYIMAGELOCATION},
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {11, IDC_CONTENT_CONTEXT_COPYAVLOCATION},
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {12, IDC_CONTENT_CONTEXT_COPYIMAGE},
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {13, IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB},
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {14, IDC_CONTENT_CONTEXT_OPENAVNEWTAB},
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {15, IDC_CONTENT_CONTEXT_PLAYPAUSE},
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {16, IDC_CONTENT_CONTEXT_MUTE},
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {17, IDC_CONTENT_CONTEXT_LOOP},
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {18, IDC_CONTENT_CONTEXT_CONTROLS},
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {19, IDC_CONTENT_CONTEXT_ROTATECW},
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {20, IDC_CONTENT_CONTEXT_ROTATECCW},
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {21, IDC_BACK},
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {22, IDC_FORWARD},
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {23, IDC_SAVE_PAGE},
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {24, IDC_RELOAD},
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {25, IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP},
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {26, IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP},
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {27, IDC_PRINT},
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {28, IDC_VIEW_SOURCE},
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {29, IDC_CONTENT_CONTEXT_INSPECTELEMENT},
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {30, IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE},
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {31, IDC_CONTENT_CONTEXT_VIEWPAGEINFO},
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {32, IDC_CONTENT_CONTEXT_TRANSLATE},
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {33, IDC_CONTENT_CONTEXT_RELOADFRAME},
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {34, IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE},
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {35, IDC_CONTENT_CONTEXT_VIEWFRAMEINFO},
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {36, IDC_CONTENT_CONTEXT_UNDO},
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {37, IDC_CONTENT_CONTEXT_REDO},
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {38, IDC_CONTENT_CONTEXT_CUT},
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {39, IDC_CONTENT_CONTEXT_COPY},
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {40, IDC_CONTENT_CONTEXT_PASTE},
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {41, IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE},
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {42, IDC_CONTENT_CONTEXT_DELETE},
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {43, IDC_CONTENT_CONTEXT_SELECTALL},
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {44, IDC_CONTENT_CONTEXT_SEARCHWEBFOR},
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {45, IDC_CONTENT_CONTEXT_GOTOURL},
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {46, IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS},
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {47, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS},
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {48, IDC_CONTENT_CONTEXT_ADDSEARCHENGINE},
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {52, IDC_CONTENT_CONTEXT_OPENLINKWITH},
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {53, IDC_CHECK_SPELLING_WHILE_TYPING},
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {54, IDC_SPELLCHECK_MENU},
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {55, IDC_CONTENT_CONTEXT_SPELLING_TOGGLE},
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {56, IDC_SPELLCHECK_LANGUAGES_FIRST},
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {57, IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE},
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {58, IDC_SPELLCHECK_SUGGESTION_0},
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {59, IDC_SPELLCHECK_ADD_TO_DICTIONARY},
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {60, IDC_SPELLPANEL_TOGGLE},
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Add new items here and use |enum_id| from the next line.
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {61, 0},  // Must be the last. Increment |enum_id| when new IDC was added.
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Collapses large ranges of ids before looking for UMA enum.
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint CollapseCommandsForUMA(int id) {
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!RenderViewContextMenu::IsContentCustomCommandId(id));
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!ContextMenuMatcher::IsExtensionsCustomCommandId(id));
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST &&
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) {
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (id >= IDC_SPELLCHECK_LANGUAGES_FIRST &&
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      id <= IDC_SPELLCHECK_LANGUAGES_LAST) {
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return IDC_SPELLCHECK_LANGUAGES_FIRST;
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (id >= IDC_SPELLCHECK_SUGGESTION_0 &&
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      id <= IDC_SPELLCHECK_SUGGESTION_LAST) {
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return IDC_SPELLCHECK_SUGGESTION_0;
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return id;
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns UMA enum value for command specified by |id| or -1 if not found.
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int FindUMAEnumValueForCommand(int id) {
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (RenderViewContextMenu::IsContentCustomCommandId(id))
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 0;
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ContextMenuMatcher::IsExtensionsCustomCommandId(id))
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 1;
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  id = CollapseCommandsForUMA(id);
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const size_t kMappingSize = arraysize(kUmaEnumToControlId);
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < kMappingSize; ++i) {
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (kUmaEnumToControlId[i].control_id == id) {
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return kUmaEnumToControlId[i].enum_id;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return -1;
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Usually a new tab is expected where this function is used,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// however users should be able to open a tab in background
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or in a new window.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowOpenDisposition ForceNewTabDispositionFromEventFlags(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int event_flags) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition =
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::DispositionFromEventFlags(event_flags);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Helper function to escape "&" as "&&".
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EscapeAmpersands(base::string16* text) {
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ReplaceChars(*text, base::ASCIIToUTF16("&"), base::ASCIIToUTF16("&&"),
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     text);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Returns the preference of the profile represented by the |context|.
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)PrefService* GetPrefs(content::BrowserContext* context) {
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return user_prefs::UserPrefs::Get(context);
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ExtensionPatternMatch(const extensions::URLPatternSet& patterns,
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           const GURL& url) {
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // No patterns means no restriction, so that implicitly matches.
28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (patterns.is_empty())
28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return true;
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return patterns.MatchesURL(url);
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const GURL& GetDocumentURL(const content::ContextMenuParams& params) {
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return params.frame_url.is_empty() ? params.page_url : params.frame_url;
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)content::Referrer CreateSaveAsReferrer(
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const GURL& url,
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const content::ContextMenuParams& params) {
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const GURL& referring_url = GetDocumentURL(params);
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return content::Referrer::SanitizeForRequest(
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      url,
29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      content::Referrer(referring_url.GetAsReferrer(), params.referrer_policy));
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool g_custom_id_ranges_initialized = false;
30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const int kSpellcheckRadioGroup = 1;
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::IsDevToolsURL(const GURL& url) {
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return url.SchemeIs(content::kChromeDevToolsScheme);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::IsInternalResourcesURL(const GURL& url) {
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!url.SchemeIs(content::kChromeUIScheme))
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return url.host() == chrome::kChromeUISyncResourcesHost;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewContextMenu::RenderViewContextMenu(
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::RenderFrameHost* render_frame_host,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params)
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : RenderViewContextMenuBase(render_frame_host, params),
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extension_items_(browser_context_,
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       this,
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       &menu_model_,
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       base::Bind(MenuItemMatchesParams, params_)),
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      protocol_handler_submenu_model_(this),
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      protocol_handler_registry_(
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ProtocolHandlerRegistryFactory::GetForBrowserContext(GetProfile())) {
33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!g_custom_id_ranges_initialized) {
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    g_custom_id_ranges_initialized = true;
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SetContentCustomCommandIdRange(IDC_CONTENT_CONTEXT_CUSTOM_FIRST,
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   IDC_CONTENT_CONTEXT_CUSTOM_LAST);
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  set_content_type(ContextMenuContentTypeFactory::Create(
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_web_contents_, params));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewContextMenu::~RenderViewContextMenu() {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Menu construction functions -------------------------------------------------
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::ExtensionContextAndPatternMatch(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params,
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const MenuItem::ContextList& contexts,
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const extensions::URLPatternSet& target_url_patterns) {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool has_link = !params.link_url.is_empty();
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool has_selection = !params.selection_text.empty();
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool in_frame = !params.frame_url.is_empty();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contexts.Contains(MenuItem::ALL) ||
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (has_selection && contexts.Contains(MenuItem::SELECTION)) ||
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (params.is_editable && contexts.Contains(MenuItem::EDITABLE)) ||
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (in_frame && contexts.Contains(MenuItem::FRAME)))
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_link && contexts.Contains(MenuItem::LINK) &&
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionPatternMatch(target_url_patterns, params.link_url))
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (params.media_type) {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebContextMenuData::MediaTypeImage:
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (contexts.Contains(MenuItem::IMAGE) &&
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ExtensionPatternMatch(target_url_patterns, params.src_url))
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebContextMenuData::MediaTypeVideo:
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (contexts.Contains(MenuItem::VIDEO) &&
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ExtensionPatternMatch(target_url_patterns, params.src_url))
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebContextMenuData::MediaTypeAudio:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (contexts.Contains(MenuItem::AUDIO) &&
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ExtensionPatternMatch(target_url_patterns, params.src_url))
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PAGE is the least specific context, so we only examine that if none of the
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other contexts apply (except for FRAME, which is included in PAGE for
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // backwards compatibility).
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_link && !has_selection && !params.is_editable &&
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.media_type == WebContextMenuData::MediaTypeNone &&
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contexts.Contains(MenuItem::PAGE))
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::MenuItemMatchesParams(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const extensions::MenuItem* item) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool match = ExtensionContextAndPatternMatch(params, item->contexts(),
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               item->target_url_patterns());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!match)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& document_url = GetDocumentURL(params);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ExtensionPatternMatch(item->document_url_patterns(), document_url);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendAllExtensionItems() {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_items_.Clear();
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service =
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::ExtensionSystem::Get(browser_context_)->extension_service();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // In unit-tests, we may not have an ExtensionService.
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MenuManager* menu_manager = MenuManager::Get(browser_context_);
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!menu_manager)
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 printable_selection_text = PrintableSelectionText();
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EscapeAmpersands(&printable_selection_text);
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Get a list of extension id's that have context menu items, and sort by the
4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // top level context menu title of the extension.
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::set<MenuItem::ExtensionKey> ids = menu_manager->ExtensionIds();
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<base::string16> sorted_menu_titles;
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::map<base::string16, std::string> map_ids;
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (std::set<MenuItem::ExtensionKey>::iterator iter = ids.begin();
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       iter != ids.end();
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       ++iter) {
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const Extension* extension =
4336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        service->GetExtensionById(iter->extension_id, false);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Platform apps have their context menus created directly in
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // AppendPlatformAppItems.
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (extension && !extension->is_platform_app()) {
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::string16 menu_title = extension_items_.GetTopLevelContextMenuTitle(
4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          *iter, printable_selection_text);
4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      map_ids[menu_title] = iter->extension_id;
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sorted_menu_titles.push_back(menu_title);
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (sorted_menu_titles.empty())
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const std::string app_locale = g_browser_process->GetApplicationLocale();
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  l10n_util::SortStrings16(app_locale, &sorted_menu_titles);
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (size_t i = 0; i < sorted_menu_titles.size(); ++i) {
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& id = map_ids[sorted_menu_titles[i]];
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const MenuItem::ExtensionKey extension_key(id);
4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    extension_items_.AppendExtensionItems(extension_key,
4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          printable_selection_text,
4556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          &index,
4566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          false);  // is_action_menu
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderViewContextMenu::AppendCurrentExtensionItems() {
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Avoid appending extension related items when |extension| is null.
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // For Panel, this happens when the panel is navigated to a url outside of the
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // extension's package.
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const Extension* extension = GetExtension();
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (extension) {
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Only add extension items from this extension.
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int index = 0;
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const MenuItem::ExtensionKey key(
4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extension->id(),
4706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        extensions::WebViewGuest::GetViewInstanceId(source_web_contents_));
4716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    extension_items_.AppendExtensionItems(key,
4726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          PrintableSelectionText(),
4736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          &index,
4746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          false);  // is_action_menu
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderViewContextMenu::InitMenu() {
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderViewContextMenuBase::InitMenu();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE))
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendPageItems();
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_FRAME)) {
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Merge in frame items with page items if we clicked within a frame that
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // needs them.
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendFrameItems();
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK)) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendLinkItems();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (params_.media_type != WebContextMenuData::MediaTypeNone)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_MEDIA_IMAGE)) {
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendImageItems();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_SEARCHWEBFORIMAGE)) {
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendSearchWebForImageItems();
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_MEDIA_VIDEO)) {
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendVideoItems();
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_MEDIA_AUDIO)) {
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendAudioItems();
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_MEDIA_CANVAS)) {
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    AppendCanvasItems();
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (content_type_->SupportsGroup(
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_MEDIA_PLUGIN)) {
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendPluginItems();
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ITEM_GROUP_MEDIA_FILE has no specific items.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_EDITABLE))
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendEditableItems();
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_COPY)) {
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(!content_type_->SupportsGroup(
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               ContextMenuContentType::ITEM_GROUP_EDITABLE));
535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendCopyItem();
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_SEARCH_PROVIDER)) {
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendSearchProvider();
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PRINT))
544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendPrintItem();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION)) {
548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(!content_type_->SupportsGroup(
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION));
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendAllExtensionItems();
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION)) {
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(!content_type_->SupportsGroup(
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION));
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendCurrentExtensionItems();
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_DEVELOPER)) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendDeveloperItems();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_DEVTOOLS_UNPACKED_EXT)) {
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendDevtoolsForUnpackedExtensions();
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type_->SupportsGroup(
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_PRINT_PREVIEW)) {
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AppendPrintPreviewItems();
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Profile* RenderViewContextMenu::GetProfile() {
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Profile::FromBrowserContext(browser_context_);
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderViewContextMenu::RecordUsedItem(int id) {
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int enum_id = FindUMAEnumValueForCommand(id);
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (enum_id != -1) {
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const size_t kMappingSize = arraysize(kUmaEnumToControlId);
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.Used", enum_id,
5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              kUmaEnumToControlId[kMappingSize - 1].enum_id);
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NOTREACHED() << "Update kUmaEnumToControlId. Unhanded IDC: " << id;
5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderViewContextMenu::RecordShownItem(int id) {
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int enum_id = FindUMAEnumValueForCommand(id);
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (enum_id != -1) {
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const size_t kMappingSize = arraysize(kUmaEnumToControlId);
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.Shown", enum_id,
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              kUmaEnumToControlId[kMappingSize - 1].enum_id);
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Just warning here. It's harder to maintain list of all possibly
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // visible items than executable items.
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DLOG(ERROR) << "Update kUmaEnumToControlId. Unhanded IDC: " << id;
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderViewContextMenu::HandleAuthorizeAllPlugins() {
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins(
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_web_contents_, false, std::string());
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderViewContextMenu::AppendPrintPreviewItems() {
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_FULL_PRINTING)
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!print_preview_menu_observer_.get()) {
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    print_preview_menu_observer_.reset(
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        new PrintPreviewContextMenuObserver(source_web_contents_));
616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  observers_.AddObserver(print_preview_menu_observer_.get());
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const Extension* RenderViewContextMenu::GetExtension() const {
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  extensions::ExtensionSystem* system =
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::ExtensionSystem::Get(browser_context_);
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // There is no process manager in some tests.
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!system->process_manager())
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return NULL;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return system->process_manager()->GetExtensionForRenderViewHost(
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      source_web_contents_->GetRenderViewHost());
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendDeveloperItems() {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show Inspect Element in DevTools itself only in case of the debug
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // devtools build.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool show_developer_items = !IsDevToolsURL(params_.page_url);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(DEBUG_DEVTOOLS)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  show_developer_items = true;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!show_developer_items)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the DevTools popup menu, "developer items" is normally the only
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // section, so omit the separator there.
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_INSPECTELEMENT,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_INSPECTELEMENT);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderViewContextMenu::AppendDevtoolsForUnpackedExtensions() {
653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add a separator if there are any items already in the menu.
654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP,
657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_RELOAD_PACKAGED_APP);
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP,
659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_RESTART_APP);
660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AppendDeveloperItems();
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE,
662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE);
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendLinkItems() {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!params_.link_url.is_empty()) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_OPENLINKNEWTAB);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW,
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_OPENLINKNEWWINDOW);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (params_.link_url.is_valid()) {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppendProtocolHandlerSubMenu();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD,
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVELINKAS,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_SAVELINKAS);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_COPYLINKLOCATION,
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      params_.link_url.SchemeIs(url::kMailToScheme) ?
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_COPYEMAILADDRESS :
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_COPYLINKLOCATION);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendImageItems() {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_SAVEIMAGEAS);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGELOCATION,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_COPYIMAGELOCATION);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_COPYIMAGE);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB,
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB);
697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderViewContextMenu::AppendSearchWebForImageItems() {
700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURLService* service =
7015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(GetProfile());
702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const TemplateURL* const default_provider =
703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service->GetDefaultSearchProvider();
704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (params_.has_image_contents && default_provider &&
705424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      !default_provider->image_url().empty() &&
706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      default_provider->image_url_ref().IsValid(service->search_terms_data())) {
707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    menu_model_.AddItem(
7083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE,
709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_SEARCHWEBFORIMAGE,
710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   default_provider->short_name()));
711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendAudioItems() {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMediaItems();
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_SAVEAUDIOAS);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYAVLOCATION,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderViewContextMenu::AppendCanvasItems() {
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS,
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  IDS_CONTENT_CONTEXT_SAVEIMAGEAS);
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE,
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  IDS_CONTENT_CONTEXT_COPYIMAGE);
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendVideoItems() {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMediaItems();
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_SAVEVIDEOAS);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYAVLOCATION,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendMediaItems() {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int media_flags = params_.media_flags;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_PLAYPAUSE,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_flags & WebContextMenuData::MediaPaused ?
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_PLAY :
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_PAUSE);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_MUTE,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_flags & WebContextMenuData::MediaMuted ?
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_UNMUTE :
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CONTENT_CONTEXT_MUTE);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddCheckItemWithStringId(IDC_CONTENT_CONTEXT_LOOP,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       IDS_CONTENT_CONTEXT_LOOP);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddCheckItemWithStringId(IDC_CONTENT_CONTEXT_CONTROLS,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       IDS_CONTENT_CONTEXT_CONTROLS);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendPluginItems() {
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params_.page_url == params_.src_url) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Full page plugin, so show page menu items.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (params_.link_url.is_empty() && params_.selection_text.empty())
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppendPageItems();
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS,
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_SAVEPAGEAS);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params_.media_flags & WebContextMenuData::MediaCanRotate) {
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ROTATECW,
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_ROTATECW);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ROTATECCW,
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_ROTATECCW);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendPageItems() {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_BACK, IDS_CONTENT_CONTEXT_BACK);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_FORWARD, IDS_CONTENT_CONTEXT_FORWARD);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_RELOAD, IDS_CONTENT_CONTEXT_RELOAD);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_SAVE_PAGE,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_SAVEPAGEAS);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
793c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (TranslateService::IsTranslatableURL(params_.page_url)) {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string locale = g_browser_process->GetApplicationLocale();
7955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    locale = translate::TranslateDownloadManager::GetLanguageCode(locale);
796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 language =
797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        l10n_util::GetDisplayNameForLocale(locale, locale, true);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItem(
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDC_CONTENT_CONTEXT_TRANSLATE,
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_TRANSLATE, language));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_VIEW_SOURCE,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_VIEWPAGESOURCE);
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWPAGEINFO,
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_VIEWPAGEINFO);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendFrameItems() {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RELOADFRAME,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_RELOADFRAME);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These two menu items have yet to be implemented.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=11827
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   IDS_CONTENT_CONTEXT_SAVEFRAMEAS
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   IDS_CONTENT_CONTEXT_PRINTFRAME
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE,
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_VIEWFRAMESOURCE);
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMEINFO,
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_VIEWFRAMEINFO);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendCopyItem() {
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY,
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_COPY);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewContextMenu::AppendPrintItem() {
8285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (GetPrefs(browser_context_)->GetBoolean(prefs::kPrintingEnabled) &&
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (params_.media_type == WebContextMenuData::MediaTypeNone ||
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       params_.media_flags & WebContextMenuData::MediaCanPrint)) {
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT);
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendSearchProvider() {
8365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(browser_context_);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TrimWhitespace(params_.selection_text, base::TRIM_ALL,
839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       &params_.selection_text);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params_.selection_text.empty())
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ReplaceChars(params_.selection_text, AutocompleteMatch::kInvalidChars,
8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::ASCIIToUTF16(" "), &params_.selection_text);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch match;
84703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  AutocompleteClassifierFactory::GetForProfile(GetProfile())->Classify(
84803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      params_.selection_text,
84903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      false,
85003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      false,
85103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      metrics::OmniboxEventProto::INVALID_SPEC,
85203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &match,
85303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      NULL);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selection_navigation_url_ = match.destination_url;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!selection_navigation_url_.is_valid())
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 printable_selection_text = PrintableSelectionText();
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EscapeAmpersands(&printable_selection_text);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AutocompleteMatch::IsSearchType(match.type)) {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TemplateURL* const default_provider =
8635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        TemplateURLServiceFactory::GetForProfile(GetProfile())
8645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            ->GetDefaultSearchProvider();
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!default_provider)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItem(
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDC_CONTENT_CONTEXT_SEARCHWEBFOR,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_SEARCHWEBFOR,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   default_provider->short_name(),
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   printable_selection_text));
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((selection_navigation_url_ != params_.link_url) &&
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme(
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            selection_navigation_url_.scheme())) {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu_model_.AddItem(
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDC_CONTENT_CONTEXT_GOTOURL,
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_GOTOURL,
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     printable_selection_text));
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendEditableItems() {
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool use_spellcheck_and_search = !chrome::IsRunningInForcedAppMode();
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (use_spellcheck_and_search)
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendSpellingSuggestionsSubMenu();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_UNDO,
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_UNDO);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_REDO,
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_REDO);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_CUT,
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_CUT);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_COPY);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_PASTE,
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_PASTE);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE,
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_DELETE,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_DELETE);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (use_spellcheck_and_search && !params_.keyword_url.is_empty()) {
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ADDSEARCHENGINE,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    IDS_CONTENT_CONTEXT_ADDSEARCHENGINE);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (use_spellcheck_and_search)
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendSpellcheckOptionsSubMenu();
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendPlatformEditableItems();
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SELECTALL,
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  IDS_CONTENT_CONTEXT_SELECTALL);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendSpellingSuggestionsSubMenu() {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!spelling_menu_observer_.get())
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    spelling_menu_observer_.reset(new SpellingMenuObserver(this));
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(spelling_menu_observer_.get());
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spelling_menu_observer_->InitMenu(params_);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendSpellcheckOptionsSubMenu() {
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!spellchecker_submenu_observer_.get()) {
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    spellchecker_submenu_observer_.reset(new SpellCheckerSubMenuObserver(
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, this, kSpellcheckRadioGroup));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spellchecker_submenu_observer_->InitMenu(params_);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(spellchecker_submenu_observer_.get());
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::AppendProtocolHandlerSubMenu() {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProtocolHandlerRegistry::ProtocolHandlerList handlers =
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHandlersForLinkUrl();
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handlers.empty())
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t max = IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST -
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < handlers.size() && i <= max; i++) {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protocol_handler_submenu_model_.AddItem(
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST + i,
948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::UTF8ToUTF16(handlers[i].url().host()));
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protocol_handler_submenu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protocol_handler_submenu_model_.AddItem(
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS,
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_OPENLINKWITH_CONFIGURE));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu_model_.AddSubMenu(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_OPENLINKWITH,
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_OPENLINKWITH),
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &protocol_handler_submenu_model_);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Menu delegate functions -----------------------------------------------------
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::IsCommandIdEnabled(int id) const {
9646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {
9656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool enabled = false;
9666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (RenderViewContextMenuBase::IsCommandIdKnown(id, &enabled))
9676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return enabled;
9686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CoreTabHelper* core_tab_helper =
971ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      CoreTabHelper::FromWebContents(source_web_contents_);
972ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int content_restrictions = 0;
973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (core_tab_helper)
974ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    content_restrictions = core_tab_helper->content_restrictions();
975c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (id == IDC_PRINT && (content_restrictions & CONTENT_RESTRICTION_PRINT))
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (id == IDC_SAVE_PAGE &&
979ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      (content_restrictions & CONTENT_RESTRICTION_SAVE)) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PrefService* prefs = GetPrefs(browser_context_);
9845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow Spell Check language items on sub menu for text area context menu.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((id >= IDC_SPELLCHECK_LANGUAGES_FIRST) &&
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (id < IDC_SPELLCHECK_LANGUAGES_LAST)) {
9885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return prefs->GetBoolean(prefs::kEnableContinuousSpellcheck);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension items.
9925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ContextMenuMatcher::IsExtensionsCustomCommandId(id))
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_items_.IsCommandIdEnabled(id);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST &&
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::Availability incognito_avail =
10015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      IncognitoModePrefs::GetAvailability(prefs);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (id) {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_BACK:
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return source_web_contents_->GetController().CanGoBack();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_FORWARD:
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return source_web_contents_->GetController().CanGoForward();
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_RELOAD: {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CoreTabHelper* core_tab_helper =
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CoreTabHelper::FromWebContents(source_web_contents_);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!core_tab_helper)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CoreTabHelperDelegate* core_delegate = core_tab_helper->delegate();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !core_delegate ||
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             core_delegate->CanReloadContents(source_web_contents_);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_VIEW_SOURCE:
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE:
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return source_web_contents_->GetController().CanViewSource();
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_INSPECTELEMENT:
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE:
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP:
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP:
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return IsDevCommandEnabled(id);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_VIEWPAGEINFO:
1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (source_web_contents_->GetController().GetVisibleEntry() == NULL)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Disabled if no browser is associated (e.g. desktop notifications).
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (chrome::FindBrowserWithWebContents(source_web_contents_) == NULL)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_TRANSLATE: {
103946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ChromeTranslateClient* chrome_translate_client =
104046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          ChromeTranslateClient::FromWebContents(source_web_contents_);
104146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (!chrome_translate_client)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string original_lang =
104446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          chrome_translate_client->GetLanguageState().original_language();
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string target_lang = g_browser_process->GetApplicationLocale();
10465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      target_lang =
10475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          translate::TranslateDownloadManager::GetLanguageCode(target_lang);
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Note that we intentionally enable the menu even if the original and
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // target languages are identical.  This is to give a way to user to
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // translate a page that might contains text fragments in a different
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // language.
105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return ((params_.edit_flags & WebContextMenuData::CanTranslate) != 0) &&
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !original_lang.empty() &&  // Did we receive the page language yet?
105446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             !chrome_translate_client->GetLanguageState().IsPageTranslated() &&
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !source_web_contents_->GetInterstitialPage() &&
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             // There are some application locales which can't be used as a
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             // target language for translation.
10585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             translate::TranslateDownloadManager::IsSupportedLanguage(
10595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 target_lang) &&
1060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             // Disable on the Instant Extended NTP.
1061868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             !chrome::IsInstantNTP(source_web_contents_);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB:
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW:
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return params_.link_url.is_valid();
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYLINKLOCATION:
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return params_.unfiltered_link_url.is_valid();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SAVELINKAS: {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* local_state = g_browser_process->local_state();
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(local_state);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Test if file-selection dialogs are forbidden by policy.
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs))
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return params_.link_url.is_valid() &&
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ProfileIOData::IsHandledProtocol(params_.link_url.scheme());
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SAVEIMAGEAS: {
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* local_state = g_browser_process->local_state();
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(local_state);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Test if file-selection dialogs are forbidden by policy.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs))
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return params_.has_image_contents;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // The images shown in the most visited thumbnails can't be opened or
10933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // searched for conventionally.
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB:
10953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    case IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE:
10963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      return params_.src_url.is_valid() &&
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          (params_.src_url.scheme() != content::kChromeUIScheme);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYIMAGE:
1100424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return params_.has_image_contents;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Media control commands should all be disabled if the player is in an
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // error state.
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PLAYPAUSE:
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_LOOP:
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (params_.media_flags &
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              WebContextMenuData::MediaInError) == 0;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mute and unmute should also be disabled if the player has no audio.
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_MUTE:
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (params_.media_flags &
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              WebContextMenuData::MediaHasAudio) != 0 &&
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (params_.media_flags &
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              WebContextMenuData::MediaInError) == 0;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_CONTROLS:
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (params_.media_flags &
1118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              WebContextMenuData::MediaCanToggleControls) != 0;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_ROTATECW:
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_ROTATECCW:
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (params_.media_flags & WebContextMenuData::MediaCanRotate) != 0;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYAVLOCATION:
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION:
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return params_.src_url.is_valid();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SAVEAVAS: {
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* local_state = g_browser_process->local_state();
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(local_state);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Test if file-selection dialogs are forbidden by policy.
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs))
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url = params_.src_url;
1137c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      bool can_save =
1138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch          (params_.media_flags & WebContextMenuData::MediaCanSave) &&
1139c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch          url.is_valid() && ProfileIOData::IsHandledProtocol(url.scheme());
1140c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Do not save the preview PDF on the print preview page.
1142c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      can_save = can_save &&
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !(printing::PrintPreviewDialogController::IsPrintPreviewURL(url));
1144c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif
1145c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      return can_save;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENAVNEWTAB:
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SAVE_PAGE: {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CoreTabHelper* core_tab_helper =
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CoreTabHelper::FromWebContents(source_web_contents_);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!core_tab_helper)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CoreTabHelperDelegate* core_delegate = core_tab_helper->delegate();
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (core_delegate &&
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !core_delegate->CanSaveContents(source_web_contents_))
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* local_state = g_browser_process->local_state();
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(local_state);
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Test if file-selection dialogs are forbidden by policy.
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs))
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // We save the last committed entry (which the user is looking at), as
1169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // opposed to any pending URL that hasn't committed yet.
1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NavigationEntry* entry =
1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          source_web_contents_->GetController().GetLastCommittedEntry();
1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return content::IsSavableURL(entry ? entry->GetURL() : GURL());
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_RELOADFRAME:
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return params_.frame_url.is_valid();
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_UNDO:
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanUndo);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_REDO:
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanRedo);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_CUT:
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanCut);
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPY:
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanCopy);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PASTE:
11916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE: {
11926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      std::vector<base::string16> types;
11936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      bool ignore;
11946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ui::Clipboard::GetForCurrentThread()->ReadAvailableTypes(
11956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ui::CLIPBOARD_TYPE_COPY_PASTE, &types, &ignore);
11966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !types.empty();
11976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_DELETE:
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanDelete);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SELECTALL:
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanSelectAll);
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD:
12055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return !browser_context_->IsOffTheRecord() &&
12065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             params_.link_url.is_valid() &&
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             incognito_avail != IncognitoModePrefs::DISABLED;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_PRINT:
12105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return prefs->GetBoolean(prefs::kPrintingEnabled) &&
12115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             (params_.media_type == WebContextMenuData::MediaTypeNone ||
12125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              params_.media_flags & WebContextMenuData::MediaCanPrint);
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SEARCHWEBFOR:
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_GOTOURL:
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLPANEL_TOGGLE:
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS:
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_VIEWFRAMEINFO:
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Disabled if no browser is associated (e.g. desktop notifications).
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (chrome::FindBrowserWithWebContents(source_web_contents_) == NULL)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CHECK_SPELLING_WHILE_TYPING:
12265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return prefs->GetBoolean(prefs::kEnableContinuousSpellcheck);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) && defined(OS_POSIX)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(suzhe): this should not be enabled for password fields.
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_INPUT_METHODS_MENU:
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_ADDSEARCHENGINE:
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return !params_.keyword_url.is_empty();
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SPELLCHECK_MENU:
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKWITH:
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS:
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::IsCommandIdChecked(int id) const {
12535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (RenderViewContextMenuBase::IsCommandIdChecked(id))
12545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if the video is set to looping.
125703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (id == IDC_CONTENT_CONTEXT_LOOP)
125803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return (params_.media_flags & WebContextMenuData::MediaLoop) != 0;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (id == IDC_CONTENT_CONTEXT_CONTROLS)
126103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return (params_.media_flags & WebContextMenuData::MediaControls) != 0;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension items.
12645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ContextMenuMatcher::IsExtensionsCustomCommandId(id))
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_items_.IsCommandIdChecked(id);
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) {
12715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderViewContextMenuBase::ExecuteCommand(id, event_flags);
12725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (command_executed_)
12735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  command_executed_ = true;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderFrameHost* render_frame_host = GetRenderFrameHost();
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process extension menu items.
12795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ContextMenuMatcher::IsExtensionsCustomCommandId(id)) {
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_items_.ExecuteCommand(id, source_web_contents_, params_);
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST &&
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) {
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandlerRegistry::ProtocolHandlerList handlers =
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetHandlersForLinkUrl();
128803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (handlers.empty())
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
129003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("RegisterProtocolHandler.ContextMenu_Open"));
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int handlerIndex = id - IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowOpenDisposition disposition =
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ForceNewTabDispositionFromEventFlags(event_flags);
129603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    OpenURL(handlers[handlerIndex].TranslateUrl(params_.link_url),
129703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            GetDocumentURL(params_),
129803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            disposition,
12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ui::PAGE_TRANSITION_LINK);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (id) {
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB: {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser =
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          chrome::FindBrowserWithWebContents(source_web_contents_);
130703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      OpenURL(params_.link_url,
130803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              GetDocumentURL(params_),
130903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              !browser || browser->is_app() ?
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB,
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ui::PAGE_TRANSITION_LINK);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW:
131503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      OpenURL(params_.link_url,
131603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              GetDocumentURL(params_),
131703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              NEW_WINDOW,
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ui::PAGE_TRANSITION_LINK);
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD:
1322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      OpenURL(params_.link_url, GURL(), OFF_THE_RECORD,
13231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ui::PAGE_TRANSITION_LINK);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SAVELINKAS: {
1327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RecordDownloadSource(DOWNLOAD_INITIATED_BY_CONTEXT_MENU);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url = params_.link_url;
132903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      content::Referrer referrer = CreateSaveAsReferrer(url, params_);
13305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      DownloadManager* dlm =
13315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          BrowserContext::GetDownloadManager(browser_context_);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadUrlParameters> dl_params(
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DownloadUrlParameters::FromWebContents(source_web_contents_, url));
13345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      dl_params->set_referrer(referrer);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dl_params->set_referrer_encoding(params_.frame_charset);
1336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      dl_params->set_suggested_name(params_.suggested_filename);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dl_params->set_prompt(true);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dlm->DownloadUrl(dl_params.Pass());
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SAVEAVAS:
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SAVEIMAGEAS: {
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool is_large_data_url = params_.has_image_contents &&
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params_.src_url.is_empty();
13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (params_.media_type == WebContextMenuData::MediaTypeCanvas ||
13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          (params_.media_type == WebContextMenuData::MediaTypeImage &&
13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              is_large_data_url)) {
1349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        source_web_contents_->GetRenderViewHost()->SaveImageAt(
1350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          params_.x, params_.y);
1351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      } else {
1352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        RecordDownloadSource(DOWNLOAD_INITIATED_BY_CONTEXT_MENU);
1353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        const GURL& url = params_.src_url;
135403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        content::Referrer referrer = CreateSaveAsReferrer(url, params_);
13555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        source_web_contents_->SaveFrame(url, referrer);
1356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYLINKLOCATION:
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteURLToClipboard(params_.unfiltered_link_url);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION:
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYAVLOCATION:
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteURLToClipboard(params_.src_url);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPYIMAGE:
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CopyImageAt(params_.x, params_.y);
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    case IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE:
1374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      GetImageThumbnailForSearch();
1375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      break;
1376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB:
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_OPENAVNEWTAB:
137903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      OpenURL(params_.src_url,
138003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              GetDocumentURL(params_),
138103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              NEW_BACKGROUND_TAB,
13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ui::PAGE_TRANSITION_LINK);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PLAYPAUSE: {
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool play = !!(params_.media_flags & WebContextMenuData::MediaPaused);
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (play) {
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::RecordAction(UserMetricsAction("MediaContextMenu_Play"));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::RecordAction(UserMetricsAction("MediaContextMenu_Pause"));
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaPlayerActionAt(gfx::Point(params_.x, params_.y),
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          WebMediaPlayerAction(
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WebMediaPlayerAction::Play, play));
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_MUTE: {
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool mute = !(params_.media_flags & WebContextMenuData::MediaMuted);
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mute) {
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::RecordAction(UserMetricsAction("MediaContextMenu_Mute"));
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::RecordAction(UserMetricsAction("MediaContextMenu_Unmute"));
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaPlayerActionAt(gfx::Point(params_.x, params_.y),
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          WebMediaPlayerAction(
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WebMediaPlayerAction::Mute, mute));
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_LOOP:
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(UserMetricsAction("MediaContextMenu_Loop"));
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaPlayerActionAt(gfx::Point(params_.x, params_.y),
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          WebMediaPlayerAction(
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WebMediaPlayerAction::Loop,
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              !IsCommandIdChecked(IDC_CONTENT_CONTEXT_LOOP)));
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_CONTROLS:
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(UserMetricsAction("MediaContextMenu_Controls"));
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaPlayerActionAt(
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point(params_.x, params_.y),
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WebMediaPlayerAction(
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              WebMediaPlayerAction::Controls,
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              !IsCommandIdChecked(IDC_CONTENT_CONTEXT_CONTROLS)));
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_ROTATECW:
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UserMetricsAction("PluginContextMenu_RotateClockwise"));
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PluginActionAt(
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point(params_.x, params_.y),
143303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          WebPluginAction(WebPluginAction::Rotate90Clockwise, true));
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_ROTATECCW:
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UserMetricsAction("PluginContextMenu_RotateCounterclockwise"));
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PluginActionAt(
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point(params_.x, params_.y),
144103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          WebPluginAction(WebPluginAction::Rotate90Counterclockwise, true));
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_BACK:
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_web_contents_->GetController().GoBack();
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_FORWARD:
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_web_contents_->GetController().GoForward();
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_SAVE_PAGE:
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_web_contents_->OnSavePage();
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_RELOAD:
14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_web_contents_->GetController().Reload(true);
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP: {
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* platform_app = GetExtension();
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(platform_app);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(platform_app->is_platform_app());
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::ExtensionSystem::Get(browser_context_)
14665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ->extension_service()
14675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ->ReloadExtension(platform_app->id());
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP: {
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* platform_app = GetExtension();
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(platform_app);
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(platform_app->is_platform_app());
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      apps::AppLoadService::Get(GetProfile())
14775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ->RestartApplication(platform_app->id());
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case IDC_PRINT: {
1482c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_PRINTING)
14831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (params_.media_type != WebContextMenuData::MediaTypeNone) {
1484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (render_frame_host) {
1485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          render_frame_host->Send(new PrintMsg_PrintNodeUnderContextMenu(
1486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              render_frame_host->GetRoutingID()));
1487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
14881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING)
14921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      printing::PrintViewManager* print_view_manager =
14931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          printing::PrintViewManager::FromWebContents(source_web_contents_);
14941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!print_view_manager)
14951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
14961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!GetPrefs(browser_context_)
14971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               ->GetBoolean(prefs::kPrintPreviewDisabled)) {
14981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        print_view_manager->PrintPreviewNow(!params_.selection_text.empty());
14991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
15001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
15011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else   // ENABLE_FULL_PRINTING
15021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      printing::PrintViewManagerBasic* print_view_manager =
15031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          printing::PrintViewManagerBasic::FromWebContents(
15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              source_web_contents_);
15051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!print_view_manager)
15061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
15071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // ENABLE_FULL_PRINTING
15081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_BASIC_PRINTING)
15101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      print_view_manager->PrintNow();
15111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // !DISABLE_BASIC_PRINTING
15121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // ENABLE_PRINTING
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_VIEW_SOURCE:
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_web_contents_->ViewSource();
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_INSPECTELEMENT:
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Inspect(params_.x, params_.y);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE: {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* platform_app = GetExtension();
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(platform_app);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(platform_app->is_platform_app());
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::devtools_util::InspectBackgroundPage(platform_app,
15315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                       GetProfile());
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_VIEWPAGEINFO: {
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NavigationController* controller = &source_web_contents_->GetController();
15373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      // Important to use GetVisibleEntry to match what's showing in the
1538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // omnibox.  This may return null.
15393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      NavigationEntry* nav_entry = controller->GetVisibleEntry();
1540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!nav_entry)
1541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser =
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          chrome::FindBrowserWithWebContents(source_web_contents_);
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::ShowWebsiteSettings(browser, source_web_contents_,
15457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  nav_entry->GetURL(), nav_entry->GetSSL());
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_TRANSLATE: {
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // A translation might have been triggered by the time the menu got
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // selected, do nothing in that case.
155246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ChromeTranslateClient* chrome_translate_client =
155346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          ChromeTranslateClient::FromWebContents(source_web_contents_);
155446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (!chrome_translate_client ||
155546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          chrome_translate_client->GetLanguageState().IsPageTranslated() ||
155646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          chrome_translate_client->GetLanguageState().translation_pending()) {
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string original_lang =
156046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          chrome_translate_client->GetLanguageState().original_language();
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string target_lang = g_browser_process->GetApplicationLocale();
15625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      target_lang =
15635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          translate::TranslateDownloadManager::GetLanguageCode(target_lang);
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Since the user decided to translate for that language and site, clears
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // any preferences for not translating them.
15665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_ptr<translate::TranslatePrefs> prefs(
15675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ChromeTranslateClient::CreateTranslatePrefs(
15685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              GetPrefs(browser_context_)));
15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs->UnblockLanguage(original_lang);
15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs->RemoveSiteFromBlacklist(params_.page_url.HostNoBrackets());
15715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      translate::TranslateManager* manager =
157246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          chrome_translate_client->GetTranslateManager();
1573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK(manager);
1574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      manager->TranslatePage(original_lang, target_lang, true);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_RELOADFRAME:
1579e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // We always obey the cache here.
1580e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // TODO(evanm): Perhaps we could allow shift-clicking the menu item to do
1581e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // a cache-ignoring reload of the frame.
1582e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      source_web_contents_->ReloadFocusedFrame(false);
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE:
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_web_contents_->ViewFrameSource(params_.frame_url,
158790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                            params_.frame_page_state);
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_VIEWFRAMEINFO: {
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser = chrome::FindBrowserWithWebContents(
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          source_web_contents_);
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::ShowWebsiteSettings(browser, source_web_contents_,
15947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  params_.frame_url, params_.security_info);
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_UNDO:
1599c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->Undo();
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_REDO:
1603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->Redo();
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_CUT:
1607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->Cut();
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_COPY:
1611c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->Copy();
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PASTE:
1615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->Paste();
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE:
1619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->PasteAndMatchStyle();
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_DELETE:
1623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->Delete();
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SELECTALL:
1627c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      source_web_contents_->SelectAll();
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_SEARCHWEBFOR:
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_GOTOURL: {
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WindowOpenDisposition disposition =
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ForceNewTabDispositionFromEventFlags(event_flags);
1634effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      OpenURL(selection_navigation_url_, GURL(), disposition,
16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ui::PAGE_TRANSITION_LINK);
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: {
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WindowOpenDisposition disposition =
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ForceNewTabDispositionFromEventFlags(event_flags);
1641effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
16421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OpenURL(url, GURL(), disposition, ui::PAGE_TRANSITION_LINK);
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS: {
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("RegisterProtocolHandler.ContextMenu_Settings"));
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WindowOpenDisposition disposition =
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ForceNewTabDispositionFromEventFlags(event_flags);
1651effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL url = chrome::GetSettingsUrl(chrome::kHandlerSettingsSubPage);
16521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OpenURL(url, GURL(), disposition, ui::PAGE_TRANSITION_LINK);
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IDC_CONTENT_CONTEXT_ADDSEARCHENGINE: {
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Make sure the model is loaded.
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLService* model =
16595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          TemplateURLServiceFactory::GetForProfile(GetProfile());
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!model)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      model->Load();
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchEngineTabHelper* search_engine_tab_helper =
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SearchEngineTabHelper::FromWebContents(source_web_contents_);
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (search_engine_tab_helper &&
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          search_engine_tab_helper->delegate()) {
16686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        base::string16 keyword(TemplateURL::GenerateKeyword(params_.page_url));
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TemplateURLData data;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data.short_name = keyword;
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data.SetKeyword(keyword);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data.SetURL(params_.keyword_url.spec());
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data.favicon_url =
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            TemplateURL::GenerateFaviconURL(params_.page_url.GetOrigin());
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Takes ownership of the TemplateURL.
16765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        search_engine_tab_helper->delegate()->ConfirmAddSearchProvider(
16775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            new TemplateURL(data), GetProfile());
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandlerRegistry::ProtocolHandlerList
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewContextMenu::GetHandlersForLinkUrl() {
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry::ProtocolHandlerList handlers =
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protocol_handler_registry_->GetHandlersFor(params_.link_url.scheme());
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::sort(handlers.begin(), handlers.end());
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handlers;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderViewContextMenu::NotifyMenuShown() {
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN,
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<RenderViewContextMenu>(this),
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderViewContextMenu::NotifyURLOpened(
17045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& url,
17055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    content::WebContents* new_contents) {
17065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RetargetingDetails details;
17075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  details.source_web_contents = source_web_contents_;
17081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Don't use GetRenderFrameHost() as it may be NULL. crbug.com/399789
17091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  details.source_render_frame_id = render_frame_id_;
17105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  details.target_url = url;
17115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  details.target_web_contents = new_contents;
17125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  details.not_yet_in_tabstrip = false;
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::NotificationService::current()->Notify(
17155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      chrome::NOTIFICATION_RETARGETING,
17165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::Source<Profile>(GetProfile()),
17175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::Details<RetargetingDetails>(&details));
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewContextMenu::IsDevCommandEnabled(int id) const {
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (id == IDC_CONTENT_CONTEXT_INSPECTELEMENT ||
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id == IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE) {
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CommandLine* command_line = CommandLine::ForCurrentProcess();
17245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!GetPrefs(browser_context_)
17255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             ->GetBoolean(prefs::kWebKitJavascriptEnabled) ||
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        command_line->HasSwitch(switches::kDisableJavaScript))
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't enable the web inspector if the developer tools are disabled via
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the preference dev-tools-disabled.
17315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (GetPrefs(browser_context_)->GetBoolean(prefs::kDevToolsDisabled))
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 RenderViewContextMenu::PrintableSelectionText() {
173958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::TruncateString(params_.selection_text,
17405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             kMaxSelectionTextLength,
17415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             gfx::WORD_BREAK);
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Controller functions --------------------------------------------------------
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::CopyImageAt(int x, int y) {
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_web_contents_->GetRenderViewHost()->CopyImageAt(x, y);
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void RenderViewContextMenu::GetImageThumbnailForSearch() {
17515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderFrameHost* render_frame_host = GetRenderFrameHost();
1752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!render_frame_host)
1753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
1754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  render_frame_host->Send(new ChromeViewMsg_RequestThumbnailForContextNode(
1755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      render_frame_host->GetRoutingID(),
1756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      kImageSearchThumbnailMinSize,
1757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::Size(kImageSearchThumbnailMaxWidth,
1758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                kImageSearchThumbnailMaxHeight)));
1759a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::Inspect(int x, int y) {
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("DevTools_InspectElement"));
17635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderFrameHost* render_frame_host = GetRenderFrameHost();
1764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!render_frame_host)
1765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
17666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DevToolsWindow::InspectElement(
17676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      WebContents::FromRenderFrameHost(render_frame_host), x, y);
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::WriteURLToClipboard(const GURL& url) {
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_common_net::WriteURLToClipboard(
17721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      url, GetPrefs(browser_context_)->GetString(prefs::kAcceptLanguages));
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::MediaPlayerActionAt(
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location,
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebMediaPlayerAction& action) {
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_web_contents_->GetRenderViewHost()->
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteMediaPlayerActionAtLocation(location, action);
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewContextMenu::PluginActionAt(
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location,
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebPluginAction& action) {
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source_web_contents_->GetRenderViewHost()->
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecutePluginActionAtLocation(location, action);
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1788