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 focused
When 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 focused
Tuple Fields§
§0: u64
Trait 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§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 moreSource§impl<T> MaybeBoxed<Box<T>> for T
impl<T> MaybeBoxed<Box<T>> for T
Source§fn maybe_boxed(self) -> Box<T>
fn maybe_boxed(self) -> Box<T>
Source§impl<T> MaybeBoxed<T> for T
impl<T> MaybeBoxed<T> for T
Source§fn maybe_boxed(self) -> T
fn maybe_boxed(self) -> T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian()
.