diff options
Diffstat (limited to 'components/script/dom/permissions.rs')
-rw-r--r-- | components/script/dom/permissions.rs | 100 |
1 files changed, 50 insertions, 50 deletions
diff --git a/components/script/dom/permissions.rs b/components/script/dom/permissions.rs index cb91fb692f9..37887f60773 100644 --- a/components/script/dom/permissions.rs +++ b/components/script/dom/permissions.rs @@ -19,19 +19,13 @@ use crate::dom::promise::Promise; use crate::realms::{AlreadyInRealm, InRealm}; use crate::script_runtime::JSContext; use dom_struct::dom_struct; +use embedder_traits::{self, EmbedderMsg, PermissionPrompt, PermissionRequest}; +use ipc_channel::ipc; use js::conversions::ConversionResult; use js::jsapi::JSObject; use js::jsval::{ObjectValue, UndefinedValue}; use servo_config::pref; use std::rc::Rc; -#[cfg(target_os = "linux")] -use tinyfiledialogs::{self, MessageBoxIcon, YesNo}; - -#[cfg(target_os = "linux")] -const DIALOG_TITLE: &'static str = "Permission request dialog"; -const NONSECURE_DIALOG_MESSAGE: &'static str = "feature is only safe to use in secure context,\ - but servo can't guarantee\n that the current context is secure. Do you want to proceed and grant permission?"; -const REQUEST_DIALOG_MESSAGE: &'static str = "Do you want to grant permission for"; pub trait PermissionAlgorithm { type Descriptor; @@ -143,7 +137,6 @@ impl Permissions { // (Revoke) Step 3. let globalscope = self.global(); globalscope - .as_window() .permission_state_invocation_results() .borrow_mut() .remove(&root_desc.name.to_string()); @@ -176,7 +169,6 @@ impl Permissions { // (Revoke) Step 3. let globalscope = self.global(); globalscope - .as_window() .permission_state_invocation_results() .borrow_mut() .remove(&root_desc.name.to_string()); @@ -259,17 +251,13 @@ impl PermissionAlgorithm for Permissions { // Step 3. PermissionState::Prompt => { let perm_name = status.get_query(); - - let globalscope = GlobalScope::current().expect("No current global object"); + let prompt = + PermissionPrompt::Request(embedder_traits::PermissionName::from(perm_name)); // https://w3c.github.io/permissions/#request-permission-to-use (Step 3 - 4) - let state = prompt_user( - &format!("{} {} ?", REQUEST_DIALOG_MESSAGE, perm_name.clone()), - globalscope.is_headless(), - ); - + let globalscope = GlobalScope::current().expect("No current global object"); + let state = prompt_user_from_embedder(prompt, &globalscope); globalscope - .as_window() .permission_state_invocation_results() .borrow_mut() .insert(perm_name.to_string(), state); @@ -292,7 +280,7 @@ pub fn get_descriptor_permission_state( env_settings_obj: Option<&GlobalScope>, ) -> PermissionState { // Step 1. - let settings = match env_settings_obj { + let globalscope = match env_settings_obj { Some(env_settings_obj) => DomRoot::from_ref(env_settings_obj), None => GlobalScope::current().expect("No current global object"), }; @@ -308,22 +296,20 @@ pub fn get_descriptor_permission_state( if pref!(dom.permissions.testing.allowed_in_nonsecure_contexts) { PermissionState::Granted } else { - settings - .as_window() + globalscope .permission_state_invocation_results() .borrow_mut() .remove(&permission_name.to_string()); - prompt_user( - &format!("The {} {}", permission_name, NONSECURE_DIALOG_MESSAGE), - settings.is_headless(), + prompt_user_from_embedder( + PermissionPrompt::Insecure(embedder_traits::PermissionName::from(permission_name)), + &globalscope, ) } }; // Step 3. - if let Some(prev_result) = settings - .as_window() + if let Some(prev_result) = globalscope .permission_state_invocation_results() .borrow() .get(&permission_name.to_string()) @@ -332,8 +318,7 @@ pub fn get_descriptor_permission_state( } // Store the invocation result - settings - .as_window() + globalscope .permission_state_invocation_results() .borrow_mut() .insert(permission_name.to_string(), state); @@ -342,28 +327,6 @@ pub fn get_descriptor_permission_state( state } -#[cfg(target_os = "linux")] -fn prompt_user(message: &str, headless: bool) -> PermissionState { - if headless { - return PermissionState::Denied; - } - match tinyfiledialogs::message_box_yes_no( - DIALOG_TITLE, - message, - MessageBoxIcon::Question, - YesNo::No, - ) { - YesNo::Yes => PermissionState::Granted, - YesNo::No => PermissionState::Denied, - } -} - -#[cfg(not(target_os = "linux"))] -fn prompt_user(_message: &str, _headless: bool) -> PermissionState { - // TODO popup only supported on linux - PermissionState::Denied -} - // https://w3c.github.io/permissions/#allowed-in-non-secure-contexts fn allowed_in_nonsecure_contexts(permission_name: &PermissionName) -> bool { match *permission_name { @@ -391,3 +354,40 @@ fn allowed_in_nonsecure_contexts(permission_name: &PermissionName) -> bool { PermissionName::Persistent_storage => false, } } + +fn prompt_user_from_embedder(prompt: PermissionPrompt, gs: &GlobalScope) -> PermissionState { + let (sender, receiver) = ipc::channel().expect("Failed to create IPC channel!"); + gs.send_to_embedder(EmbedderMsg::PromptPermission(prompt, sender)); + + match receiver.recv() { + Ok(PermissionRequest::Granted) => PermissionState::Granted, + Ok(PermissionRequest::Denied) => PermissionState::Denied, + Err(e) => { + warn!( + "Failed to receive permission state from embedder ({:?}).", + e + ); + PermissionState::Denied + }, + } +} + +impl From<PermissionName> for embedder_traits::PermissionName { + fn from(permission_name: PermissionName) -> Self { + match permission_name { + PermissionName::Geolocation => embedder_traits::PermissionName::Geolocation, + PermissionName::Notifications => embedder_traits::PermissionName::Notifications, + PermissionName::Push => embedder_traits::PermissionName::Push, + PermissionName::Midi => embedder_traits::PermissionName::Midi, + PermissionName::Camera => embedder_traits::PermissionName::Camera, + PermissionName::Microphone => embedder_traits::PermissionName::Microphone, + PermissionName::Speaker => embedder_traits::PermissionName::Speaker, + PermissionName::Device_info => embedder_traits::PermissionName::DeviceInfo, + PermissionName::Background_sync => embedder_traits::PermissionName::BackgroundSync, + PermissionName::Bluetooth => embedder_traits::PermissionName::Bluetooth, + PermissionName::Persistent_storage => { + embedder_traits::PermissionName::PersistentStorage + }, + } + } +} |