aboutsummaryrefslogtreecommitdiffstats
path: root/ports/servoshell/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'ports/servoshell/desktop')
-rw-r--r--ports/servoshell/desktop/app_state.rs20
-rw-r--r--ports/servoshell/desktop/dialog.rs67
2 files changed, 78 insertions, 9 deletions
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<Option<String>>,
},
+ Authentication {
+ username: String,
+ password: String,
+ request: Option<AuthenticationRequest>,
+ },
}
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
+ },
}
}
}