Просмотр исходного кода

feat(ssr): Add 'nonce' option to context for ssr outlet script (#8047)

close #7479
Hyunje Jun 7 лет назад
Родитель
Сommit
f036cce163
2 измененных файлов с 29 добавлено и 1 удалено
  1. 2 1
      src/server/template-renderer/index.js
  2. 27 0
      test/ssr/ssr-template.spec.js

+ 2 - 1
src/server/template-renderer/index.js

@@ -198,8 +198,9 @@ export default class TemplateRenderer {
     const autoRemove = process.env.NODE_ENV === 'production'
       ? ';(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());'
       : ''
+    const nonceAttr = context.nonce ? ` nonce="${context.nonce}"` : ''
     return context[contextKey]
-      ? `<script>window.${windowKey}=${state}${autoRemove}</script>`
+      ? `<script${nonceAttr}>window.${windowKey}=${state}${autoRemove}</script>`
       : ''
   }
 

+ 27 - 0
test/ssr/ssr-template.spec.js

@@ -387,5 +387,32 @@ describe('SSR: template option', () => {
         done()
       })
     })
+
+    it('renderToString + nonce', done => {
+      const interpolateTemplate = `<html><head><title>hello</title></head><body><!--vue-ssr-outlet--></body></html>`
+      const renderer = createRenderer({
+        template: interpolateTemplate
+      })
+
+      const context = {
+        state: { a: 1 },
+        nonce: '4AEemGb0xJptoIGFP3Nd'
+      }
+
+      renderer.renderToString(new Vue({
+        template: '<div>hi</div>'
+      }), context, (err, res) => {
+        expect(err).toBeNull()
+        expect(res).toContain(
+          `<html><head>` +
+          `<title>hello</title>` +
+          `</head><body>` +
+          `<div data-server-rendered="true">hi</div>` +
+          `<script nonce="4AEemGb0xJptoIGFP3Nd">window.__INITIAL_STATE__={"a":1}</script>` +
+          `</body></html>`
+        )
+        done()
+      })
+    })
   }
 })