Index: chrome/browser/renderer_context_menu/render_view_context_menu.cc |
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc |
index 5a4ab40131b9e7646e31a3ba46e0a045871eb86b..0e637d78794fcb45d3c4fc951292f6ab2e35dc57 100644 |
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc |
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc |
@@ -38,7 +38,6 @@ |
#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" |
@@ -146,6 +145,13 @@ using extensions::MenuManager; |
namespace { |
+// Whether to return the general enum_id or context_specific_enum_id |
+// in the FindUMAEnumValueForCommand lookup function. |
+enum UmaEnumIdLookupType { |
+ GENERAL_ENUM_ID, |
+ CONTEXT_SPECIFIC_ENUM_ID, |
+}; |
+ |
const int kImageSearchThumbnailMinSize = 300 * 300; |
const int kImageSearchThumbnailMaxWidth = 600; |
const int kImageSearchThumbnailMaxHeight = 600; |
@@ -155,8 +161,14 @@ const int kImageSearchThumbnailMaxHeight = 600; |
// 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|. |
+// |
+// |context_specific_enum_id| matches the ContextMenuOption histogram enum. |
+// Used to track command usage under specific contexts, specifically Menu |
+// items under 'link + image' and 'selected text'. Should be set to -1 if |
+// command is not context specific tracked. |
const struct UmaEnumCommandIdPair { |
int enum_id; |
+ int context_specific_enum_id; |
int control_id; |
} kUmaEnumToControlId[] = { |
/* |
@@ -164,72 +176,73 @@ const struct UmaEnumCommandIdPair { |
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}, |
- {61, IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB}, |
- {62, IDC_WRITING_DIRECTION_MENU}, |
- {63, IDC_WRITING_DIRECTION_DEFAULT}, |
- {64, IDC_WRITING_DIRECTION_LTR}, |
- {65, IDC_WRITING_DIRECTION_RTL}, |
- {66, IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE}, |
- {67, IDC_CONTENT_CONTEXT_FORCESAVEPASSWORD}, |
+ {2, -1, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST}, |
+ {3, 0, IDC_CONTENT_CONTEXT_OPENLINKNEWTAB}, |
+ {4, 15, IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW}, |
+ {5, 1, IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD}, |
+ {6, 5, IDC_CONTENT_CONTEXT_SAVELINKAS}, |
+ {7, 17, IDC_CONTENT_CONTEXT_SAVEAVAS}, |
+ {8, 6, IDC_CONTENT_CONTEXT_SAVEIMAGEAS}, |
+ {9, 2, IDC_CONTENT_CONTEXT_COPYLINKLOCATION}, |
+ {10, 10, IDC_CONTENT_CONTEXT_COPYIMAGELOCATION}, |
+ {11, -1, IDC_CONTENT_CONTEXT_COPYAVLOCATION}, |
+ {12, 9, IDC_CONTENT_CONTEXT_COPYIMAGE}, |
+ {13, 8, IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB}, |
+ {14, -1, IDC_CONTENT_CONTEXT_OPENAVNEWTAB}, |
+ {15, -1, IDC_CONTENT_CONTEXT_PLAYPAUSE}, |
+ {16, -1, IDC_CONTENT_CONTEXT_MUTE}, |
+ {17, -1, IDC_CONTENT_CONTEXT_LOOP}, |
+ {18, -1, IDC_CONTENT_CONTEXT_CONTROLS}, |
+ {19, -1, IDC_CONTENT_CONTEXT_ROTATECW}, |
+ {20, -1, IDC_CONTENT_CONTEXT_ROTATECCW}, |
+ {21, -1, IDC_BACK}, |
+ {22, -1, IDC_FORWARD}, |
+ {23, -1, IDC_SAVE_PAGE}, |
+ {24, -1, IDC_RELOAD}, |
+ {25, -1, IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP}, |
+ {26, -1, IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP}, |
+ {27, 16, IDC_PRINT}, |
+ {28, -1, IDC_VIEW_SOURCE}, |
+ {29, -1, IDC_CONTENT_CONTEXT_INSPECTELEMENT}, |
+ {30, -1, IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE}, |
+ {31, -1, IDC_CONTENT_CONTEXT_VIEWPAGEINFO}, |
+ {32, -1, IDC_CONTENT_CONTEXT_TRANSLATE}, |
+ {33, -1, IDC_CONTENT_CONTEXT_RELOADFRAME}, |
+ {34, -1, IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE}, |
+ {35, -1, IDC_CONTENT_CONTEXT_VIEWFRAMEINFO}, |
+ {36, -1, IDC_CONTENT_CONTEXT_UNDO}, |
+ {37, -1, IDC_CONTENT_CONTEXT_REDO}, |
+ {38, -1, IDC_CONTENT_CONTEXT_CUT}, |
+ {39, 4, IDC_CONTENT_CONTEXT_COPY}, |
+ {40, -1, IDC_CONTENT_CONTEXT_PASTE}, |
+ {41, -1, IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE}, |
+ {42, -1, IDC_CONTENT_CONTEXT_DELETE}, |
+ {43, -1, IDC_CONTENT_CONTEXT_SELECTALL}, |
+ {44, 17, IDC_CONTENT_CONTEXT_SEARCHWEBFOR}, |
+ {45, -1, IDC_CONTENT_CONTEXT_GOTOURL}, |
+ {46, -1, IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS}, |
+ {47, -1, IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS}, |
+ {48, -1, IDC_CONTENT_CONTEXT_ADDSEARCHENGINE}, |
+ {52, -1, IDC_CONTENT_CONTEXT_OPENLINKWITH}, |
+ {53, -1, IDC_CHECK_SPELLING_WHILE_TYPING}, |
+ {54, -1, IDC_SPELLCHECK_MENU}, |
+ {55, -1, IDC_CONTENT_CONTEXT_SPELLING_TOGGLE}, |
+ {56, -1, IDC_SPELLCHECK_LANGUAGES_FIRST}, |
+ {57, 11, IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE}, |
+ {58, -1, IDC_SPELLCHECK_SUGGESTION_0}, |
+ {59, -1, IDC_SPELLCHECK_ADD_TO_DICTIONARY}, |
+ {60, -1, IDC_SPELLPANEL_TOGGLE}, |
+ {61, -1, IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB}, |
+ {62, -1, IDC_WRITING_DIRECTION_MENU}, |
+ {63, -1, IDC_WRITING_DIRECTION_DEFAULT}, |
+ {64, -1, IDC_WRITING_DIRECTION_LTR}, |
+ {65, -1, IDC_WRITING_DIRECTION_RTL}, |
+ {66, -1, IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE}, |
+ {67, -1, IDC_CONTENT_CONTEXT_FORCESAVEPASSWORD}, |
// Add new items here and use |enum_id| from the next line. |
// Also, add new items to RenderViewContextMenuItem enum in histograms.xml. |
- {68, 0}, // Must be the last. Increment |enum_id| when new IDC was added. |
+ {68, -1, 0}, // Must be the last. Increment |enum_id| when new IDC |
+ // was added. |
}; |
// Collapses large ranges of ids before looking for UMA enum. |
@@ -256,7 +269,8 @@ int CollapseCommandsForUMA(int id) { |
} |
// Returns UMA enum value for command specified by |id| or -1 if not found. |
-int FindUMAEnumValueForCommand(int id) { |
+// |use_specific_context_enum| set to true returns the context_specific_enum_id. |
+int FindUMAEnumValueForCommand(int id, UmaEnumIdLookupType enum_lookup_type) { |
if (RenderViewContextMenu::IsContentCustomCommandId(id)) |
return 0; |
@@ -267,9 +281,15 @@ int FindUMAEnumValueForCommand(int 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; |
+ if (enum_lookup_type == GENERAL_ENUM_ID) { |
+ return kUmaEnumToControlId[i].enum_id; |
+ } else if (enum_lookup_type == CONTEXT_SPECIFIC_ENUM_ID && |
+ kUmaEnumToControlId[i].context_specific_enum_id > -1) { |
+ return kUmaEnumToControlId[i].context_specific_enum_id; |
+ } |
} |
} |
+ |
return -1; |
} |
@@ -341,8 +361,6 @@ void WriteURLToClipboard(const GURL& url, const std::string& languages) { |
bool g_custom_id_ranges_initialized = false; |
-const int kSpellcheckRadioGroup = 1; |
- |
} // namespace |
// static |
@@ -558,13 +576,6 @@ void RenderViewContextMenu::InitMenu() { |
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) |
@@ -617,8 +628,18 @@ void RenderViewContextMenu::InitMenu() { |
AppendSearchProvider(); |
} |
- if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PRINT)) |
+ if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PRINT) && |
+ !content_type_->SupportsGroup( |
+ ContextMenuContentType::ITEM_GROUP_MEDIA_IMAGE)) { |
AppendPrintItem(); |
+ } |
+ |
+ if (content_type_->SupportsGroup( |
+ ContextMenuContentType::ITEM_GROUP_EDITABLE)) { |
+ menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
+ AppendPlatformEditableItems(); |
+ AppendLanguageSettings(); |
+ } |
if (content_type_->SupportsGroup( |
ContextMenuContentType::ITEM_GROUP_MEDIA_PLUGIN)) { |
@@ -665,18 +686,37 @@ Profile* RenderViewContextMenu::GetProfile() { |
} |
void RenderViewContextMenu::RecordUsedItem(int id) { |
- int enum_id = FindUMAEnumValueForCommand(id); |
+ int enum_id = FindUMAEnumValueForCommand(id, GENERAL_ENUM_ID); |
if (enum_id != -1) { |
const size_t kMappingSize = arraysize(kUmaEnumToControlId); |
UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.Used", enum_id, |
kUmaEnumToControlId[kMappingSize - 1].enum_id); |
+ // Record to additional context specific histograms. |
+ enum_id = FindUMAEnumValueForCommand(id, CONTEXT_SPECIFIC_ENUM_ID); |
+ |
+ // Linked image context. |
+ if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK) && |
+ content_type_->SupportsGroup( |
+ ContextMenuContentType::ITEM_GROUP_MEDIA_IMAGE)) { |
+ UMA_HISTOGRAM_ENUMERATION("ContextMenu.SelectedOption.ImageLink", enum_id, |
+ kUmaEnumToControlId[kMappingSize - 1].enum_id); |
+ } |
+ // Selected text context. |
+ if (content_type_->SupportsGroup( |
+ ContextMenuContentType::ITEM_GROUP_SEARCH_PROVIDER) && |
+ content_type_->SupportsGroup( |
+ ContextMenuContentType::ITEM_GROUP_PRINT)) { |
+ UMA_HISTOGRAM_ENUMERATION("ContextMenu.SelectedOption.SelectedText", |
+ enum_id, |
+ kUmaEnumToControlId[kMappingSize - 1].enum_id); |
+ } |
} else { |
NOTREACHED() << "Update kUmaEnumToControlId. Unhanded IDC: " << id; |
} |
} |
void RenderViewContextMenu::RecordShownItem(int id) { |
- int enum_id = FindUMAEnumValueForCommand(id); |
+ int enum_id = FindUMAEnumValueForCommand(id, GENERAL_ENUM_ID); |
if (enum_id != -1) { |
const size_t kMappingSize = arraysize(kUmaEnumToControlId); |
UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.Shown", enum_id, |
@@ -726,6 +766,12 @@ void RenderViewContextMenu::AppendDeveloperItems() { |
// In the DevTools popup menu, "developer items" is normally the only |
// section, so omit the separator there. |
menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
+ if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) |
+ menu_model_.AddItemWithStringId(IDC_VIEW_SOURCE, |
+ IDS_CONTENT_CONTEXT_VIEWPAGESOURCE); |
+ if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_FRAME)) |
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE, |
+ IDS_CONTENT_CONTEXT_VIEWFRAMESOURCE); |
menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_INSPECTELEMENT, |
IDS_CONTENT_CONTEXT_INSPECTELEMENT); |
} |
@@ -767,12 +813,6 @@ void RenderViewContextMenu::AppendLinkItems() { |
} |
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); |
std::map<std::string, std::string>::const_iterator it = |
params_.properties.find(data_reduction_proxy::chrome_proxy_header()); |
if (it != params_.properties.end() && it->second == |
@@ -792,6 +832,12 @@ void RenderViewContextMenu::AppendImageItems() { |
menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB, |
IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); |
} |
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, |
+ IDS_CONTENT_CONTEXT_SAVEIMAGEAS); |
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE, |
+ IDS_CONTENT_CONTEXT_COPYIMAGE); |
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGELOCATION, |
+ IDS_CONTENT_CONTEXT_COPYIMAGELOCATION); |
} |
void RenderViewContextMenu::AppendSearchWebForImageItems() { |
@@ -810,14 +856,13 @@ void RenderViewContextMenu::AppendSearchWebForImageItems() { |
} |
void RenderViewContextMenu::AppendAudioItems() { |
- AppendMediaItems(); |
menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB, |
+ IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB); |
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() { |
@@ -828,35 +873,13 @@ void RenderViewContextMenu::AppendCanvasItems() { |
} |
void RenderViewContextMenu::AppendVideoItems() { |
- AppendMediaItems(); |
menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB, |
+ IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB); |
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() { |
@@ -895,27 +918,11 @@ void RenderViewContextMenu::AppendPageItems() { |
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() { |
+ if (menu_model_.GetItemCount()) |
+ menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY, |
IDS_CONTENT_CONTEXT_COPY); |
} |
@@ -993,13 +1000,25 @@ void RenderViewContextMenu::AppendEditableItems() { |
if (use_spellcheck_and_search) |
AppendSpellingSuggestionsSubMenu(); |
- if (!IsDevToolsURL(params_.page_url)) { |
+// 'Undo' and 'Redo' for text input with no suggestions and no text selected. |
+// We make an exception for OS X as context clicking will select the closest |
+// word. In this case both items are always shown. |
+#if defined(OS_MACOSX) |
+ 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); |
+#else |
+ if (!IsDevToolsURL(params_.page_url) && !menu_model_.GetItemCount() && |
+ !content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PRINT)) { |
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); |
} |
+#endif |
menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_CUT, |
IDS_CONTENT_CONTEXT_CUT); |
@@ -1009,33 +1028,18 @@ void RenderViewContextMenu::AppendEditableItems() { |
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_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SELECTALL, |
+ IDS_CONTENT_CONTEXT_SELECTALL); |
+ |
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); |
- } |
+void RenderViewContextMenu::AppendLanguageSettings() { |
+ const bool use_spellcheck_and_search = !chrome::IsRunningInForcedAppMode(); |
-#if defined(OS_MACOSX) |
if (use_spellcheck_and_search) |
- AppendSpellcheckOptionsSubMenu(); |
-#else |
- if (chrome::spellcheck_common::IsMultilingualSpellcheckEnabled()) { |
menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS, |
IDS_CONTENT_CONTEXT_LANGUAGE_SETTINGS); |
- } else if (use_spellcheck_and_search) { |
- AppendSpellcheckOptionsSubMenu(); |
- } |
-#endif // defined(OS_MACOSX) |
- |
- AppendPlatformEditableItems(); |
- |
- menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); |
- menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SELECTALL, |
- IDS_CONTENT_CONTEXT_SELECTALL); |
} |
void RenderViewContextMenu::AppendSpellingSuggestionsSubMenu() { |
@@ -1045,15 +1049,6 @@ void RenderViewContextMenu::AppendSpellingSuggestionsSubMenu() { |
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(); |