options.js 3.9 KB

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