aboutsummaryrefslogtreecommitdiffstats
path: root/ports/servoshell/desktop
diff options
context:
space:
mode:
authorchickenleaf <lashwinib@gmail.com>2025-02-21 19:58:55 +0530
committerGitHub <noreply@github.com>2025-02-21 14:28:55 +0000
commitf6e2e3d4186d177241a4e625939d3574e0e14bf5 (patch)
tree40311ed0179be1c695b3794478a763ea5d4e2c32 /ports/servoshell/desktop
parenta433b202595bb0e2208571b0680be396937e092f (diff)
downloadservo-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.rs36
-rw-r--r--ports/servoshell/desktop/dialog.rs43
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
+ },
}
}
}