mirror of
https://github.com/miniflux/v2.git
synced 2025-06-27 16:36:00 +00:00
Offline-pwa update
This commit is contained in:
parent
fbc3294f30
commit
d88b8a1d3b
5 changed files with 29 additions and 10 deletions
|
@ -42,11 +42,11 @@ type User struct {
|
||||||
DefaultHomePage string `json:"default_home_page"`
|
DefaultHomePage string `json:"default_home_page"`
|
||||||
CategoriesSortingOrder string `json:"categories_sorting_order"`
|
CategoriesSortingOrder string `json:"categories_sorting_order"`
|
||||||
MarkReadOnView bool `json:"mark_read_on_view"`
|
MarkReadOnView bool `json:"mark_read_on_view"`
|
||||||
CacheForOffline bool `json:"cache_for_offline"`
|
|
||||||
MediaPlaybackRate float64 `json:"media_playback_rate"`
|
MediaPlaybackRate float64 `json:"media_playback_rate"`
|
||||||
BlockFilterEntryRules string `json:"block_filter_entry_rules"`
|
BlockFilterEntryRules string `json:"block_filter_entry_rules"`
|
||||||
KeepFilterEntryRules string `json:"keep_filter_entry_rules"`
|
KeepFilterEntryRules string `json:"keep_filter_entry_rules"`
|
||||||
ExternalFontHosts string `json:"external_font_hosts"`
|
ExternalFontHosts string `json:"external_font_hosts"`
|
||||||
|
CacheForOffline bool `json:"cache_for_offline"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u User) String() string {
|
func (u User) String() string {
|
||||||
|
|
|
@ -100,7 +100,7 @@ func (b *Builder) Write() {
|
||||||
func (b *Builder) writeHeaders() {
|
func (b *Builder) writeHeaders() {
|
||||||
b.headers["X-Content-Type-Options"] = "nosniff"
|
b.headers["X-Content-Type-Options"] = "nosniff"
|
||||||
b.headers["X-Frame-Options"] = "DENY"
|
b.headers["X-Frame-Options"] = "DENY"
|
||||||
b.headers["Referrer-Policy"] = "no-referrer"
|
b.headers["Referrer-Policy"] = "strict-origin"
|
||||||
|
|
||||||
for key, value := range b.headers {
|
for key, value := range b.headers {
|
||||||
b.w.Header().Set(key, value)
|
b.w.Header().Set(key, value)
|
||||||
|
|
|
@ -241,7 +241,7 @@ func sanitizeAttributes(baseURL, tagName string, attributes []html.Attribute) ([
|
||||||
func getExtraAttributes(tagName string) ([]string, []string) {
|
func getExtraAttributes(tagName string) ([]string, []string) {
|
||||||
switch tagName {
|
switch tagName {
|
||||||
case "a":
|
case "a":
|
||||||
return []string{"rel", "target", "referrerpolicy"}, []string{`rel="noopener noreferrer"`, `target="_blank"`, `referrerpolicy="no-referrer"`}
|
return []string{"rel", "target", "referrerpolicy"}, []string{`rel="noopener noreferrer"`, `target="_blank"`, `referrerpolicy="strict-origin"`}
|
||||||
case "video", "audio":
|
case "video", "audio":
|
||||||
return []string{"controls"}, []string{"controls"}
|
return []string{"controls"}, []string{"controls"}
|
||||||
case "iframe":
|
case "iframe":
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<section class="entry" data-id="{{ .entry.ID }}" aria-labelledby="page-header-title">
|
<section class="entry" data-id="{{ .entry.ID }}" aria-labelledby="page-header-title">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h1 id="page-header-title" dir="auto">
|
<h1 id="page-header-title" dir="auto">
|
||||||
<a href="{{ .entry.URL | safeURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer">{{ .entry.Title }}</a>
|
<a href="{{ .entry.URL | safeURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="strict-origin">{{ .entry.Title }}</a>
|
||||||
</h1>
|
</h1>
|
||||||
{{ if .user }}
|
{{ if .user }}
|
||||||
<div class="entry-actions">
|
<div class="entry-actions">
|
||||||
|
@ -79,7 +79,7 @@
|
||||||
class="page-link"
|
class="page-link"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
referrerpolicy="no-referrer"
|
referrerpolicy="strict-origin"
|
||||||
data-original-link="{{ .user.MarkReadOnView }}">{{ icon "external-link" }}<span class="icon-label">{{ t "entry.external_link.label" }}</span></a>
|
data-original-link="{{ .user.MarkReadOnView }}">{{ icon "external-link" }}<span class="icon-label">{{ t "entry.external_link.label" }}</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -98,7 +98,7 @@
|
||||||
title="{{ t "entry.comments.title" }}"
|
title="{{ t "entry.comments.title" }}"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
referrerpolicy="no-referrer"
|
referrerpolicy="strict-origin"
|
||||||
data-comments-link="true"
|
data-comments-link="true"
|
||||||
>{{ icon "comment" }}<span class="icon-label">{{ t "entry.comments.label" }}</span></a>
|
>{{ icon "comment" }}<span class="icon-label">{{ t "entry.comments.label" }}</span></a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -232,7 +232,7 @@
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<div class="entry-enclosure-download">
|
<div class="entry-enclosure-download">
|
||||||
<a href="{{ .URL | safeURL }}" title="{{ t "action.download" }}{{ if gt .Size 0 }} - {{ formatFileSize .Size }}{{ end }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer">{{ .URL | safeURL }}</a>
|
<a href="{{ .URL | safeURL }}" title="{{ t "action.download" }}{{ if gt .Size 0 }} - {{ formatFileSize .Size }}{{ end }}" target="_blank" rel="noopener noreferrer" referrerpolicy="strict-origin">{{ .URL | safeURL }}</a>
|
||||||
<small>{{ if gt .Size 0 }} - <strong>{{ formatFileSize .Size }}</strong>{{ end }}</small>
|
<small>{{ if gt .Size 0 }} - <strong>{{ formatFileSize .Size }}</strong>{{ end }}</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,13 +3,24 @@
|
||||||
const OFFLINE_VERSION = 2;
|
const OFFLINE_VERSION = 2;
|
||||||
const CACHE_NAME = "offline";
|
const CACHE_NAME = "offline";
|
||||||
|
|
||||||
|
const cachedPages = [
|
||||||
|
"/unread",
|
||||||
|
"/starred",
|
||||||
|
"/stylesheets",
|
||||||
|
"/app",
|
||||||
|
"/service-worker",
|
||||||
|
"/manifest.json",
|
||||||
|
"/feed/icon",
|
||||||
|
"/icon",
|
||||||
|
];
|
||||||
|
|
||||||
self.addEventListener("install", (event) => {
|
self.addEventListener("install", (event) => {
|
||||||
event.waitUntil(
|
event.waitUntil(
|
||||||
(async () => {
|
(async () => {
|
||||||
const cache = await caches.open(CACHE_NAME);
|
const cache = await caches.open(CACHE_NAME);
|
||||||
|
|
||||||
if (USE_CACHE) {
|
if (USE_CACHE) {
|
||||||
await cache.addAll(["/", "/unread", OFFLINE_URL]);
|
await cache.addAll(["/", "/unread", "/starred", OFFLINE_URL]);
|
||||||
} else {
|
} else {
|
||||||
// Setting {cache: 'reload'} in the new request will ensure that the
|
// Setting {cache: 'reload'} in the new request will ensure that the
|
||||||
// response isn't fulfilled from the HTTP cache; i.e., it will be from
|
// response isn't fulfilled from the HTTP cache; i.e., it will be from
|
||||||
|
@ -49,12 +60,20 @@ async function cacheFirstWithRefresh(request) {
|
||||||
return networkResponse;
|
return networkResponse;
|
||||||
});
|
});
|
||||||
|
|
||||||
return (await cache.match(request)) || (await fetchResponsePromise);
|
try {
|
||||||
|
return (await cache.match(request)) || (await fetchResponsePromise);
|
||||||
|
} catch (error) {
|
||||||
|
const cache = await caches.open(CACHE_NAME);
|
||||||
|
return await cache.match(OFFLINE_URL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.addEventListener("fetch", (event) => {
|
self.addEventListener("fetch", (event) => {
|
||||||
if (USE_CACHE) {
|
if (USE_CACHE) {
|
||||||
return event.respondWith(cacheFirstWithRefresh(event.request));
|
const url = new URL(event.request.url);
|
||||||
|
if (cachedPages.some((page) => url.pathname.startsWith(page))) {
|
||||||
|
return event.respondWith(cacheFirstWithRefresh(event.request));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We proxify requests through fetch() only if we are offline because it's slower.
|
// We proxify requests through fetch() only if we are offline because it's slower.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue