172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <algorithm> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set> 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/render_view_context_menu.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h" 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/stl_util-inl.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h" 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_classifier.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_edit.h" 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_manager.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_window.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_manager.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/download_util.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/save_package.h" 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/extensions/extension_event_router.h" 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/metrics/user_metrics.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/browser_url_util.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/page_info_window.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/platform_util.h" 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_member.h" 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/printing/print_preview_tab_controller.h" 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url_model.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/spellcheck_host.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/spellchecker_platform_engine.h" 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/translate/translate_manager.h" 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/translate/translate_prefs.h" 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/translate/translate_tab_helper.h" 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/download/download_tab_helper.h" 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/chrome_constants.h" 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h" 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/content_restriction.h" 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/print_messages.h" 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/child_process_security_policy.h" 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h" 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h" 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/escape.h" 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h" 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerAction.h" 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebTextDirection.h" 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/favicon_size.h" 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webmenuitem.h" 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebContextMenuData; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebMediaPlayerAction; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool IsCustomItemEnabled(const std::vector<WebMenuItem>& items, int id) { 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < items.size(); ++i) { 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int action_id = IDC_CONTENT_CONTEXT_CUSTOM_FIRST + items[i].action; 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (action_id == id) 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return items[i].enabled; 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (items[i].type == WebMenuItem::SUBMENU) { 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (IsCustomItemEnabled(items[i].submenu, id)) 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return false; 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool IsCustomItemChecked(const std::vector<WebMenuItem>& items, int id) { 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST); 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < items.size(); ++i) { 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int action_id = IDC_CONTENT_CONTEXT_CUSTOM_FIRST + items[i].action; 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (action_id == id) 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return items[i].checked; 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (items[i].type == WebMenuItem::SUBMENU) { 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (IsCustomItemChecked(items[i].submenu, id)) 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return false; 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst size_t kMaxCustomMenuDepth = 5; 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst size_t kMaxCustomMenuTotalItems = 1000; 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid AddCustomItemsToMenu(const std::vector<WebMenuItem>& items, 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t depth, 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t* total_items, 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::SimpleMenuModel::Delegate* delegate, 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::SimpleMenuModel* menu_model) { 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (depth > kMaxCustomMenuDepth) { 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(ERROR) << "Custom menu too deeply nested."; 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < items.size(); ++i) { 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (IDC_CONTENT_CONTEXT_CUSTOM_FIRST + items[i].action >= 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IDC_CONTENT_CONTEXT_CUSTOM_LAST) { 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(ERROR) << "Custom menu action value too big."; 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (*total_items >= kMaxCustomMenuTotalItems) { 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(ERROR) << "Custom menu too large (too many items)."; 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (*total_items)++; 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (items[i].type) { 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebMenuItem::OPTION: 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model->AddItem( 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen items[i].action + IDC_CONTENT_CONTEXT_CUSTOM_FIRST, 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen items[i].label); 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebMenuItem::CHECKABLE_OPTION: 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model->AddCheckItem( 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen items[i].action + IDC_CONTENT_CONTEXT_CUSTOM_FIRST, 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen items[i].label); 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebMenuItem::GROUP: 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(viettrungluu): I don't know what this is supposed to do. 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NOTREACHED(); 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebMenuItem::SEPARATOR: 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model->AddSeparator(); 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebMenuItem::SUBMENU: { 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::SimpleMenuModel* submenu = new ui::SimpleMenuModel(delegate); 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddCustomItemsToMenu(items[i].submenu, depth + 1, total_items, delegate, 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen submenu); 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model->AddSubMenu( 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen items[i].action + IDC_CONTENT_CONTEXT_CUSTOM_FIRST, 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen items[i].label, 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen submenu); 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default: 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NOTREACHED(); 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst size_t RenderViewContextMenu::kMaxExtensionItemTitleLength = 75; 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst size_t RenderViewContextMenu::kMaxSelectionTextLength = 50; 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RenderViewContextMenu::IsDevToolsURL(const GURL& url) { 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return url.SchemeIs(chrome::kChromeDevToolsScheme) && 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url.host() == chrome::kChromeUIDevToolsHost; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool RenderViewContextMenu::IsInternalResourcesURL(const GURL& url) { 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!url.SchemeIs(chrome::kChromeUIScheme)) 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return url.host() == chrome::kChromeUISyncResourcesHost || 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick url.host() == chrome::kChromeUIRemotingResourcesHost; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kSpellcheckRadioGroup = 1; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRenderViewContextMenu::RenderViewContextMenu( 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents, 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ContextMenuParams& params) 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : params_(params), 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_(tab_contents), 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_(tab_contents->profile()), 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ALLOW_THIS_IN_INITIALIZER_LIST(menu_model_(this)), 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_(false), 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ALLOW_THIS_IN_INITIALIZER_LIST(spellcheck_submenu_model_(this)), 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ALLOW_THIS_IN_INITIALIZER_LIST(bidi_submenu_model_(this)) { 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRenderViewContextMenu::~RenderViewContextMenu() { 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Menu construction functions ------------------------------------------------- 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::Init() { 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitMenu(); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PlatformInit(); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic bool ExtensionContextMatch(const ContextMenuParams& params, 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem::ContextList contexts) { 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_link = !params.link_url.is_empty(); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_selection = !params.selection_text.empty(); 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool in_frame = !params.frame_url.is_empty(); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (contexts.Contains(ExtensionMenuItem::ALL) || 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (has_selection && contexts.Contains(ExtensionMenuItem::SELECTION)) || 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (has_link && contexts.Contains(ExtensionMenuItem::LINK)) || 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (params.is_editable && contexts.Contains(ExtensionMenuItem::EDITABLE)) || 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (in_frame && contexts.Contains(ExtensionMenuItem::FRAME))) { 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (params.media_type) { 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeImage: 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return contexts.Contains(ExtensionMenuItem::IMAGE); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeVideo: 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return contexts.Contains(ExtensionMenuItem::VIDEO); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeAudio: 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return contexts.Contains(ExtensionMenuItem::AUDIO); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // PAGE is the least specific context, so we only examine that if none of the 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // other contexts apply (except for FRAME, which is included in PAGE for 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // backwards compatibility). 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!has_link && !has_selection && !params.is_editable && 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.media_type == WebContextMenuData::MediaTypeNone && 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch contexts.Contains(ExtensionMenuItem::PAGE)) 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic bool ExtensionPatternMatch(const ExtensionExtent& patterns, 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) { 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // No patterns means no restriction, so that implicitly matches. 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (patterns.is_empty()) 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return patterns.ContainsURL(url); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const GURL& GetDocumentURL(const ContextMenuParams& params) { 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params.frame_url.is_empty() ? params.page_url : params.frame_url; 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Given a list of items, returns the ones that match given the contents 257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// of |params| and the profile. 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic ExtensionMenuItem::List GetRelevantExtensionItems( 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ExtensionMenuItem::List& items, 260513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ContextMenuParams& params, 261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile, 262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool can_cross_incognito) { 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem::List result; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (ExtensionMenuItem::List::const_iterator i = items.begin(); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != items.end(); ++i) { 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ExtensionMenuItem* item = *i; 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ExtensionContextMatch(params, item->contexts())) 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch continue; 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& document_url = GetDocumentURL(params); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ExtensionPatternMatch(item->document_url_patterns(), document_url)) 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch continue; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& target_url = 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.src_url.is_empty() ? params.link_url : params.src_url; 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!ExtensionPatternMatch(item->target_url_patterns(), target_url)) 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch continue; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (item->id().profile == profile || can_cross_incognito) 281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch result.push_back(*i); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendExtensionItems( 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& extension_id, int* index) { 28821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* service = profile_->GetExtensionService(); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuManager* manager = service->menu_manager(); 290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = service->GetExtensionById(extension_id, false); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_GE(*index, 0); 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_index = 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST - IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST; 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!extension || *index >= max_index) 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Find matching items. 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ExtensionMenuItem::List* all_items = manager->MenuItems(extension_id); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!all_items || all_items->empty()) 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool can_cross_incognito = service->CanCrossIncognito(extension); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem::List items = 303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GetRelevantExtensionItems(*all_items, params_, profile_, 304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch can_cross_incognito); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (items.empty()) 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If this is the first extension-provided menu item, add a separator. 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (*index == 0) 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int menu_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + (*index)++; 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Extensions are only allowed one top-level slot (and it can't be a radio or 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // checkbox item because we are going to put the extension icon next to it). 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If they have more than that, we automatically push them into a submenu. 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 title; 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem::List submenu_items; 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (items.size() > 1 || items[0]->type() != ExtensionMenuItem::NORMAL) { 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch title = UTF8ToUTF16(extension->name()); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch submenu_items = items; 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem* item = items[0]; 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_item_map_[menu_id] = item->id(); 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick title = item->TitleWithReplacement(PrintableSelectionText(), 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kMaxExtensionItemTitleLength); 327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch submenu_items = GetRelevantExtensionItems(item->children(), params_, 328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch profile_, can_cross_incognito); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now add our item(s) to the menu_model_. 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (submenu_items.empty()) { 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItem(menu_id, title); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::SimpleMenuModel* submenu = new ui::SimpleMenuModel(this); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_menu_models_.push_back(submenu); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSubMenu(menu_id, title, submenu); 338513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RecursivelyAppendExtensionItems(submenu_items, can_cross_incognito, submenu, 339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch index); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetExtensionIcon(extension_id); 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::RecursivelyAppendExtensionItems( 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ExtensionMenuItem::List& items, 346513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool can_cross_incognito, 34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::SimpleMenuModel* menu_model, 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int *index) { 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 selection_text = PrintableSelectionText(); 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem::Type last_type = ExtensionMenuItem::NORMAL; 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int radio_group_id = 1; 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (ExtensionMenuItem::List::const_iterator i = items.begin(); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != items.end(); ++i) { 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem* item = *i; 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If last item was of type radio but the current one isn't, auto-insert 3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // a separator. The converse case is handled below. 3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (last_type == ExtensionMenuItem::RADIO && 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick item->type() != ExtensionMenuItem::RADIO) { 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model->AddSeparator(); 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick last_type = ExtensionMenuItem::SEPARATOR; 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int menu_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + (*index)++; 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (menu_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_item_map_[menu_id] = item->id(); 3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 title = item->TitleWithReplacement(selection_text, 3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kMaxExtensionItemTitleLength); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (item->type() == ExtensionMenuItem::NORMAL) { 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem::List children = 373513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GetRelevantExtensionItems(item->children(), params_, 374513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch profile_, can_cross_incognito); 375dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (children.empty()) { 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model->AddItem(menu_id, title); 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::SimpleMenuModel* submenu = new ui::SimpleMenuModel(this); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_menu_models_.push_back(submenu); 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model->AddSubMenu(menu_id, title, submenu); 381513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RecursivelyAppendExtensionItems(children, can_cross_incognito, 382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch submenu, index); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (item->type() == ExtensionMenuItem::CHECKBOX) { 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model->AddCheckItem(menu_id, title); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (item->type() == ExtensionMenuItem::RADIO) { 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (i != items.begin() && 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick last_type != ExtensionMenuItem::RADIO) { 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch radio_group_id++; 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Auto-append a separator if needed. 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (last_type != ExtensionMenuItem::SEPARATOR) 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu_model->AddSeparator(); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model->AddRadioItem(menu_id, title, radio_group_id); 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (item->type() == ExtensionMenuItem::SEPARATOR) { 3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (i != items.begin() && last_type != ExtensionMenuItem::SEPARATOR) { 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu_model->AddSeparator(); 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch last_type = item->type(); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::SetExtensionIcon(const std::string& extension_id) { 40721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* service = profile_->GetExtensionService(); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuManager* menu_manager = service->menu_manager(); 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int index = menu_model_.GetItemCount() - 1; 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_GE(index, 0); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap& icon = menu_manager->GetIconForExtension(extension_id); 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(icon.width() == kFaviconSize); 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(icon.height() == kFaviconSize); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.SetIcon(index, icon); 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendAllExtensionItems() { 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_item_map_.clear(); 42221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* service = profile_->GetExtensionService(); 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!service) 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; // In unit-tests, we may not have an ExtensionService. 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuManager* menu_manager = service->menu_manager(); 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& document_url = GetDocumentURL(params_); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!menu_manager->HasAllowedScheme(document_url)) 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get a list of extension id's that have context menu items, and sort it by 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the extension's name. 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::set<std::string> ids = menu_manager->ExtensionIds(); 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::pair<std::string, std::string> > sorted_ids; 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::set<std::string>::iterator i = ids.begin(); i != ids.end(); ++i) { 435513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = service->GetExtensionById(*i, false); 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (extension) 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sorted_ids.push_back( 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::pair<std::string, std::string>(extension->name(), *i)); 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(asargent) - See if this works properly for i18n names (bug 32363). 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::sort(sorted_ids.begin(), sorted_ids.end()); 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (sorted_ids.empty()) 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int index = 0; 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeTicks begin = base::TimeTicks::Now(); 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::pair<std::string, std::string> >::const_iterator i; 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (i = sorted_ids.begin(); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != sorted_ids.end(); ++i) { 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendExtensionItems(i->second, &index); 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UMA_HISTOGRAM_TIMES("Extensions.ContextMenus_BuildTime", 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeTicks::Now() - begin); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UMA_HISTOGRAM_COUNTS("Extensions.ContextMenus_ItemCount", index); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::InitMenu() { 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_link = !params_.link_url.is_empty(); 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_selection = !params_.selection_text.empty(); 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (AppendCustomItems()) { 46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Don't add items for Pepper menu. 46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!params_.custom_context.is_pepper_menu) 46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AppendDeveloperItems(); 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When no special node or text is selected and selection has no link, 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // show page items. 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_devtools = false; 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (params_.media_type == WebContextMenuData::MediaTypeNone && 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !has_link && 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !params_.is_editable && 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !has_selection) { 47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!params_.page_url.is_empty()) { 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_devtools = IsDevToolsURL(params_.page_url); 47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!is_devtools && !IsInternalResourcesURL(params_.page_url)) { 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendPageItems(); 48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Merge in frame items if we clicked within a frame that needs them. 48172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!params_.frame_url.is_empty()) { 48272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_devtools = IsDevToolsURL(params_.frame_url); 48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!is_devtools && !IsInternalResourcesURL(params_.frame_url)) { 48472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model_.AddSeparator(); 48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AppendFrameItems(); 48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(params_.frame_url.is_empty()); 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (has_link) { 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendLinkItems(); 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (params_.media_type != WebContextMenuData::MediaTypeNone) 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (params_.media_type) { 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeNone: 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeImage: 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendImageItems(); 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeVideo: 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendVideoItems(); 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebContextMenuData::MediaTypeAudio: 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendAudioItems(); 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 51272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebContextMenuData::MediaTypePlugin: 51372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AppendPluginItems(); 51472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifdef WEBCONTEXT_MEDIATYPEFILE_DEFINED 516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen case WebContextMenuData::MediaTypeFile: 517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen break; 518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (params_.is_editable) 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendEditableItems(); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else if (has_selection) 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendCopyItem(); 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (has_selection) 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendSearchProvider(); 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!is_devtools) 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendAllExtensionItems(); 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendDeveloperItems(); 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid RenderViewContextMenu::LookUpInDictionary() { 5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Used only in the Mac port. 5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED(); 5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RenderViewContextMenu::AppendCustomItems() { 54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t total_items = 0; 54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddCustomItemsToMenu(params_.custom_items, 0, &total_items, this, 54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &menu_model_); 54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return total_items > 0; 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendDeveloperItems() { 548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // In the DevTools popup menu, "developer items" is normally the only 549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // section, so omit the separator there. 550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (menu_model_.GetItemCount() > 0) 551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen menu_model_.AddSeparator(); 552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_INSPECTELEMENT, 553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDS_CONTENT_CONTEXT_INSPECTELEMENT); 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendLinkItems() { 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB, 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_OPENLINKNEWTAB); 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW, 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_OPENLINKNEWWINDOW); 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!external_) { 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD, 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD); 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVELINKAS, 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SAVELINKAS); 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId( 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_COPYLINKLOCATION, 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_.link_url.SchemeIs(chrome::kMailToScheme) ? 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPYEMAILADDRESS : 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPYLINKLOCATION); 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendImageItems() { 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SAVEIMAGEAS); 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGELOCATION, 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPYIMAGELOCATION); 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYIMAGE, 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPYIMAGE); 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB, 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendAudioItems() { 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendMediaItems(); 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS, 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SAVEAUDIOAS); 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYAVLOCATION, 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION); 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB, 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB); 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendVideoItems() { 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendMediaItems(); 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS, 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SAVEVIDEOAS); 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYAVLOCATION, 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION); 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_OPENAVNEWTAB, 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB); 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendMediaItems() { 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int media_flags = params_.media_flags; 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId( 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_PLAYPAUSE, 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch media_flags & WebContextMenuData::MediaPaused ? 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_PLAY : 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_PAUSE); 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId( 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_MUTE, 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch media_flags & WebContextMenuData::MediaMuted ? 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_UNMUTE : 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_MUTE); 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddCheckItemWithStringId(IDC_CONTENT_CONTEXT_LOOP, 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_LOOP); 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddCheckItemWithStringId(IDC_CONTENT_CONTEXT_CONTROLS, 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_CONTROLS); 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderViewContextMenu::AppendPluginItems() { 63072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (params_.page_url == params_.src_url) { 63172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Full page plugin, so show page menu items. 63272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (params_.link_url.is_empty() && params_.selection_text.empty()) 63372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AppendPageItems(); 63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 63572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS, 63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IDS_CONTENT_CONTEXT_SAVEPAGEAS); 63772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); 63872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 64072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendPageItems() { 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_BACK, IDS_CONTENT_CONTEXT_BACK); 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_FORWARD, IDS_CONTENT_CONTEXT_FORWARD); 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_RELOAD, IDS_CONTENT_CONTEXT_RELOAD); 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_SAVE_PAGE, 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SAVEPAGEAS); 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string locale = g_browser_process->GetApplicationLocale(); 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locale = TranslateManager::GetLanguageCode(locale); 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 language = l10n_util::GetDisplayNameForLocale(locale, locale, true); 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItem( 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_TRANSLATE, 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_TRANSLATE, language)); 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_VIEW_SOURCE, 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_VIEWPAGESOURCE); 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWPAGEINFO, 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_VIEWPAGEINFO); 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendFrameItems() { 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_RELOADFRAME, 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_RELOADFRAME); 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These two menu items have yet to be implemented. 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // http://code.google.com/p/chromium/issues/detail?id=11827 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IDS_CONTENT_CONTEXT_SAVEFRAMEAS 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IDS_CONTENT_CONTEXT_PRINTFRAME 670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE, 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_VIEWFRAMESOURCE); 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_VIEWFRAMEINFO, 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_VIEWFRAMEINFO); 674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendCopyItem() { 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY, 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPY); 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendSearchProvider() { 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile_); 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TrimWhitespace(params_.selection_text, TRIM_ALL, ¶ms_.selection_text); 685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (params_.selection_text.empty()) 686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteMatch match; 68921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile_->GetAutocompleteClassifier()->Classify( 69072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params_.selection_text, string16(), false, &match, NULL); 691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch selection_navigation_url_ = match.destination_url; 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!selection_navigation_url_.is_valid()) 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 printable_selection_text = PrintableSelectionText(); 696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Escape "&" as "&&". 697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = printable_selection_text.find('&'); i != string16::npos; 698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i = printable_selection_text.find('&', i + 2)) 699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch printable_selection_text.insert(i, 1, '&'); 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (match.transition == PageTransition::TYPED) { 702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme( 703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch selection_navigation_url_.scheme())) { 704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItem( 705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_GOTOURL, 706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_GOTOURL, 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch printable_selection_text)); 708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TemplateURL* const default_provider = 711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetTemplateURLModel()->GetDefaultSearchProvider(); 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!default_provider) 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItem( 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_SEARCHWEBFOR, 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_SEARCHWEBFOR, 71772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default_provider->short_name(), 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch printable_selection_text)); 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendEditableItems() { 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Append Dictionary spell check suggestions. 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < params_.dictionary_suggestions.size() && 725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_SPELLCHECK_SUGGESTION_0 + i <= IDC_SPELLCHECK_SUGGESTION_LAST; 726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++i) { 727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItem(IDC_SPELLCHECK_SUGGESTION_0 + static_cast<int>(i), 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_.dictionary_suggestions[i]); 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 730dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!params_.dictionary_suggestions.empty()) 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If word is misspelled, give option for "Add to dictionary" 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!params_.misspelled_word.empty()) { 735dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (params_.dictionary_suggestions.empty()) { 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItem(0, 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS)); 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_SPELLCHECK_ADD_TO_DICTIONARY, 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_ADD_TO_DICTIONARY); 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_UNDO, 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_UNDO); 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_REDO, 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_REDO); 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_CUT, 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_CUT); 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPY, 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_COPY); 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_PASTE, 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_PASTE); 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_DELETE, 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_DELETE); 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendSpellcheckOptionsSubMenu(); 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // OS X provides a contextual menu to set writing direction for BiDi 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // languages. 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This functionality is exposed as a keyboard shortcut on Windows & Linux. 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendBidiSubMenu(); 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // OS_MACOSX 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSeparator(); 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SELECTALL, 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SELECTALL); 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendSpellcheckOptionsSubMenu() { 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add Spell Check languages to sub menu. 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::string> spellcheck_languages; 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckHost::GetSpellCheckLanguages(profile_, 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &spellcheck_languages); 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(spellcheck_languages.size() < 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_SPELLCHECK_LANGUAGES_LAST - IDC_SPELLCHECK_LANGUAGES_FIRST); 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string app_locale = g_browser_process->GetApplicationLocale(); 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < spellcheck_languages.size(); ++i) { 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 display_name(l10n_util::GetDisplayNameForLocale( 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_languages[i], app_locale, true)); 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_submenu_model_.AddRadioItem( 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_SPELLCHECK_LANGUAGES_FIRST + i, 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch display_name, 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kSpellcheckRadioGroup); 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add item in the sub menu to pop up the fonts and languages options menu. 792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_submenu_model_.AddSeparator(); 793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_submenu_model_.AddItemWithStringId( 794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS, 795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_LANGUAGE_SETTINGS); 796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add 'Check the spelling of this field' item in the sub menu. 798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_submenu_model_.AddCheckItem( 799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_CHECK_SPELLING_OF_THIS_FIELD, 800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_CHECK_SPELLING_OF_THIS_FIELD)); 802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add option for showing the spelling panel if the platform spellchecker 804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // supports it. 805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (SpellCheckerPlatform::SpellCheckerAvailable() && 806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckerPlatform::SpellCheckerProvidesPanel()) { 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_submenu_model_.AddCheckItem( 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_SPELLPANEL_TOGGLE, 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckerPlatform::SpellingPanelVisible() ? 811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_HIDE_SPELLING_PANEL : 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_CONTENT_CONTEXT_SHOW_SPELLING_PANEL)); 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSubMenu( 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_SPELLCHECK_MENU, 817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_SPELLCHECK_MENU), 818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &spellcheck_submenu_model_); 819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::AppendBidiSubMenu() { 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bidi_submenu_model_.AddCheckItem(IDC_WRITING_DIRECTION_DEFAULT, 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_WRITING_DIRECTION_DEFAULT)); 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bidi_submenu_model_.AddCheckItem(IDC_WRITING_DIRECTION_LTR, 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_WRITING_DIRECTION_LTR)); 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bidi_submenu_model_.AddCheckItem(IDC_WRITING_DIRECTION_RTL, 828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL)); 829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch menu_model_.AddSubMenu( 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDC_WRITING_DIRECTION_MENU, 832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_WRITING_DIRECTION_MENU), 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &bidi_submenu_model_); 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // OS_MACOSX 836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 837c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionMenuItem* RenderViewContextMenu::GetExtensionMenuItem(int id) const { 838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuManager* manager = 83921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile_->GetExtensionService()->menu_manager(); 840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::map<int, ExtensionMenuItem::Id>::const_iterator i = 841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_item_map_.find(id); 842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i != extension_item_map_.end()) { 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem* item = manager->GetItemById(i->second); 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (item) 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return item; 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Menu delegate functions ----------------------------------------------------- 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RenderViewContextMenu::IsCommandIdEnabled(int id) const { 853731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (id == IDC_PRINT && 854731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick (source_tab_contents_->content_restrictions() & 855731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CONTENT_RESTRICTION_PRINT)) { 856731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return false; 857731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 858731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 859513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (id == IDC_SAVE_PAGE && 860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch (source_tab_contents_->content_restrictions() & 861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CONTENT_RESTRICTION_SAVE)) { 862513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return false; 863513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allow Spell Check language items on sub menu for text area context menu. 866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if ((id >= IDC_SPELLCHECK_LANGUAGES_FIRST) && 867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (id < IDC_SPELLCHECK_LANGUAGES_LAST)) { 868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return profile_->GetPrefs()->GetBoolean(prefs::kEnableSpellCheck); 869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Custom items. 8723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && 8733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { 87472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return IsCustomItemEnabled(params_.custom_items, id); 8753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Extension items. 878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST && 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) { 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In the future we may add APIs for extensions to disable items, but for 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // now all items are implicitly enabled. 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (id) { 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_BACK: 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return source_tab_contents_->controller().CanGoBack(); 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_FORWARD: 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return source_tab_contents_->controller().CanGoForward(); 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_RELOAD: 893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return source_tab_contents_->delegate() && 894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_->delegate()->CanReloadContents( 895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_); 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_VIEW_SOURCE: 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE: 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return source_tab_contents_->controller().CanViewSource(); 900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_INSPECTELEMENT: 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Viewing page info is not a developer command but is meaningful for the 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // same set of pages which developer commands are meaningful for. 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_VIEWPAGEINFO: 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return IsDevCommandEnabled(id); 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_TRANSLATE: { 908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TranslateTabHelper* helper = 909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper::GetCurrentWrapperForContents( 910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_)->translate_tab_helper(); 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string original_lang = 912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen helper->language_state().original_language(); 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string target_lang = g_browser_process->GetApplicationLocale(); 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch target_lang = TranslateManager::GetLanguageCode(target_lang); 915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Note that we intentionally enable the menu even if the original and 916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // target languages are identical. This is to give a way to user to 917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // translate a page that might contains text fragments in a different 918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // language. 919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanTranslate) && 920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen helper->language_state().page_translatable() && 9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !original_lang.empty() && // Did we receive the page language yet? 9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Only allow translating languages we explitly support and the 9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // unknown language (in which case the page language is detected on 9243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // the server side). 9253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (original_lang == chrome::kUnknownLanguageCode || 9263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TranslateManager::IsSupportedLanguage(original_lang)) && 927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !helper->language_state().IsPageTranslated() && 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !source_tab_contents_->interstitial_page() && 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TranslateManager::IsTranslatableURL(params_.page_url); 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB: 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW: 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.link_url.is_valid(); 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYLINKLOCATION: 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.unfiltered_link_url.is_valid(); 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SAVELINKAS: 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.link_url.is_valid() && 94121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::URLRequest::IsHandledURL(params_.link_url); 942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SAVEIMAGEAS: 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.src_url.is_valid() && 94521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::URLRequest::IsHandledURL(params_.src_url); 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB: 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The images shown in the most visited thumbnails do not currently open 949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in a new tab as they should. Disabling this context menu option for 950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // now, as a quick hack, before we resolve this issue (Issue = 2608). 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(sidchat): Enable this option once this issue is resolved. 9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (params_.src_url.scheme() == chrome::kChromeUIScheme || 9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !params_.src_url.is_valid()) 954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYIMAGE: 958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !params_.is_image_blocked; 959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Media control commands should all be disabled if the player is in an 961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // error state. 962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_PLAYPAUSE: 963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_LOOP: 964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.media_flags & 965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::MediaInError) == 0; 966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Mute and unmute should also be disabled if the player has no audio. 968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_MUTE: 969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.media_flags & 970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::MediaHasAudio) != 0 && 971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (params_.media_flags & 972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::MediaInError) == 0; 973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Media controls can be toggled only for video player. If we toggle 975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // controls for audio then the player disappears, and there is no way to 976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return it back. 977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_CONTROLS: 978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.media_flags & 979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::MediaHasVideo) != 0; 980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYAVLOCATION: 982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION: 983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.src_url.is_valid(); 984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SAVEAVAS: 986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.media_flags & 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::MediaCanSave) && 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_.src_url.is_valid() && 98921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::URLRequest::IsHandledURL(params_.src_url); 990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENAVNEWTAB: 992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SAVE_PAGE: { 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Instead of using GetURL here, we use url() (which is the "real" url of 996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the page) from the NavigationEntry because its reflects their origin 997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // rather than the display one (returned by GetURL) which may be 998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different (like having "view-source:" on the front). 999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry* active_entry = 1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->controller().GetActiveEntry(); 1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return SavePackage::IsSavableURL( 1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (active_entry) ? active_entry->url() : GURL()); 1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_RELOADFRAME: 1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.frame_url.is_valid(); 1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_UNDO: 1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanUndo); 1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_REDO: 1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanRedo); 1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_CUT: 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanCut); 1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPY: 1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanCopy); 1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_PASTE: 1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanPaste); 1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_DELETE: 1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanDelete); 1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SELECTALL: 1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !!(params_.edit_flags & WebContextMenuData::CanSelectAll); 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD: 103072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return !profile_->IsOffTheRecord() && params_.link_url.is_valid() && 103172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile_->GetPrefs()->GetBoolean(prefs::kIncognitoEnabled); 1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_ADD_TO_DICTIONARY: 1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !params_.misspelled_word.empty(); 1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_PRINT: 1037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (g_browser_process->local_state() && 1038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !g_browser_process->local_state()->GetBoolean( 1039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prefs::kPrintingEnabled)) { 1040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 104272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return params_.media_type == WebContextMenuData::MediaTypeNone || 1043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params_.media_flags & WebContextMenuData::MediaCanPrint; 104472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SEARCHWEBFOR: 1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_GOTOURL: 1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_0: 1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_1: 1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_2: 1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_3: 1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_4: 1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLPANEL_TOGGLE: 1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_MACOSX) 1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jeremy): re-enable - http://crbug.com/34512 . 1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: 1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_VIEWFRAMEINFO: 1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CHECK_SPELLING_OF_THIS_FIELD: 1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return profile_->GetPrefs()->GetBoolean(prefs::kEnableSpellCheck); 1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jeremy): re-enable - http://crbug.com/34512 . 1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: 1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_DEFAULT: // Provided to match OS defaults. 1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.writing_direction_default & 1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::CheckableMenuItemEnabled; 1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_RTL: 1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.writing_direction_right_to_left & 1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::CheckableMenuItemEnabled; 1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_LTR: 1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.writing_direction_left_to_right & 1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::CheckableMenuItemEnabled; 1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_MENU: 1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 10813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case IDC_CONTENT_CONTEXT_LOOK_UP_IN_DICTIONARY: 10823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // This is OK because the menu is not shown when it isn't 10833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // appropriate. 10843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 10853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_POSIX) 1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(suzhe): this should not be enabled for password fields. 1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_INPUT_METHODS_MENU: 1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 1089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_MENU: 1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 1093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1094c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 1095c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1096c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1097c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RenderViewContextMenu::IsCommandIdChecked(int id) const { 1101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See if the video is set to looping. 1102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_CONTENT_CONTEXT_LOOP) { 1103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.media_flags & 1104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::MediaLoop) != 0; 1105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_CONTENT_CONTEXT_CONTROLS) { 1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.media_flags & 1109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebContextMenuData::MediaControlRootElement) != 0; 1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Custom items. 11133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && 11143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { 111572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return IsCustomItemChecked(params_.custom_items, id); 11163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 11173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Extension items. 1119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST && 1120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) { 1121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuItem* item = GetExtensionMenuItem(id); 1122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (item) 1123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return item->checked(); 1124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 1125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 1129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_WRITING_DIRECTION_DEFAULT) 1130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.writing_direction_default & 1131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::CheckableMenuItemChecked; 1132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_WRITING_DIRECTION_RTL) 1133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.writing_direction_right_to_left & 1134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::CheckableMenuItemChecked; 1135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_WRITING_DIRECTION_LTR) 1136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return params_.writing_direction_left_to_right & 1137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebContextMenuData::CheckableMenuItemChecked; 11383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (id == IDC_CONTENT_CONTEXT_LOOK_UP_IN_DICTIONARY) 11393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 1140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // OS_MACOSX 1141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check box for 'Check the Spelling of this field'. 1143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_CHECK_SPELLING_OF_THIS_FIELD) { 1144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return (params_.spellcheck_enabled && 1145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetPrefs()->GetBoolean(prefs::kEnableSpellCheck)); 1146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't bother getting the display language vector if this isn't a spellcheck 1149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // language. 1150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if ((id < IDC_SPELLCHECK_LANGUAGES_FIRST) || 1151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (id >= IDC_SPELLCHECK_LANGUAGES_LAST)) 1152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::string> languages; 1155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return SpellCheckHost::GetSpellCheckLanguages(profile_, &languages) == 1156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (id - IDC_SPELLCHECK_LANGUAGES_FIRST); 1157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::ExecuteCommand(int id) { 1160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check to see if one of the spell check language ids have been clicked. 1161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id >= IDC_SPELLCHECK_LANGUAGES_FIRST && 1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch id < IDC_SPELLCHECK_LANGUAGES_LAST) { 1163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const size_t language_number = id - IDC_SPELLCHECK_LANGUAGES_FIRST; 1164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::string> languages; 1165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckHost::GetSpellCheckLanguages(profile_, &languages); 1166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (language_number < languages.size()) { 1167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StringPrefMember dictionary_language; 1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dictionary_language.Init(prefs::kSpellCheckDictionary, 1169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetPrefs(), NULL); 1170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dictionary_language.SetValue(languages[language_number]); 1171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 1173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Process custom actions range. 117672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (id >= IDC_CONTENT_CONTEXT_CUSTOM_FIRST && 117772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen id <= IDC_CONTENT_CONTEXT_CUSTOM_LAST) { 1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsigned action = id - IDC_CONTENT_CONTEXT_CUSTOM_FIRST; 117972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen source_tab_contents_->render_view_host()->PerformCustomContextMenuAction( 118072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params_.custom_context, action); 1181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 1182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Process extension menu items. 1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST && 1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) { 1187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionMenuManager* manager = 118821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile_->GetExtensionService()->menu_manager(); 1189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::map<int, ExtensionMenuItem::Id>::const_iterator i = 1190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_item_map_.find(id); 1191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i != extension_item_map_.end()) { 1192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager->ExecuteCommand(profile_, source_tab_contents_, params_, 1193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i->second); 1194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 1196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (id) { 1200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENLINKNEWTAB: 1201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OpenURL(params_.link_url, 1202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->delegate() && 1203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->delegate()->IsApplication() ? 1204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB, 1205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageTransition::LINK); 1206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW: 1209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OpenURL(params_.link_url, NEW_WINDOW, PageTransition::LINK); 1210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD: 1213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OpenURL(params_.link_url, OFF_THE_RECORD, PageTransition::LINK); 1214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SAVEAVAS: 1217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SAVEIMAGEAS: 1218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SAVELINKAS: { 1219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_util::RecordDownloadCount( 1220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_util::INITIATED_BY_CONTEXT_MENU_COUNT); 1221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& referrer = 1222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_.frame_url.is_empty() ? params_.page_url : params_.frame_url; 1223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url = 1224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (id == IDC_CONTENT_CONTEXT_SAVELINKAS ? params_.link_url : 1225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_.src_url); 1226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DownloadManager* dlm = profile_->GetDownloadManager(); 1227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dlm->DownloadUrl(url, referrer, params_.frame_charset, 1228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_); 1229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYLINKLOCATION: 1233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteURLToClipboard(params_.unfiltered_link_url); 1234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION: 1237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYAVLOCATION: 1238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteURLToClipboard(params_.src_url); 1239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPYIMAGE: 1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CopyImageAt(params_.x, params_.y); 1243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB: 1246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_OPENAVNEWTAB: 1247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OpenURL(params_.src_url, NEW_BACKGROUND_TAB, PageTransition::LINK); 1248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_PLAYPAUSE: { 1251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool play = !!(params_.media_flags & WebContextMenuData::MediaPaused); 1252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (play) { 1253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("MediaContextMenu_Play"), 1254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("MediaContextMenu_Pause"), 1257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MediaPlayerActionAt(gfx::Point(params_.x, params_.y), 1260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction( 1261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction::Play, play)); 1262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_MUTE: { 1266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool mute = !(params_.media_flags & WebContextMenuData::MediaMuted); 1267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (mute) { 1268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("MediaContextMenu_Mute"), 1269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("MediaContextMenu_Unmute"), 1272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MediaPlayerActionAt(gfx::Point(params_.x, params_.y), 1275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction( 1276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction::Mute, mute)); 1277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_LOOP: 1281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("MediaContextMenu_Loop"), 1282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MediaPlayerActionAt(gfx::Point(params_.x, params_.y), 1284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction( 1285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction::Loop, 1286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !IsCommandIdChecked(IDC_CONTENT_CONTEXT_LOOP))); 1287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_CONTROLS: 1290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("MediaContextMenu_Controls"), 1291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MediaPlayerActionAt( 1293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Point(params_.x, params_.y), 1294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction( 1295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebMediaPlayerAction::Controls, 1296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !IsCommandIdChecked(IDC_CONTENT_CONTEXT_CONTROLS))); 1297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_BACK: 1300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->controller().GoBack(); 1301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_FORWARD: 1304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->controller().GoForward(); 1305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen case IDC_SAVE_PAGE: { 1308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* wrapper = 1309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper::GetCurrentWrapperForContents( 1310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_); 1311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wrapper->download_tab_helper()->OnSavePage(); 1312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_RELOAD: 1316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Prevent the modal "Resubmit form post" dialog from appearing in the 1317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // context of an external context menu. 1318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->controller().Reload(!external_); 1319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_PRINT: 132272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (params_.media_type == WebContextMenuData::MediaTypeNone) { 1323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (CommandLine::ForCurrentProcess()->HasSwitch( 1324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen switches::kEnablePrintPreview)) { 1325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printing::PrintPreviewTabController::PrintPreview( 1326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_); 1327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 1328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* wrapper = 1329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper::GetCurrentWrapperForContents( 1330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_); 1331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wrapper->print_view_manager()->PrintNow(); 1332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 133372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 1334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RenderViewHost* rvh = source_tab_contents_->render_view_host(); 1335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen rvh->Send(new PrintMsg_PrintNodeUnderContextMenu(rvh->routing_id())); 133672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 1337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_VIEW_SOURCE: 134021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen source_tab_contents_->ViewSource(); 1341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_INSPECTELEMENT: 1344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Inspect(params_.x, params_.y); 1345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_VIEWPAGEINFO: { 1348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry* nav_entry = 1349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->controller().GetActiveEntry(); 1350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->ShowPageInfo(nav_entry->url(), nav_entry->ssl(), 1351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch true); 1352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_TRANSLATE: { 1356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A translation might have been triggered by the time the menu got 1357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // selected, do nothing in that case. 1358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TranslateTabHelper* helper = 1359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper::GetCurrentWrapperForContents( 1360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_)->translate_tab_helper(); 1361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (helper->language_state().IsPageTranslated() || 1362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen helper->language_state().translation_pending()) { 1363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 1364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string original_lang = helper->language_state().original_language(); 1366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string target_lang = g_browser_process->GetApplicationLocale(); 1367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch target_lang = TranslateManager::GetLanguageCode(target_lang); 1368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Since the user decided to translate for that language and site, clears 1369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // any preferences for not translating them. 1370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TranslatePrefs prefs(profile_->GetPrefs()); 1371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs.RemoveLanguageFromBlacklist(original_lang); 1372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs.RemoveSiteFromBlacklist(params_.page_url.HostNoBrackets()); 137321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TranslateManager::GetInstance()->TranslatePage( 1374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_, original_lang, target_lang); 1375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_RELOADFRAME: 1379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->ReloadFrame(); 1380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE: 1383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_->ViewFrameSource(params_.frame_url, 1384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params_.frame_content_state); 1385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_VIEWFRAMEINFO: { 1388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Deserialize the SSL info. 1389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry::SSLStatus ssl; 1390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!params_.security_info.empty()) { 1391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int cert_id, cert_status, security_bits, connection_status; 1392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLManager::DeserializeSecurityInfo(params_.security_info, 1393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &cert_id, 1394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &cert_status, 1395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &security_bits, 1396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &connection_status); 1397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.set_cert_id(cert_id); 1398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.set_cert_status(cert_status); 1399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.set_security_bits(security_bits); 1400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.set_connection_status(connection_status); 1401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->ShowPageInfo(params_.frame_url, ssl, 1403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false); // Don't show the history. 1404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_UNDO: 1408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Undo(); 1409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_REDO: 1412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Redo(); 1413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_CUT: 1416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Cut(); 1417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_COPY: 1420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Copy(); 1421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_PASTE: 1424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Paste(); 1425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_DELETE: 1428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Delete(); 1429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SELECTALL: 1432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->SelectAll(); 1433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_SEARCHWEBFOR: 1436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CONTENT_CONTEXT_GOTOURL: { 1437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OpenURL(selection_navigation_url_, NEW_FOREGROUND_TAB, 1438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageTransition::LINK); 1439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_0: 1443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_1: 1444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_2: 1445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_3: 1446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_SUGGESTION_4: 1447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->Replace( 1448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params_.dictionary_suggestions[id - IDC_SPELLCHECK_SUGGESTION_0]); 1449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_CHECK_SPELLING_OF_THIS_FIELD: 1452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->ToggleSpellCheck(); 1453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLCHECK_ADD_TO_DICTIONARY: { 1455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckHost* spellcheck_host = profile_->GetSpellCheckHost(); 1456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!spellcheck_host) { 1457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch spellcheck_host->AddWord(UTF16ToUTF8(params_.misspelled_word)); 1461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckerPlatform::AddWord(params_.misspelled_word); 1462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen case IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS: { 1466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string url = std::string(chrome::kChromeUISettingsURL) + 1467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chrome::kLanguageOptionsSubPage; 1468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OpenURL(GURL(url), NEW_FOREGROUND_TAB, PageTransition::LINK); 1469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_SPELLPANEL_TOGGLE: 1473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->ToggleSpellPanel( 1474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SpellCheckerPlatform::SpellingPanelVisible()); 1475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 1478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_DEFAULT: 1479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WebKit's current behavior is for this menu item to always be disabled. 1480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_RTL: 1483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_WRITING_DIRECTION_LTR: { 1484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebKit::WebTextDirection dir = WebKit::WebTextDirectionLeftToRight; 1485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_WRITING_DIRECTION_RTL) 1486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dir = WebKit::WebTextDirectionRightToLeft; 1487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->UpdateTextDirection(dir); 1488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->NotifyTextDirection(); 1489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 14913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case IDC_CONTENT_CONTEXT_LOOK_UP_IN_DICTIONARY: 14923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LookUpInDictionary(); 14933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick break; 1494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // OS_MACOSX 1495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 1497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid RenderViewContextMenu::MenuWillShow() { 1503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RenderWidgetHostView* view = source_tab_contents_->GetRenderWidgetHostView(); 1504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (view) 1505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen view->ShowingContextMenu(true); 1506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 150872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderViewContextMenu::MenuClosed() { 1509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RenderWidgetHostView* view = source_tab_contents_->GetRenderWidgetHostView(); 1510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (view) 1511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen view->ShowingContextMenu(false); 1512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (source_tab_contents_->render_view_host()) { 1513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_tab_contents_->render_view_host()->ContextMenuClosed( 1514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params_.custom_context); 1515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 151672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 151772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RenderViewContextMenu::IsDevCommandEnabled(int id) const { 1519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 1520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (command_line.HasSwitch(switches::kAlwaysEnableDevTools)) 1521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 1522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry *active_entry = 1524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->controller().GetActiveEntry(); 1525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!active_entry) 1526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't inspect view source. 1529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (active_entry->IsViewSourceMode()) 1530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't inspect about:network, about:memory, etc. 1533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // However, we do want to inspect about:blank, which is often 1534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // used by ordinary web pages. 1535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (active_entry->virtual_url().SchemeIs(chrome::kAboutScheme) && 1536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !LowerCaseEqualsASCII(active_entry->virtual_url().path(), "blank")) 1537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (id == IDC_CONTENT_CONTEXT_INSPECTELEMENT) { 1540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't enable the web inspector if JavaScript is disabled. 1541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!profile_->GetPrefs()->GetBoolean(prefs::kWebKitJavascriptEnabled) || 1542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch command_line.HasSwitch(switches::kDisableJavaScript)) 1543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 1544513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Don't enable the web inspector if the developer tools are disabled via 1545513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the preference dev-tools-disabled. 1546513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled)) 1547513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return false; 1548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 1551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstring16 RenderViewContextMenu::PrintableSelectionText() { 155421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return l10n_util::TruncateString(params_.selection_text, 155521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen kMaxSelectionTextLength); 1556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Controller functions -------------------------------------------------------- 1559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::OpenURL( 1561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WindowOpenDisposition disposition, 1563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageTransition::Type transition) { 1564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->OpenURL(url, GURL(), disposition, transition); 1565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::CopyImageAt(int x, int y) { 1568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->CopyImageAt(x, y); 1569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::Inspect(int x, int y) { 1572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserMetrics::RecordAction(UserMetricsAction("DevTools_InspectElement"), 1573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_); 1574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DevToolsManager::GetInstance()->InspectElement( 1575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host(), x, y); 1576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::WriteURLToClipboard(const GURL& url) { 1579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chrome_browser_net::WriteURLToClipboard( 1580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url, 15813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), 1582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->clipboard()); 1583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RenderViewContextMenu::MediaPlayerActionAt( 1586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Point& location, 1587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebMediaPlayerAction& action) { 1588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source_tab_contents_->render_view_host()->MediaPlayerActionAt( 1589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch location, action); 1590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1591