storage.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // chrome.storage.sync.clear()
  2. // chrome.permissions.getAll((p) => chrome.permissions.remove({origins: p.origins}))
  3. md.storage = ({compilers}) => {
  4. var defaults = md.storage.defaults(compilers)
  5. var state = {}
  6. function set (options) {
  7. chrome.storage.sync.set(options)
  8. Object.assign(state, options)
  9. }
  10. chrome.storage.sync.get((res) => {
  11. md.storage.bug(res)
  12. Object.assign(state, JSON.parse(JSON.stringify(
  13. !Object.keys(res).length ? defaults : res)))
  14. // mutate
  15. md.storage.migrations(state)
  16. // in case of new providers from the compilers branch
  17. Object.keys(compilers).forEach((compiler) => {
  18. if (!state[compiler]) {
  19. state[compiler] = compilers[compiler].defaults
  20. }
  21. })
  22. set(state)
  23. })
  24. return {defaults, state, set}
  25. }
  26. md.storage.defaults = (compilers) => {
  27. var match = '\\.(?:markdown|mdown|mkdn|md|mkd|mdwn|mdtxt|mdtext|text)(?:#.*|\\?.*)?$'
  28. var defaults = {
  29. theme: {
  30. name: 'github',
  31. url: chrome.runtime.getURL('/themes/github.css')
  32. },
  33. compiler: 'marked',
  34. raw: false,
  35. header: true,
  36. match,
  37. content: {
  38. emoji: false,
  39. scroll: true,
  40. toc: false,
  41. mathjax: false,
  42. autoreload: false,
  43. },
  44. origins: {
  45. 'file://': {
  46. match,
  47. csp: false,
  48. encoding: '',
  49. }
  50. },
  51. themes: [],
  52. }
  53. Object.keys(compilers).forEach((compiler) => {
  54. defaults[compiler] = compilers[compiler].defaults
  55. })
  56. return defaults
  57. }
  58. md.storage.bug = (res) => {
  59. // reload extension bug
  60. chrome.permissions.getAll((permissions) => {
  61. var origins = Object.keys(res.origins || {})
  62. chrome.permissions.remove({
  63. origins: permissions.origins
  64. .filter((origin) => origins.indexOf(origin.slice(0, -2)) === -1)
  65. })
  66. })
  67. }
  68. md.storage.migrations = (state) => {
  69. // v3.6 -> v3.7
  70. if (typeof state.origins['file://'] === 'object') {
  71. state.origins['file://'].csp = false
  72. }
  73. if (typeof state.theme === 'string') {
  74. state.theme = {
  75. name: state.theme,
  76. url: chrome.runtime.getURL(`/themes/${state.theme}.css`)
  77. }
  78. }
  79. if (state.themes === undefined) {
  80. state.themes = []
  81. }
  82. }