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, &params_.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