Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(515)

Unified Diff: chrome/browser/ui/views/frame/browser_view.cc

Issue 10134036: Let Chrome app handle Ash accelerators first if the app is launched as a window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: final rebase Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/browser.cc ('k') | ui/views/focus/focus_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 81ee794955a704d2ce8c6a9e623651216a538499..934caa5e48edb9328a578a8badbd66f8837c6642 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1145,13 +1145,18 @@ void BrowserView::ShowAppMenu() {
bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) {
- if (event.type != WebKit::WebInputEvent::RawKeyDown)
+ *is_keyboard_shortcut = false;
+
+ if ((event.type != WebKit::WebInputEvent::RawKeyDown) &&
+ (event.type != WebKit::WebInputEvent::KeyUp)) {
return false;
+ }
#if defined(OS_WIN) && !defined(USE_AURA)
// As Alt+F4 is the close-app keyboard shortcut, it needs processing
// immediately.
if (event.windowsKeyCode == ui::VKEY_F4 &&
+ event.type == WebKit::WebInputEvent::RawKeyDown &&
event.modifiers == NativeWebKeyboardEvent::AltKey) {
DefWindowProc(event.os_event.hwnd, event.os_event.message,
event.os_event.wParam, event.os_event.lParam);
@@ -1170,16 +1175,25 @@ bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
NativeWebKeyboardEvent::ControlKey,
(event.modifiers & NativeWebKeyboardEvent::AltKey) ==
NativeWebKeyboardEvent::AltKey);
+ if (event.type == WebKit::WebInputEvent::KeyUp)
+ accelerator.set_type(ui::ET_KEY_RELEASED);
+
+ // What we have to do here is as follows:
+ // - If the |browser_| is for an app, do nothing.
+ // - If the |browser_| is not for an app, and the |accelerator| is not
+ // associated with the browser (e.g. an Ash shortcut), process it.
+ // - If the |browser_| is not for an app, and the |accelerator| is associated
+ // with the browser, and it is a reserved one (e.g. Ctrl-t), process it.
+ // - If the |browser_| is not for an app, and the |accelerator| is associated
+ // with the browser, and it is not a reserved one, do nothing.
- // We first find out the browser command associated to the |event|.
- // Then if the command is a reserved one, and should be processed
- // immediately according to the |event|, the command will be executed
- // immediately. Otherwise we just set |*is_keyboard_shortcut| properly and
- // return false.
+ if (browser_->is_app()) {
+ // We don't have to flip |is_keyboard_shortcut| here. If we do that, the app
+ // might not be able to see a subsequent Char event. See OnHandleInputEvent
+ // in content/renderer/render_widget.cc for details.
+ return false;
+ }
- // This piece of code is based on the fact that accelerators registered
- // into the |focus_manager| may only trigger a browser command execution.
- //
// Here we need to retrieve the command id (if any) associated to the
// keyboard event. Instead of looking up the command id in the
// |accelerator_table_| by ourselves, we block the command execution of
@@ -1187,21 +1201,27 @@ bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
// |focus_manager| as if we are activating an accelerator key.
// Then we can retrieve the command id from the |browser_| object.
browser_->SetBlockCommandExecution(true);
- focus_manager->ProcessAccelerator(accelerator);
- int id = browser_->GetLastBlockedCommand(NULL);
+ // If the |accelerator| is a non-browser shortcut (e.g. Ash shortcut), the
+ // command execution cannot be blocked and true is returned. However, it is
+ // okay as long as is_app() is false. See comments in this function.
+ const bool processed = focus_manager->ProcessAccelerator(accelerator);
+ const int id = browser_->GetLastBlockedCommand(NULL);
browser_->SetBlockCommandExecution(false);
- if (id == -1)
- return false;
-
// Executing the command may cause |this| object to be destroyed.
if (browser_->IsReservedCommandOrKey(id, event)) {
UpdateAcceleratorMetrics(accelerator, id);
return browser_->ExecuteCommandIfEnabled(id);
}
- DCHECK(is_keyboard_shortcut != NULL);
- *is_keyboard_shortcut = true;
+ if (id != -1) {
+ // |accelerator| is a non-reserved browser shortcut (e.g. Ctrl+t).
+ if (event.type == WebKit::WebInputEvent::RawKeyDown)
+ *is_keyboard_shortcut = true;
+ } else if (processed) {
+ // |accelerator| is a non-browser shortcut (e.g. F5-F10 on Ash).
+ return true;
+ }
return false;
}
« no previous file with comments | « chrome/browser/ui/browser.cc ('k') | ui/views/focus/focus_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698