Explorar o código

Add autoreload content option

simov %!s(int64=7) %!d(string=hai) anos
pai
achega
73e0bd4400
Modificáronse 4 ficheiros con 57 adicións e 7 borrados
  1. 1 0
      background/messages.js
  2. 5 0
      background/storage.js
  3. 25 6
      background/webrequest.js
  4. 26 1
      content/content.js

+ 1 - 0
background/messages.js

@@ -58,6 +58,7 @@ md.messages = ({storage: {defaults, state, set}, compilers, mathjax, webrequest}
     else if (req.message === 'popup.content') {
       set({content: req.content})
       notifyContent({message: 'reload'})
+      webrequest()
       sendResponse()
     }
     else if (req.message === 'popup.advanced') {

+ 5 - 0
background/storage.js

@@ -13,6 +13,7 @@ md.storage = ({compilers}) => {
       scroll: true,
       toc: false,
       mathjax: false,
+      autoreload: false,
     },
     raw: false,
     header: true,
@@ -94,6 +95,10 @@ md.storage = ({compilers}) => {
     if (typeof options.csp === 'boolean') {
       delete options.csp
     }
+    // v3.5 -> v3.6
+    if (options.content.autoreload === undefined) {
+      options.content.autoreload = false
+    }
 
     // reload extension bug
     chrome.permissions.getAll((permissions) => {

+ 25 - 6
background/webrequest.js

@@ -40,6 +40,14 @@ md.webrequest = ({storage: {state}, detect}) => {
     return {responseHeaders}
   }
 
+  var onCompleted = ({ip, tabId}) => {
+    if (ip && ip !== '127.0.0.1') {
+      setTimeout(() => {
+        chrome.tabs.sendMessage(tabId, {message: 'autoreload'})
+      }, 500)
+    }
+  }
+
   var events = () => {
     var headers = false
     for (var key in state.origins) {
@@ -54,20 +62,25 @@ md.webrequest = ({storage: {state}, detect}) => {
       headers = true
     }
 
-    return {headers}
+    var completed = false
+    if (state.content.autoreload) {
+      completed = true
+    }
+
+    return {headers, completed}
   }
 
-  var perm = (headers, done) => {
+  var perm = (headers, completed, done) => {
     // ff: webRequest is required permission
     if (/Firefox/.test(navigator.userAgent)) {
       done()
     }
     // request permissions
-    else if (headers && !chrome.webRequest) {
+    else if ((headers || completed) && !chrome.webRequest) {
       chrome.permissions.request({permissions}, done)
     }
     // remove permissions
-    else if (!headers && chrome.webRequest) {
+    else if (!headers && !completed && chrome.webRequest) {
       chrome.permissions.remove({permissions}, () => {
         chrome.webRequest = null
         done()
@@ -80,20 +93,26 @@ md.webrequest = ({storage: {state}, detect}) => {
 
   return () => {
 
-    var {headers} = events()
+    var {headers, completed} = events()
 
     // remove listeners
     if (chrome.webRequest) {
       if (!headers && !/Firefox/.test(navigator.userAgent)) {
         chrome.webRequest.onHeadersReceived.removeListener(onHeadersReceived)
       }
+      if (!completed) {
+        chrome.webRequest.onCompleted.removeListener(onCompleted)
+      }
     }
 
-    perm(headers, () => {
+    perm(headers, completed, () => {
       // add listeners
       if (headers && !chrome.webRequest.onHeadersReceived.hasListener(onHeadersReceived)) {
         chrome.webRequest.onHeadersReceived.addListener(onHeadersReceived, filter, options)
       }
+      if (completed && !chrome.webRequest.onCompleted.hasListener(onCompleted)) {
+        chrome.webRequest.onCompleted.addListener(onCompleted, filter)
+      }
     })
   }
 }

+ 26 - 1
content/content.js

@@ -8,7 +8,8 @@ var state = {
   compiler,
   html: '',
   markdown: '',
-  toc: ''
+  toc: '',
+  interval: null,
 }
 
 chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
@@ -23,6 +24,9 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
     state.raw = req.raw
     m.redraw()
   }
+  else if (req.message === 'autoreload') {
+    clearInterval(state.interval)
+  }
 })
 
 var oncreate = {
@@ -230,3 +234,24 @@ if (document.readyState === 'complete') {
 else {
   window.addEventListener('DOMContentLoaded', mount)
 }
+
+if (state.content.autoreload) {
+  ;(() => {
+    var xhr = new XMLHttpRequest()
+    xhr.onreadystatechange = () => {
+      if (xhr.readyState === 4 && state.markdown !== xhr.responseText) {
+        location.reload(true)
+      }
+    }
+    state.interval = setInterval(() => {
+      xhr.open('GET', location.href + '?preventCache=' + Date.now(), true)
+      try {
+        xhr.send()
+      }
+      catch (err) {
+        console.error(err)
+        clearInterval(state.interval)
+      }
+    }, 1000)
+  })()
+}