From 16e468bb8c43a2beb77af13c230fdd0d49b4bb4f Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Sat, 27 Aug 2011 18:41:21 +0000 Subject: [PATCH] - [mac] Add selector implementations for edit commands (issue #276). - [mac] Don't generate character events for arrow key presses (issue #294). - Call OnSetFocus when the browser view receives focus/becomes first responder (issue #314). git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@281 5089003a-bbd8-11dd-ad1f-f1f9622dbc98 --- libcef/browser_impl_win.cc | 17 ++++++++++-- libcef/browser_webview_delegate.cc | 8 ++++++ libcef/browser_webview_mac.mm | 42 ++++++++++++++++++++++++++++++ libcef/webwidget_host_mac.mm | 6 +++-- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/libcef/browser_impl_win.cc b/libcef/browser_impl_win.cc index 4c08b1b0e..ce635ce76 100644 --- a/libcef/browser_impl_win.cc +++ b/libcef/browser_impl_win.cc @@ -81,8 +81,21 @@ LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message, return 0; case WM_SETFOCUS: - if (browser) - browser->UIT_SetFocus(browser->UIT_GetWebViewHost(), true); + if (browser) { + WebViewHost* host = browser->UIT_GetWebViewHost(); + if (host) { + bool handled = false; + CefRefPtr client = browser->GetClient(); + if (client.get()) { + CefRefPtr handler = client->GetFocusHandler(); + if (handler.get()) + handled = handler->OnSetFocus(browser, false); + } + + if (!handled) + browser->UIT_SetFocus(host, true); + } + } return 0; case WM_ERASEBKGND: diff --git a/libcef/browser_webview_delegate.cc b/libcef/browser_webview_delegate.cc index 5c54f5a5f..bc1c4bc99 100644 --- a/libcef/browser_webview_delegate.cc +++ b/libcef/browser_webview_delegate.cc @@ -507,6 +507,12 @@ void BrowserWebViewDelegate::scheduleAnimation() { host->ScheduleAnimation(); } +// This method is called when: +// A. A request is loaded in a window other than the source window +// (FrameLoader::loadFrameRequest), or +// B. A request is loaded in an already existing popup window +// (FrameLoader::createWindow), or +// C. A DOM window receives a focus event (DOMWindow::focus) void BrowserWebViewDelegate::didFocus() { if (WebWidgetHost* host = GetWidgetHost()) { bool handled = false; @@ -522,6 +528,8 @@ void BrowserWebViewDelegate::didFocus() { } } +// This method is called when a DOM window receives a blur event +// (DOMWindow::blur). void BrowserWebViewDelegate::didBlur() { if (WebWidgetHost* host = GetWidgetHost()) browser_->UIT_SetFocus(host, false); diff --git a/libcef/browser_webview_mac.mm b/libcef/browser_webview_mac.mm index 144b1ecb0..b90282881 100644 --- a/libcef/browser_webview_mac.mm +++ b/libcef/browser_webview_mac.mm @@ -156,6 +156,13 @@ - (BOOL)becomeFirstResponder { if (browser_ && browser_->UIT_GetWebView()) { + CefRefPtr client = browser_->GetClient(); + if (client.get()) { + CefRefPtr handler = client->GetFocusHandler(); + if (handler.get() && handler->OnSetFocus(browser_, false)) + return NO; + } + browser_->UIT_GetWebViewHost()->SetFocus(YES); return [super becomeFirstResponder]; } @@ -181,6 +188,41 @@ [self setNeedsDisplay:YES]; } +- (void)undo:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->Undo(); +} + +- (void)redo:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->Redo(); +} + +- (void)cut:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->Cut(); +} + +- (void)copy:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->Copy(); +} + +- (void)paste:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->Paste(); +} + +- (void)delete:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->Delete(); +} + +- (void)selectAll:(id)sender { + if (browser_) + browser_->GetFocusedFrame()->SelectAll(); +} + - (void)registerDragDrop { dropTarget_.reset([[WebDropTarget alloc] initWithWebView:self]); diff --git a/libcef/webwidget_host_mac.mm b/libcef/webwidget_host_mac.mm index 45f0b6e74..ada8793c8 100644 --- a/libcef/webwidget_host_mac.mm +++ b/libcef/webwidget_host_mac.mm @@ -220,8 +220,10 @@ void WebWidgetHost::WheelEvent(NSEvent *event) { void WebWidgetHost::KeyEvent(NSEvent *event) { WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event)); webwidget_->handleInputEvent(keyboard_event); - if ([event type] == NSKeyDown) { - // Send a Char event here to emulate the keyboard events. + if ([event type] == NSKeyDown && + !([event modifierFlags] & NSNumericPadKeyMask)) { + // Send a Char event here to emulate the keyboard events. Do not send a + // Char event for arrow keys (NSNumericPadKeyMask modifier will be set). // TODO(hbono): Bug 20852 implement the // NSTextInput protocol and remove this code. keyboard_event.type = WebInputEvent::Char;