| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "athena/content/render_view_context_menu_impl.h" |
| |
| #include "base/strings/utf_string_conversions.h" |
| #include "components/renderer_context_menu/context_menu_content_type.h" |
| #include "components/renderer_context_menu/views/toolkit_delegate_views.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/web_contents.h" |
| #include "third_party/WebKit/public/web/WebContextMenuData.h" |
| |
| namespace athena { |
| using blink::WebContextMenuData; |
| |
| namespace { |
| |
| enum { |
| // Nativation |
| CMD_BACK = 0, |
| CMD_FORWARD, |
| CMD_RELOAD, |
| CMD_VIEW_SOURCE, |
| |
| // Link |
| CMD_OPEN_LINK_NEW_ACTIVITY, |
| |
| // Edit |
| CMD_UNDO, |
| CMD_REDO, |
| CMD_CUT, |
| CMD_COPY, |
| CMD_PASTE, |
| CMD_PASTE_AND_MATCH_STYLE, |
| CMD_DELETE, |
| CMD_SELECT_ALL, |
| CMD_LAST, |
| }; |
| |
| // Max number of custom command ids allowd. |
| const int kNumCustomCommandIds = 1000; |
| |
| // TODO(oshima): Move IDS for context menus to components/renderer_context_menu |
| // and replace hardcoded strings below. |
| void AppendPageItems(ui::SimpleMenuModel* menu_model) { |
| menu_model->AddItem(CMD_BACK, base::ASCIIToUTF16("Back")); |
| menu_model->AddItem(CMD_FORWARD, base::ASCIIToUTF16("Forward")); |
| menu_model->AddItem(CMD_RELOAD, base::ASCIIToUTF16("Reload")); |
| menu_model->AddSeparator(ui::NORMAL_SEPARATOR); |
| menu_model->AddItem(CMD_VIEW_SOURCE, base::ASCIIToUTF16("View Source")); |
| } |
| |
| void AppendLinkItems(const content::ContextMenuParams& params, |
| ui::SimpleMenuModel* menu_model) { |
| if (!params.link_url.is_empty()) |
| menu_model->AddItem(CMD_OPEN_LINK_NEW_ACTIVITY, |
| base::ASCIIToUTF16("Open Link In New Activity")); |
| } |
| |
| void AppendEditableItems(ui::SimpleMenuModel* menu_model) { |
| menu_model->AddItem(CMD_UNDO, base::ASCIIToUTF16("Undo")); |
| menu_model->AddItem(CMD_REDO, base::ASCIIToUTF16("Redo")); |
| menu_model->AddSeparator(ui::NORMAL_SEPARATOR); |
| menu_model->AddItem(CMD_CUT, base::ASCIIToUTF16("Cut")); |
| menu_model->AddItem(CMD_COPY, base::ASCIIToUTF16("Copy")); |
| menu_model->AddItem(CMD_PASTE, base::ASCIIToUTF16("Paste")); |
| menu_model->AddItem(CMD_PASTE_AND_MATCH_STYLE, |
| base::ASCIIToUTF16("Paste as plain text")); |
| menu_model->AddItem(CMD_DELETE, base::ASCIIToUTF16("Delete")); |
| menu_model->AddSeparator(ui::NORMAL_SEPARATOR); |
| menu_model->AddItem(CMD_SELECT_ALL, base::ASCIIToUTF16("Select All")); |
| } |
| |
| } // namespace |
| |
| RenderViewContextMenuImpl::RenderViewContextMenuImpl( |
| content::RenderFrameHost* render_frame_host, |
| const content::ContextMenuParams& params) |
| : RenderViewContextMenuBase(render_frame_host, params) { |
| SetContentCustomCommandIdRange(CMD_LAST, CMD_LAST + kNumCustomCommandIds); |
| // TODO(oshima): Support other types |
| set_content_type( |
| new ContextMenuContentType(source_web_contents_, params, true)); |
| set_toolkit_delegate(scoped_ptr<ToolkitDelegate>(new ToolkitDelegateViews)); |
| } |
| |
| RenderViewContextMenuImpl::~RenderViewContextMenuImpl() { |
| } |
| |
| void RenderViewContextMenuImpl::RunMenuAt(views::Widget* parent, |
| const gfx::Point& point, |
| ui::MenuSourceType type) { |
| static_cast<ToolkitDelegateViews*>(toolkit_delegate()) |
| ->RunMenuAt(parent, point, type); |
| } |
| |
| void RenderViewContextMenuImpl::InitMenu() { |
| RenderViewContextMenuBase::InitMenu(); |
| bool needs_separator = false; |
| if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_PAGE)) { |
| AppendPageItems(&menu_model_); |
| needs_separator = true; |
| } |
| |
| if (content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK)) { |
| if (needs_separator) |
| AddSeparator(); |
| AppendLinkItems(params_, &menu_model_); |
| needs_separator = true; |
| } |
| |
| if (content_type_->SupportsGroup( |
| ContextMenuContentType::ITEM_GROUP_EDITABLE)) { |
| if (needs_separator) |
| AddSeparator(); |
| AppendEditableItems(&menu_model_); |
| } |
| } |
| |
| void RenderViewContextMenuImpl::RecordShownItem(int id) { |
| // TODO(oshima): Imelement UMA stats. crbug.com/401673 |
| NOTIMPLEMENTED(); |
| } |
| |
| void RenderViewContextMenuImpl::RecordUsedItem(int id) { |
| // TODO(oshima): Imelement UMA stats. crbug.com/401673 |
| NOTIMPLEMENTED(); |
| } |
| |
| #if defined(ENABLE_PLUGINS) |
| void RenderViewContextMenuImpl::HandleAuthorizeAllPlugins() { |
| } |
| #endif |
| |
| void RenderViewContextMenuImpl::NotifyMenuShown() { |
| } |
| |
| void RenderViewContextMenuImpl::NotifyURLOpened( |
| const GURL& url, |
| content::WebContents* new_contents) { |
| } |
| |
| bool RenderViewContextMenuImpl::GetAcceleratorForCommandId( |
| int command_id, |
| ui::Accelerator* accelerator) { |
| NOTIMPLEMENTED(); |
| return false; |
| } |
| |
| bool RenderViewContextMenuImpl::IsCommandIdChecked(int command_id) const { |
| return false; |
| } |
| |
| bool RenderViewContextMenuImpl::IsCommandIdEnabled(int command_id) const { |
| { |
| bool enabled = false; |
| if (RenderViewContextMenuBase::IsCommandIdKnown(command_id, &enabled)) |
| return enabled; |
| } |
| switch (command_id) { |
| // Navigation |
| case CMD_BACK: |
| return source_web_contents_->GetController().CanGoBack(); |
| case CMD_FORWARD: |
| return source_web_contents_->GetController().CanGoForward(); |
| case CMD_RELOAD: |
| return true; |
| case CMD_VIEW_SOURCE: |
| return source_web_contents_->GetController().CanViewSource(); |
| |
| // Link |
| case CMD_OPEN_LINK_NEW_ACTIVITY: |
| return params_.link_url.is_valid(); |
| |
| // Editable |
| case CMD_UNDO: |
| return !!(params_.edit_flags & WebContextMenuData::CanUndo); |
| |
| case CMD_REDO: |
| return !!(params_.edit_flags & WebContextMenuData::CanRedo); |
| |
| case CMD_CUT: |
| return !!(params_.edit_flags & WebContextMenuData::CanCut); |
| |
| case CMD_COPY: |
| return !!(params_.edit_flags & WebContextMenuData::CanCopy); |
| |
| case CMD_PASTE: |
| case CMD_PASTE_AND_MATCH_STYLE: |
| return !!(params_.edit_flags & WebContextMenuData::CanPaste); |
| |
| case CMD_DELETE: |
| return !!(params_.edit_flags & WebContextMenuData::CanDelete); |
| |
| case CMD_SELECT_ALL: |
| return !!(params_.edit_flags & WebContextMenuData::CanSelectAll); |
| } |
| return false; |
| } |
| |
| void RenderViewContextMenuImpl::ExecuteCommand(int command_id, |
| int event_flags) { |
| RenderViewContextMenuBase::ExecuteCommand(command_id, event_flags); |
| if (command_executed_) |
| return; |
| command_executed_ = true; |
| switch (command_id) { |
| // Navigation |
| case CMD_BACK: |
| source_web_contents_->GetController().GoBack(); |
| break; |
| case CMD_FORWARD: |
| source_web_contents_->GetController().GoForward(); |
| break; |
| case CMD_RELOAD: |
| source_web_contents_->GetController().Reload(true); |
| break; |
| case CMD_VIEW_SOURCE: |
| source_web_contents_->ViewSource(); |
| break; |
| |
| // Link |
| case CMD_OPEN_LINK_NEW_ACTIVITY: |
| OpenURL( |
| params_.link_url, |
| params_.frame_url.is_empty() ? params_.page_url : params_.frame_url, |
| NEW_FOREGROUND_TAB, |
| content::PAGE_TRANSITION_LINK); |
| break; |
| |
| // Editable |
| case CMD_UNDO: |
| source_web_contents_->Undo(); |
| break; |
| |
| case CMD_REDO: |
| source_web_contents_->Redo(); |
| break; |
| |
| case CMD_CUT: |
| source_web_contents_->Cut(); |
| break; |
| |
| case CMD_COPY: |
| source_web_contents_->Copy(); |
| break; |
| |
| case CMD_PASTE: |
| source_web_contents_->Paste(); |
| break; |
| |
| case CMD_PASTE_AND_MATCH_STYLE: |
| source_web_contents_->PasteAndMatchStyle(); |
| break; |
| |
| case CMD_DELETE: |
| source_web_contents_->Delete(); |
| break; |
| |
| case CMD_SELECT_ALL: |
| source_web_contents_->SelectAll(); |
| break; |
| } |
| } |
| |
| } // namespace athena |