index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. var path = require('path')
  2. var http = require('http')
  3. var puppeteer = require('puppeteer')
  4. var iconv = require('iconv-lite')
  5. var options = {
  6. headless: false,
  7. // slowMo: 300,
  8. args: [
  9. `--disable-extensions-except=${path.resolve(__dirname, '../')}`,
  10. `--load-extension=${path.resolve(__dirname, '../')}`,
  11. ],
  12. }
  13. var tests = [
  14. 'defaults-popup',
  15. 'defaults-options',
  16. 'popup-options',
  17. 'origin-add',
  18. 'origin-match',
  19. 'origin-encoding',
  20. 'origin-csp', // should be last - destroys popup and advanced
  21. ]
  22. describe('markdown-viewer', () => {
  23. var browser, server
  24. it('test suite', async () => {
  25. browser = await puppeteer.launch(options)
  26. var extensions = await browser.newPage()
  27. await extensions.goto('chrome://extensions')
  28. // enable developer mode
  29. await extensions.evaluate(() => {
  30. document.querySelector('extensions-manager').shadowRoot
  31. .querySelector('extensions-toolbar').shadowRoot
  32. .querySelector('cr-toggle').click()
  33. })
  34. // get extension id
  35. var id = await extensions.evaluate(() =>
  36. Array.from(
  37. document.querySelector('extensions-manager').shadowRoot
  38. .querySelector('extensions-item-list').shadowRoot
  39. .querySelectorAll('extensions-item')
  40. )[0].id
  41. )
  42. var popup = await browser.newPage()
  43. await popup.goto(`chrome-extension://${id}/content/popup.html`)
  44. var advanced = await browser.newPage()
  45. await advanced.goto(`chrome-extension://${id}/content/options.html`)
  46. var content = await browser.newPage()
  47. await new Promise((resolve, reject) => {
  48. var index = 0
  49. server = http.createServer()
  50. server.on('request', (req, res) => {
  51. // content-type
  52. if (/wrong-content-type/.test(req.url)) {
  53. res.setHeader('Content-Type', 'text/plain')
  54. res.end('**bold**')
  55. }
  56. else if (/correct-content-type/.test(req.url)) {
  57. res.setHeader('Content-Type', 'text/markdown')
  58. res.end('**bold**')
  59. }
  60. else if (/correct-content-type-variation/.test(req.url)) {
  61. res.setHeader('Content-Type', 'text/x-markdown')
  62. res.end('**bold**')
  63. }
  64. // popup options
  65. else if (/compiler-options-marked/.test(req.url)) {
  66. res.setHeader('Content-Type', 'text/x-markdown')
  67. res.end('~~strikethrough~~')
  68. }
  69. else if (/compiler-options-remark/.test(req.url)) {
  70. res.setHeader('Content-Type', 'text/x-markdown')
  71. res.end('- [ ] task')
  72. }
  73. else if (/content-options-toc/.test(req.url)) {
  74. res.setHeader('Content-Type', 'text/markdown')
  75. res.end('# h1\n# h2\n# h3')
  76. }
  77. else if (/content-options-scroll/.test(req.url)) {
  78. res.setHeader('Content-Type', 'text/markdown')
  79. res.end([
  80. '# h1',
  81. Array(500).fill('lorem ipsum').join(' '),
  82. '## h2',
  83. Array(500).fill('lorem ipsum').join(' '),
  84. '### h3',
  85. Array(500).fill('lorem ipsum').join(' '),
  86. ].join('\n\n'))
  87. }
  88. else if (/autoreload/.test(req.url)) {
  89. res.setHeader('Content-Type', 'text/markdown')
  90. index += /preventCache/.test(req.url) ? 1 : 0
  91. res.end(`# ${index}`)
  92. }
  93. // csp
  94. else if (/csp-match-header/.test(req.url)) {
  95. res.setHeader('Content-Security-Policy',
  96. `default-src 'none'; style-src 'unsafe-inline'; sandbox`)
  97. res.setHeader('Content-Type', 'text/markdown')
  98. res.end('# h1')
  99. }
  100. else if (/csp-match-path/.test(req.url)) {
  101. res.setHeader('Content-Security-Policy',
  102. `default-src 'none'; style-src 'unsafe-inline'; sandbox`)
  103. res.end('# h1')
  104. }
  105. else if (/csp-no-header-no-path/.test(req.url)) {
  106. res.setHeader('Content-Security-Policy',
  107. `default-src 'none'; style-src 'unsafe-inline'; sandbox`)
  108. res.end('# h1')
  109. }
  110. // encoding
  111. else if (/windows-1251/.test(req.url)) {
  112. res.setHeader('Content-Type', 'text/markdown; charset=UTF-8')
  113. res.end(iconv.encode('здрасти', 'win1251'))
  114. }
  115. })
  116. server.listen(3000, resolve)
  117. })
  118. tests.forEach((file) => {
  119. describe(file, () => {
  120. require(`./${file}.js`)({puppeteer, browser, extensions, popup, advanced, content})
  121. })
  122. })
  123. after(async () => {
  124. server.close()
  125. await browser.close()
  126. })
  127. })
  128. })