|
|
@ -29,10 +29,10 @@ pub fn get_parent_node(node: &Handle) -> Handle {
|
|
|
|
parent.and_then(|node| node.upgrade()).unwrap()
|
|
|
|
parent.and_then(|node| node.upgrade()).unwrap()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn get_node_name(node: &Handle) -> String {
|
|
|
|
pub fn get_node_name(node: &Handle) -> &'_ str {
|
|
|
|
match &node.data {
|
|
|
|
match &node.data {
|
|
|
|
NodeData::Element { ref name, .. } => name.local.as_ref().to_string(),
|
|
|
|
NodeData::Element { ref name, .. } => name.local.as_ref(),
|
|
|
|
_ => str!(),
|
|
|
|
_ => "",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -95,10 +95,10 @@ pub fn walk_and_embed_assets(
|
|
|
|
|
|
|
|
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
if &attr.name.local == "rel" {
|
|
|
|
if &attr.name.local == "rel" {
|
|
|
|
if is_icon(&attr.value.to_string()) {
|
|
|
|
if is_icon(attr.value.as_ref()) {
|
|
|
|
link_type = "icon";
|
|
|
|
link_type = "icon";
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
} else if attr.value.to_string() == "stylesheet" {
|
|
|
|
} else if attr.value.as_ref() == "stylesheet" {
|
|
|
|
link_type = "stylesheet";
|
|
|
|
link_type = "stylesheet";
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -111,8 +111,8 @@ pub fn walk_and_embed_assets(
|
|
|
|
if opt_no_images {
|
|
|
|
if opt_no_images {
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
let href_full_url = resolve_url(&url, &attr.value.to_string())
|
|
|
|
let href_full_url =
|
|
|
|
.unwrap_or_default();
|
|
|
|
resolve_url(&url, attr.value.as_ref()).unwrap_or_default();
|
|
|
|
let (favicon_dataurl, _) = retrieve_asset(
|
|
|
|
let (favicon_dataurl, _) = retrieve_asset(
|
|
|
|
cache,
|
|
|
|
cache,
|
|
|
|
client,
|
|
|
|
client,
|
|
|
@ -133,8 +133,8 @@ pub fn walk_and_embed_assets(
|
|
|
|
if opt_no_css {
|
|
|
|
if opt_no_css {
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
let href_full_url = resolve_url(&url, &attr.value.to_string())
|
|
|
|
let href_full_url =
|
|
|
|
.unwrap_or_default();
|
|
|
|
resolve_url(&url, &attr.value.as_ref()).unwrap_or_default();
|
|
|
|
let replacement_text = match retrieve_asset(
|
|
|
|
let replacement_text = match retrieve_asset(
|
|
|
|
cache,
|
|
|
|
cache,
|
|
|
|
client,
|
|
|
|
client,
|
|
|
@ -172,7 +172,7 @@ pub fn walk_and_embed_assets(
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
if &attr.name.local == "href" {
|
|
|
|
if &attr.name.local == "href" {
|
|
|
|
let href_full_url =
|
|
|
|
let href_full_url =
|
|
|
|
resolve_url(&url, &attr.value.to_string()).unwrap_or_default();
|
|
|
|
resolve_url(&url, attr.value.as_ref()).unwrap_or_default();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.push_slice(&href_full_url.as_str());
|
|
|
|
attr.value.push_slice(&href_full_url.as_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -230,8 +230,8 @@ pub fn walk_and_embed_assets(
|
|
|
|
let attr_name: &str = &attr.name.local;
|
|
|
|
let attr_name: &str = &attr.name.local;
|
|
|
|
|
|
|
|
|
|
|
|
if attr_name == "src" {
|
|
|
|
if attr_name == "src" {
|
|
|
|
let src_full_url: String = resolve_url(&url, &attr.value.to_string())
|
|
|
|
let src_full_url: String = resolve_url(&url, attr.value.as_ref())
|
|
|
|
.unwrap_or(attr.value.to_string());
|
|
|
|
.unwrap_or_else(|_| attr.value.to_string());
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.push_slice(src_full_url.as_str());
|
|
|
|
attr.value.push_slice(src_full_url.as_str());
|
|
|
|
} else if attr_name == "srcset" {
|
|
|
|
} else if attr_name == "srcset" {
|
|
|
@ -241,8 +241,7 @@ pub fn walk_and_embed_assets(
|
|
|
|
attr.value.push_slice(TRANSPARENT_PIXEL);
|
|
|
|
attr.value.push_slice(TRANSPARENT_PIXEL);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
let srcset_full_url: String =
|
|
|
|
let srcset_full_url: String =
|
|
|
|
resolve_url(&url, &attr.value.to_string())
|
|
|
|
resolve_url(&url, attr.value.as_ref()).unwrap_or_default();
|
|
|
|
.unwrap_or_default();
|
|
|
|
|
|
|
|
let (source_dataurl, _) = retrieve_asset(
|
|
|
|
let (source_dataurl, _) = retrieve_asset(
|
|
|
|
cache,
|
|
|
|
cache,
|
|
|
|
client,
|
|
|
|
client,
|
|
|
@ -268,7 +267,7 @@ pub fn walk_and_embed_assets(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let href_full_url: String =
|
|
|
|
let href_full_url: String =
|
|
|
|
resolve_url(&url, &attr.value.to_string()).unwrap_or_default();
|
|
|
|
resolve_url(&url, attr.value.as_ref()).unwrap_or_default();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.push_slice(href_full_url.as_str());
|
|
|
|
attr.value.push_slice(href_full_url.as_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -297,8 +296,8 @@ pub fn walk_and_embed_assets(
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
if &attr.name.local == "src" {
|
|
|
|
if &attr.name.local == "src" {
|
|
|
|
let src_full_url: String =
|
|
|
|
let src_full_url =
|
|
|
|
resolve_url(&url, &attr.value.to_string()).unwrap_or_default();
|
|
|
|
resolve_url(&url, attr.value.as_ref()).unwrap_or_default();
|
|
|
|
let (js_dataurl, _) = retrieve_asset(
|
|
|
|
let (js_dataurl, _) = retrieve_asset(
|
|
|
|
cache,
|
|
|
|
cache,
|
|
|
|
client,
|
|
|
|
client,
|
|
|
@ -342,8 +341,8 @@ pub fn walk_and_embed_assets(
|
|
|
|
if &attr.name.local == "action" {
|
|
|
|
if &attr.name.local == "action" {
|
|
|
|
// Modify action to be a full URL
|
|
|
|
// Modify action to be a full URL
|
|
|
|
if !is_valid_url(&attr.value) {
|
|
|
|
if !is_valid_url(&attr.value) {
|
|
|
|
let href_full_url: String =
|
|
|
|
let href_full_url =
|
|
|
|
resolve_url(&url, &attr.value.to_string()).unwrap_or_default();
|
|
|
|
resolve_url(&url, attr.value.as_ref()).unwrap_or_default();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.push_slice(href_full_url.as_str());
|
|
|
|
attr.value.push_slice(href_full_url.as_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -359,15 +358,14 @@ pub fn walk_and_embed_assets(
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let iframe_src: String = attr.value.to_string();
|
|
|
|
let iframe_src = attr.value.as_ref();
|
|
|
|
|
|
|
|
|
|
|
|
// Ignore iframes with empty source (they cause infinite loops)
|
|
|
|
// Ignore iframes with empty source (they cause infinite loops)
|
|
|
|
if iframe_src == str!() {
|
|
|
|
if iframe_src.is_empty() {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let src_full_url: String =
|
|
|
|
let src_full_url = resolve_url(&url, iframe_src).unwrap_or_default();
|
|
|
|
resolve_url(&url, &iframe_src).unwrap_or_default();
|
|
|
|
|
|
|
|
let (iframe_data, iframe_final_url) = retrieve_asset(
|
|
|
|
let (iframe_data, iframe_final_url) = retrieve_asset(
|
|
|
|
cache,
|
|
|
|
cache,
|
|
|
|
client,
|
|
|
|
client,
|
|
|
@ -400,10 +398,10 @@ pub fn walk_and_embed_assets(
|
|
|
|
"video" => {
|
|
|
|
"video" => {
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
for attr in attrs_mut.iter_mut() {
|
|
|
|
if &attr.name.local == "poster" {
|
|
|
|
if &attr.name.local == "poster" {
|
|
|
|
let video_poster = attr.value.to_string();
|
|
|
|
let video_poster = attr.value.as_ref();
|
|
|
|
|
|
|
|
|
|
|
|
// Skip posters with empty source
|
|
|
|
// Skip posters with empty source
|
|
|
|
if video_poster == str!() {
|
|
|
|
if video_poster.is_empty() {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -411,7 +409,7 @@ pub fn walk_and_embed_assets(
|
|
|
|
attr.value.clear();
|
|
|
|
attr.value.clear();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
let poster_full_url =
|
|
|
|
let poster_full_url =
|
|
|
|
resolve_url(&url, &video_poster).unwrap_or_default();
|
|
|
|
resolve_url(&url, video_poster).unwrap_or_default();
|
|
|
|
let (poster_dataurl, _) = retrieve_asset(
|
|
|
|
let (poster_dataurl, _) = retrieve_asset(
|
|
|
|
cache,
|
|
|
|
cache,
|
|
|
|
client,
|
|
|
|
client,
|
|
|
@ -556,7 +554,6 @@ pub fn stringify_document(
|
|
|
|
if opt_no_images {
|
|
|
|
if opt_no_images {
|
|
|
|
content_attr += " img-src data:;";
|
|
|
|
content_attr += " img-src data:;";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
content_attr = content_attr.trim().to_string();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let meta = dom.create_element(
|
|
|
|
let meta = dom.create_element(
|
|
|
|
QualName::new(None, ns!(), local_name!("meta")),
|
|
|
|
QualName::new(None, ns!(), local_name!("meta")),
|
|
|
@ -567,7 +564,7 @@ pub fn stringify_document(
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Attribute {
|
|
|
|
Attribute {
|
|
|
|
name: QualName::new(None, ns!(), local_name!("content")),
|
|
|
|
name: QualName::new(None, ns!(), local_name!("content")),
|
|
|
|
value: format_tendril!("{}", content_attr),
|
|
|
|
value: format_tendril!("{}", content_attr.trim()),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
|
|
|
Default::default(),
|
|
|
|
Default::default(),
|
|
|
|