mirror of
https://github.com/servo/servo.git
synced 2025-08-29 17:18:23 +01:00
webdriver: Raise WebView
to top when focus (#38909)
- Add a helper function `focus_and_raise_to_top` to `WebView`. - For webdriver, raise webview to top when focus, to make it consistent with user interaction. Testing: Should reduce some flaky TIMEOUT when combined with another PR later. Fixes: A small patch before the PR for #38906. --------- Signed-off-by: Euclid Ye <euclid.ye@huawei.com>
This commit is contained in:
parent
01a9b317d4
commit
8683f97fcc
6 changed files with 14 additions and 16 deletions
|
@ -58,8 +58,7 @@ impl ::servo::WebViewDelegate for AppState {
|
||||||
.hidpi_scale_factor(Scale::new(self.window.scale_factor() as f32))
|
.hidpi_scale_factor(Scale::new(self.window.scale_factor() as f32))
|
||||||
.delegate(parent_webview.delegate())
|
.delegate(parent_webview.delegate())
|
||||||
.build();
|
.build();
|
||||||
webview.focus();
|
webview.focus_and_raise_to_top(true);
|
||||||
webview.raise_to_top(true);
|
|
||||||
|
|
||||||
self.webviews.borrow_mut().push(webview.clone());
|
self.webviews.borrow_mut().push(webview.clone());
|
||||||
Some(webview)
|
Some(webview)
|
||||||
|
@ -117,8 +116,7 @@ impl ApplicationHandler<WakerEvent> for App {
|
||||||
.delegate(app_state.clone())
|
.delegate(app_state.clone())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
webview.focus();
|
webview.focus_and_raise_to_top(true);
|
||||||
webview.raise_to_top(true);
|
|
||||||
|
|
||||||
app_state.webviews.borrow_mut().push(webview);
|
app_state.webviews.borrow_mut().push(webview);
|
||||||
*self = Self::Running(app_state);
|
*self = Self::Running(app_state);
|
||||||
|
|
|
@ -408,6 +408,12 @@ impl WebView {
|
||||||
.expect("BUG: invalid WebView instance");
|
.expect("BUG: invalid WebView instance");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn focus_and_raise_to_top(&self, hide_others: bool) -> FocusId {
|
||||||
|
let focus_id = self.focus();
|
||||||
|
self.raise_to_top(hide_others);
|
||||||
|
focus_id
|
||||||
|
}
|
||||||
|
|
||||||
pub fn notify_theme_change(&self, theme: Theme) {
|
pub fn notify_theme_change(&self, theme: Theme) {
|
||||||
self.inner()
|
self.inner()
|
||||||
.constellation_proxy
|
.constellation_proxy
|
||||||
|
|
|
@ -2482,7 +2482,7 @@ impl Handler {
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
self.send_message_to_embedder(WebDriverCommandMsg::FocusWebView(webview_id, sender))?;
|
self.send_message_to_embedder(WebDriverCommandMsg::FocusWebView(webview_id, sender))?;
|
||||||
if wait_for_ipc_response(receiver)? {
|
if wait_for_ipc_response(receiver)? {
|
||||||
debug!("Focus new webview successfully");
|
debug!("Focus new webview {webview_id} successfully");
|
||||||
} else {
|
} else {
|
||||||
debug!("Focus new webview failed, it may not exist anymore");
|
debug!("Focus new webview failed, it may not exist anymore");
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,7 +376,7 @@ impl App {
|
||||||
},
|
},
|
||||||
WebDriverCommandMsg::FocusWebView(webview_id, response_sender) => {
|
WebDriverCommandMsg::FocusWebView(webview_id, response_sender) => {
|
||||||
if let Some(webview) = running_state.webview_by_id(webview_id) {
|
if let Some(webview) = running_state.webview_by_id(webview_id) {
|
||||||
let focus_id = webview.focus();
|
let focus_id = webview.focus_and_raise_to_top(true);
|
||||||
running_state.set_pending_focus(focus_id, response_sender);
|
running_state.set_pending_focus(focus_id, response_sender);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -120,8 +120,7 @@ impl RunningAppState {
|
||||||
|
|
||||||
pub(crate) fn create_and_focus_toplevel_webview(self: &Rc<Self>, url: Url) {
|
pub(crate) fn create_and_focus_toplevel_webview(self: &Rc<Self>, url: Url) {
|
||||||
let webview = self.create_toplevel_webview(url);
|
let webview = self.create_toplevel_webview(url);
|
||||||
webview.focus();
|
webview.focus_and_raise_to_top(true);
|
||||||
webview.raise_to_top(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn create_toplevel_webview(self: &Rc<Self>, url: Url) -> WebView {
|
pub(crate) fn create_toplevel_webview(self: &Rc<Self>, url: Url) -> WebView {
|
||||||
|
@ -634,8 +633,7 @@ impl WebViewDelegate for RunningAppState {
|
||||||
// as that is what the specification expects. Otherwise, we would like `window.open()`
|
// as that is what the specification expects. Otherwise, we would like `window.open()`
|
||||||
// to create a new foreground tab
|
// to create a new foreground tab
|
||||||
if self.servoshell_preferences.webdriver_port.is_none() {
|
if self.servoshell_preferences.webdriver_port.is_none() {
|
||||||
webview.focus();
|
webview.focus_and_raise_to_top(true);
|
||||||
webview.raise_to_top(true);
|
|
||||||
}
|
}
|
||||||
self.add(webview.clone());
|
self.add(webview.clone());
|
||||||
Some(webview)
|
Some(webview)
|
||||||
|
|
|
@ -406,12 +406,8 @@ impl Window {
|
||||||
})
|
})
|
||||||
.shortcut(Modifiers::CONTROL, Key::Named(NamedKey::PageUp), || {
|
.shortcut(Modifiers::CONTROL, Key::Named(NamedKey::PageUp), || {
|
||||||
if let Some(index) = state.get_focused_webview_index() {
|
if let Some(index) = state.get_focused_webview_index() {
|
||||||
let new_index = if index == 0 {
|
let len = state.webviews().len();
|
||||||
state.webviews().len() - 1
|
state.focus_webview_by_index((index + len - 1) % len);
|
||||||
} else {
|
|
||||||
index - 1
|
|
||||||
};
|
|
||||||
state.focus_webview_by_index(new_index)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.shortcut(CMD_OR_CONTROL, 'T', || {
|
.shortcut(CMD_OR_CONTROL, 'T', || {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue