aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_thread.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/script_thread.rs')
-rw-r--r--components/script/script_thread.rs78
1 files changed, 72 insertions, 6 deletions
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 9c93bef22df..2129979ad42 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -50,8 +50,9 @@ use devtools_traits::{
};
use embedder_traits::user_content_manager::UserContentManager;
use embedder_traits::{
- CompositorHitTestResult, EmbedderMsg, InputEvent, MediaSessionActionType, MouseButton,
- MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverScriptCommand,
+ CompositorHitTestResult, EmbedderMsg, FocusSequenceNumber, InputEvent, MediaSessionActionType,
+ MouseButton, MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails,
+ WebDriverScriptCommand,
};
use euclid::Point2D;
use euclid::default::Rect;
@@ -124,7 +125,7 @@ use crate::dom::customelementregistry::{
CallbackReaction, CustomElementDefinition, CustomElementReactionStack,
};
use crate::dom::document::{
- Document, DocumentSource, FocusType, HasBrowsingContext, IsHTMLDocument, TouchEventResult,
+ Document, DocumentSource, FocusInitiator, HasBrowsingContext, IsHTMLDocument, TouchEventResult,
};
use crate::dom::element::Element;
use crate::dom::globalscope::GlobalScope;
@@ -1803,8 +1804,14 @@ impl ScriptThread {
ScriptThreadMessage::RemoveHistoryStates(pipeline_id, history_states) => {
self.handle_remove_history_states(pipeline_id, history_states)
},
- ScriptThreadMessage::FocusIFrame(parent_pipeline_id, frame_id) => {
- self.handle_focus_iframe_msg(parent_pipeline_id, frame_id, can_gc)
+ ScriptThreadMessage::FocusIFrame(parent_pipeline_id, frame_id, sequence) => {
+ self.handle_focus_iframe_msg(parent_pipeline_id, frame_id, sequence, can_gc)
+ },
+ ScriptThreadMessage::FocusDocument(pipeline_id, sequence) => {
+ self.handle_focus_document_msg(pipeline_id, sequence, can_gc)
+ },
+ ScriptThreadMessage::Unfocus(pipeline_id, sequence) => {
+ self.handle_unfocus_msg(pipeline_id, sequence, can_gc)
},
ScriptThreadMessage::WebDriverScriptCommand(pipeline_id, msg) => {
self.handle_webdriver_msg(pipeline_id, msg, can_gc)
@@ -2513,6 +2520,7 @@ impl ScriptThread {
&self,
parent_pipeline_id: PipelineId,
browsing_context_id: BrowsingContextId,
+ sequence: FocusSequenceNumber,
can_gc: CanGc,
) {
let document = self
@@ -2532,7 +2540,65 @@ impl ScriptThread {
return;
};
- document.request_focus(Some(&iframe_element_root), FocusType::Parent, can_gc);
+ if document.get_focus_sequence() > sequence {
+ debug!(
+ "Disregarding the FocusIFrame message because the contained sequence number is \
+ too old ({:?} < {:?})",
+ sequence,
+ document.get_focus_sequence()
+ );
+ return;
+ }
+
+ document.request_focus(Some(&iframe_element_root), FocusInitiator::Remote, can_gc);
+ }
+
+ fn handle_focus_document_msg(
+ &self,
+ pipeline_id: PipelineId,
+ sequence: FocusSequenceNumber,
+ can_gc: CanGc,
+ ) {
+ if let Some(doc) = self.documents.borrow().find_document(pipeline_id) {
+ if doc.get_focus_sequence() > sequence {
+ debug!(
+ "Disregarding the FocusDocument message because the contained sequence number is \
+ too old ({:?} < {:?})",
+ sequence,
+ doc.get_focus_sequence()
+ );
+ return;
+ }
+ doc.request_focus(None, FocusInitiator::Remote, can_gc);
+ } else {
+ warn!(
+ "Couldn't find document by pipleline_id:{pipeline_id:?} when handle_focus_document_msg."
+ );
+ }
+ }
+
+ fn handle_unfocus_msg(
+ &self,
+ pipeline_id: PipelineId,
+ sequence: FocusSequenceNumber,
+ can_gc: CanGc,
+ ) {
+ if let Some(doc) = self.documents.borrow().find_document(pipeline_id) {
+ if doc.get_focus_sequence() > sequence {
+ debug!(
+ "Disregarding the Unfocus message because the contained sequence number is \
+ too old ({:?} < {:?})",
+ sequence,
+ doc.get_focus_sequence()
+ );
+ return;
+ }
+ doc.handle_container_unfocus(can_gc);
+ } else {
+ warn!(
+ "Couldn't find document by pipleline_id:{pipeline_id:?} when handle_unfocus_msg."
+ );
+ }
}
fn handle_post_message_msg(