Skip to main content

FrameGraph

Struct FrameGraph 

Source
pub struct FrameGraph {
    pub nodes: Vec<FrameNode>,
}
Expand description

The full graph for a page snapshot.

Children are indexed via FrameGraph::children which scans the nodes Vec, fine for the typical <50-node frame trees we see in the wild; would warrant a parent→children index for 1000+-frame pages (which don’t exist in practice).

Fields§

§nodes: Vec<FrameNode>

Implementations§

Source§

impl FrameGraph

Source

pub async fn snapshot(page: &Page) -> Result<Self>

Build a graph from the current state of page.

Structure (parent links + depth + every frame’s URL) comes from a single browsingContext.getTree round-trip via Page::frame_tree, so the real cross-origin nesting is preserved, the old page.frames() path returned a flat id list and forced every node to parent: root, depth: 1, collapsing reCAPTCHA’s bframe-inside-anchor (and every other nested challenge) into siblings and defeating the graph’s whole purpose.

Each node is then enriched with title + has_captcha_marker by evaluating [PROBE_JS] inside that frame’s own realm, the same selector list oracle::take_snapshot uses, so the two passes stay in sync. A frame whose probe eval fails (raced destruction, restricted realm) is not dropped: it keeps its structural place with the URL getTree reported, and the failure is logged at warn, never silently swallowed (which the old path did, making cross-origin captcha frames vanish from the graph entirely).

Source

pub fn any_captcha_marker(&self) -> bool

True iff the graph has any node with has_captcha_marker. Cheap pre-check before more expensive walks.

Source

pub fn children(&self, parent_idx: usize) -> Vec<usize>

Indices of all child nodes of parent_idx.

Linear scan; acceptable for typical tree sizes (<50 nodes). If we ever ship a graph with hundreds of nodes, replace with a precomputed parent→children index.

Source

pub fn bfs(&self) -> Vec<usize>

BFS from the root, returning node indices in visit order.

Handy for “do this thing in every frame, top-down” without open-coding the queue management at every call site.

Source

pub fn deepest_captcha(&self) -> Option<usize>

Find the deepest node that has a captcha marker. Returns None when no node carries one.

Useful for “walk OUTWARD from the captcha to find the nearest enclosing token field”, once you have the captcha node, traverse parent links upward until the token shows up.

Source

pub fn ancestors_inclusive(&self, node_idx: usize) -> Vec<usize>

All node indices on the path from node_idx up to the root, inclusive of both endpoints. Empty when node_idx is OOB.

Use this when a captcha solve produces a token in a deeply- nested iframe and you need to relay it up the tree via postMessage: the path is the relay route.

Source

pub fn frames_by_host(&self) -> HashMap<String, Vec<usize>>

Group nodes by URL host, returning a map host → indices.

Lets a solver target “all cross-origin frames hosted by challenges.cloudflare.com” in one query, e.g. to pierce the CF Turnstile sandbox.

Trait Implementations§

Source§

impl Clone for FrameGraph

Source§

fn clone(&self) -> FrameGraph

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FrameGraph

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FrameGraph

Source§

fn default() -> FrameGraph

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more