Merge pull request #130 from snshn/body-background

Account for legacy BODY background="" attribute
This commit is contained in:
Sunshine 2020-03-05 08:32:06 -05:00 committed by GitHub
commit 808ce3e722
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 80 additions and 6 deletions

View file

@ -207,16 +207,54 @@ pub fn walk_and_embed_assets(
} }
} }
} }
"body" => {
// Find and remove background attribute(s), keep reference to the last one
let mut found_background: Option<Attribute> = None;
let mut i = 0;
while i < attrs_mut.len() {
let attr_name = attrs_mut[i].name.local.as_ref();
if attr_name.eq_ignore_ascii_case("background") {
found_background = Some(attrs_mut.remove(i));
} else {
i += 1;
}
}
if !opt_no_images {
if let Some((data_url, _)) = found_background
.iter()
.map(|attr| attr.value.trim())
.filter(|background| !background.is_empty()) // Skip if empty
.next()
.and_then(|background| resolve_url(&url, background).ok()) // Make absolute
.and_then(|abs_src| // Download and convert to data_url
retrieve_asset(
cache,
client,
&abs_src,
true,
"",
opt_silent,
).ok())
{
// Add new data_url background attribute
attrs_mut.push(Attribute {
name: QualName::new(None, ns!(), local_name!("background")),
value: Tendril::from_slice(data_url.as_ref()),
});
}
}
}
"img" => { "img" => {
// Find source tags // Find source attribute(s)
let mut found_src: Option<Attribute> = None; let mut found_src: Option<Attribute> = None;
let mut found_datasrc: Option<Attribute> = None; let mut found_datasrc: Option<Attribute> = None;
let mut i = 0; let mut i = 0;
while i < attrs_mut.len() { while i < attrs_mut.len() {
let name = attrs_mut[i].name.local.as_ref(); let attr_name = attrs_mut[i].name.local.as_ref();
if name.eq_ignore_ascii_case("src") { if attr_name.eq_ignore_ascii_case("src") {
found_src = Some(attrs_mut.remove(i)); found_src = Some(attrs_mut.remove(i));
} else if name.eq_ignore_ascii_case("data-src") { } else if attr_name.eq_ignore_ascii_case("data-src") {
found_datasrc = Some(attrs_mut.remove(i)); found_datasrc = Some(attrs_mut.remove(i));
} else { } else {
i += 1; i += 1;
@ -233,7 +271,7 @@ pub fn walk_and_embed_assets(
.iter() .iter()
.chain(&found_src) // Give data_url priority .chain(&found_src) // Give data_url priority
.map(|attr| attr.value.trim()) .map(|attr| attr.value.trim())
.filter(|src| !src.is_empty()) // Ignore empty srcs .filter(|src| !src.is_empty()) // Skip if empty
.next() .next()
.and_then(|src| resolve_url(&url, src).ok()) // Make absolute .and_then(|src| resolve_url(&url, src).ok()) // Make absolute
.and_then(|abs_src| // Download and convert to data_url .and_then(|abs_src| // Download and convert to data_url
@ -246,7 +284,7 @@ pub fn walk_and_embed_assets(
opt_silent, opt_silent,
).ok()) ).ok())
{ {
// Add the new data_url src attribute // Add new data_url src attribute
attrs_mut.push(Attribute { attrs_mut.push(Attribute {
name: QualName::new(None, ns!(), local_name!("src")), name: QualName::new(None, ns!(), local_name!("src")),
value: Tendril::from_slice(data_url.as_ref()), value: Tendril::from_slice(data_url.as_ref()),

View file

@ -261,6 +261,42 @@ fn test_walk_and_embed_assets_no_images() {
); );
} }
#[test]
fn walk_and_embed_assets_no_body_background_images() {
let html = "<body background=\"no/such/image.png\" background=\"no/such/image2.png\"></body>";
let dom = html_to_dom(&html);
let url = "http://localhost";
let cache = &mut HashMap::new();
let opt_no_css: bool = false;
let opt_no_frames: bool = false;
let opt_no_js: bool = false;
let opt_no_images: bool = true;
let opt_silent = true;
let client = Client::new();
walk_and_embed_assets(
cache,
&client,
&url,
&dom.document,
opt_no_css,
opt_no_js,
opt_no_images,
opt_silent,
opt_no_frames,
);
let mut buf: Vec<u8> = Vec::new();
serialize(&mut buf, &dom.document, SerializeOpts::default()).unwrap();
assert_eq!(
buf.iter().map(|&c| c as char).collect::<String>(),
"<html><head></head><body></body></html>"
);
}
#[test] #[test]
fn test_walk_and_embed_assets_no_frames() { fn test_walk_and_embed_assets_no_frames() {
let html = "<frameset><frame src=\"http://trackbook.com\"></frameset>"; let html = "<frameset><frame src=\"http://trackbook.com\"></frameset>";