From 9ea02fa4b46e92c00d3efa252e36681729d385a0 Mon Sep 17 00:00:00 2001 From: Cristian Brinza Date: Thu, 29 Aug 2024 19:39:08 +0300 Subject: [PATCH] Fix minibrowser scroll by keyboard (#33252) * Fix minibrowser scroll by keyboard Signed-off-by: crbrz * Apply suggested change Co-authored-by: Josh Matthews Signed-off-by: Cristian Brinza --------- Signed-off-by: crbrz Signed-off-by: Cristian Brinza Co-authored-by: Josh Matthews --- ports/servoshell/desktop/webview.rs | 32 ++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/ports/servoshell/desktop/webview.rs b/ports/servoshell/desktop/webview.rs index 46a0a6c038a..a6a33f6a7ad 100644 --- a/ports/servoshell/desktop/webview.rs +++ b/ports/servoshell/desktop/webview.rs @@ -526,7 +526,7 @@ where } /// Handle key events after they have been handled by Servo. - fn handle_key_from_servo(&mut self, _: Option, event: KeyboardEvent) { + fn handle_key_from_servo(&mut self, webview_id: Option, event: KeyboardEvent) { ShortcutMatcher::from_event(event) .shortcut(CMD_OR_CONTROL, '=', || { self.event_queue.push(EmbedderEvent::Zoom(1.1)) @@ -545,49 +545,67 @@ where 0.0, -self.window.page_height() + 2.0 * LINE_HEIGHT, )); - self.scroll_window_from_key(scroll_location, TouchEventType::Move); + self.scroll_window_from_key(scroll_location, TouchEventType::Move, webview_id); }) .shortcut(Modifiers::empty(), Key::PageUp, || { let scroll_location = ScrollLocation::Delta(Vector2D::new( 0.0, self.window.page_height() - 2.0 * LINE_HEIGHT, )); - self.scroll_window_from_key(scroll_location, TouchEventType::Move); + self.scroll_window_from_key(scroll_location, TouchEventType::Move, webview_id); }) .shortcut(Modifiers::empty(), Key::Home, || { - self.scroll_window_from_key(ScrollLocation::Start, TouchEventType::Move); + self.scroll_window_from_key( + ScrollLocation::Start, + TouchEventType::Move, + webview_id, + ); }) .shortcut(Modifiers::empty(), Key::End, || { - self.scroll_window_from_key(ScrollLocation::End, TouchEventType::Move); + self.scroll_window_from_key(ScrollLocation::End, TouchEventType::Move, webview_id); }) .shortcut(Modifiers::empty(), Key::ArrowUp, || { self.scroll_window_from_key( ScrollLocation::Delta(Vector2D::new(0.0, 3.0 * LINE_HEIGHT)), TouchEventType::Move, + webview_id, ); }) .shortcut(Modifiers::empty(), Key::ArrowDown, || { self.scroll_window_from_key( ScrollLocation::Delta(Vector2D::new(0.0, -3.0 * LINE_HEIGHT)), TouchEventType::Move, + webview_id, ); }) .shortcut(Modifiers::empty(), Key::ArrowLeft, || { self.scroll_window_from_key( ScrollLocation::Delta(Vector2D::new(LINE_HEIGHT, 0.0)), TouchEventType::Move, + webview_id, ); }) .shortcut(Modifiers::empty(), Key::ArrowRight, || { self.scroll_window_from_key( ScrollLocation::Delta(Vector2D::new(-LINE_HEIGHT, 0.0)), TouchEventType::Move, + webview_id, ); }); } - fn scroll_window_from_key(&mut self, scroll_location: ScrollLocation, phase: TouchEventType) { - let event = EmbedderEvent::Scroll(scroll_location, Point2D::zero(), phase); + fn scroll_window_from_key( + &mut self, + scroll_location: ScrollLocation, + phase: TouchEventType, + webview_id: Option, + ) { + // In minibrowser mode the webview is offset by the toolbar + let origin = webview_id + .and_then(|id| self.webviews.get(&id)) + .map(|webview| webview.rect.min.ceil().to_i32()) + .unwrap_or(Point2D::zero()); + let event = EmbedderEvent::Scroll(scroll_location, origin, phase); self.event_queue.push(event); }