background.js 5.2 KB

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