Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added loading of sitemap to filter instant loading requests #1668

Merged
merged 1 commit into from May 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 0 additions & 2 deletions material/assets/javascripts/bundle.193efd2f.min.js

This file was deleted.

1 change: 0 additions & 1 deletion material/assets/javascripts/bundle.193efd2f.min.js.map

This file was deleted.

2 changes: 2 additions & 0 deletions material/assets/javascripts/bundle.1fe7f735.min.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions material/assets/javascripts/bundle.1fe7f735.min.js.map

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions material/assets/manifest.json
@@ -1,6 +1,6 @@
{
"assets/javascripts/bundle.js": "assets/javascripts/bundle.193efd2f.min.js",
"assets/javascripts/bundle.js.map": "assets/javascripts/bundle.193efd2f.min.js.map",
"assets/javascripts/bundle.js": "assets/javascripts/bundle.1fe7f735.min.js",
"assets/javascripts/bundle.js.map": "assets/javascripts/bundle.1fe7f735.min.js.map",
"assets/javascripts/vendor.js": "assets/javascripts/vendor.8caa27b7.min.js",
"assets/javascripts/vendor.js.map": "assets/javascripts/vendor.8caa27b7.min.js.map",
"assets/javascripts/worker/search.js": "assets/javascripts/worker/search.37585f48.min.js",
Expand Down
2 changes: 1 addition & 1 deletion material/base.html
Expand Up @@ -179,7 +179,7 @@ <h1>{{ page.title | default(config.site_name, true)}}</h1>
</div>
{% block scripts %}
<script src="{{ 'assets/javascripts/vendor.8caa27b7.min.js' | url }}"></script>
<script src="{{ 'assets/javascripts/bundle.193efd2f.min.js' | url }}"></script>
<script src="{{ 'assets/javascripts/bundle.1fe7f735.min.js' | url }}"></script>
{%- set translations = {} -%}
{%- for key in [
"clipboard.copy",
Expand Down
2 changes: 1 addition & 1 deletion mkdocs.yml
Expand Up @@ -52,7 +52,7 @@ theme:
language: en
features:
- tabs
#- instant
- instant
palette:
primary: indigo
accent: indigo
Expand Down
27 changes: 24 additions & 3 deletions src/assets/javascripts/index.ts
Expand Up @@ -46,7 +46,8 @@ import {
take,
shareReplay,
pluck,
catchError
catchError,
map
} from "rxjs/operators"

import {
Expand Down Expand Up @@ -352,8 +353,28 @@ export function initialize(config: unknown) {
})

/* Enable instant loading, if not on file:// protocol */
if (config.features.includes("instant") && location.protocol !== "file:")
setupInstantLoading({ document$, location$, viewport$ })
if (config.features.includes("instant") && location.protocol !== "file:") {

/* Fetch sitemap and extract URL whitelist */
base$
.pipe(
switchMap(base => ajax({
url: `${base}/sitemap.xml`,
responseType: "document",
withCredentials: true
})
.pipe<Document>(
pluck("response")
)
),
map(document => (
getElements("loc", document).map(node => node.textContent!)
))
)
.subscribe(urls => {
setupInstantLoading(urls, { document$, location$, viewport$ })
})
}

/* ----------------------------------------------------------------------- */

Expand Down
8 changes: 6 additions & 2 deletions src/assets/javascripts/integrations/instant/index.ts
Expand Up @@ -100,7 +100,7 @@ interface SetupOptions {
* @param options - Options
*/
export function setupInstantLoading(
{ document$, viewport$, location$ }: SetupOptions
urls: string[], { document$, viewport$, location$ }: SetupOptions
): void {

/* Disable automatic scroll restoration */
Expand All @@ -125,7 +125,11 @@ export function setupInstantLoading(
switchMap(ev => {
if (ev.target instanceof HTMLElement) {
const el = ev.target.closest("a")
if (el && !el.target && isLocalLocation(el)) {
if (
el && !el.target &&
isLocalLocation(el) &&
urls.includes(el.href)
) {
if (!isAnchorLocation(el))
ev.preventDefault()
return of(el)
Expand Down