1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/renderer_context_menu/context_menu_content_type.h"
7 #include "chrome/app/chrome_command_ids.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/profiles/profile_io_data.h"
10 #include "chrome/common/url_constants.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/common/url_constants.h"
13 #include "extensions/browser/extension_system.h"
14 #include "extensions/browser/process_manager.h"
15 #include "extensions/common/extension.h"
16 #include "third_party/WebKit/public/web/WebContextMenuData.h"
19 using blink::WebContextMenuData;
20 using content::WebContents;
21 using extensions::Extension;
25 bool IsDevToolsURL(const GURL& url) {
26 return url.SchemeIs(content::kChromeDevToolsScheme);
29 bool IsInternalResourcesURL(const GURL& url) {
30 return url.SchemeIs(content::kChromeUIScheme) &&
31 (url.host() == chrome::kChromeUISyncResourcesHost);
36 ContextMenuContentType::ContextMenuContentType(
37 content::WebContents* web_contents,
38 const content::ContextMenuParams& params,
39 bool supports_custom_items)
41 source_web_contents_(web_contents),
42 profile_(Profile::FromBrowserContext(
43 source_web_contents_->GetBrowserContext())),
44 supports_custom_items_(supports_custom_items) {
47 ContextMenuContentType::~ContextMenuContentType() {
50 const Extension* ContextMenuContentType::GetExtension() const {
51 extensions::ExtensionSystem* system =
52 extensions::ExtensionSystem::Get(profile_);
53 // There is no process manager in some tests.
54 if (!system->process_manager())
57 return system->process_manager()->GetExtensionForRenderViewHost(
58 source_web_contents_->GetRenderViewHost());
61 bool ContextMenuContentType::SupportsGroup(int group) {
62 const bool has_selection = !params_.selection_text.empty();
64 if (supports_custom_items_ && !params_.custom_items.empty()) {
65 if (group == ITEM_GROUP_CUSTOM)
69 // For menus with custom items, if there is no selection, we do not
70 // add items other than developer items. And for Pepper menu, don't even
71 // add developer items.
72 if (!params_.custom_context.is_pepper_menu)
73 return group == ITEM_GROUP_DEVELOPER;
78 // If there's a selection when there are custom items, fall through to
79 // adding the normal ones after the custom ones.
82 return SupportsGroupInternal(group);
85 bool ContextMenuContentType::SupportsGroupInternal(int group) {
86 const bool has_link = !params_.unfiltered_link_url.is_empty();
87 const bool has_selection = !params_.selection_text.empty();
90 case ITEM_GROUP_CUSTOM:
91 return supports_custom_items_ && !params_.custom_items.empty();
93 case ITEM_GROUP_PAGE: {
95 params_.media_type == WebContextMenuData::MediaTypeNone &&
96 !has_link && !params_.is_editable && !has_selection;
98 if (!is_candidate && params_.page_url.is_empty())
99 DCHECK(params_.frame_url.is_empty());
101 return is_candidate && !params_.page_url.is_empty() &&
102 !IsDevToolsURL(params_.page_url) &&
103 !IsInternalResourcesURL(params_.page_url);
106 case ITEM_GROUP_FRAME: {
108 bool page_group_supported = SupportsGroupInternal(ITEM_GROUP_PAGE);
109 return page_group_supported && !params_.frame_url.is_empty() &&
110 !IsDevToolsURL(params_.frame_url) &&
111 !IsInternalResourcesURL(params_.page_url);
114 case ITEM_GROUP_LINK:
117 case ITEM_GROUP_MEDIA_IMAGE:
118 return params_.media_type == WebContextMenuData::MediaTypeImage;
120 case ITEM_GROUP_SEARCHWEBFORIMAGE:
121 // Image menu items imply search web for image item.
122 return SupportsGroupInternal(ITEM_GROUP_MEDIA_IMAGE);
124 case ITEM_GROUP_MEDIA_VIDEO:
125 return params_.media_type == WebContextMenuData::MediaTypeVideo;
127 case ITEM_GROUP_MEDIA_AUDIO:
128 return params_.media_type == WebContextMenuData::MediaTypeAudio;
130 case ITEM_GROUP_MEDIA_CANVAS:
131 return params_.media_type == WebContextMenuData::MediaTypeCanvas;
133 case ITEM_GROUP_MEDIA_PLUGIN:
134 return params_.media_type == WebContextMenuData::MediaTypePlugin;
136 case ITEM_GROUP_MEDIA_FILE:
137 #if defined(WEBCONTEXT_MEDIATYPEFILE_DEFINED)
138 return params_.media_type == WebContextMenuData::MediaTypeFile;
143 case ITEM_GROUP_EDITABLE:
144 return params_.is_editable;
146 case ITEM_GROUP_COPY:
147 return !params_.is_editable && has_selection;
149 case ITEM_GROUP_SEARCH_PROVIDER:
150 return has_selection;
152 case ITEM_GROUP_PRINT: {
153 bool enable = has_selection && !IsDevToolsURL(params_.page_url);
154 // Image menu items also imply print items.
155 return enable || SupportsGroupInternal(ITEM_GROUP_MEDIA_IMAGE);
158 case ITEM_GROUP_ALL_EXTENSION:
159 return !IsDevToolsURL(params_.page_url);
161 case ITEM_GROUP_CURRENT_EXTENSION:
164 case ITEM_GROUP_DEVELOPER:
167 case ITEM_GROUP_DEVTOOLS_UNPACKED_EXT:
170 case ITEM_GROUP_PRINT_PREVIEW:
171 #if defined(ENABLE_FULL_PRINTING)