From bb623ffe8c771263595fb8fc5c4171bcd7cd4e4a Mon Sep 17 00:00:00 2001 From: Herrtian <70463940+Herrtian@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:36:21 +0200 Subject: [PATCH 1/2] fix: keep release descriptions from expanding on hover --- crates/bin/docs_rs_web/templates/core/home.html | 3 ++- .../bin/docs_rs_web/templates/releases/releases.html | 9 ++++++--- crates/bin/docs_rs_web/templates/style/style.scss | 7 ------- gui-tests/long-crate-description.goml | 12 ++++++++++++ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/crates/bin/docs_rs_web/templates/core/home.html b/crates/bin/docs_rs_web/templates/core/home.html index 5ddc6dae97..e889246799 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..26684a311d 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| + From 8a685205936a88837c7686cce83d90af58e5e5f6 Mon Sep 17 00:00:00 2001 From: Herrtian <70463940+Herrtian@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:57:25 +0200 Subject: [PATCH 2/2] Escape release description tooltips --- .../bin/docs_rs_web/src/handlers/releases.rs | 29 +++++++++++++++++++ .../bin/docs_rs_web/templates/core/home.html | 2 +- .../templates/releases/releases.html | 4 +-- 3 files changed, 32 insertions(+), 3 deletions(-) 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 e889246799..32014cb0c8 100644 --- a/crates/bin/docs_rs_web/templates/core/home.html +++ b/crates/bin/docs_rs_web/templates/core/home.html @@ -58,7 +58,7 @@

{{ crate::icons::IconCubes.render_solid(false, false, "") }} D {{- release.name }}-{{ release.version -}}

+ title="{{ release.description.as_deref().unwrap_or_default()|escape }}"> {{- 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 26684a311d..00a787ffc3 100644 --- a/crates/bin/docs_rs_web/templates/releases/releases.html +++ b/crates/bin/docs_rs_web/templates/releases/releases.html @@ -48,7 +48,7 @@
+ title="{{ release.description|escape }}"> {{- release.description -}}
@@ -84,7 +84,7 @@ {#- -#}
+ title="{{ release.description.as_deref().unwrap_or_default()|escape }}"> {{- release.description.as_deref().unwrap_or_default() -}}