aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/globalscope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/globalscope.rs')
-rw-r--r--components/script/dom/globalscope.rs171
1 files changed, 33 insertions, 138 deletions
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index efa9a9a97ab..527d03eed4e 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -18,18 +18,17 @@ use base::id::{
ServiceWorkerId, ServiceWorkerRegistrationId, WebViewId,
};
use constellation_traits::{
- BlobData, BlobImpl, BroadcastMsg, FileBlob, MessagePortImpl, MessagePortMsg, PortMessageTask,
- ScriptToConstellationChan, ScriptToConstellationMessage,
+ BlobData, BlobImpl, BroadcastMsg, FileBlob, LoadData, LoadOrigin, MessagePortImpl,
+ MessagePortMsg, PortMessageTask, ScriptToConstellationChan, ScriptToConstellationMessage,
};
use content_security_policy::{
- CheckResult, CspList, PolicyDisposition, PolicySource, Violation, ViolationResource,
+ CheckResult, CspList, Destination, Initiator, NavigationCheckType, ParserMetadata,
+ PolicyDisposition, PolicySource, Request, Violation, ViolationResource,
};
use crossbeam_channel::Sender;
use devtools_traits::{PageError, ScriptToDevtoolsControlMsg};
use dom_struct::dom_struct;
-use embedder_traits::{
- EmbedderMsg, GamepadEvent, GamepadSupportedHapticEffects, GamepadUpdateType,
-};
+use embedder_traits::EmbedderMsg;
use http::HeaderMap;
use hyper_serde::Serde;
use ipc_channel::ipc::{self, IpcSender};
@@ -64,6 +63,7 @@ use profile_traits::{ipc as profile_ipc, mem as profile_mem, time as profile_tim
use script_bindings::interfaces::GlobalScopeHelpers;
use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
use timers::{TimerEventId, TimerEventRequest, TimerSource};
+use url::Origin;
use uuid::Uuid;
#[cfg(feature = "webgpu")]
use webgpu_traits::{DeviceLostReason, WebGPUDevice};
@@ -81,9 +81,7 @@ use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function;
use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{
ImageBitmapOptions, ImageBitmapSource,
};
-use crate::dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorMethods;
use crate::dom::bindings::codegen::Bindings::NotificationBinding::NotificationPermissionCallback;
-use crate::dom::bindings::codegen::Bindings::PerformanceBinding::Performance_Binding::PerformanceMethods;
use crate::dom::bindings::codegen::Bindings::PermissionStatusBinding::{
PermissionName, PermissionState,
};
@@ -113,8 +111,6 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus};
use crate::dom::eventsource::EventSource;
use crate::dom::eventtarget::EventTarget;
use crate::dom::file::File;
-use crate::dom::gamepad::{Gamepad, contains_user_gesture};
-use crate::dom::gamepadevent::GamepadEventType;
use crate::dom::htmlscriptelement::{ScriptId, SourceCode};
use crate::dom::imagebitmap::ImageBitmap;
use crate::dom::messageevent::MessageEvent;
@@ -2957,6 +2953,33 @@ impl GlobalScope {
is_js_evaluation_allowed == CheckResult::Allowed
}
+ pub(crate) fn should_navigation_request_be_blocked(&self, load_data: &LoadData) -> bool {
+ let Some(csp_list) = self.get_csp_list() else {
+ return false;
+ };
+ let request = Request {
+ url: load_data.url.clone().into_url(),
+ origin: match &load_data.load_origin {
+ LoadOrigin::Script(immutable_origin) => immutable_origin.clone().into_url_origin(),
+ _ => Origin::new_opaque(),
+ },
+ // TODO: populate this field correctly
+ redirect_count: 0,
+ destination: Destination::None,
+ initiator: Initiator::None,
+ nonce: "".to_owned(),
+ integrity_metadata: "".to_owned(),
+ parser_metadata: ParserMetadata::None,
+ };
+ // TODO: set correct navigation check type for form submission if applicable
+ let (result, violations) =
+ csp_list.should_navigation_request_be_blocked(&request, NavigationCheckType::Other);
+
+ self.report_csp_violations(violations);
+
+ result == CheckResult::Blocked
+ }
+
pub(crate) fn create_image_bitmap(
&self,
image: ImageBitmapSource,
@@ -3287,134 +3310,6 @@ impl GlobalScope {
}
}
- pub(crate) fn handle_gamepad_event(&self, gamepad_event: GamepadEvent) {
- match gamepad_event {
- GamepadEvent::Connected(index, name, bounds, supported_haptic_effects) => {
- self.handle_gamepad_connect(
- index.0,
- name,
- bounds.axis_bounds,
- bounds.button_bounds,
- supported_haptic_effects,
- );
- },
- GamepadEvent::Disconnected(index) => {
- self.handle_gamepad_disconnect(index.0);
- },
- GamepadEvent::Updated(index, update_type) => {
- self.receive_new_gamepad_button_or_axis(index.0, update_type);
- },
- };
- }
-
- /// <https://www.w3.org/TR/gamepad/#dfn-gamepadconnected>
- fn handle_gamepad_connect(
- &self,
- // As the spec actually defines how to set the gamepad index, the GilRs index
- // is currently unused, though in practice it will almost always be the same.
- // More infra is currently needed to track gamepads across windows.
- _index: usize,
- name: String,
- axis_bounds: (f64, f64),
- button_bounds: (f64, f64),
- supported_haptic_effects: GamepadSupportedHapticEffects,
- ) {
- // TODO: 2. If document is not null and is not allowed to use the "gamepad" permission,
- // then abort these steps.
- let this = Trusted::new(self);
- self.task_manager()
- .gamepad_task_source()
- .queue(task!(gamepad_connected: move || {
- let global = this.root();
-
- if let Some(window) = global.downcast::<Window>() {
- let navigator = window.Navigator();
- let selected_index = navigator.select_gamepad_index();
- let gamepad = Gamepad::new(
- &global,
- selected_index,
- name,
- "standard".into(),
- axis_bounds,
- button_bounds,
- supported_haptic_effects,
- false,
- CanGc::note(),
- );
- navigator.set_gamepad(selected_index as usize, &gamepad, CanGc::note());
- }
- }));
- }
-
- /// <https://www.w3.org/TR/gamepad/#dfn-gamepaddisconnected>
- pub(crate) fn handle_gamepad_disconnect(&self, index: usize) {
- let this = Trusted::new(self);
- self.task_manager()
- .gamepad_task_source()
- .queue(task!(gamepad_disconnected: move || {
- let global = this.root();
- if let Some(window) = global.downcast::<Window>() {
- let navigator = window.Navigator();
- if let Some(gamepad) = navigator.get_gamepad(index) {
- if window.Document().is_fully_active() {
- gamepad.update_connected(false, gamepad.exposed(), CanGc::note());
- navigator.remove_gamepad(index);
- }
- }
- }
- }));
- }
-
- /// <https://www.w3.org/TR/gamepad/#receiving-inputs>
- pub(crate) fn receive_new_gamepad_button_or_axis(
- &self,
- index: usize,
- update_type: GamepadUpdateType,
- ) {
- let this = Trusted::new(self);
-
- // <https://w3c.github.io/gamepad/#dfn-update-gamepad-state>
- self.task_manager().gamepad_task_source().queue(
- task!(update_gamepad_state: move || {
- let global = this.root();
- if let Some(window) = global.downcast::<Window>() {
- let navigator = window.Navigator();
- if let Some(gamepad) = navigator.get_gamepad(index) {
- let current_time = global.performance().Now();
- gamepad.update_timestamp(*current_time);
- match update_type {
- GamepadUpdateType::Axis(index, value) => {
- gamepad.map_and_normalize_axes(index, value);
- },
- GamepadUpdateType::Button(index, value) => {
- gamepad.map_and_normalize_buttons(index, value);
- }
- };
- if !navigator.has_gamepad_gesture() && contains_user_gesture(update_type) {
- navigator.set_has_gamepad_gesture(true);
- navigator.GetGamepads()
- .iter()
- .filter_map(|g| g.as_ref())
- .for_each(|gamepad| {
- gamepad.set_exposed(true);
- gamepad.update_timestamp(*current_time);
- let new_gamepad = Trusted::new(&**gamepad);
- if window.Document().is_fully_active() {
- global.task_manager().gamepad_task_source().queue(
- task!(update_gamepad_connect: move || {
- let gamepad = new_gamepad.root();
- gamepad.notify_event(GamepadEventType::Connected, CanGc::note());
- })
- );
- }
- });
- }
- }
- }
- })
- );
- }
-
pub(crate) fn current_group_label(&self) -> Option<DOMString> {
self.console_group_stack
.borrow()