options.js 5.8 KB

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