From b0561c78c7976089c845306def8ead03e30b2914 Mon Sep 17 00:00:00 2001 From: chickenleaf Date: Wed, 19 Feb 2025 19:12:48 +0530 Subject: servoshell: Port Authentication dialog code to use egui intead of tinyfiledialogs (#35507) Signed-off-by: L Ashwin B --- ports/servoshell/desktop/app_state.rs | 20 ++++++----- ports/servoshell/desktop/dialog.rs | 67 ++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 9 deletions(-) (limited to 'ports/servoshell') diff --git a/ports/servoshell/desktop/app_state.rs b/ports/servoshell/desktop/app_state.rs index 1d8ffa578c1..3496e67337d 100644 --- a/ports/servoshell/desktop/app_state.rs +++ b/ports/servoshell/desktop/app_state.rs @@ -172,7 +172,13 @@ impl RunningAppState { } pub(crate) fn for_each_active_dialog(&self, callback: impl Fn(&mut Dialog) -> bool) { - let Some(webview_id) = self.focused_webview().as_ref().map(WebView::id) else { + let last_created_webview_id = self.inner().creation_order.last().cloned(); + let Some(webview_id) = self + .focused_webview() + .as_ref() + .map(WebView::id) + .or(last_created_webview_id) + else { return; }; @@ -392,19 +398,17 @@ impl WebViewDelegate for RunningAppState { fn request_authentication( &self, - _webview: WebView, + webview: WebView, authentication_request: AuthenticationRequest, ) { if self.inner().headless { return; } - if let (Some(username), Some(password)) = ( - tinyfiledialogs::input_box("", "username", ""), - tinyfiledialogs::input_box("", "password", ""), - ) { - authentication_request.authenticate(username, password); - } + self.add_dialog( + webview, + Dialog::new_authentication_dialog(authentication_request), + ); } fn request_open_auxiliary_webview( diff --git a/ports/servoshell/desktop/dialog.rs b/ports/servoshell/desktop/dialog.rs index cd3b6a4abd6..87ee7ef2d58 100644 --- a/ports/servoshell/desktop/dialog.rs +++ b/ports/servoshell/desktop/dialog.rs @@ -9,7 +9,7 @@ use egui::Modal; use egui_file_dialog::{DialogState, FileDialog as EguiFileDialog}; use log::warn; use servo::ipc_channel::ipc::IpcSender; -use servo::{FilterPattern, PromptResult}; +use servo::{AuthenticationRequest, FilterPattern, PromptResult}; pub enum Dialog { File { @@ -30,6 +30,11 @@ pub enum Dialog { input_text: String, sender: IpcSender>, }, + Authentication { + username: String, + password: String, + request: Option, + }, } impl Dialog { @@ -82,6 +87,14 @@ impl Dialog { } } + pub fn new_authentication_dialog(authentication_request: AuthenticationRequest) -> Self { + Dialog::Authentication { + username: String::new(), + password: String::new(), + request: Some(authentication_request), + } + } + pub fn update(&mut self, ctx: &egui::Context) -> bool { match self { Dialog::File { @@ -196,6 +209,58 @@ impl Dialog { }); is_open }, + Dialog::Authentication { + username, + password, + ref mut request, + } => { + let mut is_open = true; + Modal::new("input".into()).show(ctx, |ui| { + let mut frame = egui::Frame::default().inner_margin(10.0).begin(ui); + frame.content_ui.set_min_width(150.0); + + if let Some(ref request) = request { + let url = + egui::RichText::new(request.url().origin().unicode_serialization()); + frame.content_ui.heading(url); + } + + frame.content_ui.add_space(10.0); + + frame + .content_ui + .label("This site is asking you to sign in."); + frame.content_ui.add_space(10.0); + + frame.content_ui.label("Username:"); + frame.content_ui.text_edit_singleline(username); + frame.content_ui.add_space(10.0); + + frame.content_ui.label("Password:"); + frame + .content_ui + .add(egui::TextEdit::singleline(password).password(true)); + + frame.end(ui); + + egui::Sides::new().show( + ui, + |_ui| {}, + |ui| { + if ui.button("Sign in").clicked() { + let request = + request.take().expect("non-None until dialog is closed"); + request.authenticate(username.clone(), password.clone()); + is_open = false; + } + if ui.button("Cancel").clicked() { + is_open = false; + } + }, + ); + }); + is_open + }, } } } -- cgit v1.2.3