feat(url): classify about srcdoc URLs precisely

This commit is contained in:
ldm0
2026-10-10 18:35:52 +08:00
committed by Donough Liu
parent 55159e2669
commit 0ebd7fa9d6
2 changed files with 30 additions and 0 deletions
+2
View File
@@ -2,6 +2,8 @@ pub mod components;
pub mod origin;
pub mod search_params;
pub use origin::is_about_srcdoc;
pub use origin::{
WebOrigin, is_about_blank, is_opaque_origin, is_potentially_trustworthy_url,
origin_ascii_serialization, origin_ascii_serialization_with_about_blank_inheritance,
+28
View File
@@ -137,6 +137,15 @@ pub fn is_about_blank(url: &Url) -> bool {
url.scheme() == "about" && url.path().eq_ignore_ascii_case("blank")
}
pub fn is_about_srcdoc(url: &Url) -> bool {
url.scheme() == "about"
&& url.path() == "srcdoc"
&& url.query().is_none()
&& url.username().is_empty()
&& url.password().is_none()
&& url.host().is_none()
}
pub fn is_potentially_trustworthy_url(url: &Url) -> bool {
if url.scheme() == "blob" {
return tuple_origin_url(url)
@@ -176,6 +185,25 @@ pub fn origin_ascii_serialization_with_about_blank_inheritance(
mod tests {
use super::*;
#[test]
fn about_srcdoc_matches_fragments_but_not_queries_or_authorities() {
for input in ["about:srcdoc", "ABOUT:srcdoc", "about:srcdoc#section"] {
assert!(is_about_srcdoc(&url(input)), "{input}");
}
for input in [
"about:srcdoc?",
"about:srcdoc?query#section",
"about:SRCDOC",
"about:/srcdoc",
"about://host/srcdoc",
"about://user:password@host/srcdoc",
"about:blank#srcdoc",
"https://example.test/srcdoc",
] {
assert!(!is_about_srcdoc(&url(input)), "{input}");
}
}
fn url(input: &str) -> Url {
Url::parse(input).unwrap()
}