///|
/// Validate script target parameter
/// Returns Some(()) if error was sent, None if valid
fn BidiProtocol::validate_script_target(
self : BidiProtocol,
request_id : Int,
params : Json?,
) -> Unit? {
match get_param_raw(params, "target") {
None => {
self.send_error(request_id, "invalid argument", "Missing target")
return Some(())
}
Some(Object(target_map)) => {
// Check if context is specified
match target_map.get("context") {
Some(String(ctx_id)) =>
if !self.manager.has_session(ctx_id) {
self.send_error(
request_id,
"no such frame",
"Unknown context: " + ctx_id,
)
return Some(())
}
Some(Null)
| Some(True)
| Some(False)
| Some(Number(_))
| Some(Array(_))
| Some(Object(_)) => {
self.send_error(
request_id, "invalid argument", "target.context must be a string",
)
return Some(())
}
None => ()
}
// Check if realm is specified
match target_map.get("realm") {
Some(String(realm_id)) =>
if !self.realm_context.contains(realm_id) {
self.send_error(
request_id,
"no such frame",
"Unknown realm: " + realm_id,
)
return Some(())
}
Some(Null)
| Some(True)
| Some(False)
| Some(Number(_))
| Some(Array(_))
| Some(Object(_)) => {
self.send_error(
request_id, "invalid argument", "target.realm must be a string",
)
return Some(())
}
None => ()
}
// Target must have either context or realm
if target_map.get("context") is None && target_map.get("realm") is None {
self.send_error(
request_id, "invalid argument", "target must have either context or realm",
)
return Some(())
}
// Validate sandbox if present (must be string)
match target_map.get("sandbox") {
Some(String(_)) => ()
Some(Null) => () // null is allowed
Some(True)
| Some(False)
| Some(Number(_))
| Some(Array(_))
| Some(Object(_)) => {
self.send_error(
request_id, "invalid argument", "target.sandbox must be a string",
)
return Some(())
}
None => ()
}
}
Some(_) => {
self.send_error(
request_id, "invalid argument", "target must be an object",
)
return Some(())
}
}
None
}
///|
/// Resolve target context/realm pair from script target.
fn BidiProtocol::resolve_target_context_realm(
self : BidiProtocol,
params : Json?,
) -> (String, String) {
match get_param_raw(params, "target") {
Some(Object(target_map)) => {
let context_id = match target_map.get("context") {
Some(String(id)) => Some(id)
_ => None
}
let realm_id = match target_map.get("realm") {
Some(String(id)) => Some(id)
_ => None
}
let sandbox_name = match target_map.get("sandbox") {
Some(String(name)) => Some(name)
_ => None
}
match context_id {
Some(ctx_id) =>
match sandbox_name {
Some(name) =>
if name == "" {
(
ctx_id,
self.context_realm.get(ctx_id).unwrap_or("realm-" + ctx_id),
)
} else {
(ctx_id, self.get_or_create_sandbox_realm(ctx_id, name))
}
None =>
(
ctx_id,
self.context_realm.get(ctx_id).unwrap_or("realm-" + ctx_id),
)
}
None =>
match realm_id {
Some(realm) => {
let fallback_ctx = self.default_context_id.unwrap_or(
self.ensure_default_context(),
)
let resolved_ctx = self.realm_context
.get(realm)
.unwrap_or(fallback_ctx)
(resolved_ctx, realm)
}
None => {
let fallback_ctx = self.default_context_id.unwrap_or(
self.ensure_default_context(),
)
(
fallback_ctx,
self.context_realm
.get(fallback_ctx)
.unwrap_or("realm-" + fallback_ctx),
)
}
}
}
}
_ => {
let fallback_ctx = self.default_context_id.unwrap_or(
self.ensure_default_context(),
)
(
fallback_ctx,
self.context_realm.get(fallback_ctx).unwrap_or("realm-" + fallback_ctx),
)
}
}
}