X Tutup
Skip to content

Commit befe53e

Browse files
authored
fix: pointer lock escape handling (electron#32828)
1 parent 41aaed3 commit befe53e

File tree

4 files changed

+52
-25
lines changed

4 files changed

+52
-25
lines changed

shell/browser/api/electron_api_web_contents.cc

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,9 @@ bool WebContents::PlatformHandleKeyboardEvent(
12501250
content::KeyboardEventProcessingResult WebContents::PreHandleKeyboardEvent(
12511251
content::WebContents* source,
12521252
const content::NativeWebKeyboardEvent& event) {
1253+
if (exclusive_access_manager_->HandleUserKeyEvent(event))
1254+
return content::KeyboardEventProcessingResult::HANDLED;
1255+
12531256
if (event.GetType() == blink::WebInputEvent::Type::kRawKeyDown ||
12541257
event.GetType() == blink::WebInputEvent::Type::kKeyUp) {
12551258
bool prevent_default = Emit("before-input-event", event);
@@ -1398,6 +1401,35 @@ void WebContents::FindReply(content::WebContents* web_contents,
13981401
Emit("found-in-page", result.GetHandle());
13991402
}
14001403

1404+
void WebContents::RequestExclusivePointerAccess(
1405+
content::WebContents* web_contents,
1406+
bool user_gesture,
1407+
bool last_unlocked_by_target,
1408+
bool allowed) {
1409+
if (allowed) {
1410+
exclusive_access_manager_->mouse_lock_controller()->RequestToLockMouse(
1411+
web_contents, user_gesture, last_unlocked_by_target);
1412+
} else {
1413+
web_contents->GotResponseToLockMouseRequest(
1414+
blink::mojom::PointerLockResult::kPermissionDenied);
1415+
}
1416+
}
1417+
1418+
void WebContents::RequestToLockMouse(content::WebContents* web_contents,
1419+
bool user_gesture,
1420+
bool last_unlocked_by_target) {
1421+
auto* permission_helper =
1422+
WebContentsPermissionHelper::FromWebContents(web_contents);
1423+
permission_helper->RequestPointerLockPermission(
1424+
user_gesture, last_unlocked_by_target,
1425+
base::BindOnce(&WebContents::RequestExclusivePointerAccess,
1426+
base::Unretained(this)));
1427+
}
1428+
1429+
void WebContents::LostMouseLock() {
1430+
exclusive_access_manager_->mouse_lock_controller()->LostMouseLock();
1431+
}
1432+
14011433
void WebContents::RequestKeyboardLock(content::WebContents* web_contents,
14021434
bool esc_key_locked) {
14031435
exclusive_access_manager_->keyboard_lock_controller()->RequestKeyboardLock(
@@ -1430,14 +1462,6 @@ void WebContents::RequestMediaAccessPermission(
14301462
permission_helper->RequestMediaAccessPermission(request, std::move(callback));
14311463
}
14321464

1433-
void WebContents::RequestToLockMouse(content::WebContents* web_contents,
1434-
bool user_gesture,
1435-
bool last_unlocked_by_target) {
1436-
auto* permission_helper =
1437-
WebContentsPermissionHelper::FromWebContents(web_contents);
1438-
permission_helper->RequestPointerLockPermission(user_gesture);
1439-
}
1440-
14411465
content::JavaScriptDialogManager* WebContents::GetJavaScriptDialogManager(
14421466
content::WebContents* source) {
14431467
if (!dialog_manager_)

shell/browser/api/electron_api_web_contents.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,14 @@ class WebContents : public ExclusiveAccessContext,
560560
const gfx::Rect& selection_rect,
561561
int active_match_ordinal,
562562
bool final_update) override;
563+
void RequestExclusivePointerAccess(content::WebContents* web_contents,
564+
bool user_gesture,
565+
bool last_unlocked_by_target,
566+
bool allowed);
567+
void RequestToLockMouse(content::WebContents* web_contents,
568+
bool user_gesture,
569+
bool last_unlocked_by_target) override;
570+
void LostMouseLock() override;
563571
void RequestKeyboardLock(content::WebContents* web_contents,
564572
bool esc_key_locked) override;
565573
void CancelKeyboardLockRequest(content::WebContents* web_contents) override;
@@ -570,9 +578,6 @@ class WebContents : public ExclusiveAccessContext,
570578
content::WebContents* web_contents,
571579
const content::MediaStreamRequest& request,
572580
content::MediaResponseCallback callback) override;
573-
void RequestToLockMouse(content::WebContents* web_contents,
574-
bool user_gesture,
575-
bool last_unlocked_by_target) override;
576581
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
577582
content::WebContents* source) override;
578583
void OnAudioStateChanged(bool audible) override;

shell/browser/web_contents_permission_helper.cc

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,6 @@ void MediaAccessAllowed(const content::MediaStreamRequest& request,
4343
controller.Deny(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED);
4444
}
4545

46-
void OnPointerLockResponse(content::WebContents* web_contents, bool allowed) {
47-
if (web_contents) {
48-
if (allowed)
49-
web_contents->GotResponseToLockMouseRequest(
50-
blink::mojom::PointerLockResult::kSuccess);
51-
else
52-
web_contents->GotResponseToLockMouseRequest(
53-
blink::mojom::PointerLockResult::kPermissionDenied);
54-
}
55-
}
56-
5746
void OnPermissionResponse(base::OnceCallback<void(bool)> callback,
5847
blink::mojom::PermissionStatus status) {
5948
if (status == blink::mojom::PermissionStatus::GRANTED)
@@ -157,10 +146,15 @@ void WebContentsPermissionHelper::RequestWebNotificationPermission(
157146
}
158147

159148
void WebContentsPermissionHelper::RequestPointerLockPermission(
160-
bool user_gesture) {
149+
bool user_gesture,
150+
bool last_unlocked_by_target,
151+
base::OnceCallback<void(content::WebContents*, bool, bool, bool)>
152+
callback) {
161153
RequestPermission(
162154
static_cast<content::PermissionType>(PermissionType::POINTER_LOCK),
163-
base::BindOnce(&OnPointerLockResponse, web_contents_), user_gesture);
155+
base::BindOnce(std::move(callback), web_contents_, user_gesture,
156+
last_unlocked_by_target),
157+
user_gesture);
164158
}
165159

166160
void WebContentsPermissionHelper::RequestOpenExternalPermission(

shell/browser/web_contents_permission_helper.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,13 @@ class WebContentsPermissionHelper
3636
void RequestFullscreenPermission(base::OnceCallback<void(bool)> callback);
3737
void RequestMediaAccessPermission(const content::MediaStreamRequest& request,
3838
content::MediaResponseCallback callback);
39+
void RequestPointerLockPermission(
40+
bool user_gesture,
41+
bool last_unlocked_by_target,
42+
base::OnceCallback<void(content::WebContents*, bool, bool, bool)>
43+
callback);
3944
void RequestWebNotificationPermission(
4045
base::OnceCallback<void(bool)> callback);
41-
void RequestPointerLockPermission(bool user_gesture);
4246
void RequestOpenExternalPermission(base::OnceCallback<void(bool)> callback,
4347
bool user_gesture,
4448
const GURL& url);

0 commit comments

Comments
 (0)
X Tutup