///|
/// Handle browsingContext.close.
fn BidiProtocol::handle_browsing_context_close(
self : BidiProtocol,
request : BidiRequest,
) -> Result[Unit, String] {
match get_param_raw(request.params, "context") {
Some(String(ctx_id)) => {
let prompt_unload = match get_param_raw(request.params, "promptUnload") {
Some(True) => true
Some(False) => false
Some(Null) => false
Some(_) => {
self.send_error(
request.id,
"invalid argument",
"promptUnload must be a boolean",
)
return Ok(())
}
None => false
}
if !self.manager.has_session(ctx_id) {
self.send_error(
request.id,
"no such frame",
"Unknown context: " + ctx_id,
)
return Ok(())
}
if self.context_parent.contains(ctx_id) {
self.send_error(
request.id,
"invalid argument",
"context must be top-level",
)
return Ok(())
}
if prompt_unload && self.has_beforeunload_prompt_in_scope(ctx_id) {
let handler = self.resolve_unhandled_prompt_handler(
ctx_id, "beforeunload",
)
self.clear_pending_prompt_state(ctx_id)
self.pending_prompt_type[ctx_id] = "beforeunload"
self.pending_close_request[ctx_id] = request.id
self.emit_user_prompt_opened(
ctx_id,
"beforeunload",
handler,
"beforeunload",
None,
)
return Ok(())
}
// Send response BEFORE events (BiDi protocol requirement)
self.send_success(request.id, Some(make_object({})))
self.close_context_and_cleanup(ctx_id, true) |> ignore
Ok(())
}
Some(_) => {
self.send_error(
request.id,
"invalid argument",
"context must be a string",
)
Ok(())
}
None => {
self.send_error(request.id, "invalid argument", "Missing context")
Ok(())
}
}
}