aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/permissions.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2020-02-29 14:52:15 -0500
committerGitHub <noreply@github.com>2020-02-29 14:52:15 -0500
commitd42835b238cc8a086f08e9901e19b81bc5d75be3 (patch)
treee307169454b94565f65b1660ee25db52e22ec41f /components/script/dom/permissions.rs
parent0260176f09f80e4d5528c39cc01ed81389906473 (diff)
parent3b85c6a24e254af375e27421de2464b746d104fb (diff)
downloadservo-d42835b238cc8a086f08e9901e19b81bc5d75be3.tar.gz
servo-d42835b238cc8a086f08e9901e19b81bc5d75be3.zip
Auto merge of #25869 - iulianR:issue-23057-tinifiledialogs, r=jdm
Move tinyfiledialog call from script to embedder <!-- Please describe your changes on the following line: --> PR is based on work started in #23651. I rebased on top of master and addressed review comments. Handling the `PromptPermission` message in `libsimpleservo` is probably not ideal. Looking forward to make more changes, just let me know how I should proceed. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #23057 (GitHub issue number if applicable) <!-- Either: --> - [ ] There are tests for these changes OR - [ ] These changes do not require tests because ___ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
Diffstat (limited to 'components/script/dom/permissions.rs')
-rw-r--r--components/script/dom/permissions.rs100
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
+ },
+ }
+ }
+}