diff options
author | chickenleaf <lashwinib@gmail.com> | 2025-02-21 19:58:55 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-21 14:28:55 +0000 |
commit | f6e2e3d4186d177241a4e625939d3574e0e14bf5 (patch) | |
tree | 40311ed0179be1c695b3794478a763ea5d4e2c32 /ports/servoshell/desktop | |
parent | a433b202595bb0e2208571b0680be396937e092f (diff) | |
download | servo-f6e2e3d4186d177241a4e625939d3574e0e14bf5.tar.gz servo-f6e2e3d4186d177241a4e625939d3574e0e14bf5.zip |
servoshell: Port Permission dialog code to use egui instead of tinyfiledialogs (#35577)
Signed-off-by: L Ashwin B <lashwinib@gmail.com>
Diffstat (limited to 'ports/servoshell/desktop')
-rw-r--r-- | ports/servoshell/desktop/app_state.rs | 36 | ||||
-rw-r--r-- | ports/servoshell/desktop/dialog.rs | 43 |
2 files changed, 49 insertions, 30 deletions
diff --git a/ports/servoshell/desktop/app_state.rs b/ports/servoshell/desktop/app_state.rs index 88abee07a58..3d79b513e79 100644 --- a/ports/servoshell/desktop/app_state.rs +++ b/ports/servoshell/desktop/app_state.rs @@ -22,8 +22,6 @@ use servo::{ PermissionRequest, PromptDefinition, PromptOrigin, PromptResult, Servo, ServoDelegate, ServoError, TouchEventType, WebView, WebViewDelegate, }; -#[cfg(target_os = "linux")] -use tinyfiledialogs::MessageBoxIcon; use url::Url; use super::app::PumpResult; @@ -537,10 +535,14 @@ impl WebViewDelegate for RunningAppState { self.add_dialog(webview, file_dialog); } - fn request_permission(&self, _webview: servo::WebView, request: PermissionRequest) { - if !self.servoshell_preferences.headless { - prompt_user(request); + fn request_permission(&self, webview: servo::WebView, permission_request: PermissionRequest) { + if self.servoshell_preferences.headless { + permission_request.deny(); + return; } + + let permission_dialog = Dialog::new_permission_request_dialog(permission_request); + self.add_dialog(webview, permission_dialog); } fn notify_new_frame_ready(&self, _webview: servo::WebView) { @@ -595,30 +597,6 @@ impl WebViewDelegate for RunningAppState { } #[cfg(target_os = "linux")] -fn prompt_user(request: PermissionRequest) { - use tinyfiledialogs::YesNo; - - let message = format!( - "Do you want to grant permission for {:?}?", - request.feature() - ); - match tinyfiledialogs::message_box_yes_no( - "Permission request dialog", - &message, - MessageBoxIcon::Question, - YesNo::No, - ) { - YesNo::Yes => request.allow(), - YesNo::No => request.deny(), - } -} - -#[cfg(not(target_os = "linux"))] -fn prompt_user(_request: PermissionRequest) { - // Requests are denied by default. -} - -#[cfg(target_os = "linux")] fn platform_get_selected_devices(devices: Vec<String>) -> Option<String> { thread::Builder::new() .name("DevicePicker".to_owned()) diff --git a/ports/servoshell/desktop/dialog.rs b/ports/servoshell/desktop/dialog.rs index 87ee7ef2d58..05aab3f27b3 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::{AuthenticationRequest, FilterPattern, PromptResult}; +use servo::{AuthenticationRequest, FilterPattern, PermissionRequest, PromptResult}; pub enum Dialog { File { @@ -35,6 +35,10 @@ pub enum Dialog { password: String, request: Option<AuthenticationRequest>, }, + Permission { + message: String, + request: Option<PermissionRequest>, + }, } impl Dialog { @@ -95,6 +99,17 @@ impl Dialog { } } + pub fn new_permission_request_dialog(permission_request: PermissionRequest) -> Self { + let message = format!( + "Do you want to grant permission for {:?}?", + permission_request.feature() + ); + Dialog::Permission { + message, + request: Some(permission_request), + } + } + pub fn update(&mut self, ctx: &egui::Context) -> bool { match self { Dialog::File { @@ -261,6 +276,32 @@ impl Dialog { }); is_open }, + Dialog::Permission { message, request } => { + let mut is_open = true; + let modal = Modal::new("permission".into()); + modal.show(ctx, |ui| { + make_dialog_label(message, ui, None); + egui::Sides::new().show( + ui, + |_ui| {}, + |ui| { + if ui.button("Allow").clicked() { + let request = + request.take().expect("non-None until dialog is closed"); + request.allow(); + is_open = false; + } + if ui.button("Deny").clicked() { + let request = + request.take().expect("non-None until dialog is closed"); + request.deny(); + is_open = false; + } + }, + ); + }); + is_open + }, } } } |