diff options
author | Frédéric Guillot <fred@miniflux.net> | 2018-07-15 21:51:09 -0700 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2018-07-15 21:51:09 -0700 |
commit | 6aa02680d80709d714672dd842dc3dc2533339fe (patch) | |
tree | d6cf7b40e5662983fd3132630417aa91a1a35c15 /ui | |
parent | c926498d3d12f4e59c5fe0cd40a77c42d15c30b9 (diff) |
Add service worker to cache feed icons
Diffstat (limited to 'ui')
-rw-r--r-- | ui/static/js.go | 11 | ||||
-rw-r--r-- | ui/static/js/bootstrap.js | 7 | ||||
-rw-r--r-- | ui/static/js/sw.js | 14 | ||||
-rw-r--r-- | ui/static_javascript.go | 13 |
4 files changed, 40 insertions, 5 deletions
diff --git a/ui/static/js.go b/ui/static/js.go index a6b7b1c..fdb2f2d 100644 --- a/ui/static/js.go +++ b/ui/static/js.go @@ -2,7 +2,7 @@ package static -var Javascript = map[string]string{ +var Javascripts = map[string]string{ "app": `(function(){'use strict';class DomHelper{static isVisible(element){return element.offsetParent!==null;} static openNewTab(url){let win=window.open("");win.opener=null;win.location=url;win.focus();} static scrollPageTo(element){let windowScrollPosition=window.pageYOffset;let windowHeight=document.documentElement.clientHeight;let viewportPosition=windowScrollPosition+windowHeight;let itemBottomPosition=element.offsetTop+element.offsetHeight;if(viewportPosition-itemBottomPosition<0||viewportPosition-element.offsetTop>windowHeight){window.scrollTo(0,element.offsetTop-10);}} @@ -91,9 +91,12 @@ if(currentItem===null){items[0].classList.add("current-item");return;} for(let i=0;i<items.length;i++){if(items[i].classList.contains("current-item")){items[i].classList.remove("current-item");if(i+1<items.length){items[i+1].classList.add("current-item");DomHelper.scrollPageTo(items[i+1]);} break;}}} isListView(){return document.querySelector(".items")!==null;}} -document.addEventListener("DOMContentLoaded",function(){FormHandler.handleSubmitButtons();let touchHandler=new TouchHandler();touchHandler.listen();let navHandler=new NavHandler();let keyboardHandler=new KeyboardHandler();keyboardHandler.on("g u",()=>navHandler.goToPage("unread"));keyboardHandler.on("g b",()=>navHandler.goToPage("starred"));keyboardHandler.on("g h",()=>navHandler.goToPage("history"));keyboardHandler.on("g f",()=>navHandler.goToPage("feeds"));keyboardHandler.on("g c",()=>navHandler.goToPage("categories"));keyboardHandler.on("g s",()=>navHandler.goToPage("settings"));keyboardHandler.on("ArrowLeft",()=>navHandler.goToPrevious());keyboardHandler.on("ArrowRight",()=>navHandler.goToNext());keyboardHandler.on("j",()=>navHandler.goToPrevious());keyboardHandler.on("p",()=>navHandler.goToPrevious());keyboardHandler.on("k",()=>navHandler.goToNext());keyboardHandler.on("n",()=>navHandler.goToNext());keyboardHandler.on("h",()=>navHandler.goToPage("previous"));keyboardHandler.on("l",()=>navHandler.goToPage("next"));keyboardHandler.on("o",()=>navHandler.openSelectedItem());keyboardHandler.on("v",()=>navHandler.openOriginalLink());keyboardHandler.on("m",()=>navHandler.toggleEntryStatus());keyboardHandler.on("A",()=>navHandler.markPageAsRead());keyboardHandler.on("s",()=>navHandler.saveEntry());keyboardHandler.on("d",()=>navHandler.fetchOriginalContent());keyboardHandler.on("f",()=>navHandler.toggleBookmark());keyboardHandler.on("?",()=>navHandler.showKeyboardShortcuts());keyboardHandler.on("/",(e)=>navHandler.setFocusToSearchInput(e));keyboardHandler.on("Escape",()=>ModalHandler.close());keyboardHandler.listen();let mouseHandler=new MouseHandler();mouseHandler.onClick("a[data-save-entry]",(event)=>{event.preventDefault();EntryHandler.saveEntry(event.target);});mouseHandler.onClick("a[data-toggle-bookmark]",(event)=>{event.preventDefault();EntryHandler.toggleBookmark(event.target);});mouseHandler.onClick("a[data-toggle-status]",(event)=>{event.preventDefault();let currentItem=DomHelper.findParent(event.target,"item");if(currentItem){EntryHandler.toggleEntryStatus(currentItem);}});mouseHandler.onClick("a[data-fetch-content-entry]",(event)=>{event.preventDefault();EntryHandler.fetchOriginalContent(event.target);});mouseHandler.onClick("a[data-on-click=markPageAsRead]",()=>navHandler.markPageAsRead());mouseHandler.onClick("a[data-confirm]",(event)=>{(new ConfirmHandler()).handle(event);});mouseHandler.onClick("a[data-action=search]",(event)=>{navHandler.setFocusToSearchInput(event);});if(document.documentElement.clientWidth<600){let menuHandler=new MenuHandler();mouseHandler.onClick(".logo",()=>menuHandler.toggleMainMenu());mouseHandler.onClick(".header nav li",(event)=>menuHandler.clickMenuListItem(event));}});})();`, +document.addEventListener("DOMContentLoaded",function(){FormHandler.handleSubmitButtons();let touchHandler=new TouchHandler();touchHandler.listen();let navHandler=new NavHandler();let keyboardHandler=new KeyboardHandler();keyboardHandler.on("g u",()=>navHandler.goToPage("unread"));keyboardHandler.on("g b",()=>navHandler.goToPage("starred"));keyboardHandler.on("g h",()=>navHandler.goToPage("history"));keyboardHandler.on("g f",()=>navHandler.goToPage("feeds"));keyboardHandler.on("g c",()=>navHandler.goToPage("categories"));keyboardHandler.on("g s",()=>navHandler.goToPage("settings"));keyboardHandler.on("ArrowLeft",()=>navHandler.goToPrevious());keyboardHandler.on("ArrowRight",()=>navHandler.goToNext());keyboardHandler.on("j",()=>navHandler.goToPrevious());keyboardHandler.on("p",()=>navHandler.goToPrevious());keyboardHandler.on("k",()=>navHandler.goToNext());keyboardHandler.on("n",()=>navHandler.goToNext());keyboardHandler.on("h",()=>navHandler.goToPage("previous"));keyboardHandler.on("l",()=>navHandler.goToPage("next"));keyboardHandler.on("o",()=>navHandler.openSelectedItem());keyboardHandler.on("v",()=>navHandler.openOriginalLink());keyboardHandler.on("m",()=>navHandler.toggleEntryStatus());keyboardHandler.on("A",()=>navHandler.markPageAsRead());keyboardHandler.on("s",()=>navHandler.saveEntry());keyboardHandler.on("d",()=>navHandler.fetchOriginalContent());keyboardHandler.on("f",()=>navHandler.toggleBookmark());keyboardHandler.on("?",()=>navHandler.showKeyboardShortcuts());keyboardHandler.on("/",(e)=>navHandler.setFocusToSearchInput(e));keyboardHandler.on("Escape",()=>ModalHandler.close());keyboardHandler.listen();let mouseHandler=new MouseHandler();mouseHandler.onClick("a[data-save-entry]",(event)=>{event.preventDefault();EntryHandler.saveEntry(event.target);});mouseHandler.onClick("a[data-toggle-bookmark]",(event)=>{event.preventDefault();EntryHandler.toggleBookmark(event.target);});mouseHandler.onClick("a[data-toggle-status]",(event)=>{event.preventDefault();let currentItem=DomHelper.findParent(event.target,"item");if(currentItem){EntryHandler.toggleEntryStatus(currentItem);}});mouseHandler.onClick("a[data-fetch-content-entry]",(event)=>{event.preventDefault();EntryHandler.fetchOriginalContent(event.target);});mouseHandler.onClick("a[data-on-click=markPageAsRead]",()=>navHandler.markPageAsRead());mouseHandler.onClick("a[data-confirm]",(event)=>{(new ConfirmHandler()).handle(event);});mouseHandler.onClick("a[data-action=search]",(event)=>{navHandler.setFocusToSearchInput(event);});if(document.documentElement.clientWidth<600){let menuHandler=new MenuHandler();mouseHandler.onClick(".logo",()=>menuHandler.toggleMainMenu());mouseHandler.onClick(".header nav li",(event)=>menuHandler.clickMenuListItem(event));} +if("serviceWorker"in navigator){let scriptElement=document.getElementById("service-worker-script");if(scriptElement){navigator.serviceWorker.register(scriptElement.src);}}});})();`, + "sw": `'use strict';self.addEventListener("fetch",(event)=>{if(event.request.url.includes("/feed/icon/")){event.respondWith(caches.open("feed_icons").then((cache)=>{return cache.match(event.request).then((response)=>{return response||fetch(event.request).then((response)=>{cache.put(event.request,response.clone());return response;});});}));}});`, } -var JavascriptChecksums = map[string]string{ - "app": "ef0457f301b924c25a20fa00e65bfda5437f41bc9ad0a0762b62b9c64b6d0ac5", +var JavascriptsChecksums = map[string]string{ + "app": "cf86a525349b18a448c8599978c9f54cb41092128c5c573b40cbb22a588ac24e", + "sw": "55fffa223919cc18572788fb9c62fccf92166c0eb5d3a1d6f91c31f24d020be9", } diff --git a/ui/static/js/bootstrap.js b/ui/static/js/bootstrap.js index 98ad635..bd3b09e 100644 --- a/ui/static/js/bootstrap.js +++ b/ui/static/js/bootstrap.js @@ -71,4 +71,11 @@ document.addEventListener("DOMContentLoaded", function() { mouseHandler.onClick(".logo", () => menuHandler.toggleMainMenu()); mouseHandler.onClick(".header nav li", (event) => menuHandler.clickMenuListItem(event)); } + + if ("serviceWorker" in navigator) { + let scriptElement = document.getElementById("service-worker-script"); + if (scriptElement) { + navigator.serviceWorker.register(scriptElement.src); + } + } }); diff --git a/ui/static/js/sw.js b/ui/static/js/sw.js new file mode 100644 index 0000000..8e32fcb --- /dev/null +++ b/ui/static/js/sw.js @@ -0,0 +1,14 @@ +self.addEventListener("fetch", (event) => { + if (event.request.url.includes("/feed/icon/")) { + event.respondWith( + caches.open("feed_icons").then((cache) => { + return cache.match(event.request).then((response) => { + return response || fetch(event.request).then((response) => { + cache.put(event.request, response.clone()); + return response; + }); + }); + }) + ); + } +}); diff --git a/ui/static_javascript.go b/ui/static_javascript.go index 821a339..990368b 100644 --- a/ui/static_javascript.go +++ b/ui/static_javascript.go @@ -8,11 +8,22 @@ import ( "net/http" "time" + "github.com/miniflux/miniflux/http/request" "github.com/miniflux/miniflux/http/response" + "github.com/miniflux/miniflux/http/response/html" "github.com/miniflux/miniflux/ui/static" ) // Javascript renders application client side code. func (c *Controller) Javascript(w http.ResponseWriter, r *http.Request) { - response.Cache(w, r, "text/javascript; charset=utf-8", static.JavascriptChecksums["app"], []byte(static.Javascript["app"]), 48*time.Hour) + filename := request.Param(r, "name", "app") + if _, found := static.Javascripts[filename]; !found { + html.NotFound(w) + return + } + + body := static.Javascripts[filename] + etag := static.JavascriptsChecksums[filename] + + response.Cache(w, r, "text/javascript; charset=utf-8", etag, []byte(body), 48*time.Hour) } |