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

Side by Side Diff: chrome/browser/ui/views/frame/browser_view.cc

Issue 2775553002: Adds the ability for WebContentsDelegate to decide if event should be updated (Closed)
Patch Set: Fix compile Created 3 years, 9 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/views/frame/browser_view.h ('k') | chrome/test/base/test_browser_window.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/frame/browser_view.h" 5 #include "chrome/browser/ui/views/frame/browser_view.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 #include "components/app_modal/app_modal_dialog_queue.h" 106 #include "components/app_modal/app_modal_dialog_queue.h"
107 #include "components/app_modal/native_app_modal_dialog.h" 107 #include "components/app_modal/native_app_modal_dialog.h"
108 #include "components/omnibox/browser/omnibox_popup_model.h" 108 #include "components/omnibox/browser/omnibox_popup_model.h"
109 #include "components/omnibox/browser/omnibox_popup_view.h" 109 #include "components/omnibox/browser/omnibox_popup_view.h"
110 #include "components/omnibox/browser/omnibox_view.h" 110 #include "components/omnibox/browser/omnibox_view.h"
111 #include "components/prefs/pref_service.h" 111 #include "components/prefs/pref_service.h"
112 #include "components/sessions/core/tab_restore_service.h" 112 #include "components/sessions/core/tab_restore_service.h"
113 #include "components/signin/core/common/profile_management_switches.h" 113 #include "components/signin/core/common/profile_management_switches.h"
114 #include "components/translate/core/browser/language_state.h" 114 #include "components/translate/core/browser/language_state.h"
115 #include "content/public/browser/download_manager.h" 115 #include "content/public/browser/download_manager.h"
116 #include "content/public/browser/keyboard_event_processing_result.h"
116 #include "content/public/browser/notification_service.h" 117 #include "content/public/browser/notification_service.h"
117 #include "content/public/browser/render_frame_host.h" 118 #include "content/public/browser/render_frame_host.h"
118 #include "content/public/browser/render_view_host.h" 119 #include "content/public/browser/render_view_host.h"
119 #include "content/public/browser/render_widget_host_view.h" 120 #include "content/public/browser/render_widget_host_view.h"
120 #include "content/public/browser/user_metrics.h" 121 #include "content/public/browser/user_metrics.h"
121 #include "content/public/browser/web_contents.h" 122 #include "content/public/browser/web_contents.h"
122 #include "content/public/common/content_switches.h" 123 #include "content/public/common/content_switches.h"
123 #include "ui/accessibility/ax_node_data.h" 124 #include "ui/accessibility/ax_node_data.h"
124 #include "ui/base/accelerators/accelerator.h" 125 #include "ui/base/accelerators/accelerator.h"
125 #include "ui/base/hit_test.h" 126 #include "ui/base/hit_test.h"
(...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 return; 1300 return;
1300 1301
1301 // Keep the top-of-window views revealed as long as the app menu is visible. 1302 // Keep the top-of-window views revealed as long as the app menu is visible.
1302 std::unique_ptr<ImmersiveRevealedLock> revealed_lock( 1303 std::unique_ptr<ImmersiveRevealedLock> revealed_lock(
1303 immersive_mode_controller_->GetRevealedLock( 1304 immersive_mode_controller_->GetRevealedLock(
1304 ImmersiveModeController::ANIMATE_REVEAL_NO)); 1305 ImmersiveModeController::ANIMATE_REVEAL_NO));
1305 1306
1306 toolbar_->app_menu_button()->Activate(nullptr); 1307 toolbar_->app_menu_button()->Activate(nullptr);
1307 } 1308 }
1308 1309
1309 bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, 1310 content::KeyboardEventProcessingResult BrowserView::PreHandleKeyboardEvent(
1310 bool* is_keyboard_shortcut) { 1311 const NativeWebKeyboardEvent& event) {
1311 *is_keyboard_shortcut = false;
1312
1313 if ((event.type() != blink::WebInputEvent::RawKeyDown) && 1312 if ((event.type() != blink::WebInputEvent::RawKeyDown) &&
1314 (event.type() != blink::WebInputEvent::KeyUp)) { 1313 (event.type() != blink::WebInputEvent::KeyUp)) {
1315 return false; 1314 return content::KeyboardEventProcessingResult::NOT_HANDLED;
1316 } 1315 }
1317 1316
1318 views::FocusManager* focus_manager = GetFocusManager(); 1317 views::FocusManager* focus_manager = GetFocusManager();
1319 DCHECK(focus_manager); 1318 DCHECK(focus_manager);
1320 1319
1321 if (focus_manager->shortcut_handling_suspended()) 1320 if (focus_manager->shortcut_handling_suspended())
1322 return false; 1321 return content::KeyboardEventProcessingResult::NOT_HANDLED;
1323 1322
1324 ui::Accelerator accelerator = 1323 ui::Accelerator accelerator =
1325 ui::GetAcceleratorFromNativeWebKeyboardEvent(event); 1324 ui::GetAcceleratorFromNativeWebKeyboardEvent(event);
1326 1325
1327 // What we have to do here is as follows: 1326 // What we have to do here is as follows:
1328 // - If the |browser_| is for an app, do nothing. 1327 // - If the |browser_| is for an app, do nothing.
1329 // - On CrOS if |accelerator| is deprecated, we allow web contents to consume 1328 // - On CrOS if |accelerator| is deprecated, we allow web contents to consume
1330 // it if needed. 1329 // it if needed.
1331 // - If the |browser_| is not for an app, and the |accelerator| is not 1330 // - If the |browser_| is not for an app, and the |accelerator| is not
1332 // associated with the browser (e.g. an Ash shortcut), process it. 1331 // associated with the browser (e.g. an Ash shortcut), process it.
1333 // - If the |browser_| is not for an app, and the |accelerator| is associated 1332 // - If the |browser_| is not for an app, and the |accelerator| is associated
1334 // with the browser, and it is a reserved one (e.g. Ctrl+w), process it. 1333 // with the browser, and it is a reserved one (e.g. Ctrl+w), process it.
1335 // - If the |browser_| is not for an app, and the |accelerator| is associated 1334 // - If the |browser_| is not for an app, and the |accelerator| is associated
1336 // with the browser, and it is not a reserved one, do nothing. 1335 // with the browser, and it is not a reserved one, do nothing.
1337 1336
1338 if (browser_->is_app()) { 1337 if (browser_->is_app()) {
1339 // Let all keys fall through to a v1 app's web content, even accelerators. 1338 // Let all keys fall through to a v1 app's web content, even accelerators.
1340 // We don't have to flip |is_keyboard_shortcut| here. If we do that, the app 1339 // We don't use NOT_HANDLED_IS_SHORTCUT here. If we do that, the app
1341 // might not be able to see a subsequent Char event. See OnHandleInputEvent 1340 // might not be able to see a subsequent Char event. See OnHandleInputEvent
1342 // in content/renderer/render_widget.cc for details. 1341 // in content/renderer/render_widget.cc for details.
1343 return false; 1342 return content::KeyboardEventProcessingResult::NOT_HANDLED;
1344 } 1343 }
1345 1344
1346 #if defined(OS_CHROMEOS) 1345 #if defined(OS_CHROMEOS)
1347 if (ash_util::IsAcceleratorDeprecated(accelerator)) { 1346 if (ash_util::IsAcceleratorDeprecated(accelerator)) {
1348 if (event.type() == blink::WebInputEvent::RawKeyDown) 1347 return (event.type() == blink::WebInputEvent::RawKeyDown)
1349 *is_keyboard_shortcut = true; 1348 ? content::KeyboardEventProcessingResult::NOT_HANDLED_IS_SHORTCUT
1350 return false; 1349 : content::KeyboardEventProcessingResult::NOT_HANDLED;
1351 } 1350 }
1352 #endif // defined(OS_CHROMEOS) 1351 #endif // defined(OS_CHROMEOS)
1353 1352
1354 if (frame_->PreHandleKeyboardEvent(event)) 1353 if (frame_->PreHandleKeyboardEvent(event))
1355 return true; 1354 return content::KeyboardEventProcessingResult::HANDLED;
1356 1355
1357 chrome::BrowserCommandController* controller = browser_->command_controller(); 1356 chrome::BrowserCommandController* controller = browser_->command_controller();
1358 1357
1359 // Here we need to retrieve the command id (if any) associated to the 1358 // Here we need to retrieve the command id (if any) associated to the
1360 // keyboard event. Instead of looking up the command id in the 1359 // keyboard event. Instead of looking up the command id in the
1361 // |accelerator_table_| by ourselves, we block the command execution of 1360 // |accelerator_table_| by ourselves, we block the command execution of
1362 // the |browser_| object then send the keyboard event to the 1361 // the |browser_| object then send the keyboard event to the
1363 // |focus_manager| as if we are activating an accelerator key. 1362 // |focus_manager| as if we are activating an accelerator key.
1364 // Then we can retrieve the command id from the |browser_| object. 1363 // Then we can retrieve the command id from the |browser_| object.
1365 bool original_block_command_state = controller->block_command_execution(); 1364 bool original_block_command_state = controller->block_command_execution();
1366 controller->SetBlockCommandExecution(true); 1365 controller->SetBlockCommandExecution(true);
1367 // If the |accelerator| is a non-browser shortcut (e.g. Ash shortcut), the 1366 // If the |accelerator| is a non-browser shortcut (e.g. Ash shortcut), the
1368 // command execution cannot be blocked and true is returned. However, it is 1367 // command execution cannot be blocked and true is returned. However, it is
1369 // okay as long as is_app() is false. See comments in this function. 1368 // okay as long as is_app() is false. See comments in this function.
1370 const bool processed = focus_manager->ProcessAccelerator(accelerator); 1369 const bool processed = focus_manager->ProcessAccelerator(accelerator);
1371 const int id = controller->GetLastBlockedCommand(nullptr); 1370 const int id = controller->GetLastBlockedCommand(nullptr);
1372 controller->SetBlockCommandExecution(original_block_command_state); 1371 controller->SetBlockCommandExecution(original_block_command_state);
1373 1372
1374 // Executing the command may cause |this| object to be destroyed. 1373 // Executing the command may cause |this| object to be destroyed.
1375 if (controller->IsReservedCommandOrKey(id, event)) { 1374 if (controller->IsReservedCommandOrKey(id, event)) {
1376 UpdateAcceleratorMetrics(accelerator, id); 1375 UpdateAcceleratorMetrics(accelerator, id);
1377 return chrome::ExecuteCommand(browser_.get(), id); 1376 return chrome::ExecuteCommand(browser_.get(), id)
1377 ? content::KeyboardEventProcessingResult::HANDLED
1378 : content::KeyboardEventProcessingResult::NOT_HANDLED;
1378 } 1379 }
1379 1380
1380 if (id != -1) { 1381 if (id != -1) {
1381 // |accelerator| is a non-reserved browser shortcut (e.g. Ctrl+f). 1382 // |accelerator| is a non-reserved browser shortcut (e.g. Ctrl+f).
1382 if (event.type() == blink::WebInputEvent::RawKeyDown) 1383 return (event.type() == blink::WebInputEvent::RawKeyDown)
1383 *is_keyboard_shortcut = true; 1384 ? content::KeyboardEventProcessingResult::NOT_HANDLED_IS_SHORTCUT
1384 } else if (processed) { 1385 : content::KeyboardEventProcessingResult::NOT_HANDLED;
1386 }
1387
1388 if (processed) {
1385 // |accelerator| is a non-browser shortcut (e.g. F4-F10 on Ash). Report 1389 // |accelerator| is a non-browser shortcut (e.g. F4-F10 on Ash). Report
1386 // that we handled it. 1390 // that we handled it.
1387 return true; 1391 return content::KeyboardEventProcessingResult::HANDLED;
1388 } 1392 }
1389 1393
1390 return false; 1394 return content::KeyboardEventProcessingResult::NOT_HANDLED;
1391 } 1395 }
1392 1396
1393 void BrowserView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 1397 void BrowserView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
1394 if (frame_->HandleKeyboardEvent(event)) 1398 if (frame_->HandleKeyboardEvent(event))
1395 return; 1399 return;
1396 1400
1397 unhandled_keyboard_event_handler_.HandleKeyboardEvent(event, 1401 unhandled_keyboard_event_handler_.HandleKeyboardEvent(event,
1398 GetFocusManager()); 1402 GetFocusManager());
1399 } 1403 }
1400 1404
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2672 } 2676 }
2673 2677
2674 extensions::ActiveTabPermissionGranter* 2678 extensions::ActiveTabPermissionGranter*
2675 BrowserView::GetActiveTabPermissionGranter() { 2679 BrowserView::GetActiveTabPermissionGranter() {
2676 content::WebContents* web_contents = GetActiveWebContents(); 2680 content::WebContents* web_contents = GetActiveWebContents();
2677 if (!web_contents) 2681 if (!web_contents)
2678 return nullptr; 2682 return nullptr;
2679 return extensions::TabHelper::FromWebContents(web_contents) 2683 return extensions::TabHelper::FromWebContents(web_contents)
2680 ->active_tab_permission_granter(); 2684 ->active_tab_permission_granter();
2681 } 2685 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/frame/browser_view.h ('k') | chrome/test/base/test_browser_window.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698