diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 43ef330cc74ad..e4030acac92d4 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1250,6 +1250,9 @@ bool WebContents::PlatformHandleKeyboardEvent( content::KeyboardEventProcessingResult WebContents::PreHandleKeyboardEvent( content::WebContents* source, const content::NativeWebKeyboardEvent& event) { + if (exclusive_access_manager_->HandleUserKeyEvent(event)) + return content::KeyboardEventProcessingResult::HANDLED; + if (event.GetType() == blink::WebInputEvent::Type::kRawKeyDown || event.GetType() == blink::WebInputEvent::Type::kKeyUp) { bool prevent_default = Emit("before-input-event", event); @@ -1398,6 +1401,35 @@ void WebContents::FindReply(content::WebContents* web_contents, Emit("found-in-page", result.GetHandle()); } +void WebContents::RequestExclusivePointerAccess( + content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target, + bool allowed) { + if (allowed) { + exclusive_access_manager_->mouse_lock_controller()->RequestToLockMouse( + web_contents, user_gesture, last_unlocked_by_target); + } else { + web_contents->GotResponseToLockMouseRequest( + blink::mojom::PointerLockResult::kPermissionDenied); + } +} + +void WebContents::RequestToLockMouse(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) { + auto* permission_helper = + WebContentsPermissionHelper::FromWebContents(web_contents); + permission_helper->RequestPointerLockPermission( + user_gesture, last_unlocked_by_target, + base::BindOnce(&WebContents::RequestExclusivePointerAccess, + base::Unretained(this))); +} + +void WebContents::LostMouseLock() { + exclusive_access_manager_->mouse_lock_controller()->LostMouseLock(); +} + void WebContents::RequestKeyboardLock(content::WebContents* web_contents, bool esc_key_locked) { exclusive_access_manager_->keyboard_lock_controller()->RequestKeyboardLock( @@ -1430,14 +1462,6 @@ void WebContents::RequestMediaAccessPermission( permission_helper->RequestMediaAccessPermission(request, std::move(callback)); } -void WebContents::RequestToLockMouse(content::WebContents* web_contents, - bool user_gesture, - bool last_unlocked_by_target) { - auto* permission_helper = - WebContentsPermissionHelper::FromWebContents(web_contents); - permission_helper->RequestPointerLockPermission(user_gesture); -} - content::JavaScriptDialogManager* WebContents::GetJavaScriptDialogManager( content::WebContents* source) { if (!dialog_manager_) diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index 5bd418b79401c..996c90cbbbc39 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -560,6 +560,14 @@ class WebContents : public ExclusiveAccessContext, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update) override; + void RequestExclusivePointerAccess(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target, + bool allowed); + void RequestToLockMouse(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) override; + void LostMouseLock() override; void RequestKeyboardLock(content::WebContents* web_contents, bool esc_key_locked) override; void CancelKeyboardLockRequest(content::WebContents* web_contents) override; @@ -570,9 +578,6 @@ class WebContents : public ExclusiveAccessContext, content::WebContents* web_contents, const content::MediaStreamRequest& request, content::MediaResponseCallback callback) override; - void RequestToLockMouse(content::WebContents* web_contents, - bool user_gesture, - bool last_unlocked_by_target) override; content::JavaScriptDialogManager* GetJavaScriptDialogManager( content::WebContents* source) override; void OnAudioStateChanged(bool audible) override; diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index 44129dd295834..2fd8cb0a6c699 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -43,17 +43,6 @@ void MediaAccessAllowed(const content::MediaStreamRequest& request, controller.Deny(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED); } -void OnPointerLockResponse(content::WebContents* web_contents, bool allowed) { - if (web_contents) { - if (allowed) - web_contents->GotResponseToLockMouseRequest( - blink::mojom::PointerLockResult::kSuccess); - else - web_contents->GotResponseToLockMouseRequest( - blink::mojom::PointerLockResult::kPermissionDenied); - } -} - void OnPermissionResponse(base::OnceCallback callback, blink::mojom::PermissionStatus status) { if (status == blink::mojom::PermissionStatus::GRANTED) @@ -157,10 +146,15 @@ void WebContentsPermissionHelper::RequestWebNotificationPermission( } void WebContentsPermissionHelper::RequestPointerLockPermission( - bool user_gesture) { + bool user_gesture, + bool last_unlocked_by_target, + base::OnceCallback + callback) { RequestPermission( static_cast(PermissionType::POINTER_LOCK), - base::BindOnce(&OnPointerLockResponse, web_contents_), user_gesture); + base::BindOnce(std::move(callback), web_contents_, user_gesture, + last_unlocked_by_target), + user_gesture); } void WebContentsPermissionHelper::RequestOpenExternalPermission( diff --git a/shell/browser/web_contents_permission_helper.h b/shell/browser/web_contents_permission_helper.h index 6f320b7a6a9b7..639dcd8a8829a 100644 --- a/shell/browser/web_contents_permission_helper.h +++ b/shell/browser/web_contents_permission_helper.h @@ -36,9 +36,13 @@ class WebContentsPermissionHelper void RequestFullscreenPermission(base::OnceCallback callback); void RequestMediaAccessPermission(const content::MediaStreamRequest& request, content::MediaResponseCallback callback); + void RequestPointerLockPermission( + bool user_gesture, + bool last_unlocked_by_target, + base::OnceCallback + callback); void RequestWebNotificationPermission( base::OnceCallback callback); - void RequestPointerLockPermission(bool user_gesture); void RequestOpenExternalPermission(base::OnceCallback callback, bool user_gesture, const GURL& url);