///|
/// Handle browsingContext.reload.
fn BidiProtocol::handle_browsing_context_reload(
self : BidiProtocol,
request : BidiRequest,
) -> Result[Unit, String] {
let ctx_id = match get_param_raw(request.params, "context") {
Some(String(value)) => value
Some(_) => {
self.send_error(
request.id,
"invalid argument",
"context must be a string",
)
return Ok(())
}
None => {
self.send_error(request.id, "invalid argument", "Missing context")
return Ok(())
}
}
let ignore_cache_raw = match get_param_raw(request.params, "ignoreCache") {
Some(value) => Some(value)
None => get_param_raw(request.params, "ignore_cache")
}
let _ignore_cache = match ignore_cache_raw {
Some(True) => true
Some(False) => false
Some(_) => {
self.send_error(
request.id,
"invalid argument",
"ignoreCache must be a boolean",
)
return Ok(())
}
None => false
}
let wait_mode = match get_param_raw(request.params, "wait") {
Some(String(value)) =>
if value == "none" || value == "interactive" || value == "complete" {
value
} else {
self.send_error(
request.id,
"invalid argument",
"wait must be one of none, interactive, or complete",
)
return Ok(())
}
Some(_) => {
self.send_error(request.id, "invalid argument", "wait must be a string")
return Ok(())
}
None => "none"
}
if !self.manager.has_session(ctx_id) {
self.send_error(request.id, "no such frame", "Unknown context: " + ctx_id)
return Ok(())
}
self.input_synthetic_events_by_context.remove(ctx_id)
self.context_synthetic_scrolled.remove(ctx_id)
self.clear_synthetic_location_href(ctx_id)
let _ = self.fail_in_flight_navigation(
ctx_id, "aborted", "Navigation interrupted by reload",
)
match self.manager.get_session(ctx_id) {
Some(session) => {
let url = session.get_url()
if self.has_beforeunload_prompt_in_scope(ctx_id) {
let handler = self.resolve_unhandled_prompt_handler(
ctx_id, "beforeunload",
)
let nav_id = self.next_navigation_id.to_string()
self.next_navigation_id += 1
self.clear_pending_prompt_state(ctx_id)
self.pending_prompt_type[ctx_id] = "beforeunload"
self.pending_beforeunload_request[ctx_id] = request.id
self.pending_beforeunload_url[ctx_id] = url
self.pending_beforeunload_requested_url[ctx_id] = self.requested_navigation_url(
ctx_id,
)
self.pending_beforeunload_wait[ctx_id] = wait_mode
self.pending_beforeunload_navigation[ctx_id] = nav_id
self.emit_navigation_started_event(ctx_id, url, nav_id)
self.emit_user_prompt_opened(
ctx_id,
"beforeunload",
handler,
"beforeunload",
None,
)
return Ok(())
}
self.complete_navigation_request_with_wait(
request.id,
ctx_id,
url,
wait_mode,
)
Ok(())
}
None => {
self.send_error(request.id, "no such frame", "Unknown context: " + ctx_id)
Ok(())
}
}
}