Added loading of sitemap to filter instant loading requests

This commit is contained in:
squidfunk 2020-05-03 18:02:59 +02:00 committed by Martin Donath
parent 9a0c3e9094
commit 252db1334e
9 changed files with 37 additions and 12 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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",

View File

@ -179,7 +179,7 @@
</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",

View File

@ -52,7 +52,7 @@ theme:
language: en
features:
- tabs
#- instant
- instant
palette:
primary: indigo
accent: indigo

View File

@ -46,7 +46,8 @@ import {
take,
shareReplay,
pluck,
catchError
catchError,
map
} from "rxjs/operators"
import {
@ -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$ })
})
}
/* ----------------------------------------------------------------------- */

View File

@ -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 */
@ -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)