pub struct FocusSequenceNumber(pub u64);Expand description
A sequence number generated by a script thread for its pipelines. The
constellation attaches the target pipeline’s last seen FocusSequenceNumber
to every focus-related message it sends.
This is used to resolve the inconsistency that occurs due to bidirectional focus state synchronization and provide eventual consistency. Example:
script constellation
-----------------------------------------------------------------------
send ActivateDocument ----------> receive ActivateDocument
,---- send FocusDocument
|
focus an iframe |
send Focus -----------------|---> receive Focus
| focus the iframe's content document
receive FocusDocument <-----' send FocusDocument to the content pipeline --> ...
unfocus the iframe
focus the document
Final state: Final state:
the iframe is not focused the iframe is focusedWhen the above sequence completes, from the script thread’s point of view, the iframe is unfocused, but from the constellation’s point of view, the iframe is still focused.
This inconsistency can be resolved by associating a sequence number to each message. Whenever a script thread initiates a focus operation, it generates and sends a brand new sequence number. The constellation attaches the last-received sequence number to each message it sends. This way, the script thread can discard out-dated incoming focus messages, and eventually, all actors converge to the consistent state which is determined based on the last focus message received by the constellation.
script constellation
-----------------------------------------------------------------------
send ActivateDocument ----------> receive ActivateDocument
,---- send FocusDocument (0)
|
seq_number += 1 |
focus an iframe |
send Focus (1) -------------|---> receive Focus (1)
| focus the iframe's content document
receive FocusDocument (0) <-' send FocusDocument to the content pipeline --> ...
ignore it because 0 < 1
Final state: Final state:
the iframe is focused the iframe is focusedTuple Fields§
§0: u64Trait Implementations§
Source§impl Clone for FocusSequenceNumber
impl Clone for FocusSequenceNumber
Source§fn clone(&self) -> FocusSequenceNumber
fn clone(&self) -> FocusSequenceNumber
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for FocusSequenceNumber
impl Debug for FocusSequenceNumber
Source§impl Default for FocusSequenceNumber
impl Default for FocusSequenceNumber
Source§fn default() -> FocusSequenceNumber
fn default() -> FocusSequenceNumber
Source§impl<'de> Deserialize<'de> for FocusSequenceNumber
impl<'de> Deserialize<'de> for FocusSequenceNumber
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<FocusSequenceNumber, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<FocusSequenceNumber, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Display for FocusSequenceNumber
impl Display for FocusSequenceNumber
Source§impl Hash for FocusSequenceNumber
impl Hash for FocusSequenceNumber
Source§impl MallocSizeOf for FocusSequenceNumber
impl MallocSizeOf for FocusSequenceNumber
Source§fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize
fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize
Source§impl PartialEq for FocusSequenceNumber
impl PartialEq for FocusSequenceNumber
Source§impl PartialOrd for FocusSequenceNumber
impl PartialOrd for FocusSequenceNumber
Source§impl Serialize for FocusSequenceNumber
impl Serialize for FocusSequenceNumber
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Copy for FocusSequenceNumber
impl Eq for FocusSequenceNumber
impl StructuralPartialEq for FocusSequenceNumber
Auto Trait Implementations§
impl Freeze for FocusSequenceNumber
impl RefUnwindSafe for FocusSequenceNumber
impl Send for FocusSequenceNumber
impl Sync for FocusSequenceNumber
impl Unpin for FocusSequenceNumber
impl UnwindSafe for FocusSequenceNumber
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more