ソースを参照

Fix autoreload for file urls in Chrome 80

simov 5 年 前
コミット
7f760f89eb
7 ファイル変更71 行追加14 行削除
  1. 2 1
      background/index.js
  2. 9 1
      background/messages.js
  3. 25 0
      background/xhr.js
  4. 32 12
      content/index.js
  5. 1 0
      manifest.firefox.json
  6. 1 0
      manifest.json
  7. 1 0
      manifest.test.json

+ 2 - 1
background/index.js

@@ -5,6 +5,7 @@
   var detect = md.detect({storage, inject})
   var webrequest = md.webrequest({storage, detect})
   var mathjax = md.mathjax()
+  var xhr = md.xhr()
 
   var compilers = Object.keys(md.compilers)
     .reduce((all, compiler) => (
@@ -12,7 +13,7 @@
       all
     ), {})
 
-  var messages = md.messages({storage, compilers, mathjax, webrequest})
+  var messages = md.messages({storage, compilers, mathjax, xhr, webrequest})
 
   chrome.tabs.onUpdated.addListener(detect.tab)
   chrome.runtime.onMessage.addListener(messages)

+ 9 - 1
background/messages.js

@@ -1,8 +1,9 @@
 
-md.messages = ({storage: {defaults, state, set}, compilers, mathjax, webrequest}) => {
+md.messages = ({storage: {defaults, state, set}, compilers, mathjax, xhr, webrequest}) => {
 
   return (req, sender, sendResponse) => {
 
+    // content
     if (req.message === 'markdown') {
       var markdown = req.markdown
 
@@ -19,6 +20,11 @@ md.messages = ({storage: {defaults, state, set}, compilers, mathjax, webrequest}
 
       sendResponse({message: 'html', html})
     }
+    else if (req.message === 'autoreload') {
+      xhr.get(req.location, (err, body) => {
+        sendResponse({err, body})
+      })
+    }
 
     // popup
     else if (req.message === 'popup') {
@@ -142,6 +148,8 @@ md.messages = ({storage: {defaults, state, set}, compilers, mathjax, webrequest}
 
       sendResponse()
     }
+
+    return true
   }
 
   function notifyContent (req, res) {

+ 25 - 0
background/xhr.js

@@ -0,0 +1,25 @@
+
+md.xhr = () => {
+  var done
+
+  var xhr = new XMLHttpRequest()
+  xhr.onreadystatechange = () => {
+    if (xhr.readyState === 4) {
+      done(null, xhr.responseText)
+    }
+  }
+
+  var get = (url, _done) => {
+    done = _done
+    xhr.open('GET', url + '?preventCache=' + Date.now(), true)
+    try {
+      xhr.send()
+    }
+    catch (err) {
+      console.error(err)
+      done(err)
+    }
+  }
+
+  return {get}
+}

+ 32 - 12
content/index.js

@@ -213,26 +213,46 @@ if (state.content.autoreload) {
   ;(() => {
     var initial = ''
 
+    var response = (body) => {
+      if (!initial) {
+        initial = body
+      }
+      else if (initial !== body) {
+        location.reload(true)
+      }
+    }
+
     var xhr = new XMLHttpRequest()
     xhr.onreadystatechange = () => {
       if (xhr.readyState === 4) {
-        if (!initial) {
-          initial = xhr.responseText
-        }
-        else if (initial !== xhr.responseText) {
-          location.reload(true)
-        }
+        response(xhr.responseText)
       }
     }
 
     var get = () => {
-      xhr.open('GET', location.href + '?preventCache=' + Date.now(), true)
-      try {
-        xhr.send()
+      if (location.protocol === 'file:') {
+        chrome.runtime.sendMessage({
+          message: 'autoreload',
+          location: location.href
+        }, (res) => {
+          if (res.err) {
+            console.error(res.err)
+            clearInterval(state.interval)
+          }
+          else {
+            response(res.body)
+          }
+        })
       }
-      catch (err) {
-        console.error(err)
-        clearInterval(state.interval)
+      else {
+        xhr.open('GET', location.href + '?preventCache=' + Date.now(), true)
+        try {
+          xhr.send()
+        }
+        catch (err) {
+          console.error(err)
+          clearInterval(state.interval)
+        }
       }
     }
 

+ 1 - 0
manifest.firefox.json

@@ -32,6 +32,7 @@
       "/background/inject.js",
       "/background/messages.js",
       "/background/mathjax.js",
+      "/background/xhr.js",
 
       "/background/index.js"
     ]

+ 1 - 0
manifest.json

@@ -29,6 +29,7 @@
       "/background/inject.js",
       "/background/messages.js",
       "/background/mathjax.js",
+      "/background/xhr.js",
 
       "/background/index.js"
     ],

+ 1 - 0
manifest.test.json

@@ -29,6 +29,7 @@
       "/background/inject.js",
       "/background/messages.js",
       "/background/mathjax.js",
+      "/background/xhr.js",
 
       "/background/index.js"
     ],