///|
/// Emit navigationStarted event for the given context.
fn BidiProtocol::emit_navigation_started_event(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
) -> Unit {
let event_name = "browsingContext.navigationStarted"
if !self.is_subscribed_for_context(event_name, ctx_id) {
return
}
self.context_last_started_navigation[ctx_id] = navigation_id
let params = make_object({
"context": Json::string(ctx_id),
"navigation": Json::string(navigation_id),
"url": Json::string(url),
"timestamp": Json::number(input_now_ms()),
})
self.outbox.push(Event({ event_method: event_name, params }))
}
///|
/// Emit navigationCommitted event for the given context.
fn BidiProtocol::emit_navigation_committed_event(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
) -> Unit {
let event_name = "browsingContext.navigationCommitted"
if !self.is_subscribed_for_context(event_name, ctx_id) {
return
}
let params = make_object({
"context": Json::string(ctx_id),
"navigation": Json::string(navigation_id),
"url": Json::string(url),
"timestamp": Json::number(input_now_ms()),
})
self.outbox.push(Event({ event_method: event_name, params }))
}
///|
/// Emit navigationFailed event for the given context.
fn BidiProtocol::emit_navigation_failed_event(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
) -> Unit {
let event_name = "browsingContext.navigationFailed"
if !self.is_subscribed_for_context(event_name, ctx_id) {
return
}
let params = make_object({
"context": Json::string(ctx_id),
"navigation": Json::string(navigation_id),
"url": Json::string(url),
"timestamp": Json::number(input_now_ms()),
})
self.outbox.push(Event({ event_method: event_name, params }))
}
///|
/// Emit navigationAborted event for the given context.
fn BidiProtocol::emit_navigation_aborted_event(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
) -> Unit {
let event_name = "browsingContext.navigationAborted"
if !self.is_subscribed_for_context(event_name, ctx_id) {
return
}
let params = make_object({
"context": Json::string(ctx_id),
"navigation": Json::string(navigation_id),
"url": Json::string(url),
"timestamp": Json::number(input_now_ms()),
})
self.outbox.push(Event({ event_method: event_name, params }))
}
///|
/// Emit domContentLoaded/load/historyUpdated for a committed navigation.
fn BidiProtocol::emit_navigation_lifecycle_events(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
) -> Unit {
let timestamp = input_now_ms()
let base = make_object({
"context": Json::string(ctx_id),
"navigation": Json::string(navigation_id),
"url": Json::string(url),
"timestamp": Json::number(timestamp),
})
// Emit domContentLoaded
if self.is_subscribed_for_context("browsingContext.domContentLoaded", ctx_id) {
self.outbox.push(
Event({ event_method: "browsingContext.domContentLoaded", params: base }),
)
}
// Emit load
if self.is_subscribed_for_context("browsingContext.load", ctx_id) {
self.outbox.push(
Event({ event_method: "browsingContext.load", params: base }),
)
}
// Emit historyUpdated
let history = make_object({
"context": Json::string(ctx_id),
"url": Json::string(url),
"timestamp": Json::number(timestamp),
})
if self.is_subscribed_for_context("browsingContext.historyUpdated", ctx_id) {
self.outbox.push(
Event({ event_method: "browsingContext.historyUpdated", params: history }),
)
}
}
///|
/// Emit basic navigation events.
fn BidiProtocol::emit_navigation_events(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
) -> Unit {
self.emit_navigation_events_internal(ctx_id, url, navigation_id, true)
}
///|
/// Emit basic navigation events, optionally excluding dom/load/history lifecycle.
fn BidiProtocol::emit_navigation_events_internal(
self : BidiProtocol,
ctx_id : String,
url : String,
navigation_id : String,
emit_lifecycle : Bool,
) -> Unit {
let committed_url = resolve_navigation_committed_url(url)
self.emit_navigation_started_event(ctx_id, url, navigation_id)
self.emit_navigation_committed_event(ctx_id, committed_url, navigation_id)
if emit_lifecycle {
self.emit_navigation_lifecycle_events(ctx_id, url, navigation_id)
}
match resolve_http_equiv_redirect_url(url) {
Some(redirected_url) => {
let redirected_nav_id = self.next_navigation_id.to_string()
self.next_navigation_id += 1
self.emit_navigation_started_event(
ctx_id, redirected_url, redirected_nav_id,
)
self.emit_navigation_committed_event(
ctx_id, redirected_url, redirected_nav_id,
)
if emit_lifecycle {
self.emit_navigation_lifecycle_events(
ctx_id, redirected_url, redirected_nav_id,
)
}
}
None => ()
}
match resolve_inline_script_redirect_url(url) {
Some(redirected_url) => {
self.emit_navigation_aborted_event(ctx_id, url, navigation_id)
let redirected_nav_id = self.next_navigation_id.to_string()
self.next_navigation_id += 1
self.emit_navigation_started_event(
ctx_id, redirected_url, redirected_nav_id,
)
self.emit_navigation_committed_event(
ctx_id,
resolve_navigation_committed_url(redirected_url),
redirected_nav_id,
)
if emit_lifecycle {
self.emit_navigation_lifecycle_events(
ctx_id, redirected_url, redirected_nav_id,
)
}
}
None => ()
}
}