GetTrustedTypesPolicyRuntimeModule.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. */
  4. "use strict";
  5. const RuntimeGlobals = require("../RuntimeGlobals");
  6. const Template = require("../Template");
  7. const HelperRuntimeModule = require("./HelperRuntimeModule");
  8. /** @typedef {import("../Compilation")} Compilation */
  9. /** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
  10. class GetTrustedTypesPolicyRuntimeModule extends HelperRuntimeModule {
  11. /**
  12. * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
  13. */
  14. constructor(runtimeRequirements) {
  15. super("trusted types policy");
  16. this.runtimeRequirements = runtimeRequirements;
  17. }
  18. /**
  19. * @returns {string | null} runtime code
  20. */
  21. generate() {
  22. const compilation = /** @type {Compilation} */ (this.compilation);
  23. const { runtimeTemplate, outputOptions } = compilation;
  24. const { trustedTypes } = outputOptions;
  25. const fn = RuntimeGlobals.getTrustedTypesPolicy;
  26. const wrapPolicyCreationInTryCatch = trustedTypes
  27. ? trustedTypes.onPolicyCreationFailure === "continue"
  28. : false;
  29. return Template.asString([
  30. "var policy;",
  31. `${fn} = ${runtimeTemplate.basicFunction("", [
  32. "// Create Trusted Type policy if Trusted Types are available and the policy doesn't exist yet.",
  33. "if (policy === undefined) {",
  34. Template.indent([
  35. "policy = {",
  36. Template.indent(
  37. [
  38. ...(this.runtimeRequirements.has(RuntimeGlobals.createScript)
  39. ? [
  40. `createScript: ${runtimeTemplate.returningFunction(
  41. "script",
  42. "script"
  43. )}`
  44. ]
  45. : []),
  46. ...(this.runtimeRequirements.has(RuntimeGlobals.createScriptUrl)
  47. ? [
  48. `createScriptURL: ${runtimeTemplate.returningFunction(
  49. "url",
  50. "url"
  51. )}`
  52. ]
  53. : [])
  54. ].join(",\n")
  55. ),
  56. "};",
  57. ...(trustedTypes
  58. ? [
  59. 'if (typeof trustedTypes !== "undefined" && trustedTypes.createPolicy) {',
  60. Template.indent([
  61. ...(wrapPolicyCreationInTryCatch ? ["try {"] : []),
  62. ...[
  63. `policy = trustedTypes.createPolicy(${JSON.stringify(
  64. trustedTypes.policyName
  65. )}, policy);`
  66. ].map(line =>
  67. wrapPolicyCreationInTryCatch ? Template.indent(line) : line
  68. ),
  69. ...(wrapPolicyCreationInTryCatch
  70. ? [
  71. "} catch (e) {",
  72. Template.indent([
  73. `console.warn('Could not create trusted-types policy ${JSON.stringify(
  74. trustedTypes.policyName
  75. )}');`
  76. ]),
  77. "}"
  78. ]
  79. : [])
  80. ]),
  81. "}"
  82. ]
  83. : [])
  84. ]),
  85. "}",
  86. "return policy;"
  87. ])};`
  88. ]);
  89. }
  90. }
  91. module.exports = GetTrustedTypesPolicyRuntimeModule;