diff --git a/crates/bin/docs_rs_web/src/handlers/releases.rs b/crates/bin/docs_rs_web/src/handlers/releases.rs
index 3935b3e2a2..f0c947b03b 100644
--- a/crates/bin/docs_rs_web/src/handlers/releases.rs
+++ b/crates/bin/docs_rs_web/src/handlers/releases.rs
@@ -827,6 +827,7 @@ pub(crate) async fn build_queue_handler(
#[cfg(test)]
mod tests {
use super::*;
+ use crate::page::web_page::AddCspNonce;
use crate::testing::{
AxumResponseTestExt, AxumRouterTestExt, TestEnvironment, TestEnvironmentExt as _,
async_wrapper,
@@ -2026,6 +2027,34 @@ mod tests {
});
}
+ #[test]
+ fn home_page_description_title_escapes_quotes() {
+ let description = r#"A "quoted" crate description"#;
+ let mut page = HomePage {
+ recent_releases: vec![Release {
+ name: FOO,
+ version: V1,
+ description: Some(description.into()),
+ target_name: None,
+ rustdoc_status: true,
+ build_time: None,
+ stars: 0,
+ has_unyanked_releases: Some(true),
+ }],
+ };
+
+ let html =
+ kuchikiki::parse_html().one(page.render_with_csp_nonce("test-nonce".into()).unwrap());
+ let description_element = html
+ .select_first(".recent-releases-container .description")
+ .expect("missing release description");
+
+ assert_eq!(
+ description_element.attributes.borrow().get("title"),
+ Some(description),
+ );
+ }
+
#[test]
fn home_page_links() {
async_wrapper(|env| async move {
diff --git a/crates/bin/docs_rs_web/templates/core/home.html b/crates/bin/docs_rs_web/templates/core/home.html
index 5ddc6dae97..32014cb0c8 100644
--- a/crates/bin/docs_rs_web/templates/core/home.html
+++ b/crates/bin/docs_rs_web/templates/core/home.html
@@ -57,7 +57,8 @@
{{ crate::icons::IconCubes.render_solid(false, false, "") }} D
{{- release.name }}-{{ release.version -}}
-
+
{{- release.description.as_deref().unwrap_or_default() -}}
diff --git a/crates/bin/docs_rs_web/templates/releases/releases.html b/crates/bin/docs_rs_web/templates/releases/releases.html
index 7746e79f95..00a787ffc3 100644
--- a/crates/bin/docs_rs_web/templates/releases/releases.html
+++ b/crates/bin/docs_rs_web/templates/releases/releases.html
@@ -36,7 +36,8 @@
{{ name }}
-
Documentation not available on docs.rs
+
Documentation not available on docs.rs
{%- when ReleaseStatus::External(release) -%}
@@ -46,7 +47,8 @@
{{- release.name -}}
-
+
{{- release.description -}}
@@ -81,7 +83,8 @@
{%- endif -%}
{#- -#}
-
+
{{- release.description.as_deref().unwrap_or_default() -}}
diff --git a/crates/bin/docs_rs_web/templates/style/style.scss b/crates/bin/docs_rs_web/templates/style/style.scss
index 036de8b82b..e011b31f75 100644
--- a/crates/bin/docs_rs_web/templates/style/style.scss
+++ b/crates/bin/docs_rs_web/templates/style/style.scss
@@ -389,13 +389,6 @@ div.recent-releases-container {
}
}
- .description:hover {
- @media #{$media-sm} {
- overflow: visible;
- white-space: normal;
- }
- }
-
.date,
.duration,
.memory {
diff --git a/gui-tests/long-crate-description.goml b/gui-tests/long-crate-description.goml
index 2cfb0fee15..99fe223dff 100644
--- a/gui-tests/long-crate-description.goml
+++ b/gui-tests/long-crate-description.goml
@@ -16,3 +16,15 @@ store-property: (|description_selector|, {"scrollWidth": description_width})
// It should be smaller due to padding, but if it overflows it'll be wider than the screen anyway.
assert-false: |description_width| > |screen_width|
+// Desktop release descriptions are truncated, but hovering them should not change
+// the row height and make the release list jump around.
+set-window-size: (1200, 800)
+store-value: (release_selector, "div.recent-releases-container a.release")
+set-text: (|description_selector|, "A very long crate description that should remain on one line when hovered instead of expanding and moving nearby release rows")
+
+store-property: (|release_selector|, {"clientHeight": release_height})
+move-cursor-to: |description_selector|
+store-property: (|release_selector|, {"clientHeight": release_height_after_hover})
+
+assert: |release_height_after_hover| == |release_height|
+