|  | @@ -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)
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      })
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  })
 |