Parcourir la source

Improve rendering time

simov il y a 9 ans
Parent
commit
ff865e728b
2 fichiers modifiés avec 87 ajouts et 32 suppressions
  1. 75 23
      background/background.js
  2. 12 9
      content/content.js

+ 75 - 23
background/background.js

@@ -2,8 +2,8 @@
 // chrome.storage.sync.clear()
 // chrome.permissions.getAll((p) => chrome.permissions.remove({origins: p.origins}))
 
-chrome.storage.sync.get((sync) => {
-  if (!Object.keys(sync).length) {
+chrome.storage.sync.get((res) => {
+  if (!Object.keys(res).length) {
     chrome.storage.sync.set({
       options: md.defaults,
       theme: 'github',
@@ -12,33 +12,85 @@ chrome.storage.sync.get((sync) => {
       origins: {}
     })
   }
+  // v2.2 -> v2.3
+  else if (!res.match || !res.origins) {
+    chrome.storage.sync.set({
+      match: '.*\\/.*\\.(?:markdown|mdown|mkdn|md|mkd|mdwn|mdtxt|mdtext|text)(?:#.*)?$',
+      origins: {}
+    })
+  }
 })
 
+function parallel (tasks, done) {
+  var complete = 0, error, result = {}
+  tasks.forEach((task) => task((err, res) => {
+    if (error) {
+      return
+    }
+    if (err) {
+      error = err
+      done(err)
+      return
+    }
+    if (res) {
+      Object.keys(res).forEach((key) => {
+        result[key] = res[key]
+      })
+    }
+    if (++complete === tasks.length) {
+      done(null, result)
+    }
+  }))
+}
+
 chrome.tabs.onUpdated.addListener((id, info, tab) => {
   if (info.status === 'loading') {
-    chrome.tabs.executeScript(id, {
-      code: 'document.querySelector("pre").style.display = "none";JSON.stringify(location)',
-      runAt: 'document_start'
-    }, (location) => {
-      if (chrome.runtime.lastError) {
+    parallel([
+      (done) => {
+        chrome.tabs.executeScript(id, {
+          code: 'JSON.stringify(location)',
+          runAt: 'document_start'
+        }, (location) => {
+          if (chrome.runtime.lastError) {
+            done(new Error('Origin not allowed'))
+            return
+          }
+          try {
+            location = JSON.parse(location)
+          }
+          catch (err) {
+            done(new Error('JSON parse error'))
+            return
+          }
+          done(null, {location})
+        })
+      },
+      (done) => {
+        chrome.storage.sync.get((res) => done(null, res))
+      }
+    ], (err, res) => {
+      if (err) {
         return
       }
-      location = JSON.parse(location)
-      chrome.storage.sync.get('origins', (res) => {
-        if (new RegExp(res.origins[location.origin]).test(location.href)) {
-          chrome.tabs.insertCSS(id, {file: 'css/content.css', runAt: 'document_start'})
-          chrome.tabs.insertCSS(id, {file: 'vendor/prism.css', runAt: 'document_start'})
-          chrome.tabs.executeScript(id, {file: 'vendor/mithril.min.js', runAt: 'document_start'})
-          chrome.tabs.executeScript(id, {file: 'vendor/prism.js', runAt: 'document_start'})
-          chrome.tabs.executeScript(id, {file: 'content/content.js', runAt: 'document_start'})
-        }
-        else {
-          chrome.tabs.executeScript(id, {
-            code: 'document.querySelector("pre").style.display = "block"',
-            runAt: 'document_start'
-          })
-        }
-      })
+      if (!res.origins[res.location.origin]) { // v2.2 -> v2.3
+        return
+      }
+      if (new RegExp(res.origins[res.location.origin]).test(res.location.href)) {
+        chrome.tabs.insertCSS(id, {code: 'pre {visibility:hidden}', runAt: 'document_start'})
+        chrome.tabs.executeScript(id, {code:
+          'var theme = "' + res.theme + '";var raw = "' + res.raw + '"', runAt: 'document_start'})
+
+        chrome.tabs.insertCSS(id, {file: 'css/content.css', runAt: 'document_start'})
+        chrome.tabs.insertCSS(id, {file: 'vendor/prism.css', runAt: 'document_start'})
+
+        chrome.tabs.executeScript(id, {file: 'vendor/mithril.min.js', runAt: 'document_start'})
+        chrome.tabs.executeScript(id, {file: 'vendor/prism.js', runAt: 'document_start'})
+        chrome.tabs.executeScript(id, {file: 'content/content.js', runAt: 'document_start'})
+
+        chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
+          chrome.pageAction.show(tabs[0].id)
+        })
+      }
     })
   }
 })

+ 12 - 9
content/content.js

@@ -2,18 +2,20 @@
 var $ = document.querySelector.bind(document)
 
 var state = {
-  theme: '',
+  theme: window['theme'] || '',
   html: '',
   markdown: '',
-  raw: false,
+  raw: window['raw'] ? !window['raw'] : false,
   getURL: () => chrome.extension.getURL('/themes/' + state.theme + '.css')
 }
 
-chrome.extension.sendMessage({message: 'settings'}, (res) => {
-  state.theme = res.theme
-  state.raw = res.raw
-  m.redraw()
-})
+if (!state.theme) { // file://
+  chrome.extension.sendMessage({message: 'settings'}, (res) => {
+    state.theme = res.theme
+    state.raw = res.raw
+    m.redraw()
+  })
+}
 
 chrome.extension.onMessage.addListener((req, sender, sendResponse) => {
   if (req.message === 'reload') {
@@ -77,8 +79,9 @@ function mount () {
       }
       if (state.theme && !state.raw) {
         updateStyles()
-        dom.push(m('link#theme [rel="stylesheet"] [type="text/css"]',
-          {href: state.getURL()}))
+        dom.push(m('link#theme [rel="stylesheet"] [type="text/css"]', {
+          href: state.getURL()
+        }))
       }
       if (state.html && !state.raw) {
         dom.push(m('#html', {oncreate: oncreate.html}, m.trust(state.html)))