Index: components/renderer_context_menu/render_view_context_menu_base.cc |
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/components/renderer_context_menu/render_view_context_menu_base.cc |
similarity index 11% |
copy from chrome/browser/renderer_context_menu/render_view_context_menu.cc |
copy to components/renderer_context_menu/render_view_context_menu_base.cc |
index 4162feacb5a6fa10cafaea8fef02d19c3fae5609..40b90298bc0022c6a2c406018f12d9458a157641 100644 |
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc |
+++ b/components/renderer_context_menu/render_view_context_menu_base.cc |
@@ -2,326 +2,66 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" |
+#include "components/renderer_context_menu/render_view_context_menu_base.h" |
#include <algorithm> |
-#include <set> |
#include <utility> |
-#include "apps/app_load_service.h" |
#include "base/command_line.h" |
#include "base/logging.h" |
-#include "base/metrics/histogram.h" |
-#include "base/prefs/pref_member.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/stl_util.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/time/time.h" |
-#include "chrome/app/chrome_command_ids.h" |
-#include "chrome/browser/app_mode/app_mode_utils.h" |
-#include "chrome/browser/autocomplete/autocomplete_classifier.h" |
-#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" |
-#include "chrome/browser/devtools/devtools_window.h" |
-#include "chrome/browser/download/download_service.h" |
-#include "chrome/browser/download/download_service_factory.h" |
-#include "chrome/browser/download/download_stats.h" |
-#include "chrome/browser/extensions/devtools_util.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/guest_view/web_view/web_view_guest.h" |
-#include "chrome/browser/plugins/chrome_plugin_service_filter.h" |
-#include "chrome/browser/prefs/incognito_mode_prefs.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/profiles/profile_io_data.h" |
-#include "chrome/browser/renderer_context_menu/context_menu_content_type_factory.h" |
-#include "chrome/browser/renderer_context_menu/spellchecker_submenu_observer.h" |
-#include "chrome/browser/renderer_context_menu/spelling_menu_observer.h" |
-#include "chrome/browser/search/search.h" |
-#include "chrome/browser/search_engines/template_url_service_factory.h" |
-#include "chrome/browser/spellchecker/spellcheck_host_metrics.h" |
-#include "chrome/browser/spellchecker/spellcheck_service.h" |
-#include "chrome/browser/tab_contents/retargeting_details.h" |
-#include "chrome/browser/translate/chrome_translate_client.h" |
-#include "chrome/browser/translate/translate_service.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_commands.h" |
-#include "chrome/browser/ui/browser_finder.h" |
-#include "chrome/browser/ui/chrome_pages.h" |
-#include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" |
-#include "chrome/browser/ui/tab_contents/core_tab_helper.h" |
-#include "chrome/common/chrome_constants.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/content_restriction.h" |
-#include "chrome/common/net/url_util.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/common/render_messages.h" |
-#include "chrome/common/spellcheck_messages.h" |
-#include "chrome/common/url_constants.h" |
-#include "components/autocomplete/autocomplete_match.h" |
-#include "components/google/core/browser/google_util.h" |
-#include "components/metrics/proto/omnibox_input_type.pb.h" |
-#include "components/search_engines/template_url.h" |
-#include "components/search_engines/template_url_service.h" |
-#include "components/translate/core/browser/translate_download_manager.h" |
-#include "components/translate/core/browser/translate_manager.h" |
-#include "components/translate/core/browser/translate_prefs.h" |
-#include "components/user_prefs/user_prefs.h" |
-#include "content/public/browser/child_process_security_policy.h" |
-#include "content/public/browser/download_manager.h" |
-#include "content/public/browser/download_save_info.h" |
-#include "content/public/browser/download_url_parameters.h" |
-#include "content/public/browser/navigation_details.h" |
-#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_service.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/render_widget_host_view.h" |
-#include "content/public/browser/user_metrics.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/common/menu_item.h" |
-#include "content/public/common/ssl_status.h" |
-#include "content/public/common/url_utils.h" |
#include "extensions/browser/extension_host.h" |
#include "extensions/browser/extension_system.h" |
#include "extensions/browser/view_type_utils.h" |
#include "extensions/common/extension.h" |
-#include "grit/generated_resources.h" |
-#include "net/base/escape.h" |
#include "third_party/WebKit/public/web/WebContextMenuData.h" |
-#include "third_party/WebKit/public/web/WebMediaPlayerAction.h" |
-#include "third_party/WebKit/public/web/WebPluginAction.h" |
-#include "ui/base/clipboard/clipboard.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/gfx/favicon_size.h" |
-#include "ui/gfx/point.h" |
-#include "ui/gfx/size.h" |
-#include "ui/gfx/text_elider.h" |
-#if defined(ENABLE_PRINTING) |
-#include "chrome/common/print_messages.h" |
- |
-#if defined(ENABLE_FULL_PRINTING) |
-#include "chrome/browser/printing/print_preview_context_menu_observer.h" |
-#include "chrome/browser/printing/print_preview_dialog_controller.h" |
-#include "chrome/browser/printing/print_view_manager.h" |
-#else |
-#include "chrome/browser/printing/print_view_manager_basic.h" |
-#endif // defined(ENABLE_FULL_PRINTING) |
-#endif // defined(ENABLE_PRINTING) |
- |
-using base::UserMetricsAction; |
using blink::WebContextMenuData; |
-using blink::WebMediaPlayerAction; |
-using blink::WebPluginAction; |
using blink::WebString; |
using blink::WebURL; |
using content::BrowserContext; |
-using content::ChildProcessSecurityPolicy; |
-using content::DownloadManager; |
-using content::DownloadUrlParameters; |
-using content::NavigationController; |
-using content::NavigationEntry; |
using content::OpenURLParams; |
using content::RenderFrameHost; |
using content::RenderViewHost; |
-using content::SSLStatus; |
using content::WebContents; |
-using extensions::ContextMenuMatcher; |
-using extensions::Extension; |
-using extensions::MenuItem; |
-using extensions::MenuManager; |
namespace { |
-const int kImageSearchThumbnailMinSize = 300 * 300; |
-const int kImageSearchThumbnailMaxWidth = 600; |
-const int kImageSearchThumbnailMaxHeight = 600; |
- |
-// The range of command IDs reserved for content's custom menus. |
-// TODO(oshima): These values will be injected by embedders. |
-const int content_context_custom_first = IDC_CONTENT_CONTEXT_CUSTOM_FIRST; |
-const int content_context_custom_last = IDC_CONTENT_CONTEXT_CUSTOM_LAST; |
- |
-// Maps UMA enumeration to IDC. IDC could be changed so we can't use |
-// just them and |UMA_HISTOGRAM_CUSTOM_ENUMERATION|. |
-// Never change mapping or reuse |enum_id|. Always push back new items. |
-// Items that is not used any more by |RenderViewContextMenu.ExecuteCommand| |
-// could be deleted, but don't change the rest of |kUmaEnumToControlId|. |
-const struct UmaEnumCommandIdPair { |
- int enum_id; |
- int control_id; |
-} kUmaEnumToControlId[] = { |
- /* |
- enum id for 0, 1 are detected using |
- RenderViewContextMenu::IsContentCustomCommandId and |
- ContextMenuMatcher::IsExtensionsCustomCommandId |
- */ |
- {2, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST}, |
- {3, IDC_CONTENT_CONTEXT_OPENLINKNEWTAB}, |
- {4, IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW}, |
- {5, IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD}, |
- {6, IDC_CONTENT_CONTEXT_SAVELINKAS}, |
- {7, IDC_CONTENT_CONTEXT_SAVEAVAS}, |
- {8, IDC_CONTENT_CONTEXT_SAVEIMAGEAS}, |
- {9, IDC_CONTENT_CONTEXT_COPYLINKLOCATION}, |
- {10, IDC_CONTENT_CONTEXT_COPYIMAGELOCATION}, |
- {11, IDC_CONTENT_CONTEXT_COPYAVLOCATION}, |
- {12, IDC_CONTENT_CONTEXT_COPYIMAGE}, |
- {13, IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB}, |
- {14, IDC_CONTENT_CONTEXT_OPENAVNEWTAB}, |
- {15, IDC_CONTENT_CONTEXT_PLAYPAUSE}, |
- {16, IDC_CONTENT_CONTEXT_MUTE}, |
- {17, IDC_CONTENT_CONTEXT_LOOP}, |
- {18, IDC_CONTENT_CONTEXT_CONTROLS}, |
- {19, IDC_CONTENT_CONTEXT_ROTATECW}, |
- {20, IDC_CONTENT_CONTEXT_ROTATECCW}, |
- {21, IDC_BACK}, |
- {22, IDC_FORWARD}, |
- {23, IDC_SAVE_PAGE}, |
- {24, IDC_RELOAD}, |
- {25, IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP}, |
- {26, IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP}, |
- {27, IDC_PRINT}, |
- {28, IDC_VIEW_SOURCE}, |
- {29, IDC_CONTENT_CONTEXT_INSPECTELEMENT}, |
- {30, IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE}, |
- {31, IDC_CONTENT_CONTEXT_VIEWPAGEINFO}, |
- {32, IDC_CONTENT_CONTEXT_TRANSLATE}, |
- {33, IDC_CONTENT_CONTEXT_RELOADFRAME}, |
- {34, IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE}, |
- {35, IDC_CONTENT_CONTEXT_VIEWFRAMEINFO}, |
- {36, IDC_CONTENT_CONTEXT_UNDO}, |
- {37, IDC_CONTENT_CONTEXT_REDO}, |
- {38, IDC_CONTENT_CONTEXT_CUT}, |
- {39, IDC_CONTENT_CONTEXT_COPY}, |
- {40, IDC_CONTENT_CONTEXT_PASTE}, |
- {41, IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE}, |
- {42, IDC_CONTENT_CONTEXT_DELETE}, |
- {43, IDC_CONTENT_CONTEXT_SELECTALL}, |
- {44, IDC_CONTENT_CONTEXT_SEARCHWEBFOR}, |
- {45, IDC_CONTENT_CONTEXT_GOTOURL}, |
- {46, IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS}, |
- {47, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS}, |
- {48, IDC_CONTENT_CONTEXT_ADDSEARCHENGINE}, |
- {52, IDC_CONTENT_CONTEXT_OPENLINKWITH}, |
- {53, IDC_CHECK_SPELLING_WHILE_TYPING}, |
- {54, IDC_SPELLCHECK_MENU}, |
- {55, IDC_CONTENT_CONTEXT_SPELLING_TOGGLE}, |
- {56, IDC_SPELLCHECK_LANGUAGES_FIRST}, |
- {57, IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE}, |
- {58, IDC_SPELLCHECK_SUGGESTION_0}, |
- {59, IDC_SPELLCHECK_ADD_TO_DICTIONARY}, |
- {60, IDC_SPELLPANEL_TOGGLE}, |
- // Add new items here and use |enum_id| from the next line. |
- {61, 0}, // Must be the last. Increment |enum_id| when new IDC was added. |
-}; |
- |
-// Collapses large ranges of ids before looking for UMA enum. |
-int CollapseCommandsForUMA(int id) { |
- DCHECK(!RenderViewContextMenu::IsContentCustomCommandId(id)); |
- DCHECK(!ContextMenuMatcher::IsExtensionsCustomCommandId(id)); |
- |
- if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST && |
- id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) { |
- return IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST; |
- } |
- |
- if (id >= IDC_SPELLCHECK_LANGUAGES_FIRST && |
- id <= IDC_SPELLCHECK_LANGUAGES_LAST) { |
- return IDC_SPELLCHECK_LANGUAGES_FIRST; |
- } |
- |
- if (id >= IDC_SPELLCHECK_SUGGESTION_0 && |
- id <= IDC_SPELLCHECK_SUGGESTION_LAST) { |
- return IDC_SPELLCHECK_SUGGESTION_0; |
- } |
- |
- return id; |
-} |
- |
-// Returns UMA enum value for command specified by |id| or -1 if not found. |
-int FindUMAEnumValueForCommand(int id) { |
- if (RenderViewContextMenu::IsContentCustomCommandId(id)) |
- return 0; |
- |
- if (ContextMenuMatcher::IsExtensionsCustomCommandId(id)) |
- return 1; |
- |
- id = CollapseCommandsForUMA(id); |
- const size_t kMappingSize = arraysize(kUmaEnumToControlId); |
- for (size_t i = 0; i < kMappingSize; ++i) { |
- if (kUmaEnumToControlId[i].control_id == id) { |
- return kUmaEnumToControlId[i].enum_id; |
- } |
- } |
- return -1; |
-} |
- |
-// Increments histogram value for used items specified by |id|. |
-void RecordUsedItem(int id) { |
- int enum_id = FindUMAEnumValueForCommand(id); |
- if (enum_id != -1) { |
- const size_t kMappingSize = arraysize(kUmaEnumToControlId); |
- UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.Used", enum_id, |
- kUmaEnumToControlId[kMappingSize - 1].enum_id); |
- } else { |
- NOTREACHED() << "Update kUmaEnumToControlId. Unhanded IDC: " << id; |
- } |
-} |
- |
-// Increments histogram value for visible context menu item specified by |id|. |
-void RecordShownItem(int id) { |
- int enum_id = FindUMAEnumValueForCommand(id); |
- if (enum_id != -1) { |
- const size_t kMappingSize = arraysize(kUmaEnumToControlId); |
- UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.Shown", enum_id, |
- kUmaEnumToControlId[kMappingSize - 1].enum_id); |
- } else { |
- // Just warning here. It's harder to maintain list of all possibly |
- // visible items than executable items. |
- DLOG(ERROR) << "Update kUmaEnumToControlId. Unhanded IDC: " << id; |
- } |
-} |
+// The (inclusive) range of command IDs reserved for content's custom menus. |
+int content_context_custom_first = -1; |
+int content_context_custom_last = -1; |
-// Usually a new tab is expected where this function is used, |
-// however users should be able to open a tab in background |
-// or in a new window. |
-WindowOpenDisposition ForceNewTabDispositionFromEventFlags( |
- int event_flags) { |
- WindowOpenDisposition disposition = |
- ui::DispositionFromEventFlags(event_flags); |
- return disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition; |
-} |
- |
-bool IsCustomItemEnabled(const std::vector<content::MenuItem>& items, int id) { |
- DCHECK(RenderViewContextMenu::IsContentCustomCommandId(id)); |
+bool IsCustomItemEnabledInternal(const std::vector<content::MenuItem>& items, |
+ int id) { |
+ DCHECK(RenderViewContextMenuBase::IsContentCustomCommandId(id)); |
for (size_t i = 0; i < items.size(); ++i) { |
- int action_id = |
- RenderViewContextMenu::ConvertToContentCustomCommandId(items[i].action); |
+ int action_id = RenderViewContextMenuBase::ConvertToContentCustomCommandId( |
+ items[i].action); |
if (action_id == id) |
return items[i].enabled; |
if (items[i].type == content::MenuItem::SUBMENU) { |
- if (IsCustomItemEnabled(items[i].submenu, id)) |
+ if (IsCustomItemEnabledInternal(items[i].submenu, id)) |
return true; |
} |
} |
return false; |
} |
-bool IsCustomItemChecked(const std::vector<content::MenuItem>& items, int id) { |
- DCHECK(RenderViewContextMenu::IsContentCustomCommandId(id)); |
+bool IsCustomItemCheckedInternal(const std::vector<content::MenuItem>& items, |
+ int id) { |
+ DCHECK(RenderViewContextMenuBase::IsContentCustomCommandId(id)); |
for (size_t i = 0; i < items.size(); ++i) { |
- int action_id = |
- RenderViewContextMenu::ConvertToContentCustomCommandId(items[i].action); |
+ int action_id = RenderViewContextMenuBase::ConvertToContentCustomCommandId( |
+ items[i].action); |
if (action_id == id) |
return items[i].checked; |
if (items[i].type == content::MenuItem::SUBMENU) { |
- if (IsCustomItemChecked(items[i].submenu, id)) |
+ if (IsCustomItemCheckedInternal(items[i].submenu, id)) |
return true; |
} |
} |
@@ -341,9 +81,9 @@ void AddCustomItemsToMenu(const std::vector<content::MenuItem>& items, |
return; |
} |
for (size_t i = 0; i < items.size(); ++i) { |
- int command_id = |
- RenderViewContextMenu::ConvertToContentCustomCommandId(items[i].action); |
- if (!RenderViewContextMenu::IsContentCustomCommandId(command_id)) { |
+ int command_id = RenderViewContextMenuBase::ConvertToContentCustomCommandId( |
+ items[i].action); |
+ if (!RenderViewContextMenuBase::IsContentCustomCommandId(command_id)) { |
LOG(ERROR) << "Custom menu action value out of range."; |
return; |
} |
@@ -355,13 +95,13 @@ void AddCustomItemsToMenu(const std::vector<content::MenuItem>& items, |
switch (items[i].type) { |
case content::MenuItem::OPTION: |
menu_model->AddItem( |
- RenderViewContextMenu::ConvertToContentCustomCommandId( |
+ RenderViewContextMenuBase::ConvertToContentCustomCommandId( |
items[i].action), |
items[i].label); |
break; |
case content::MenuItem::CHECKABLE_OPTION: |
menu_model->AddCheckItem( |
- RenderViewContextMenu::ConvertToContentCustomCommandId( |
+ RenderViewContextMenuBase::ConvertToContentCustomCommandId( |
items[i].action), |
items[i].label); |
break; |
@@ -377,7 +117,7 @@ void AddCustomItemsToMenu(const std::vector<content::MenuItem>& items, |
AddCustomItemsToMenu(items[i].submenu, depth + 1, total_items, delegate, |
submenu); |
menu_model->AddSubMenu( |
- RenderViewContextMenu::ConvertToContentCustomCommandId( |
+ RenderViewContextMenuBase::ConvertToContentCustomCommandId( |
items[i].action), |
items[i].label, |
submenu); |
@@ -390,231 +130,63 @@ void AddCustomItemsToMenu(const std::vector<content::MenuItem>& items, |
} |
} |
-// Helper function to escape "&" as "&&". |
-void EscapeAmpersands(base::string16* text) { |
- base::ReplaceChars(*text, base::ASCIIToUTF16("&"), base::ASCIIToUTF16("&&"), |
- text); |
-} |
+} // namespace |
-// Returns the preference of the profile represented by the |context|. |
-PrefService* GetPrefs(content::BrowserContext* context) { |
- return user_prefs::UserPrefs::Get(context); |
+// static |
+void RenderViewContextMenuBase::SetContentCustomCommandIdRange( |
+ int first, int last) { |
+ // The range is inclusive. |
+ content_context_custom_first = first; |
+ content_context_custom_last = last; |
} |
-} // namespace |
- |
// static |
-const size_t RenderViewContextMenu::kMaxSelectionTextLength = 50; |
+const size_t RenderViewContextMenuBase::kMaxSelectionTextLength = 50; |
// static |
-int RenderViewContextMenu::ConvertToContentCustomCommandId(int id) { |
+int RenderViewContextMenuBase::ConvertToContentCustomCommandId(int id) { |
return content_context_custom_first + id; |
} |
// static |
-bool RenderViewContextMenu::IsContentCustomCommandId(int id) { |
+bool RenderViewContextMenuBase::IsContentCustomCommandId(int id) { |
return id >= content_context_custom_first && |
id <= content_context_custom_last; |
} |
-// static |
-bool RenderViewContextMenu::IsDevToolsURL(const GURL& url) { |
- return url.SchemeIs(content::kChromeDevToolsScheme); |
-} |
- |
-// static |
-bool RenderViewContextMenu::IsInternalResourcesURL(const GURL& url) { |
- if (!url.SchemeIs(content::kChromeUIScheme)) |
- return false; |
- return url.host() == chrome::kChromeUISyncResourcesHost; |
-} |
- |
-static const int kSpellcheckRadioGroup = 1; |
- |
-RenderViewContextMenu::RenderViewContextMenu( |
+RenderViewContextMenuBase::RenderViewContextMenuBase( |
content::RenderFrameHost* render_frame_host, |
const content::ContextMenuParams& params) |
: params_(params), |
source_web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), |
- render_process_id_(render_frame_host->GetProcess()->GetID()), |
- render_frame_id_(render_frame_host->GetRoutingID()), |
browser_context_(source_web_contents_->GetBrowserContext()), |
menu_model_(this), |
- extension_items_(browser_context_, |
- this, |
- &menu_model_, |
- base::Bind(MenuItemMatchesParams, params_)), |
- protocol_handler_submenu_model_(this), |
- protocol_handler_registry_( |
- ProtocolHandlerRegistryFactory::GetForBrowserContext(GetProfile())), |
- command_executed_(false) { |
- content_type_.reset(ContextMenuContentTypeFactory::Create( |
- source_web_contents_, params)); |
+ command_executed_(false), |
+ render_process_id_(render_frame_host->GetProcess()->GetID()), |
+ render_frame_id_(render_frame_host->GetRoutingID()) { |
} |
-RenderViewContextMenu::~RenderViewContextMenu() { |
+RenderViewContextMenuBase::~RenderViewContextMenuBase() { |
} |
// Menu construction functions ------------------------------------------------- |
-void RenderViewContextMenu::Init() { |
+void RenderViewContextMenuBase::Init() { |
+ // Command id range must have been already initializerd. |
+ DCHECK_NE(-1, content_context_custom_first); |
+ DCHECK_NE(-1, content_context_custom_last); |
+ |
InitMenu(); |
if (toolkit_delegate_) |
toolkit_delegate_->Init(&menu_model_); |
} |
-void RenderViewContextMenu::Cancel() { |
+void RenderViewContextMenuBase::Cancel() { |
if (toolkit_delegate_) |
toolkit_delegate_->Cancel(); |
} |
-static bool ExtensionPatternMatch(const extensions::URLPatternSet& patterns, |
- const GURL& url) { |
- // No patterns means no restriction, so that implicitly matches. |
- if (patterns.is_empty()) |
- return true; |
- return patterns.MatchesURL(url); |
-} |
- |
-// static |
-bool RenderViewContextMenu::ExtensionContextAndPatternMatch( |
- const content::ContextMenuParams& params, |
- MenuItem::ContextList contexts, |
- const extensions::URLPatternSet& target_url_patterns) { |
- const bool has_link = !params.link_url.is_empty(); |
- const bool has_selection = !params.selection_text.empty(); |
- const bool in_frame = !params.frame_url.is_empty(); |
- |
- if (contexts.Contains(MenuItem::ALL) || |
- (has_selection && contexts.Contains(MenuItem::SELECTION)) || |
- (params.is_editable && contexts.Contains(MenuItem::EDITABLE)) || |
- (in_frame && contexts.Contains(MenuItem::FRAME))) |
- return true; |
- |
- if (has_link && contexts.Contains(MenuItem::LINK) && |
- ExtensionPatternMatch(target_url_patterns, params.link_url)) |
- return true; |
- |
- switch (params.media_type) { |
- case WebContextMenuData::MediaTypeImage: |
- if (contexts.Contains(MenuItem::IMAGE) && |
- ExtensionPatternMatch(target_url_patterns, params.src_url)) |
- return true; |
- break; |
- |
- case WebContextMenuData::MediaTypeVideo: |
- if (contexts.Contains(MenuItem::VIDEO) && |
- ExtensionPatternMatch(target_url_patterns, params.src_url)) |
- return true; |
- break; |
- |
- case WebContextMenuData::MediaTypeAudio: |
- if (contexts.Contains(MenuItem::AUDIO) && |
- ExtensionPatternMatch(target_url_patterns, params.src_url)) |
- return true; |
- break; |
- |
- default: |
- break; |
- } |
- |
- // PAGE is the least specific context, so we only examine that if none of the |
- // other contexts apply (except for FRAME, which is included in PAGE for |
- // backwards compatibility). |
- if (!has_link && !has_selection && !params.is_editable && |
- params.media_type == WebContextMenuData::MediaTypeNone && |
- contexts.Contains(MenuItem::PAGE)) |
- return true; |
- |
- return false; |
-} |
- |
-static const GURL& GetDocumentURL(const content::ContextMenuParams& params) { |
- return params.frame_url.is_empty() ? params.page_url : params.frame_url; |
-} |
- |
-// static |
-bool RenderViewContextMenu::MenuItemMatchesParams( |
- const content::ContextMenuParams& params, |
- const extensions::MenuItem* item) { |
- bool match = ExtensionContextAndPatternMatch(params, item->contexts(), |
- item->target_url_patterns()); |
- if (!match) |
- return false; |
- |
- const GURL& document_url = GetDocumentURL(params); |
- return ExtensionPatternMatch(item->document_url_patterns(), document_url); |
-} |
- |
-void RenderViewContextMenu::AppendAllExtensionItems() { |
- extension_items_.Clear(); |
- ExtensionService* service = |
- extensions::ExtensionSystem::Get(browser_context_)->extension_service(); |
- if (!service) |
- return; // In unit-tests, we may not have an ExtensionService. |
- |
- MenuManager* menu_manager = MenuManager::Get(browser_context_); |
- if (!menu_manager) |
- return; |
- |
- base::string16 printable_selection_text = PrintableSelectionText(); |
- EscapeAmpersands(&printable_selection_text); |
- |
- // Get a list of extension id's that have context menu items, and sort by the |
- // top level context menu title of the extension. |
- std::set<MenuItem::ExtensionKey> ids = menu_manager->ExtensionIds(); |
- std::vector<base::string16> sorted_menu_titles; |
- std::map<base::string16, std::string> map_ids; |
- for (std::set<MenuItem::ExtensionKey>::iterator i = ids.begin(); |
- i != ids.end(); |
- ++i) { |
- const Extension* extension = |
- service->GetExtensionById(i->extension_id, false); |
- // Platform apps have their context menus created directly in |
- // AppendPlatformAppItems. |
- if (extension && !extension->is_platform_app()) { |
- base::string16 menu_title = extension_items_.GetTopLevelContextMenuTitle( |
- *i, printable_selection_text); |
- map_ids[menu_title] = i->extension_id; |
- sorted_menu_titles.push_back(menu_title); |
- } |
- } |
- if (sorted_menu_titles.empty()) |
- return; |
- |
- const std::string app_locale = g_browser_process->GetApplicationLocale(); |
- l10n_util::SortStrings16(app_locale, &sorted_menu_titles); |
- |
- int index = 0; |
- base::TimeTicks begin = base::TimeTicks::Now(); |
- for (size_t i = 0; i < sorted_menu_titles.size(); ++i) { |
- const std::string& id = map_ids[sorted_menu_titles[i]]; |
- const MenuItem::ExtensionKey extension_key(id); |
- extension_items_.AppendExtensionItems( |
- extension_key, printable_selection_text, &index); |
- } |
- |
- UMA_HISTOGRAM_TIMES("Extensions.ContextMenus_BuildTime", |
- base::TimeTicks::Now() - begin); |
- UMA_HISTOGRAM_COUNTS("Extensions.ContextMenus_ItemCount", index); |
-} |
- |
-void RenderViewContextMenu::AppendCurrentExtensionItems() { |
- // Avoid appending extension related items when |extension| is null. |
- // For Panel, this happens when the panel is navigated to a url outside of the |
- // extension's package. |
- const Extension* extension = GetExtension(); |
- if (extension) { |
- // Only add extension items from this extension. |
- int index = 0; |
- const MenuItem::ExtensionKey key( |
- extension->id(), WebViewGuest::GetViewInstanceId(source_web_contents_)); |
- extension_items_.AppendExtensionItems( |
- key, PrintableSelectionText(), &index); |
- } |
-} |
- |
-void RenderViewContextMenu::InitMenu() { |
+void RenderViewContextMenuBase::InitMenu() { |
if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_CUSTOM)) { |
AppendCustomItems(); |
@@ -625,149 +197,29 @@ void RenderViewContextMenu::InitMenu() { |
menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
} |
} |
- |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) |
- AppendPageItems(); |
- |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_FRAME)) { |
- // Merge in frame items with page items if we clicked within a frame that |
- // needs them. |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- AppendFrameItems(); |
- } |
- |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK)) { |
- AppendLinkItems(); |
- if (params_.media_type != WebContextMenuData::MediaTypeNone) |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_MEDIA_IMAGE)) { |
- AppendImageItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_SEARCHWEBFORIMAGE)) { |
- AppendSearchWebForImageItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_MEDIA_VIDEO)) { |
- AppendVideoItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_MEDIA_AUDIO)) { |
- AppendAudioItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_MEDIA_CANVAS)) { |
- AppendCanvasItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_MEDIA_PLUGIN)) { |
- AppendPluginItems(); |
- } |
- |
- // ITEM_GROUP_MEDIA_FILE has no specific items. |
- |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_EDITABLE)) |
- AppendEditableItems(); |
- |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_COPY)) { |
- DCHECK(!content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_EDITABLE)); |
- AppendCopyItem(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_SEARCH_PROVIDER)) { |
- AppendSearchProvider(); |
- } |
- |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PRINT)) |
- AppendPrintItem(); |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION)) { |
- DCHECK(!content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION)); |
- AppendAllExtensionItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION)) { |
- DCHECK(!content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION)); |
- AppendCurrentExtensionItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_DEVELOPER)) { |
- AppendDeveloperItems(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_DEVTOOLS_UNPACKED_EXT)) { |
- AppendDevtoolsForUnpackedExtensions(); |
- } |
- |
- if (content_type_->SupportsGroup( |
- ContextMenuContentType::ITEM_GROUP_PRINT_PREVIEW)) { |
- AppendPrintPreviewItems(); |
- } |
-} |
- |
-Profile* RenderViewContextMenu::GetProfile() { |
- return Profile::FromBrowserContext(browser_context_); |
-} |
- |
-void RenderViewContextMenu::AppendPrintPreviewItems() { |
-#if defined(ENABLE_FULL_PRINTING) |
- if (!print_preview_menu_observer_.get()) { |
- print_preview_menu_observer_.reset( |
- new PrintPreviewContextMenuObserver(source_web_contents_)); |
- } |
- |
- observers_.AddObserver(print_preview_menu_observer_.get()); |
-#endif |
-} |
- |
-const Extension* RenderViewContextMenu::GetExtension() const { |
- extensions::ExtensionSystem* system = |
- extensions::ExtensionSystem::Get(browser_context_); |
- // There is no process manager in some tests. |
- if (!system->process_manager()) |
- return NULL; |
- |
- return system->process_manager()->GetExtensionForRenderViewHost( |
- source_web_contents_->GetRenderViewHost()); |
} |
-void RenderViewContextMenu::AddMenuItem(int command_id, |
- const base::string16& title) { |
+void RenderViewContextMenuBase::AddMenuItem(int command_id, |
+ const base::string16& title) { |
menu_model_.AddItem(command_id, title); |
} |
-void RenderViewContextMenu::AddCheckItem(int command_id, |
+void RenderViewContextMenuBase::AddCheckItem(int command_id, |
const base::string16& title) { |
menu_model_.AddCheckItem(command_id, title); |
} |
-void RenderViewContextMenu::AddSeparator() { |
+void RenderViewContextMenuBase::AddSeparator() { |
menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
} |
-void RenderViewContextMenu::AddSubMenu(int command_id, |
+void RenderViewContextMenuBase::AddSubMenu(int command_id, |
const base::string16& label, |
ui::MenuModel* model) { |
menu_model_.AddSubMenu(command_id, label, model); |
} |
-void RenderViewContextMenu::UpdateMenuItem(int command_id, |
+void RenderViewContextMenuBase::UpdateMenuItem(int command_id, |
bool enabled, |
bool hidden, |
const base::string16& label) { |
@@ -779,361 +231,30 @@ void RenderViewContextMenu::UpdateMenuItem(int command_id, |
} |
} |
-RenderViewHost* RenderViewContextMenu::GetRenderViewHost() const { |
+RenderViewHost* RenderViewContextMenuBase::GetRenderViewHost() const { |
return source_web_contents_->GetRenderViewHost(); |
} |
-WebContents* RenderViewContextMenu::GetWebContents() const { |
+WebContents* RenderViewContextMenuBase::GetWebContents() const { |
return source_web_contents_; |
} |
-BrowserContext* RenderViewContextMenu::GetBrowserContext() const { |
+BrowserContext* RenderViewContextMenuBase::GetBrowserContext() const { |
return browser_context_; |
} |
-bool RenderViewContextMenu::AppendCustomItems() { |
+bool RenderViewContextMenuBase::AppendCustomItems() { |
size_t total_items = 0; |
AddCustomItemsToMenu(params_.custom_items, 0, &total_items, this, |
&menu_model_); |
return total_items > 0; |
} |
-void RenderViewContextMenu::AppendDeveloperItems() { |
- // Show Inspect Element in DevTools itself only in case of the debug |
- // devtools build. |
- bool show_developer_items = !IsDevToolsURL(params_.page_url); |
- |
-#if defined(DEBUG_DEVTOOLS) |
- show_developer_items = true; |
-#endif |
- |
- if (!show_developer_items) |
- return; |
- |
- // In the DevTools popup menu, "developer items" is normally the only |
- // section, so omit the separator there. |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_INSPECTELEMENT, |
- IDS_CONTENT_CONTEXT_INSPECTELEMENT); |
-} |
- |
-void RenderViewContextMenu::AppendDevtoolsForUnpackedExtensions() { |
- // Add a separator if there are any items already in the menu. |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP, |
- IDS_CONTENT_CONTEXT_RELOAD_PACKAGED_APP); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP, |
- IDS_CONTENT_CONTEXT_RESTART_APP); |
- AppendDeveloperItems(); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE, |
- IDS_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE); |
-} |
- |
-void RenderViewContextMenu::AppendLinkItems() { |
- if (!params_.link_url.is_empty()) { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB, |
- IDS_CONTENT_CONTEXT_OPENLINKNEWTAB); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW, |
- IDS_CONTENT_CONTEXT_OPENLINKNEWWINDOW); |
- if (params_.link_url.is_valid()) { |
- AppendProtocolHandlerSubMenu(); |
- } |
- |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD, |
- IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVELINKAS, |
- IDS_CONTENT_CONTEXT_SAVELINKAS); |
- } |
- |
- menu_model_.AddItemWithStringId( |
- IDC_CONTENT_CONTEXT_COPYLINKLOCATION, |
- params_.link_url.SchemeIs(url::kMailToScheme) ? |
- IDS_CONTENT_CONTEXT_COPYEMAILADDRESS : |
- IDS_CONTENT_CONTEXT_COPYLINKLOCATION); |
-} |
- |
-void RenderViewContextMenu::AppendImageItems() { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, |
- IDS_CONTENT_CONTEXT_SAVEIMAGEAS); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGELOCATION, |
- IDS_CONTENT_CONTEXT_COPYIMAGELOCATION); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE, |
- IDS_CONTENT_CONTEXT_COPYIMAGE); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB, |
- IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); |
-} |
- |
-void RenderViewContextMenu::AppendSearchWebForImageItems() { |
- TemplateURLService* service = |
- TemplateURLServiceFactory::GetForProfile(GetProfile()); |
- const TemplateURL* const default_provider = |
- service->GetDefaultSearchProvider(); |
- if (params_.has_image_contents && default_provider && |
- !default_provider->image_url().empty() && |
- default_provider->image_url_ref().IsValid(service->search_terms_data())) { |
- menu_model_.AddItem( |
- IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE, |
- l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_SEARCHWEBFORIMAGE, |
- default_provider->short_name())); |
- } |
-} |
- |
-void RenderViewContextMenu::AppendAudioItems() { |
- AppendMediaItems(); |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS, |
- IDS_CONTENT_CONTEXT_SAVEAUDIOAS); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYAVLOCATION, |
- IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB, |
- IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB); |
-} |
- |
-void RenderViewContextMenu::AppendCanvasItems() { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, |
- IDS_CONTENT_CONTEXT_SAVEIMAGEAS); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE, |
- IDS_CONTENT_CONTEXT_COPYIMAGE); |
-} |
- |
-void RenderViewContextMenu::AppendVideoItems() { |
- AppendMediaItems(); |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS, |
- IDS_CONTENT_CONTEXT_SAVEVIDEOAS); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYAVLOCATION, |
- IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB, |
- IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB); |
-} |
- |
-void RenderViewContextMenu::AppendMediaItems() { |
- int media_flags = params_.media_flags; |
- |
- menu_model_.AddItemWithStringId( |
- IDC_CONTENT_CONTEXT_PLAYPAUSE, |
- media_flags & WebContextMenuData::MediaPaused ? |
- IDS_CONTENT_CONTEXT_PLAY : |
- IDS_CONTENT_CONTEXT_PAUSE); |
- |
- menu_model_.AddItemWithStringId( |
- IDC_CONTENT_CONTEXT_MUTE, |
- media_flags & WebContextMenuData::MediaMuted ? |
- IDS_CONTENT_CONTEXT_UNMUTE : |
- IDS_CONTENT_CONTEXT_MUTE); |
- |
- menu_model_.AddCheckItemWithStringId(IDC_CONTENT_CONTEXT_LOOP, |
- IDS_CONTENT_CONTEXT_LOOP); |
- menu_model_.AddCheckItemWithStringId(IDC_CONTENT_CONTEXT_CONTROLS, |
- IDS_CONTENT_CONTEXT_CONTROLS); |
-} |
- |
-void RenderViewContextMenu::AppendPluginItems() { |
- if (params_.page_url == params_.src_url) { |
- // Full page plugin, so show page menu items. |
- if (params_.link_url.is_empty() && params_.selection_text.empty()) |
- AppendPageItems(); |
- } else { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS, |
- IDS_CONTENT_CONTEXT_SAVEPAGEAS); |
- menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); |
- } |
- |
- if (params_.media_flags & WebContextMenuData::MediaCanRotate) { |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ROTATECW, |
- IDS_CONTENT_CONTEXT_ROTATECW); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ROTATECCW, |
- IDS_CONTENT_CONTEXT_ROTATECCW); |
- } |
-} |
- |
-void RenderViewContextMenu::AppendPageItems() { |
- menu_model_.AddItemWithStringId(IDC_BACK, IDS_CONTENT_CONTEXT_BACK); |
- menu_model_.AddItemWithStringId(IDC_FORWARD, IDS_CONTENT_CONTEXT_FORWARD); |
- menu_model_.AddItemWithStringId(IDC_RELOAD, IDS_CONTENT_CONTEXT_RELOAD); |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_SAVE_PAGE, |
- IDS_CONTENT_CONTEXT_SAVEPAGEAS); |
- menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); |
- |
- if (TranslateService::IsTranslatableURL(params_.page_url)) { |
- std::string locale = g_browser_process->GetApplicationLocale(); |
- locale = translate::TranslateDownloadManager::GetLanguageCode(locale); |
- base::string16 language = |
- l10n_util::GetDisplayNameForLocale(locale, locale, true); |
- menu_model_.AddItem( |
- IDC_CONTENT_CONTEXT_TRANSLATE, |
- l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_TRANSLATE, language)); |
- } |
- |
- menu_model_.AddItemWithStringId(IDC_VIEW_SOURCE, |
- IDS_CONTENT_CONTEXT_VIEWPAGESOURCE); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWPAGEINFO, |
- IDS_CONTENT_CONTEXT_VIEWPAGEINFO); |
-} |
- |
-void RenderViewContextMenu::AppendFrameItems() { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RELOADFRAME, |
- IDS_CONTENT_CONTEXT_RELOADFRAME); |
- // These two menu items have yet to be implemented. |
- // http://code.google.com/p/chromium/issues/detail?id=11827 |
- // IDS_CONTENT_CONTEXT_SAVEFRAMEAS |
- // IDS_CONTENT_CONTEXT_PRINTFRAME |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE, |
- IDS_CONTENT_CONTEXT_VIEWFRAMESOURCE); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMEINFO, |
- IDS_CONTENT_CONTEXT_VIEWFRAMEINFO); |
-} |
- |
-void RenderViewContextMenu::AppendCopyItem() { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY, |
- IDS_CONTENT_CONTEXT_COPY); |
-} |
- |
-void RenderViewContextMenu::AppendPrintItem() { |
- if (GetPrefs(browser_context_)->GetBoolean(prefs::kPrintingEnabled) && |
- (params_.media_type == WebContextMenuData::MediaTypeNone || |
- params_.media_flags & WebContextMenuData::MediaCanPrint)) { |
- menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); |
- } |
-} |
- |
-void RenderViewContextMenu::AppendSearchProvider() { |
- DCHECK(browser_context_); |
- |
- base::TrimWhitespace(params_.selection_text, base::TRIM_ALL, |
- ¶ms_.selection_text); |
- if (params_.selection_text.empty()) |
- return; |
- |
- base::ReplaceChars(params_.selection_text, AutocompleteMatch::kInvalidChars, |
- base::ASCIIToUTF16(" "), ¶ms_.selection_text); |
- |
- AutocompleteMatch match; |
- AutocompleteClassifierFactory::GetForProfile(GetProfile()) |
- ->Classify(params_.selection_text, |
- false, |
- false, |
- metrics::OmniboxEventProto::INVALID_SPEC, |
- &match, |
- NULL); |
- selection_navigation_url_ = match.destination_url; |
- if (!selection_navigation_url_.is_valid()) |
- return; |
- |
- base::string16 printable_selection_text = PrintableSelectionText(); |
- EscapeAmpersands(&printable_selection_text); |
- |
- if (AutocompleteMatch::IsSearchType(match.type)) { |
- const TemplateURL* const default_provider = |
- TemplateURLServiceFactory::GetForProfile(GetProfile()) |
- ->GetDefaultSearchProvider(); |
- if (!default_provider) |
- return; |
- menu_model_.AddItem( |
- IDC_CONTENT_CONTEXT_SEARCHWEBFOR, |
- l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_SEARCHWEBFOR, |
- default_provider->short_name(), |
- printable_selection_text)); |
- } else { |
- if ((selection_navigation_url_ != params_.link_url) && |
- ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme( |
- selection_navigation_url_.scheme())) { |
- menu_model_.AddItem( |
- IDC_CONTENT_CONTEXT_GOTOURL, |
- l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_GOTOURL, |
- printable_selection_text)); |
- } |
- } |
-} |
- |
-void RenderViewContextMenu::AppendEditableItems() { |
- const bool use_spellcheck_and_search = !chrome::IsRunningInForcedAppMode(); |
- |
- if (use_spellcheck_and_search) |
- AppendSpellingSuggestionsSubMenu(); |
- |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_UNDO, |
- IDS_CONTENT_CONTEXT_UNDO); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_REDO, |
- IDS_CONTENT_CONTEXT_REDO); |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_CUT, |
- IDS_CONTENT_CONTEXT_CUT); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY, |
- IDS_CONTENT_CONTEXT_COPY); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_PASTE, |
- IDS_CONTENT_CONTEXT_PASTE); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE, |
- IDS_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_DELETE, |
- IDS_CONTENT_CONTEXT_DELETE); |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- |
- if (use_spellcheck_and_search && !params_.keyword_url.is_empty()) { |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ADDSEARCHENGINE, |
- IDS_CONTENT_CONTEXT_ADDSEARCHENGINE); |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- } |
- |
- if (use_spellcheck_and_search) |
- AppendSpellcheckOptionsSubMenu(); |
- AppendPlatformEditableItems(); |
- |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SELECTALL, |
- IDS_CONTENT_CONTEXT_SELECTALL); |
-} |
- |
-void RenderViewContextMenu::AppendSpellingSuggestionsSubMenu() { |
- if (!spelling_menu_observer_.get()) |
- spelling_menu_observer_.reset(new SpellingMenuObserver(this)); |
- observers_.AddObserver(spelling_menu_observer_.get()); |
- spelling_menu_observer_->InitMenu(params_); |
-} |
- |
-void RenderViewContextMenu::AppendSpellcheckOptionsSubMenu() { |
- if (!spellchecker_submenu_observer_.get()) { |
- spellchecker_submenu_observer_.reset(new SpellCheckerSubMenuObserver( |
- this, this, kSpellcheckRadioGroup)); |
- } |
- spellchecker_submenu_observer_->InitMenu(params_); |
- observers_.AddObserver(spellchecker_submenu_observer_.get()); |
-} |
- |
-void RenderViewContextMenu::AppendProtocolHandlerSubMenu() { |
- const ProtocolHandlerRegistry::ProtocolHandlerList handlers = |
- GetHandlersForLinkUrl(); |
- if (handlers.empty()) |
- return; |
- size_t max = IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST - |
- IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST; |
- for (size_t i = 0; i < handlers.size() && i <= max; i++) { |
- protocol_handler_submenu_model_.AddItem( |
- IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST + i, |
- base::UTF8ToUTF16(handlers[i].url().host())); |
- } |
- protocol_handler_submenu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- protocol_handler_submenu_model_.AddItem( |
- IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS, |
- l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_OPENLINKWITH_CONFIGURE)); |
- |
- menu_model_.AddSubMenu( |
- IDC_CONTENT_CONTEXT_OPENLINKWITH, |
- l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_OPENLINKWITH), |
- &protocol_handler_submenu_model_); |
-} |
- |
-void RenderViewContextMenu::AppendPlatformEditableItems() { |
-} |
- |
// Menu delegate functions ----------------------------------------------------- |
-bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { |
- // If this command is is added by one of our observers, we dispatch it to the |
- // observer. |
+bool RenderViewContextMenuBase::IsCommandIdEnabled(int id) const { |
+ // If this command is is added by one of our observers, we dispatch |
+ // it to the observer. |
ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); |
RenderViewContextMenuObserver* observer; |
while ((observer = it.GetNext()) != NULL) { |
@@ -1141,293 +262,14 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { |
return observer->IsCommandIdEnabled(id); |
} |
- CoreTabHelper* core_tab_helper = |
- CoreTabHelper::FromWebContents(source_web_contents_); |
- int content_restrictions = 0; |
- if (core_tab_helper) |
- content_restrictions = core_tab_helper->content_restrictions(); |
- if (id == IDC_PRINT && (content_restrictions & CONTENT_RESTRICTION_PRINT)) |
- return false; |
- |
- if (id == IDC_SAVE_PAGE && |
- (content_restrictions & CONTENT_RESTRICTION_SAVE)) { |
- return false; |
- } |
- |
- PrefService* prefs = GetPrefs(browser_context_); |
- |
- // Allow Spell Check language items on sub menu for text area context menu. |
- if ((id >= IDC_SPELLCHECK_LANGUAGES_FIRST) && |
- (id < IDC_SPELLCHECK_LANGUAGES_LAST)) { |
- return prefs->GetBoolean(prefs::kEnableContinuousSpellcheck); |
- } |
- |
// Custom items. |
if (IsContentCustomCommandId(id)) |
- return IsCustomItemEnabled(params_.custom_items, id); |
- |
- // Extension items. |
- if (ContextMenuMatcher::IsExtensionsCustomCommandId(id)) |
- return extension_items_.IsCommandIdEnabled(id); |
- |
- if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST && |
- id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) { |
- return true; |
- } |
- |
- IncognitoModePrefs::Availability incognito_avail = |
- IncognitoModePrefs::GetAvailability(prefs); |
- switch (id) { |
- case IDC_BACK: |
- return source_web_contents_->GetController().CanGoBack(); |
- |
- case IDC_FORWARD: |
- return source_web_contents_->GetController().CanGoForward(); |
- |
- case IDC_RELOAD: { |
- CoreTabHelper* core_tab_helper = |
- CoreTabHelper::FromWebContents(source_web_contents_); |
- if (!core_tab_helper) |
- return false; |
- |
- CoreTabHelperDelegate* core_delegate = core_tab_helper->delegate(); |
- return !core_delegate || |
- core_delegate->CanReloadContents(source_web_contents_); |
- } |
- |
- case IDC_VIEW_SOURCE: |
- case IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE: |
- return source_web_contents_->GetController().CanViewSource(); |
- |
- case IDC_CONTENT_CONTEXT_INSPECTELEMENT: |
- case IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE: |
- case IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP: |
- case IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP: |
- return IsDevCommandEnabled(id); |
- |
- case IDC_CONTENT_CONTEXT_VIEWPAGEINFO: |
- if (source_web_contents_->GetController().GetVisibleEntry() == NULL) |
- return false; |
- // Disabled if no browser is associated (e.g. desktop notifications). |
- if (chrome::FindBrowserWithWebContents(source_web_contents_) == NULL) |
- return false; |
- return true; |
- |
- case IDC_CONTENT_CONTEXT_TRANSLATE: { |
- ChromeTranslateClient* chrome_translate_client = |
- ChromeTranslateClient::FromWebContents(source_web_contents_); |
- if (!chrome_translate_client) |
- return false; |
- std::string original_lang = |
- chrome_translate_client->GetLanguageState().original_language(); |
- std::string target_lang = g_browser_process->GetApplicationLocale(); |
- target_lang = |
- translate::TranslateDownloadManager::GetLanguageCode(target_lang); |
- // Note that we intentionally enable the menu even if the original and |
- // target languages are identical. This is to give a way to user to |
- // translate a page that might contains text fragments in a different |
- // language. |
- return ((params_.edit_flags & WebContextMenuData::CanTranslate) != 0) && |
- !original_lang.empty() && // Did we receive the page language yet? |
- !chrome_translate_client->GetLanguageState().IsPageTranslated() && |
- !source_web_contents_->GetInterstitialPage() && |
- // There are some application locales which can't be used as a |
- // target language for translation. |
- translate::TranslateDownloadManager::IsSupportedLanguage( |
- target_lang) && |
- // Disable on the Instant Extended NTP. |
- !chrome::IsInstantNTP(source_web_contents_); |
- } |
- |
- case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB: |
- case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW: |
- return params_.link_url.is_valid(); |
- |
- case IDC_CONTENT_CONTEXT_COPYLINKLOCATION: |
- return params_.unfiltered_link_url.is_valid(); |
- |
- case IDC_CONTENT_CONTEXT_SAVELINKAS: { |
- PrefService* local_state = g_browser_process->local_state(); |
- DCHECK(local_state); |
- // Test if file-selection dialogs are forbidden by policy. |
- if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs)) |
- return false; |
- |
- return params_.link_url.is_valid() && |
- ProfileIOData::IsHandledProtocol(params_.link_url.scheme()); |
- } |
+ return IsCustomItemEnabled(id); |
- case IDC_CONTENT_CONTEXT_SAVEIMAGEAS: { |
- PrefService* local_state = g_browser_process->local_state(); |
- DCHECK(local_state); |
- // Test if file-selection dialogs are forbidden by policy. |
- if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs)) |
- return false; |
- |
- if (params_.media_type == WebContextMenuData::MediaTypeCanvas) |
- return true; |
- |
- return params_.src_url.is_valid() && |
- ProfileIOData::IsHandledProtocol(params_.src_url.scheme()); |
- } |
- |
- // The images shown in the most visited thumbnails can't be opened or |
- // searched for conventionally. |
- case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB: |
- case IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE: |
- return params_.src_url.is_valid() && |
- (params_.src_url.scheme() != content::kChromeUIScheme); |
- |
- case IDC_CONTENT_CONTEXT_COPYIMAGE: |
- return params_.has_image_contents; |
- |
- // Media control commands should all be disabled if the player is in an |
- // error state. |
- case IDC_CONTENT_CONTEXT_PLAYPAUSE: |
- case IDC_CONTENT_CONTEXT_LOOP: |
- return (params_.media_flags & |
- WebContextMenuData::MediaInError) == 0; |
- |
- // Mute and unmute should also be disabled if the player has no audio. |
- case IDC_CONTENT_CONTEXT_MUTE: |
- return (params_.media_flags & |
- WebContextMenuData::MediaHasAudio) != 0 && |
- (params_.media_flags & |
- WebContextMenuData::MediaInError) == 0; |
- |
- case IDC_CONTENT_CONTEXT_CONTROLS: |
- return (params_.media_flags & |
- WebContextMenuData::MediaCanToggleControls) != 0; |
- |
- case IDC_CONTENT_CONTEXT_ROTATECW: |
- case IDC_CONTENT_CONTEXT_ROTATECCW: |
- return |
- (params_.media_flags & WebContextMenuData::MediaCanRotate) != 0; |
- |
- case IDC_CONTENT_CONTEXT_COPYAVLOCATION: |
- case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION: |
- return params_.src_url.is_valid(); |
- |
- case IDC_CONTENT_CONTEXT_SAVEAVAS: { |
- PrefService* local_state = g_browser_process->local_state(); |
- DCHECK(local_state); |
- // Test if file-selection dialogs are forbidden by policy. |
- if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs)) |
- return false; |
- |
- const GURL& url = params_.src_url; |
- bool can_save = |
- (params_.media_flags & WebContextMenuData::MediaCanSave) && |
- url.is_valid() && ProfileIOData::IsHandledProtocol(url.scheme()); |
-#if defined(ENABLE_FULL_PRINTING) |
- // Do not save the preview PDF on the print preview page. |
- can_save = can_save && |
- !(printing::PrintPreviewDialogController::IsPrintPreviewURL(url)); |
-#endif |
- return can_save; |
- } |
- |
- case IDC_CONTENT_CONTEXT_OPENAVNEWTAB: |
- return true; |
- |
- case IDC_SAVE_PAGE: { |
- CoreTabHelper* core_tab_helper = |
- CoreTabHelper::FromWebContents(source_web_contents_); |
- if (!core_tab_helper) |
- return false; |
- |
- CoreTabHelperDelegate* core_delegate = core_tab_helper->delegate(); |
- if (core_delegate && |
- !core_delegate->CanSaveContents(source_web_contents_)) |
- return false; |
- |
- PrefService* local_state = g_browser_process->local_state(); |
- DCHECK(local_state); |
- // Test if file-selection dialogs are forbidden by policy. |
- if (!local_state->GetBoolean(prefs::kAllowFileSelectionDialogs)) |
- return false; |
- |
- // We save the last committed entry (which the user is looking at), as |
- // opposed to any pending URL that hasn't committed yet. |
- NavigationEntry* entry = |
- source_web_contents_->GetController().GetLastCommittedEntry(); |
- return content::IsSavableURL(entry ? entry->GetURL() : GURL()); |
- } |
- |
- case IDC_CONTENT_CONTEXT_RELOADFRAME: |
- return params_.frame_url.is_valid(); |
- |
- case IDC_CONTENT_CONTEXT_UNDO: |
- return !!(params_.edit_flags & WebContextMenuData::CanUndo); |
- |
- case IDC_CONTENT_CONTEXT_REDO: |
- return !!(params_.edit_flags & WebContextMenuData::CanRedo); |
- |
- case IDC_CONTENT_CONTEXT_CUT: |
- return !!(params_.edit_flags & WebContextMenuData::CanCut); |
- |
- case IDC_CONTENT_CONTEXT_COPY: |
- return !!(params_.edit_flags & WebContextMenuData::CanCopy); |
- |
- case IDC_CONTENT_CONTEXT_PASTE: |
- case IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE: |
- return !!(params_.edit_flags & WebContextMenuData::CanPaste); |
- |
- case IDC_CONTENT_CONTEXT_DELETE: |
- return !!(params_.edit_flags & WebContextMenuData::CanDelete); |
- |
- case IDC_CONTENT_CONTEXT_SELECTALL: |
- return !!(params_.edit_flags & WebContextMenuData::CanSelectAll); |
- |
- case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD: |
- return !browser_context_->IsOffTheRecord() && |
- params_.link_url.is_valid() && |
- incognito_avail != IncognitoModePrefs::DISABLED; |
- |
- case IDC_PRINT: |
- return prefs->GetBoolean(prefs::kPrintingEnabled) && |
- (params_.media_type == WebContextMenuData::MediaTypeNone || |
- params_.media_flags & WebContextMenuData::MediaCanPrint); |
- |
- case IDC_CONTENT_CONTEXT_SEARCHWEBFOR: |
- case IDC_CONTENT_CONTEXT_GOTOURL: |
- case IDC_SPELLPANEL_TOGGLE: |
- case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: |
- return true; |
- case IDC_CONTENT_CONTEXT_VIEWFRAMEINFO: |
- // Disabled if no browser is associated (e.g. desktop notifications). |
- if (chrome::FindBrowserWithWebContents(source_web_contents_) == NULL) |
- return false; |
- return true; |
- |
- case IDC_CHECK_SPELLING_WHILE_TYPING: |
- return prefs->GetBoolean(prefs::kEnableContinuousSpellcheck); |
- |
-#if !defined(OS_MACOSX) && defined(OS_POSIX) |
- // TODO(suzhe): this should not be enabled for password fields. |
- case IDC_INPUT_METHODS_MENU: |
- return true; |
-#endif |
- |
- case IDC_CONTENT_CONTEXT_ADDSEARCHENGINE: |
- return !params_.keyword_url.is_empty(); |
- |
- case IDC_SPELLCHECK_MENU: |
- return true; |
- |
- case IDC_CONTENT_CONTEXT_OPENLINKWITH: |
- return true; |
- |
- case IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS: |
- return true; |
- |
- default: |
- NOTREACHED(); |
- return false; |
- } |
+ return false; |
} |
-bool RenderViewContextMenu::IsCommandIdChecked(int id) const { |
+bool RenderViewContextMenuBase::IsCommandIdChecked(int id) const { |
// If this command is is added by one of our observers, we dispatch it to the |
// observer. |
ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); |
@@ -1437,34 +279,19 @@ bool RenderViewContextMenu::IsCommandIdChecked(int id) const { |
return observer->IsCommandIdChecked(id); |
} |
- // See if the video is set to looping. |
- if (id == IDC_CONTENT_CONTEXT_LOOP) { |
- return (params_.media_flags & |
- WebContextMenuData::MediaLoop) != 0; |
- } |
- |
- if (id == IDC_CONTENT_CONTEXT_CONTROLS) { |
- return (params_.media_flags & |
- WebContextMenuData::MediaControls) != 0; |
- } |
- |
// Custom items. |
if (IsContentCustomCommandId(id)) |
- return IsCustomItemChecked(params_.custom_items, id); |
- |
- // Extension items. |
- if (ContextMenuMatcher::IsExtensionsCustomCommandId(id)) |
- return extension_items_.IsCommandIdChecked(id); |
+ return IsCustomItemChecked(id); |
return false; |
} |
-void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { |
+void RenderViewContextMenuBase::ExecuteCommand(int id, int event_flags) { |
command_executed_ = true; |
RecordUsedItem(id); |
- // If this command is is added by one of our observers, we dispatch it to the |
- // observer. |
+ // If this command is is added by one of our observers, we dispatch |
+ // it to the observer. |
ObserverListBase<RenderViewContextMenuObserver>::Iterator it(observers_); |
RenderViewContextMenuObserver* observer; |
while ((observer = it.GetNext()) != NULL) { |
@@ -1472,444 +299,21 @@ void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { |
return observer->ExecuteCommand(id); |
} |
- RenderFrameHost* render_frame_host = |
- RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
- |
// Process custom actions range. |
if (IsContentCustomCommandId(id)) { |
unsigned action = id - content_context_custom_first; |
const content::CustomContextMenuContext& context = params_.custom_context; |
#if defined(ENABLE_PLUGINS) |
- if (context.request_id && !context.is_pepper_menu) { |
- ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins( |
- source_web_contents_, false, std::string()); |
- } |
+ if (context.request_id && !context.is_pepper_menu) |
+ HandleAuthorizeAllPlugins(); |
#endif |
source_web_contents_->ExecuteCustomContextMenuCommand(action, context); |
return; |
} |
- |
- // Process extension menu items. |
- if (ContextMenuMatcher::IsExtensionsCustomCommandId(id)) { |
- extension_items_.ExecuteCommand(id, source_web_contents_, params_); |
- return; |
- } |
- |
- if (id >= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST && |
- id <= IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST) { |
- ProtocolHandlerRegistry::ProtocolHandlerList handlers = |
- GetHandlersForLinkUrl(); |
- if (handlers.empty()) { |
- return; |
- } |
- content::RecordAction( |
- UserMetricsAction("RegisterProtocolHandler.ContextMenu_Open")); |
- int handlerIndex = id - IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST; |
- WindowOpenDisposition disposition = |
- ForceNewTabDispositionFromEventFlags(event_flags); |
- OpenURL( |
- handlers[handlerIndex].TranslateUrl(params_.link_url), |
- params_.frame_url.is_empty() ? params_.page_url : params_.frame_url, |
- disposition, content::PAGE_TRANSITION_LINK); |
- return; |
- } |
- |
- switch (id) { |
- case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB: { |
- Browser* browser = |
- chrome::FindBrowserWithWebContents(source_web_contents_); |
- OpenURL( |
- params_.link_url, |
- params_.frame_url.is_empty() ? params_.page_url : params_.frame_url, |
- !browser || browser->is_app() ? |
- NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB, |
- content::PAGE_TRANSITION_LINK); |
- break; |
- } |
- case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW: |
- OpenURL( |
- params_.link_url, |
- params_.frame_url.is_empty() ? params_.page_url : params_.frame_url, |
- NEW_WINDOW, content::PAGE_TRANSITION_LINK); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD: |
- OpenURL(params_.link_url, GURL(), OFF_THE_RECORD, |
- content::PAGE_TRANSITION_LINK); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_SAVELINKAS: { |
- RecordDownloadSource(DOWNLOAD_INITIATED_BY_CONTEXT_MENU); |
- const GURL& referrer = |
- params_.frame_url.is_empty() ? params_.page_url : params_.frame_url; |
- const GURL& url = params_.link_url; |
- DownloadManager* dlm = |
- BrowserContext::GetDownloadManager(browser_context_); |
- scoped_ptr<DownloadUrlParameters> dl_params( |
- DownloadUrlParameters::FromWebContents(source_web_contents_, url)); |
- dl_params->set_referrer( |
- content::Referrer(referrer, params_.referrer_policy)); |
- dl_params->set_referrer_encoding(params_.frame_charset); |
- dl_params->set_suggested_name(params_.suggested_filename); |
- dl_params->set_prompt(true); |
- dlm->DownloadUrl(dl_params.Pass()); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_SAVEAVAS: |
- case IDC_CONTENT_CONTEXT_SAVEIMAGEAS: { |
- if (params_.media_type == WebContextMenuData::MediaTypeCanvas) { |
- source_web_contents_->GetRenderViewHost()->SaveImageAt( |
- params_.x, params_.y); |
- } else { |
- // TODO(zino): We can use SaveImageAt() like a case of canvas. |
- RecordDownloadSource(DOWNLOAD_INITIATED_BY_CONTEXT_MENU); |
- const GURL& referrer = |
- params_.frame_url.is_empty() ? params_.page_url : params_.frame_url; |
- const GURL& url = params_.src_url; |
- source_web_contents_->SaveFrame(url, content::Referrer( |
- referrer, params_.referrer_policy)); |
- } |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_COPYLINKLOCATION: |
- WriteURLToClipboard(params_.unfiltered_link_url); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION: |
- case IDC_CONTENT_CONTEXT_COPYAVLOCATION: |
- WriteURLToClipboard(params_.src_url); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_COPYIMAGE: |
- CopyImageAt(params_.x, params_.y); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE: |
- GetImageThumbnailForSearch(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB: |
- case IDC_CONTENT_CONTEXT_OPENAVNEWTAB: |
- OpenURL( |
- params_.src_url, |
- params_.frame_url.is_empty() ? params_.page_url : params_.frame_url, |
- NEW_BACKGROUND_TAB, content::PAGE_TRANSITION_LINK); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_PLAYPAUSE: { |
- bool play = !!(params_.media_flags & WebContextMenuData::MediaPaused); |
- if (play) { |
- content::RecordAction(UserMetricsAction("MediaContextMenu_Play")); |
- } else { |
- content::RecordAction(UserMetricsAction("MediaContextMenu_Pause")); |
- } |
- MediaPlayerActionAt(gfx::Point(params_.x, params_.y), |
- WebMediaPlayerAction( |
- WebMediaPlayerAction::Play, play)); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_MUTE: { |
- bool mute = !(params_.media_flags & WebContextMenuData::MediaMuted); |
- if (mute) { |
- content::RecordAction(UserMetricsAction("MediaContextMenu_Mute")); |
- } else { |
- content::RecordAction(UserMetricsAction("MediaContextMenu_Unmute")); |
- } |
- MediaPlayerActionAt(gfx::Point(params_.x, params_.y), |
- WebMediaPlayerAction( |
- WebMediaPlayerAction::Mute, mute)); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_LOOP: |
- content::RecordAction(UserMetricsAction("MediaContextMenu_Loop")); |
- MediaPlayerActionAt(gfx::Point(params_.x, params_.y), |
- WebMediaPlayerAction( |
- WebMediaPlayerAction::Loop, |
- !IsCommandIdChecked(IDC_CONTENT_CONTEXT_LOOP))); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_CONTROLS: |
- content::RecordAction(UserMetricsAction("MediaContextMenu_Controls")); |
- MediaPlayerActionAt( |
- gfx::Point(params_.x, params_.y), |
- WebMediaPlayerAction( |
- WebMediaPlayerAction::Controls, |
- !IsCommandIdChecked(IDC_CONTENT_CONTEXT_CONTROLS))); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_ROTATECW: |
- content::RecordAction( |
- UserMetricsAction("PluginContextMenu_RotateClockwise")); |
- PluginActionAt( |
- gfx::Point(params_.x, params_.y), |
- WebPluginAction( |
- WebPluginAction::Rotate90Clockwise, |
- true)); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_ROTATECCW: |
- content::RecordAction( |
- UserMetricsAction("PluginContextMenu_RotateCounterclockwise")); |
- PluginActionAt( |
- gfx::Point(params_.x, params_.y), |
- WebPluginAction( |
- WebPluginAction::Rotate90Counterclockwise, |
- true)); |
- break; |
- |
- case IDC_BACK: |
- source_web_contents_->GetController().GoBack(); |
- break; |
- |
- case IDC_FORWARD: |
- source_web_contents_->GetController().GoForward(); |
- break; |
- |
- case IDC_SAVE_PAGE: |
- source_web_contents_->OnSavePage(); |
- break; |
- |
- case IDC_RELOAD: |
- source_web_contents_->GetController().Reload(true); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP: { |
- const Extension* platform_app = GetExtension(); |
- DCHECK(platform_app); |
- DCHECK(platform_app->is_platform_app()); |
- |
- extensions::ExtensionSystem::Get(browser_context_) |
- ->extension_service() |
- ->ReloadExtension(platform_app->id()); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP: { |
- const Extension* platform_app = GetExtension(); |
- DCHECK(platform_app); |
- DCHECK(platform_app->is_platform_app()); |
- |
- apps::AppLoadService::Get(GetProfile()) |
- ->RestartApplication(platform_app->id()); |
- break; |
- } |
- |
- case IDC_PRINT: |
-#if defined(ENABLE_PRINTING) |
- if (params_.media_type == WebContextMenuData::MediaTypeNone) { |
-#if defined(ENABLE_FULL_PRINTING) |
- printing::PrintViewManager* print_view_manager = |
- printing::PrintViewManager::FromWebContents(source_web_contents_); |
- |
- if (!print_view_manager) |
- break; |
- if (GetPrefs(browser_context_) |
- ->GetBoolean(prefs::kPrintPreviewDisabled)) { |
- print_view_manager->PrintNow(); |
- } else { |
- print_view_manager->PrintPreviewNow(!params_.selection_text.empty()); |
- } |
-#else |
- printing::PrintViewManagerBasic* print_view_manager = |
- printing::PrintViewManagerBasic::FromWebContents( |
- source_web_contents_); |
- if (!print_view_manager) |
- break; |
- print_view_manager->PrintNow(); |
-#endif // defined(ENABLE_FULL_PRINTING) |
- } else { |
- if (render_frame_host) { |
- render_frame_host->Send(new PrintMsg_PrintNodeUnderContextMenu( |
- render_frame_host->GetRoutingID())); |
- } |
- } |
-#endif // defined(ENABLE_PRINTING) |
- break; |
- |
- case IDC_VIEW_SOURCE: |
- source_web_contents_->ViewSource(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_INSPECTELEMENT: |
- Inspect(params_.x, params_.y); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE: { |
- const Extension* platform_app = GetExtension(); |
- DCHECK(platform_app); |
- DCHECK(platform_app->is_platform_app()); |
- |
- extensions::devtools_util::InspectBackgroundPage(platform_app, |
- GetProfile()); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_VIEWPAGEINFO: { |
- NavigationController* controller = &source_web_contents_->GetController(); |
- // Important to use GetVisibleEntry to match what's showing in the |
- // omnibox. This may return null. |
- NavigationEntry* nav_entry = controller->GetVisibleEntry(); |
- if (!nav_entry) |
- return; |
- Browser* browser = |
- chrome::FindBrowserWithWebContents(source_web_contents_); |
- chrome::ShowWebsiteSettings(browser, source_web_contents_, |
- nav_entry->GetURL(), nav_entry->GetSSL()); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_TRANSLATE: { |
- // A translation might have been triggered by the time the menu got |
- // selected, do nothing in that case. |
- ChromeTranslateClient* chrome_translate_client = |
- ChromeTranslateClient::FromWebContents(source_web_contents_); |
- if (!chrome_translate_client || |
- chrome_translate_client->GetLanguageState().IsPageTranslated() || |
- chrome_translate_client->GetLanguageState().translation_pending()) { |
- return; |
- } |
- std::string original_lang = |
- chrome_translate_client->GetLanguageState().original_language(); |
- std::string target_lang = g_browser_process->GetApplicationLocale(); |
- target_lang = |
- translate::TranslateDownloadManager::GetLanguageCode(target_lang); |
- // Since the user decided to translate for that language and site, clears |
- // any preferences for not translating them. |
- scoped_ptr<translate::TranslatePrefs> prefs( |
- ChromeTranslateClient::CreateTranslatePrefs( |
- GetPrefs(browser_context_))); |
- prefs->UnblockLanguage(original_lang); |
- prefs->RemoveSiteFromBlacklist(params_.page_url.HostNoBrackets()); |
- translate::TranslateManager* manager = |
- chrome_translate_client->GetTranslateManager(); |
- DCHECK(manager); |
- manager->TranslatePage(original_lang, target_lang, true); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_RELOADFRAME: |
- // We always obey the cache here. |
- // TODO(evanm): Perhaps we could allow shift-clicking the menu item to do |
- // a cache-ignoring reload of the frame. |
- source_web_contents_->ReloadFocusedFrame(false); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE: |
- source_web_contents_->ViewFrameSource(params_.frame_url, |
- params_.frame_page_state); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_VIEWFRAMEINFO: { |
- Browser* browser = chrome::FindBrowserWithWebContents( |
- source_web_contents_); |
- chrome::ShowWebsiteSettings(browser, source_web_contents_, |
- params_.frame_url, params_.security_info); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_UNDO: |
- source_web_contents_->Undo(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_REDO: |
- source_web_contents_->Redo(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_CUT: |
- source_web_contents_->Cut(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_COPY: |
- source_web_contents_->Copy(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_PASTE: |
- source_web_contents_->Paste(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE: |
- source_web_contents_->PasteAndMatchStyle(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_DELETE: |
- source_web_contents_->Delete(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_SELECTALL: |
- source_web_contents_->SelectAll(); |
- break; |
- |
- case IDC_CONTENT_CONTEXT_SEARCHWEBFOR: |
- case IDC_CONTENT_CONTEXT_GOTOURL: { |
- WindowOpenDisposition disposition = |
- ForceNewTabDispositionFromEventFlags(event_flags); |
- OpenURL(selection_navigation_url_, GURL(), disposition, |
- content::PAGE_TRANSITION_LINK); |
- break; |
- } |
- case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: { |
- WindowOpenDisposition disposition = |
- ForceNewTabDispositionFromEventFlags(event_flags); |
- GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage); |
- OpenURL(url, GURL(), disposition, content::PAGE_TRANSITION_LINK); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS: { |
- content::RecordAction( |
- UserMetricsAction("RegisterProtocolHandler.ContextMenu_Settings")); |
- WindowOpenDisposition disposition = |
- ForceNewTabDispositionFromEventFlags(event_flags); |
- GURL url = chrome::GetSettingsUrl(chrome::kHandlerSettingsSubPage); |
- OpenURL(url, GURL(), disposition, content::PAGE_TRANSITION_LINK); |
- break; |
- } |
- |
- case IDC_CONTENT_CONTEXT_ADDSEARCHENGINE: { |
- // Make sure the model is loaded. |
- TemplateURLService* model = |
- TemplateURLServiceFactory::GetForProfile(GetProfile()); |
- if (!model) |
- return; |
- model->Load(); |
- |
- SearchEngineTabHelper* search_engine_tab_helper = |
- SearchEngineTabHelper::FromWebContents(source_web_contents_); |
- if (search_engine_tab_helper && |
- search_engine_tab_helper->delegate()) { |
- base::string16 keyword(TemplateURL::GenerateKeyword(params_.page_url)); |
- TemplateURLData data; |
- data.short_name = keyword; |
- data.SetKeyword(keyword); |
- data.SetURL(params_.keyword_url.spec()); |
- data.favicon_url = |
- TemplateURL::GenerateFaviconURL(params_.page_url.GetOrigin()); |
- // Takes ownership of the TemplateURL. |
- search_engine_tab_helper->delegate()->ConfirmAddSearchProvider( |
- new TemplateURL(data), GetProfile()); |
- } |
- break; |
- } |
- |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-ProtocolHandlerRegistry::ProtocolHandlerList |
- RenderViewContextMenu::GetHandlersForLinkUrl() { |
- ProtocolHandlerRegistry::ProtocolHandlerList handlers = |
- protocol_handler_registry_->GetHandlersFor(params_.link_url.scheme()); |
- std::sort(handlers.begin(), handlers.end()); |
- return handlers; |
+ command_executed_ = false; |
} |
-void RenderViewContextMenu::MenuWillShow(ui::SimpleMenuModel* source) { |
+void RenderViewContextMenuBase::MenuWillShow(ui::SimpleMenuModel* source) { |
for (int i = 0; i < source->GetItemCount(); ++i) { |
if (source->IsVisibleAt(i) && |
source->GetTypeAt(i) != ui::MenuModel::TYPE_SEPARATOR) { |
@@ -1926,13 +330,10 @@ void RenderViewContextMenu::MenuWillShow(ui::SimpleMenuModel* source) { |
if (view) |
view->SetShowingContextMenu(true); |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN, |
- content::Source<RenderViewContextMenu>(this), |
- content::NotificationService::NoDetails()); |
+ NotifyMenuShown(); |
} |
-void RenderViewContextMenu::MenuClosed(ui::SimpleMenuModel* source) { |
+void RenderViewContextMenuBase::MenuClosed(ui::SimpleMenuModel* source) { |
// Ignore notifications from submenus. |
if (source != &menu_model_) |
return; |
@@ -1950,33 +351,13 @@ void RenderViewContextMenu::MenuClosed(ui::SimpleMenuModel* source) { |
} |
} |
-bool RenderViewContextMenu::IsDevCommandEnabled(int id) const { |
- if (id == IDC_CONTENT_CONTEXT_INSPECTELEMENT || |
- id == IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE) { |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- if (!GetPrefs(browser_context_) |
- ->GetBoolean(prefs::kWebKitJavascriptEnabled) || |
- command_line->HasSwitch(switches::kDisableJavaScript)) |
- return false; |
- |
- // Don't enable the web inspector if the developer tools are disabled via |
- // the preference dev-tools-disabled. |
- if (GetPrefs(browser_context_)->GetBoolean(prefs::kDevToolsDisabled)) |
- return false; |
- } |
- |
- return true; |
-} |
- |
-base::string16 RenderViewContextMenu::PrintableSelectionText() { |
- return gfx::TruncateString(params_.selection_text, |
- kMaxSelectionTextLength, |
- gfx::WORD_BREAK); |
+RenderFrameHost* RenderViewContextMenuBase::GetRenderFrameHost() { |
+ return RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
} |
// Controller functions -------------------------------------------------------- |
-void RenderViewContextMenu::OpenURL( |
+void RenderViewContextMenuBase::OpenURL( |
const GURL& url, const GURL& referring_url, |
WindowOpenDisposition disposition, |
content::PageTransition transition) { |
@@ -1991,60 +372,14 @@ void RenderViewContextMenu::OpenURL( |
if (!new_contents) |
return; |
- RetargetingDetails details; |
- details.source_web_contents = source_web_contents_; |
- details.source_render_frame_id = render_frame_id_; |
- details.target_url = url; |
- details.target_web_contents = new_contents; |
- details.not_yet_in_tabstrip = false; |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_RETARGETING, |
- content::Source<Profile>(GetProfile()), |
- content::Details<RetargetingDetails>(&details)); |
-} |
- |
-void RenderViewContextMenu::CopyImageAt(int x, int y) { |
- source_web_contents_->GetRenderViewHost()->CopyImageAt(x, y); |
-} |
- |
-void RenderViewContextMenu::GetImageThumbnailForSearch() { |
- RenderFrameHost* render_frame_host = |
- RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
- if (!render_frame_host) |
- return; |
- render_frame_host->Send(new ChromeViewMsg_RequestThumbnailForContextNode( |
- render_frame_host->GetRoutingID(), |
- kImageSearchThumbnailMinSize, |
- gfx::Size(kImageSearchThumbnailMaxWidth, |
- kImageSearchThumbnailMaxHeight))); |
-} |
- |
-void RenderViewContextMenu::Inspect(int x, int y) { |
- content::RecordAction(UserMetricsAction("DevTools_InspectElement")); |
- RenderFrameHost* render_frame_host = |
- RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
- if (!render_frame_host) |
- return; |
- DevToolsWindow::InspectElement(render_frame_host->GetRenderViewHost(), x, y); |
+ NotifyURLOpened(url, new_contents); |
} |
-void RenderViewContextMenu::WriteURLToClipboard(const GURL& url) { |
- chrome_common_net::WriteURLToClipboard( |
- url, |
- GetPrefs(browser_context_)->GetString(prefs::kAcceptLanguages), |
- ui::Clipboard::GetForCurrentThread()); |
+bool RenderViewContextMenuBase::IsCustomItemChecked(int id) const { |
+ return IsCustomItemCheckedInternal(params_.custom_items, id); |
} |
-void RenderViewContextMenu::MediaPlayerActionAt( |
- const gfx::Point& location, |
- const WebMediaPlayerAction& action) { |
- source_web_contents_->GetRenderViewHost()-> |
- ExecuteMediaPlayerActionAtLocation(location, action); |
+bool RenderViewContextMenuBase::IsCustomItemEnabled(int id) const { |
+ return IsCustomItemEnabledInternal(params_.custom_items, id); |
} |
-void RenderViewContextMenu::PluginActionAt( |
- const gfx::Point& location, |
- const WebPluginAction& action) { |
- source_web_contents_->GetRenderViewHost()-> |
- ExecutePluginActionAtLocation(location, action); |
-} |