Chromium Code Reviews| Index: chrome/browser/ui/views/frame/browser_view.cc |
| diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc |
| index 60877d74b81fa04d4ba840576f1f991d5cf34c58..b6db9162491692b96bb85026eb5b1971340b86c4 100644 |
| --- a/chrome/browser/ui/views/frame/browser_view.cc |
| +++ b/chrome/browser/ui/views/frame/browser_view.cc |
| @@ -1461,20 +1461,35 @@ void BrowserView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { |
| // to windows. The real fix to this bug is to disable the commands when they |
| // won't do anything. We'll need something like an overall clipboard command |
| // manager to do that. |
| -void BrowserView::Cut() { |
| - // If a WebContent is focused, call WebContents::Cut. Otherwise, e.g. if |
| - // Omnibox is focused, send a Ctrl+x key event to Chrome. Using RWH interface |
| - // rather than the fake key event for a WebContent is important since the fake |
| - // event might be consumed by the web content (crbug.com/137908). |
| - DoCutCopyPaste(&content::WebContents::Cut, IDS_APP_CUT); |
| -} |
| +void BrowserView::CutCopyPaste(int command_id) { |
| + // If a WebContents is focused, call its member method. |
|
sky
2015/04/16 15:47:25
Seems like ideally this function would do what you
|
| + WebContents* contents = browser_->tab_strip_model()->GetActiveWebContents(); |
| + if (contents) { |
| + void (WebContents::*method)(); |
| + if (command_id == IDC_CUT) |
| + method = &content::WebContents::Cut; |
| + else if (command_id == IDC_COPY) |
| + method = &content::WebContents::Copy; |
| + else |
| + method = &content::WebContents::Paste; |
| + if (DoCutCopyPasteForWebContents(contents, method)) |
| + return; |
| -void BrowserView::Copy() { |
| - DoCutCopyPaste(&content::WebContents::Copy, IDS_APP_COPY); |
| -} |
| + WebContents* devtools = |
| + DevToolsWindow::GetInTabWebContents(contents, nullptr); |
| + if (devtools && DoCutCopyPasteForWebContents(devtools, method)) |
| + return; |
| + } |
| -void BrowserView::Paste() { |
| - DoCutCopyPaste(&content::WebContents::Paste, IDS_APP_PASTE); |
| + // Execute the command on the focused view, if possible, by calling |
| + // AcceleratorPressed(). Textfields override this to translate and execute |
| + // the provided accelerator. |
| + views::View* focused = GetFocusManager()->GetFocusedView(); |
| + if (focused->CanHandleAccelerators()) { |
| + ui::Accelerator accelerator; |
| + GetAccelerator(command_id, &accelerator); |
| + focused->AcceleratorPressed(accelerator); |
| + } |
| } |
| WindowOpenDisposition BrowserView::GetDispositionForPopupBounds( |
| @@ -2514,32 +2529,11 @@ ExclusiveAccessContext* BrowserView::GetExclusiveAccessContext() { |
| return this; |
| } |
| -void BrowserView::DoCutCopyPaste(void (WebContents::*method)(), |
| - int command_id) { |
| - WebContents* contents = browser_->tab_strip_model()->GetActiveWebContents(); |
| - if (!contents) |
| - return; |
| - if (DoCutCopyPasteForWebContents(contents, method)) |
| - return; |
| - |
| - WebContents* devtools = DevToolsWindow::GetInTabWebContents(contents, |
| - nullptr); |
| - if (devtools && DoCutCopyPasteForWebContents(devtools, method)) |
| - return; |
| - |
| - views::FocusManager* focus_manager = GetFocusManager(); |
| - views::View* focused = focus_manager->GetFocusedView(); |
| - if (focused && |
| - (!strcmp(focused->GetClassName(), views::Textfield::kViewClassName) || |
| - !strcmp(focused->GetClassName(), OmniboxViewViews::kViewClassName))) { |
| - views::Textfield* textfield = static_cast<views::Textfield*>(focused); |
| - textfield->ExecuteCommand(command_id); |
| - } |
| -} |
| - |
| bool BrowserView::DoCutCopyPasteForWebContents( |
| WebContents* contents, |
| void (WebContents::*method)()) { |
| + // Using RWH interface rather than a fake key event for a WebContent is |
| + // important since a fake event might be consumed by the web content. |
| if (contents->GetRenderWidgetHostView()->HasFocus()) { |
| (contents->*method)(); |
| return true; |