| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/guest_view/web_view/web_view_guest.h" | 5 #include "chrome/browser/guest_view/web_view/web_view_guest.h" |
| 6 | 6 |
| 7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "chrome/browser/chrome_notification_types.h" | 9 #include "chrome/browser/chrome_notification_types.h" |
| 10 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 10 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 // Cancel all find sessions in progress. | 395 // Cancel all find sessions in progress. |
| 396 find_helper_.CancelAllFindSessions(); | 396 find_helper_.CancelAllFindSessions(); |
| 397 | 397 |
| 398 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 398 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| 399 args->SetInteger(webview::kProcessId, | 399 args->SetInteger(webview::kProcessId, |
| 400 guest_web_contents()->GetRenderProcessHost()->GetID()); | 400 guest_web_contents()->GetRenderProcessHost()->GetID()); |
| 401 args->SetString(webview::kReason, TerminationStatusToString(status)); | 401 args->SetString(webview::kReason, TerminationStatusToString(status)); |
| 402 DispatchEvent(new GuestViewBase::Event(webview::kEventExit, args.Pass())); | 402 DispatchEvent(new GuestViewBase::Event(webview::kEventExit, args.Pass())); |
| 403 } | 403 } |
| 404 | 404 |
| 405 bool WebViewGuest::HandleKeyboardEvent( | 405 void WebViewGuest::HandleKeyboardEvent( |
| 406 const content::NativeWebKeyboardEvent& event) { | 406 const content::NativeWebKeyboardEvent& event) { |
| 407 if (event.type != blink::WebInputEvent::RawKeyDown) | 407 if (!attached()) |
| 408 return false; | 408 return; |
| 409 | 409 |
| 410 #if defined(OS_MACOSX) | 410 if (HandleKeyboardShortcuts(event)) |
| 411 if (event.modifiers != blink::WebInputEvent::MetaKey) | 411 return; |
| 412 return false; | |
| 413 | 412 |
| 414 if (event.windowsKeyCode == ui::VKEY_OEM_4) { | 413 // Send the unhandled keyboard events back to the embedder to reprocess them. |
| 415 Go(-1); | 414 // TODO(fsamuel): This introduces the possibility of out-of-order keyboard |
| 416 return true; | 415 // events because the guest may be arbitrarily delayed when responding to |
| 417 } | 416 // keyboard events. In that time, the embedder may have received and processed |
| 418 | 417 // additional key events. This needs to be fixed as soon as possible. |
| 419 if (event.windowsKeyCode == ui::VKEY_OEM_6) { | 418 // See http://crbug.com/229882. |
| 420 Go(1); | 419 embedder_web_contents()->GetDelegate()->HandleKeyboardEvent( |
| 421 return true; | 420 web_contents(), event); |
| 422 } | |
| 423 #else | |
| 424 if (event.windowsKeyCode == ui::VKEY_BROWSER_BACK) { | |
| 425 Go(-1); | |
| 426 return true; | |
| 427 } | |
| 428 | |
| 429 if (event.windowsKeyCode == ui::VKEY_BROWSER_FORWARD) { | |
| 430 Go(1); | |
| 431 return true; | |
| 432 } | |
| 433 #endif | |
| 434 return false; | |
| 435 } | 421 } |
| 436 | 422 |
| 437 bool WebViewGuest::IsDragAndDropEnabled() { | 423 bool WebViewGuest::IsDragAndDropEnabled() { |
| 438 return true; | 424 return true; |
| 439 } | 425 } |
| 440 | 426 |
| 441 bool WebViewGuest::IsOverridingUserAgent() const { | 427 bool WebViewGuest::IsOverridingUserAgent() const { |
| 442 return is_overriding_user_agent_; | 428 return is_overriding_user_agent_; |
| 443 } | 429 } |
| 444 | 430 |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1075 args->SetString(webview::kPermission, | 1061 args->SetString(webview::kPermission, |
| 1076 PermissionTypeToString(permission_type)); | 1062 PermissionTypeToString(permission_type)); |
| 1077 DispatchEvent(new GuestViewBase::Event(webview::kEventPermissionRequest, | 1063 DispatchEvent(new GuestViewBase::Event(webview::kEventPermissionRequest, |
| 1078 args.Pass())); | 1064 args.Pass())); |
| 1079 break; | 1065 break; |
| 1080 } | 1066 } |
| 1081 } | 1067 } |
| 1082 return request_id; | 1068 return request_id; |
| 1083 } | 1069 } |
| 1084 | 1070 |
| 1071 bool WebViewGuest::HandleKeyboardShortcuts( |
| 1072 const content::NativeWebKeyboardEvent& event) { |
| 1073 if (event.type != blink::WebInputEvent::RawKeyDown) |
| 1074 return false; |
| 1075 |
| 1076 // If the user hits the escape key without any modifiers then unlock the |
| 1077 // mouse if necessary. |
| 1078 if ((event.windowsKeyCode == ui::VKEY_ESCAPE) && |
| 1079 !(event.modifiers & blink::WebInputEvent::InputModifiers)) { |
| 1080 return guest_web_contents()->GotResponseToLockMouseRequest(false); |
| 1081 } |
| 1082 |
| 1083 #if defined(OS_MACOSX) |
| 1084 if (event.modifiers != blink::WebInputEvent::MetaKey) |
| 1085 return false; |
| 1086 |
| 1087 if (event.windowsKeyCode == ui::VKEY_OEM_4) { |
| 1088 Go(-1); |
| 1089 return true; |
| 1090 } |
| 1091 |
| 1092 if (event.windowsKeyCode == ui::VKEY_OEM_6) { |
| 1093 Go(1); |
| 1094 return true; |
| 1095 } |
| 1096 #else |
| 1097 if (event.windowsKeyCode == ui::VKEY_BROWSER_BACK) { |
| 1098 Go(-1); |
| 1099 return true; |
| 1100 } |
| 1101 |
| 1102 if (event.windowsKeyCode == ui::VKEY_BROWSER_FORWARD) { |
| 1103 Go(1); |
| 1104 return true; |
| 1105 } |
| 1106 #endif |
| 1107 |
| 1108 return false; |
| 1109 } |
| 1110 |
| 1085 WebViewGuest::PermissionResponseInfo::PermissionResponseInfo() | 1111 WebViewGuest::PermissionResponseInfo::PermissionResponseInfo() |
| 1086 : permission_type(BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN), | 1112 : permission_type(BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN), |
| 1087 allowed_by_default(false) { | 1113 allowed_by_default(false) { |
| 1088 } | 1114 } |
| 1089 | 1115 |
| 1090 WebViewGuest::PermissionResponseInfo::PermissionResponseInfo( | 1116 WebViewGuest::PermissionResponseInfo::PermissionResponseInfo( |
| 1091 const PermissionResponseCallback& callback, | 1117 const PermissionResponseCallback& callback, |
| 1092 BrowserPluginPermissionType permission_type, | 1118 BrowserPluginPermissionType permission_type, |
| 1093 bool allowed_by_default) | 1119 bool allowed_by_default) |
| 1094 : callback(callback), | 1120 : callback(callback), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1108 if (request_id != pending_context_menu_request_id_) | 1134 if (request_id != pending_context_menu_request_id_) |
| 1109 return; | 1135 return; |
| 1110 | 1136 |
| 1111 // TODO(lazyboy): Implement. | 1137 // TODO(lazyboy): Implement. |
| 1112 DCHECK(!items); | 1138 DCHECK(!items); |
| 1113 | 1139 |
| 1114 ContextMenuDelegate* menu_delegate = | 1140 ContextMenuDelegate* menu_delegate = |
| 1115 ContextMenuDelegate::FromWebContents(guest_web_contents()); | 1141 ContextMenuDelegate::FromWebContents(guest_web_contents()); |
| 1116 menu_delegate->ShowMenu(pending_menu_.Pass()); | 1142 menu_delegate->ShowMenu(pending_menu_.Pass()); |
| 1117 } | 1143 } |
| OLD | NEW |