diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 95277ebcd2de8..b5b21d71a92ba 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1401,11 +1401,26 @@ 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); + } +} + void WebContents::RequestToLockMouse(content::WebContents* web_contents, bool user_gesture, bool last_unlocked_by_target) { - exclusive_access_manager_->mouse_lock_controller()->RequestToLockMouse( - web_contents, user_gesture, 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() { diff --git a/shell/browser/api/electron_api_web_contents.h b/shell/browser/api/electron_api_web_contents.h index f312bbe92998d..996c90cbbbc39 100644 --- a/shell/browser/api/electron_api_web_contents.h +++ b/shell/browser/api/electron_api_web_contents.h @@ -560,6 +560,10 @@ 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; diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index d95ec28397c91..07f99d157dbe2 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -43,6 +43,16 @@ void MediaAccessAllowed(const content::MediaStreamRequest& request, controller.Deny(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED); } +void OnPointerLockResponse( + base::OnceCallback callback, + content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target, + bool allowed) { + std::move(callback).Run(web_contents, user_gesture, last_unlocked_by_target, + allowed); +} + void OnPermissionResponse(base::OnceCallback callback, blink::mojom::PermissionStatus status) { if (status == blink::mojom::PermissionStatus::GRANTED) @@ -145,6 +155,18 @@ void WebContentsPermissionHelper::RequestWebNotificationPermission( std::move(callback)); } +void WebContentsPermissionHelper::RequestPointerLockPermission( + bool user_gesture, + bool last_unlocked_by_target, + base::OnceCallback + callback) { + RequestPermission( + static_cast(PermissionType::POINTER_LOCK), + base::BindOnce(&OnPointerLockResponse, std::move(callback), web_contents_, + user_gesture, last_unlocked_by_target), + user_gesture); +} + void WebContentsPermissionHelper::RequestOpenExternalPermission( base::OnceCallback callback, bool user_gesture, diff --git a/shell/browser/web_contents_permission_helper.h b/shell/browser/web_contents_permission_helper.h index 5a6c2fd0e2dc0..639dcd8a8829a 100644 --- a/shell/browser/web_contents_permission_helper.h +++ b/shell/browser/web_contents_permission_helper.h @@ -36,6 +36,11 @@ 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 RequestOpenExternalPermission(base::OnceCallback callback,