Skip to content

Commit

Permalink
Generate url for ajax menu in html template
Browse files Browse the repository at this point in the history
  • Loading branch information
Nemo157 authored and syphar committed Mar 20, 2024
1 parent 588842e commit 1ee11ec
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 109 deletions.
66 changes: 23 additions & 43 deletions src/web/crate_details.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1503,33 +1503,23 @@ mod tests {
platform_links
}

fn run_check_links_redir(
env: &TestEnvironment,
url_start: &str,
url_end: &str,
extra: &str,
should_contain_redirect: bool,
) {
let response = env
.frontend()
.get(&format!("{url_start}{url_end}"))
.send()
.unwrap();
fn run_check_links_redir(env: &TestEnvironment, url: &str, should_contain_redirect: bool) {
let response = env.frontend().get(url).send().unwrap();
assert!(response.status().is_success());
let list1 = check_links(response.text().unwrap(), false, should_contain_redirect);
let text = response.text().unwrap();
let list1 = check_links(text.clone(), false, should_contain_redirect);

// Same test with AJAX endpoint.
let (start, extra_name) = if url_start.starts_with("/crate/") {
("", "/crate")
} else {
("/crate", "")
};
let response = env
.frontend()
.get(&format!(
"{start}{url_start}/menus/platforms{extra_name}{url_end}{extra}"
))
.send()
.unwrap();
let platform_menu_url = kuchikiki::parse_html()
.one(text)
.select_first("#platforms")
.expect("invalid selector")
.attributes
.borrow()
.get("data-url")
.expect("data-url")
.to_string();
let response = env.frontend().get(&platform_menu_url).send().unwrap();
assert!(response.status().is_success());
assert_cache_control(&response, CachePolicy::ForeverInCdn, &env.config());
let list2 = check_links(response.text().unwrap(), true, should_contain_redirect);
Expand All @@ -1548,27 +1538,17 @@ mod tests {
.source_file("README.md", b"storage readme")
.create()?;

// FIXME: For some reason, there are target-redirects on non-AJAX lists on docs.rs
// crate pages other than the "default" one.
run_check_links_redir(env, "/crate/dummy/0.4.0", "/features", "", false);
run_check_links_redir(env, "/crate/dummy/0.4.0", "/builds", "", false);
run_check_links_redir(env, "/crate/dummy/0.4.0", "/source/", "", false);
run_check_links_redir(env, "/crate/dummy/0.4.0", "/source/README.md", "", false);
run_check_links_redir(env, "/crate/dummy/0.4.0/features", false);
run_check_links_redir(env, "/crate/dummy/0.4.0/builds", false);
run_check_links_redir(env, "/crate/dummy/0.4.0/source/", false);
run_check_links_redir(env, "/crate/dummy/0.4.0/source/README.md", false);
run_check_links_redir(env, "/crate/dummy/0.4.0", false);

run_check_links_redir(env, "/crate/dummy/0.4.0", "", "/", false);
run_check_links_redir(env, "/dummy/latest", "/dummy", "/", true);
run_check_links_redir(
env,
"/dummy/0.4.0",
"/x86_64-pc-windows-msvc/dummy",
"/",
true,
);
run_check_links_redir(env, "/dummy/latest/dummy", true);
run_check_links_redir(env, "/dummy/0.4.0/x86_64-pc-windows-msvc/dummy", true);
run_check_links_redir(
env,
"/dummy/0.4.0",
"/x86_64-pc-windows-msvc/dummy/struct.A.html",
"/",
"/dummy/0.4.0/x86_64-pc-windows-msvc/dummy/struct.A.html",
true,
);

Expand Down
32 changes: 2 additions & 30 deletions src/web/routes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,30 +236,6 @@ pub(super) fn build_axum_routes() -> AxumRouter {
"/crate/:name/:version/source/*path",
get_internal(super::source::source_browser_handler),
)
.route(
"/crate/:name/:version/menus/platforms/crate/",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/platforms/crate/features",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/platforms/crate/builds",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/platforms/crate/builds/*path",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/platforms/crate/source/",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/platforms/crate/source/*path",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/platforms/:target",
get_internal(super::crate_details::get_all_platforms),
Expand All @@ -269,12 +245,8 @@ pub(super) fn build_axum_routes() -> AxumRouter {
get_internal(super::crate_details::get_all_platforms),
)
.route(
"/crate/:name/:version/menus/platforms/",
get_internal(super::crate_details::get_all_platforms),
)
.route(
"/crate/:name/:version/menus/platforms/:target/",
get_internal(super::crate_details::get_all_platforms),
"/crate/:name/:version/menus/platforms",
get_internal(super::crate_details::get_all_platforms_root),
)
.route(
"/crate/:name/:version/menus/releases/:target",
Expand Down
44 changes: 10 additions & 34 deletions static/menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,42 +7,27 @@ const updateMenuPositionForSubMenu = (currentMenuSupplier) => {

const loadedMenus = new Set();

function loadAjaxMenu(menu, id, msg, path, extra) {
async function loadAjaxMenu(menu, id, msg) {
if (loadedMenus.has(id)) {
return;
}
loadedMenus.add(id);
if (!menu.querySelector(".rotate")) {
return;
}
const releaseListElem = document.getElementById(id);
if (!releaseListElem) {
const listElem = document.getElementById(id);
if (!listElem) {
// We're not in a documentation page, so no need to do anything.
return;
}
const parts = window.location.pathname.split("/");
let crateName = parts[1];
let version = parts[2];
if (crateName === "crate") {
crateName = parts[2];
version = parts[3];
path += "/crate";
const url = listElem.dataset.url;
try {
const response = await fetch(url);
listElem.innerHTML = await response.text();
} catch (ex) {
console.error(`Failed to load ${msg}: ${ex}`)
listElem.innerHTML = `Failed to load ${msg}`;
}
const xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState !== XMLHttpRequest.DONE) {
return;
}
if (xhttp.status === 200) {
releaseListElem.innerHTML = xhttp.responseText;
} else {
console.error(`Failed to load ${msg}: [${xhttp.status}] ${xhttp.responseText}`);
document.getElementById(id).innerHTML = `Failed to load ${msg}`;
}
};
console.log(extra, path);
xhttp.open("GET", `/crate/${crateName}/${version}/menus/${path}${extra}`, true);
xhttp.send();
};

// Allow menus to be open and used by keyboard.
Expand Down Expand Up @@ -94,27 +79,18 @@ function loadAjaxMenu(menu, id, msg, path, extra) {
newMenu.className += " pure-menu-active";
backdrop.style.display = "block";

const parts = window.location.pathname.split("/");
const startFrom = parts[1] === "crate" ? 4 : 3;
// We get everything except the first crate name and the version.
const innerPath = "/" + parts.slice(startFrom).join("/")

if (newMenu.querySelector("#releases-list")) {
loadAjaxMenu(
newMenu,
"releases-list",
"release list",
"releases",
innerPath,
);

} else if (newMenu.querySelector("#platforms")) {
loadAjaxMenu(
newMenu,
"platforms",
"platforms list",
"platforms",
innerPath,
);
}
}
Expand Down
11 changes: 9 additions & 2 deletions templates/rustdoc/topbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

{# The url of the current release, `/crate/:name/:version` #}
{%- set crate_url = "/crate/" ~ metadata.name ~ "/" ~ metadata.req_version -%}
{%- if current_target -%}
{%- set rest_menu_url = "/" ~ current_target ~ "/" ~ inner_path -%}
{%- else -%}
{%- set rest_menu_url = "" -%}
{%- endif -%}
{%- set platform_menu_url = crate_url ~ "/menus/platforms" ~ rest_menu_url -%}
{%- set releases_menu_url = crate_url ~ "/menus/releases" ~ rest_menu_url -%}

{%- include "header/topbar_begin.html" -%}{#
extra whitespace unremovable, need to use html tags unaffacted by whitespace T_T
Expand Down Expand Up @@ -137,7 +144,7 @@
<li class="pure-menu-heading">Versions</li>

<li class="pure-menu-item">
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1">
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1" data-url="{{ releases_menu_url }}" >
<span class="rotate">{{ "spinner" | fas }}</span>
</div>
</li>
Expand Down Expand Up @@ -211,7 +218,7 @@
</a>

{# Build the dropdown list showing available targets #}
<ul class="pure-menu-children" id="platforms">
<ul class="pure-menu-children" id="platforms" data-url="{{ platform_menu_url }}" >
{%- if metadata.doc_targets|length < DEFAULT_MAX_TARGETS -%}
{%- include "rustdoc/platforms.html" -%}
{%- else -%}
Expand Down

0 comments on commit 1ee11ec

Please sign in to comment.