options.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. var state = {
  2. origin: '',
  3. origins: {},
  4. timeout: null
  5. }
  6. var events = {
  7. add: () => {
  8. if (!state.origin || /^file:/.test(state.origin)) {
  9. return
  10. }
  11. var origin = state.origin.replace(/\/$/, '')
  12. chrome.permissions.request({origins: [origin + '/*']}, (granted) => {
  13. if (granted) {
  14. chrome.runtime.sendMessage({message: 'add', origin}, (res) => {
  15. state.origin = ''
  16. get()
  17. })
  18. }
  19. })
  20. },
  21. remove: (origin) => () => {
  22. chrome.permissions.remove({origins: [origin + '/*']}, (removed) => {
  23. if (removed) {
  24. chrome.runtime.sendMessage({message: 'remove', origin}, (res) => {
  25. get()
  26. })
  27. }
  28. })
  29. },
  30. update: (origin) => (e) => {
  31. state.origins[origin] = e.target.value
  32. clearTimeout(state.timeout)
  33. state.timeout = setTimeout(() => {
  34. chrome.runtime.sendMessage({
  35. message: 'update', origin, match: e.target.value
  36. }, (res) => {})
  37. }, 750)
  38. },
  39. refresh: (origin) => () => {
  40. chrome.permissions.request({origins: [origin + '/*']}, (granted) => {})
  41. },
  42. origin: (e) => {
  43. state.origin = e.target.value
  44. }
  45. }
  46. function get () {
  47. chrome.runtime.sendMessage({message: 'origins'}, (res) => {
  48. state.origins = res.origins
  49. m.redraw()
  50. })
  51. }
  52. get()
  53. function oncreate (vnode) {
  54. componentHandler.upgradeElements(vnode.dom)
  55. }
  56. m.mount(document.querySelector('main'), {
  57. view: () =>
  58. m('.mdl-grid', [
  59. m('.mdl-cell mdl-cell--8-col-tablet mdl-cell--12-col-desktop', [
  60. m('h4', 'Add New Origin'),
  61. ]),
  62. m('.mdl-cell mdl-cell--8-col-tablet mdl-cell--12-col-desktop', [
  63. m('.mdl-textfield mdl-js-textfield', {oncreate}, [
  64. m('input.mdl-textfield__input', {
  65. value: state.origin,
  66. onchange: events.origin,
  67. placeholder: 'https://raw.githubusercontent.com'
  68. }),
  69. m('label.mdl-textfield__label')
  70. ]),
  71. m('button.mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect',
  72. {oncreate, onclick: events.add},
  73. 'Add')
  74. ]),
  75. (Object.keys(state.origins).length || null) &&
  76. m('.mdl-cell mdl-cell--8-col-tablet mdl-cell--12-col-desktop',
  77. m('h4', 'Allowed Origins')
  78. ),
  79. (Object.keys(state.origins).length || null) &&
  80. m('.mdl-cell mdl-cell--8-col-tablet mdl-cell--12-col-desktop',
  81. m('table.mdl-data-table mdl-js-data-table mdl-data-table--selectable mdl-shadow--2dp',
  82. Object.keys(state.origins).sort().map((origin) =>
  83. m('tr', [
  84. m('td.mdl-data-table__cell--non-numeric', origin),
  85. m('td.mdl-data-table__cell--non-numeric',
  86. m('.mdl-textfield mdl-js-textfield', {oncreate}, [
  87. m('input.mdl-textfield__input',
  88. {onkeyup: events.update(origin), value: state.origins[origin]}),
  89. m('label.mdl-textfield__label')
  90. ])
  91. ),
  92. m('td',
  93. (origin !== 'file://' || null) &&
  94. m('button.mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon',
  95. {oncreate, onclick: events.refresh(origin), title: 'Refresh'},
  96. m('i.material-icons icon-refresh')
  97. ),
  98. (origin !== 'file://' || null) &&
  99. m('button.mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon',
  100. {oncreate, onclick: events.remove(origin), title: 'Remove'},
  101. m('i.material-icons icon-remove')
  102. )
  103. )
  104. ])
  105. ))
  106. )
  107. ])
  108. })