options.js 4.6 KB

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