Skip to content

Commit f146871

Browse files
committed
Generate url for ajax menu in html template
1 parent e486388 commit f146871

File tree

4 files changed

+45
-109
lines changed

4 files changed

+45
-109
lines changed

src/web/crate_details.rs

+23-43
Original file line numberDiff line numberDiff line change
@@ -1384,33 +1384,23 @@ mod tests {
13841384
platform_links
13851385
}
13861386

1387-
fn run_check_links_redir(
1388-
env: &TestEnvironment,
1389-
url_start: &str,
1390-
url_end: &str,
1391-
extra: &str,
1392-
should_contain_redirect: bool,
1393-
) {
1394-
let response = env
1395-
.frontend()
1396-
.get(&format!("{url_start}{url_end}"))
1397-
.send()
1398-
.unwrap();
1387+
fn run_check_links_redir(env: &TestEnvironment, url: &str, should_contain_redirect: bool) {
1388+
let response = env.frontend().get(url).send().unwrap();
13991389
assert!(response.status().is_success());
1400-
let list1 = check_links(response.text().unwrap(), false, should_contain_redirect);
1390+
let text = response.text().unwrap();
1391+
let list1 = check_links(text.clone(), false, should_contain_redirect);
1392+
14011393
// Same test with AJAX endpoint.
1402-
let (start, extra_name) = if url_start.starts_with("/crate/") {
1403-
("", "/crate")
1404-
} else {
1405-
("/crate", "")
1406-
};
1407-
let response = env
1408-
.frontend()
1409-
.get(&format!(
1410-
"{start}{url_start}/menus/platforms{extra_name}{url_end}{extra}"
1411-
))
1412-
.send()
1413-
.unwrap();
1394+
let platform_menu_url = kuchikiki::parse_html()
1395+
.one(text)
1396+
.select_first("#platforms")
1397+
.expect("invalid selector")
1398+
.attributes
1399+
.borrow()
1400+
.get("data-url")
1401+
.expect("data-url")
1402+
.to_string();
1403+
let response = env.frontend().get(&platform_menu_url).send().unwrap();
14141404
assert!(response.status().is_success());
14151405
assert_cache_control(&response, CachePolicy::ForeverInCdn, &env.config());
14161406
let list2 = check_links(response.text().unwrap(), true, should_contain_redirect);
@@ -1429,27 +1419,17 @@ mod tests {
14291419
.source_file("README.md", b"storage readme")
14301420
.create()?;
14311421

1432-
// FIXME: For some reason, there are target-redirects on non-AJAX lists on docs.rs
1433-
// crate pages other than the "default" one.
1434-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/features", "", false);
1435-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/builds", "", false);
1436-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/source/", "", false);
1437-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/source/README.md", "", false);
1422+
run_check_links_redir(env, "/crate/dummy/0.4.0/features", false);
1423+
run_check_links_redir(env, "/crate/dummy/0.4.0/builds", false);
1424+
run_check_links_redir(env, "/crate/dummy/0.4.0/source/", false);
1425+
run_check_links_redir(env, "/crate/dummy/0.4.0/source/README.md", false);
1426+
run_check_links_redir(env, "/crate/dummy/0.4.0", false);
14381427

1439-
run_check_links_redir(env, "/crate/dummy/0.4.0", "", "/", false);
1440-
run_check_links_redir(env, "/dummy/latest", "/dummy", "/", true);
1441-
run_check_links_redir(
1442-
env,
1443-
"/dummy/0.4.0",
1444-
"/x86_64-pc-windows-msvc/dummy",
1445-
"/",
1446-
true,
1447-
);
1428+
run_check_links_redir(env, "/dummy/latest/dummy", true);
1429+
run_check_links_redir(env, "/dummy/0.4.0/x86_64-pc-windows-msvc/dummy", true);
14481430
run_check_links_redir(
14491431
env,
1450-
"/dummy/0.4.0",
1451-
"/x86_64-pc-windows-msvc/dummy/struct.A.html",
1452-
"/",
1432+
"/dummy/0.4.0/x86_64-pc-windows-msvc/dummy/struct.A.html",
14531433
true,
14541434
);
14551435

src/web/routes.rs

+2-30
Original file line numberDiff line numberDiff line change
@@ -236,30 +236,6 @@ pub(super) fn build_axum_routes() -> AxumRouter {
236236
"/crate/:name/:version/source/*path",
237237
get_internal(super::source::source_browser_handler),
238238
)
239-
.route(
240-
"/crate/:name/:version/menus/platforms/crate/",
241-
get_internal(super::crate_details::get_all_platforms_root),
242-
)
243-
.route(
244-
"/crate/:name/:version/menus/platforms/crate/features",
245-
get_internal(super::crate_details::get_all_platforms_root),
246-
)
247-
.route(
248-
"/crate/:name/:version/menus/platforms/crate/builds",
249-
get_internal(super::crate_details::get_all_platforms_root),
250-
)
251-
.route(
252-
"/crate/:name/:version/menus/platforms/crate/builds/*path",
253-
get_internal(super::crate_details::get_all_platforms_root),
254-
)
255-
.route(
256-
"/crate/:name/:version/menus/platforms/crate/source/",
257-
get_internal(super::crate_details::get_all_platforms_root),
258-
)
259-
.route(
260-
"/crate/:name/:version/menus/platforms/crate/source/*path",
261-
get_internal(super::crate_details::get_all_platforms_root),
262-
)
263239
.route(
264240
"/crate/:name/:version/menus/platforms/:target",
265241
get_internal(super::crate_details::get_all_platforms),
@@ -269,12 +245,8 @@ pub(super) fn build_axum_routes() -> AxumRouter {
269245
get_internal(super::crate_details::get_all_platforms),
270246
)
271247
.route(
272-
"/crate/:name/:version/menus/platforms/",
273-
get_internal(super::crate_details::get_all_platforms),
274-
)
275-
.route(
276-
"/crate/:name/:version/menus/platforms/:target/",
277-
get_internal(super::crate_details::get_all_platforms),
248+
"/crate/:name/:version/menus/platforms",
249+
get_internal(super::crate_details::get_all_platforms_root),
278250
)
279251
.route(
280252
"/crate/:name/:version/menus/releases/:target",

static/menu.js

+11-34
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,28 @@ const updateMenuPositionForSubMenu = (currentMenuSupplier) => {
77

88
const loadedMenus = new Set();
99

10-
function loadAjaxMenu(menu, id, msg, path, extra) {
10+
async function loadAjaxMenu(menu, id, msg) {
1111
if (loadedMenus.has(id)) {
1212
return;
1313
}
1414
loadedMenus.add(id);
1515
if (!menu.querySelector(".rotate")) {
1616
return;
1717
}
18-
const releaseListElem = document.getElementById(id);
19-
if (!releaseListElem) {
18+
const listElem = document.getElementById(id);
19+
if (!listElem) {
2020
// We're not in a documentation page, so no need to do anything.
2121
return;
2222
}
23-
const parts = window.location.pathname.split("/");
24-
let crateName = parts[1];
25-
let version = parts[2];
26-
if (crateName === "crate") {
27-
crateName = parts[2];
28-
version = parts[3];
29-
path += "/crate";
23+
const metadata = JSON.parse(document.getElementById('crate-metadata').innerText);
24+
let url = listElem.dataset.url
25+
try {
26+
const response = await fetch(url);
27+
listElem.innerHTML = await response.text();
28+
} catch (ex) {
29+
console.error(`Failed to load ${msg}: ${ex}`)
30+
listElem.innerHTML = `Failed to load ${msg}`;
3031
}
31-
const xhttp = new XMLHttpRequest();
32-
xhttp.onreadystatechange = function() {
33-
if (xhttp.readyState !== XMLHttpRequest.DONE) {
34-
return;
35-
}
36-
if (xhttp.status === 200) {
37-
releaseListElem.innerHTML = xhttp.responseText;
38-
} else {
39-
console.error(`Failed to load ${msg}: [${xhttp.status}] ${xhttp.responseText}`);
40-
document.getElementById(id).innerHTML = `Failed to load ${msg}`;
41-
}
42-
};
43-
console.log(extra, path);
44-
xhttp.open("GET", `/crate/${crateName}/${version}/menus/${path}${extra}`, true);
45-
xhttp.send();
4632
};
4733

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

97-
const parts = window.location.pathname.split("/");
98-
const startFrom = parts[1] === "crate" ? 4 : 3;
99-
// We get everything except the first crate name and the version.
100-
const innerPath = "/" + parts.slice(startFrom).join("/")
101-
10283
if (newMenu.querySelector("#releases-list")) {
10384
loadAjaxMenu(
10485
newMenu,
10586
"releases-list",
10687
"release list",
107-
"releases",
108-
innerPath,
10988
);
11089

11190
} else if (newMenu.querySelector("#platforms")) {
11291
loadAjaxMenu(
11392
newMenu,
11493
"platforms",
11594
"platforms list",
116-
"platforms",
117-
innerPath,
11895
);
11996
}
12097
}

templates/rustdoc/topbar.html

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
{# The url of the current release, `/crate/:name/:version` #}
44
{%- set crate_url = "/crate/" ~ metadata.name ~ "/" ~ metadata.req_version -%}
5+
{%- if current_target -%}
6+
{%- set rest_menu_url = "/" ~ current_target ~ "/" ~ inner_path -%}
7+
{%- else -%}
8+
{%- set rest_menu_url = "" -%}
9+
{%- endif -%}
10+
{%- set platform_menu_url = crate_url ~ "/menus/platforms" ~ rest_menu_url -%}
11+
{%- set releases_menu_url = crate_url ~ "/menus/releases" ~ rest_menu_url -%}
512

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

139146
<li class="pure-menu-item">
140-
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1">
147+
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1" data-url="{{ releases_menu_url }}" >
141148
<span class="rotate">{{ "spinner" | fas }}</span>
142149
</div>
143150
</li>
@@ -211,7 +218,7 @@
211218
</a>
212219

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

0 commit comments

Comments
 (0)