16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/content/render_view_context_menu_impl.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/strings/grit/athena_strings.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/renderer_context_menu/context_menu_content_type.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/renderer_context_menu/views/toolkit_delegate_views.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/browser_context.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/web_contents.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/web/WebContextMenuData.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/l10n/l10n_util.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace athena {
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using blink::WebContextMenuData;
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace {
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)enum {
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Nativation
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_BACK = 0,
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_FORWARD,
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_RELOAD,
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_VIEW_SOURCE,
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Link
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_OPEN_LINK_NEW_ACTIVITY,
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Edit
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_UNDO,
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_REDO,
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_CUT,
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_COPY,
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_PASTE,
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_PASTE_AND_MATCH_STYLE,
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_DELETE,
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_SELECT_ALL,
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CMD_LAST,
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Max number of custom command ids allowd.
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const int kNumCustomCommandIds = 1000;
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// TODO(oshima): Move IDS for context menus to components/renderer_context_menu
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// and replace hardcoded strings below.
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AppendPageItems(ui::SimpleMenuModel* menu_model) {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_BACK,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_BACK));
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_FORWARD,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_FORWARD));
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_RELOAD,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_RELOAD));
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CMD_VIEW_SOURCE,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_VIEWPAGESOURCE));
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AppendLinkItems(const content::ContextMenuParams& params,
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     ui::SimpleMenuModel* menu_model) {
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!params.link_url.is_empty())
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    menu_model->AddItem(
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        CMD_OPEN_LINK_NEW_ACTIVITY,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_OPENLINKNEWACTIVITY));
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AppendEditableItems(ui::SimpleMenuModel* menu_model) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_UNDO,
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_UNDO));
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_REDO,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_REDO));
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_CUT,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_CUT));
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_COPY,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_COPY));
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_PASTE,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_PASTE));
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CMD_PASTE_AND_MATCH_STYLE,
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_PASTE_AND_MATCH_STYLE));
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_DELETE,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_DELETE));
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_model->AddItem(CMD_SELECT_ALL,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      l10n_util::GetStringUTF16(IDS_ATHENA_CONTEXT_SELECTALL));
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)RenderViewContextMenuImpl::RenderViewContextMenuImpl(
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content::RenderFrameHost* render_frame_host,
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const content::ContextMenuParams& params)
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : RenderViewContextMenuBase(render_frame_host, params) {
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetContentCustomCommandIdRange(CMD_LAST, CMD_LAST + kNumCustomCommandIds);
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(oshima): Support other types
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  set_content_type(
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new ContextMenuContentType(source_web_contents_, params, true));
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  set_toolkit_delegate(scoped_ptr<ToolkitDelegate>(new ToolkitDelegateViews));
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)RenderViewContextMenuImpl::~RenderViewContextMenuImpl() {
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::RunMenuAt(views::Widget* parent,
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          const gfx::Point& point,
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          ui::MenuSourceType type) {
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static_cast<ToolkitDelegateViews*>(toolkit_delegate())
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ->RunMenuAt(parent, point, type);
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::InitMenu() {
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RenderViewContextMenuBase::InitMenu();
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool needs_separator = false;
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) {
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    AppendPageItems(&menu_model_);
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    needs_separator = true;
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK)) {
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (needs_separator)
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      AddSeparator();
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    AppendLinkItems(params_, &menu_model_);
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    needs_separator = true;
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (content_type_->SupportsGroup(
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ContextMenuContentType::ITEM_GROUP_EDITABLE)) {
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (needs_separator)
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      AddSeparator();
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    AppendEditableItems(&menu_model_);
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::RecordShownItem(int id) {
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(oshima): Imelement UMA stats. crbug.com/401673
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTIMPLEMENTED();
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::RecordUsedItem(int id) {
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(oshima): Imelement UMA stats. crbug.com/401673
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTIMPLEMENTED();
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_PLUGINS)
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::HandleAuthorizeAllPlugins() {
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::NotifyMenuShown() {
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::NotifyURLOpened(
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const GURL& url,
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content::WebContents* new_contents) {
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool RenderViewContextMenuImpl::GetAcceleratorForCommandId(
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int command_id,
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::Accelerator* accelerator) {
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTIMPLEMENTED();
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return false;
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool RenderViewContextMenuImpl::IsCommandIdChecked(int command_id) const {
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return false;
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool RenderViewContextMenuImpl::IsCommandIdEnabled(int command_id) const {
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool enabled = false;
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (RenderViewContextMenuBase::IsCommandIdKnown(command_id, &enabled))
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return enabled;
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (command_id) {
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Navigation
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_BACK:
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return source_web_contents_->GetController().CanGoBack();
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_FORWARD:
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return source_web_contents_->GetController().CanGoForward();
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_RELOAD:
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return true;
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_VIEW_SOURCE:
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return source_web_contents_->GetController().CanViewSource();
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Link
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_OPEN_LINK_NEW_ACTIVITY:
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return params_.link_url.is_valid();
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Editable
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_UNDO:
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanUndo);
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_REDO:
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanRedo);
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_CUT:
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanCut);
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_COPY:
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanCopy);
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_PASTE:
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_PASTE_AND_MATCH_STYLE:
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanPaste);
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_DELETE:
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanDelete);
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_SELECT_ALL:
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return !!(params_.edit_flags & WebContextMenuData::CanSelectAll);
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return false;
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderViewContextMenuImpl::ExecuteCommand(int command_id,
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                               int event_flags) {
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RenderViewContextMenuBase::ExecuteCommand(command_id, event_flags);
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (command_executed_)
2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  command_executed_ = true;
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (command_id) {
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Navigation
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_BACK:
2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->GetController().GoBack();
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_FORWARD:
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->GetController().GoForward();
2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_RELOAD:
2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->GetController().Reload(true);
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_VIEW_SOURCE:
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->ViewSource();
2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Link
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_OPEN_LINK_NEW_ACTIVITY:
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      OpenURL(
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          params_.link_url,
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          params_.frame_url.is_empty() ? params_.page_url : params_.frame_url,
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          NEW_FOREGROUND_TAB,
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ui::PAGE_TRANSITION_LINK);
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Editable
2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_UNDO:
2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->Undo();
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_REDO:
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->Redo();
2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_CUT:
2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->Cut();
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_COPY:
2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->Copy();
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_PASTE:
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->Paste();
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_PASTE_AND_MATCH_STYLE:
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->PasteAndMatchStyle();
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_DELETE:
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->Delete();
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CMD_SELECT_ALL:
2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      source_web_contents_->SelectAll();
2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace athena
283