background.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // chrome.storage.sync.clear()
  2. // chrome.permissions.getAll((p) => chrome.permissions.remove({origins: p.origins}))
  3. chrome.storage.sync.get((res) => {
  4. var match = '.*\\/.*\\.(?:markdown|mdown|mkdn|md|mkd|mdwn|mdtxt|mdtext|text)(?:#.*)?$'
  5. var defaults = {
  6. options: md.defaults,
  7. theme: 'github',
  8. raw: false,
  9. match,
  10. origins: {
  11. 'file://': match
  12. }
  13. }
  14. var options = !Object.keys(res).length ? defaults : res
  15. // v2.2 -> v2.3
  16. if (!options.match || !options.origins) {
  17. options.match = match
  18. options.origins = {
  19. 'file://': match
  20. }
  21. }
  22. // v2.3 -> v2.4
  23. else if (options.origins['file://']) {
  24. options.origins['file://'] = match
  25. }
  26. chrome.storage.sync.set(options)
  27. // reload extension bug
  28. chrome.permissions.getAll((permissions) => {
  29. var origins = Object.keys(res.origins || {})
  30. chrome.permissions.remove({
  31. origins: permissions.origins
  32. .filter((origin) => (origins.indexOf(origin.slice(0, -2)) === -1))
  33. })
  34. })
  35. })
  36. function parallel (tasks, done) {
  37. var complete = 0, error, result = {}
  38. tasks.forEach((task) => task((err, res) => {
  39. if (error) {
  40. return
  41. }
  42. if (err) {
  43. error = err
  44. done(err)
  45. return
  46. }
  47. if (res) {
  48. Object.keys(res).forEach((key) => {
  49. result[key] = res[key]
  50. })
  51. }
  52. if (++complete === tasks.length) {
  53. done(null, result)
  54. }
  55. }))
  56. }
  57. chrome.tabs.onUpdated.addListener((id, info, tab) => {
  58. if (info.status === 'loading') {
  59. parallel([
  60. (done) => {
  61. chrome.tabs.executeScript(id, {
  62. code: 'JSON.stringify(location)',
  63. runAt: 'document_start'
  64. }, (location) => {
  65. if (chrome.runtime.lastError) {
  66. done(new Error('Origin not allowed'))
  67. return
  68. }
  69. try {
  70. location = JSON.parse(location)
  71. }
  72. catch (err) {
  73. done(new Error('JSON parse error'))
  74. return
  75. }
  76. done(null, {location})
  77. })
  78. },
  79. (done) => {
  80. chrome.storage.sync.get((res) => done(null, res))
  81. }
  82. ], (err, res) => {
  83. if (err) {
  84. return
  85. }
  86. if (!res.origins[res.location.origin]) { // v2.2 -> v2.3
  87. return
  88. }
  89. if (new RegExp(res.origins[res.location.origin]).test(res.location.href)) {
  90. chrome.tabs.executeScript(id, {
  91. code: [
  92. 'document.querySelector("pre").style.visibility = "hidden"',
  93. 'var theme = "' + res.theme + '"',
  94. 'var raw = ' + res.raw
  95. ].join(';'), runAt: 'document_start'})
  96. chrome.tabs.insertCSS(id, {file: 'css/content.css', runAt: 'document_start'})
  97. chrome.tabs.insertCSS(id, {file: 'vendor/prism.css', runAt: 'document_start'})
  98. chrome.tabs.executeScript(id, {file: 'vendor/mithril.min.js', runAt: 'document_start'})
  99. chrome.tabs.executeScript(id, {file: 'vendor/prism.js', runAt: 'document_start'})
  100. chrome.tabs.executeScript(id, {file: 'content/content.js', runAt: 'document_start'})
  101. chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  102. chrome.pageAction.show(tabs[0].id)
  103. })
  104. }
  105. })
  106. }
  107. })
  108. chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
  109. if (req.message === 'markdown') {
  110. md.compile(req.markdown, sendResponse)
  111. }
  112. else if (req.message === 'settings') {
  113. chrome.storage.sync.get(['options', 'theme', 'raw'], (res) => {
  114. delete res.options.langPrefix
  115. sendResponse(res)
  116. })
  117. }
  118. else if (req.message === 'options') {
  119. req.options.langPrefix = 'language-' // prism
  120. chrome.storage.sync.set({options: req.options}, sendResponse)
  121. sendMessage({message: 'reload'})
  122. }
  123. else if (req.message === 'defaults') {
  124. chrome.storage.sync.set(
  125. {options: md.defaults, theme: 'github', raw: false}, sendResponse)
  126. sendMessage({message: 'reload'})
  127. }
  128. else if (req.message === 'theme') {
  129. chrome.storage.sync.set({theme: req.theme}, sendResponse)
  130. sendMessage({message: 'theme', theme: req.theme})
  131. }
  132. else if (req.message === 'raw') {
  133. chrome.storage.sync.set({raw: req.raw}, sendResponse)
  134. sendMessage({message: 'raw', raw: req.raw})
  135. }
  136. else if (req.message === 'advanced') {
  137. chrome.management.getSelf((extension) => {
  138. chrome.tabs.create({url: extension.optionsUrl}, sendResponse)
  139. })
  140. }
  141. else if (req.message === 'origins') {
  142. chrome.storage.sync.get('origins', sendResponse)
  143. }
  144. else if (req.message === 'add') {
  145. chrome.storage.sync.get(['match', 'origins'], (res) => {
  146. res.origins[req.origin] = res.match
  147. chrome.storage.sync.set({origins: res.origins}, sendResponse)
  148. })
  149. }
  150. else if (req.message === 'remove') {
  151. chrome.storage.sync.get('origins', (res) => {
  152. delete res.origins[req.origin]
  153. chrome.storage.sync.set({origins: res.origins}, sendResponse)
  154. })
  155. }
  156. else if (req.message === 'update') {
  157. chrome.storage.sync.get('origins', (res) => {
  158. res.origins[req.origin] = req.match
  159. chrome.storage.sync.set({origins: res.origins}, sendResponse)
  160. })
  161. }
  162. return true
  163. })
  164. function sendMessage (req) {
  165. chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  166. chrome.tabs.sendMessage(tabs[0].id, req)
  167. })
  168. }