From 1339272be6c40b3ebd8e10048611c091494fcdcd Mon Sep 17 00:00:00 2001 From: Tobias Smolka Date: Tue, 7 Sep 2021 12:40:07 +0200 Subject: [PATCH 1/6] Support Trusted Types in EvalSourceMapDevToolPlugin --- lib/EvalDevToolModulePlugin.js | 17 ++++- lib/EvalSourceMapDevToolPlugin.js | 19 ++++- lib/RuntimeGlobals.js | 13 ++++ lib/RuntimePlugin.js | 26 +++++++ lib/dependencies/CreateScriptUrlDependency.js | 1 + lib/runtime/CreateScriptRuntimeModule.js | 36 +++++++++ lib/runtime/CreateScriptUrlRuntimeModule.js | 43 +++-------- .../GetTrustedTypesPolicyRuntimeModule.js | 76 +++++++++++++++++++ .../ImportScriptsChunkLoadingPlugin.js | 5 +- .../trusted-types/devtool-eval/index.js | 34 +++++++++ .../trusted-types/devtool-eval/test.js | 5 ++ .../devtool-eval/webpack.config.js | 19 +++++ 12 files changed, 257 insertions(+), 37 deletions(-) create mode 100644 lib/runtime/CreateScriptRuntimeModule.js create mode 100644 lib/runtime/GetTrustedTypesPolicyRuntimeModule.js create mode 100644 test/configCases/trusted-types/devtool-eval/index.js create mode 100644 test/configCases/trusted-types/devtool-eval/test.js create mode 100644 test/configCases/trusted-types/devtool-eval/webpack.config.js diff --git a/lib/EvalDevToolModulePlugin.js b/lib/EvalDevToolModulePlugin.js index 59c80a00449..7bb46dafa24 100644 --- a/lib/EvalDevToolModulePlugin.js +++ b/lib/EvalDevToolModulePlugin.js @@ -9,6 +9,7 @@ const { ConcatSource, RawSource } = require("webpack-sources"); const ExternalModule = require("./ExternalModule"); const ModuleFilenameHelpers = require("./ModuleFilenameHelpers"); const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin"); +const RuntimeGlobals = require("./RuntimeGlobals"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("./Compiler")} Compiler */ @@ -76,7 +77,13 @@ class EvalDevToolModulePlugin { .replace(/^\//, "") ); const result = new RawSource( - `eval(${JSON.stringify(content + footer)});` + `eval(${ + compilation.outputOptions.trustedTypes + ? `${RuntimeGlobals.createScript}(${JSON.stringify( + content + footer + )})` + : JSON.stringify(content + footer) + });` ); cache.set(source, result); return result; @@ -94,6 +101,14 @@ class EvalDevToolModulePlugin { hash.update("EvalDevToolModulePlugin"); hash.update("2"); }); + if (compilation.outputOptions.trustedTypes) { + compilation.hooks.additionalModuleRuntimeRequirements.tap( + "EvalDevToolModulePlugin", + (module, set, context) => { + set.add(RuntimeGlobals.createScript); + } + ); + } }); } } diff --git a/lib/EvalSourceMapDevToolPlugin.js b/lib/EvalSourceMapDevToolPlugin.js index fefaa2e9e7d..7bee36237a9 100644 --- a/lib/EvalSourceMapDevToolPlugin.js +++ b/lib/EvalSourceMapDevToolPlugin.js @@ -12,6 +12,7 @@ const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOpt const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin"); const ConcatenatedModule = require("./optimize/ConcatenatedModule"); const { makePathsAbsolute } = require("./util/identifier"); +const RuntimeGlobals = require("./RuntimeGlobals"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("../declarations/WebpackOptions").DevTool} DevToolOptions */ @@ -164,7 +165,15 @@ class EvalSourceMapDevToolPlugin { ) + `\n//# sourceURL=webpack-internal:///${moduleId}\n`; // workaround for chrome bug return result( - new RawSource(`eval(${JSON.stringify(content + footer)});`) + new RawSource( + `eval(${ + compilation.outputOptions.trustedTypes + ? `${RuntimeGlobals.createScript}(${JSON.stringify( + content + footer + )})` + : JSON.stringify(content + footer) + });` + ) ); } ); @@ -180,6 +189,14 @@ class EvalSourceMapDevToolPlugin { hash.update("EvalSourceMapDevToolPlugin"); hash.update("2"); }); + if (compilation.outputOptions.trustedTypes) { + compilation.hooks.additionalModuleRuntimeRequirements.tap( + "EvalSourceMapDevToolPlugin", + (module, set, context) => { + set.add(RuntimeGlobals.createScript); + } + ); + } } ); } diff --git a/lib/RuntimeGlobals.js b/lib/RuntimeGlobals.js index 79d5ad5c633..6a7a6cfcdee 100644 --- a/lib/RuntimeGlobals.js +++ b/lib/RuntimeGlobals.js @@ -168,6 +168,13 @@ exports.scriptNonce = "__webpack_require__.nc"; */ exports.loadScript = "__webpack_require__.l"; +/** + * function to promote a string to a TrustedScript using webpack's Trusted + * Types policy + * Arguments: (script: string) => TrustedScript + */ +exports.createScript = "__webpack_require__.ts"; + /** * function to promote a string to a TrustedScriptURL using webpack's Trusted * Types policy @@ -175,6 +182,12 @@ exports.loadScript = "__webpack_require__.l"; */ exports.createScriptUrl = "__webpack_require__.tu"; +/** + * function to return webpack's Trusted Types policy + * Arguments: () => TrustedTypePolicy + */ +exports.getTrustedTypesPolicy = "__webpack_require__.tt"; + /** * the chunk name of the chunk with the runtime */ diff --git a/lib/RuntimePlugin.js b/lib/RuntimePlugin.js index 5ab0b7d78ef..956b204ac7a 100644 --- a/lib/RuntimePlugin.js +++ b/lib/RuntimePlugin.js @@ -13,7 +13,9 @@ const AutoPublicPathRuntimeModule = require("./runtime/AutoPublicPathRuntimeModu const CompatGetDefaultExportRuntimeModule = require("./runtime/CompatGetDefaultExportRuntimeModule"); const CompatRuntimeModule = require("./runtime/CompatRuntimeModule"); const CreateFakeNamespaceObjectRuntimeModule = require("./runtime/CreateFakeNamespaceObjectRuntimeModule"); +const CreateScriptRuntimeModule = require("./runtime/CreateScriptRuntimeModule"); const CreateScriptUrlRuntimeModule = require("./runtime/CreateScriptUrlRuntimeModule"); +const GetTrustedTypesPolicyRuntimeModule = require("./runtime/GetTrustedTypesPolicyRuntimeModule"); const DefinePropertyGettersRuntimeModule = require("./runtime/DefinePropertyGettersRuntimeModule"); const EnsureChunkRuntimeModule = require("./runtime/EnsureChunkRuntimeModule"); const GetChunkFilenameRuntimeModule = require("./runtime/GetChunkFilenameRuntimeModule"); @@ -39,7 +41,9 @@ const GLOBALS_ON_REQUIRE = [ RuntimeGlobals.runtimeId, RuntimeGlobals.compatGetDefaultExport, RuntimeGlobals.createFakeNamespaceObject, + RuntimeGlobals.createScript, RuntimeGlobals.createScriptUrl, + RuntimeGlobals.getTrustedTypesPolicy, RuntimeGlobals.definePropertyGetters, RuntimeGlobals.ensureChunk, RuntimeGlobals.entryModuleId, @@ -323,6 +327,7 @@ class RuntimePlugin { .tap("RuntimePlugin", (chunk, set) => { const withCreateScriptUrl = !!compilation.outputOptions.trustedTypes; if (withCreateScriptUrl) { + set.add(RuntimeGlobals.getTrustedTypesPolicy); set.add(RuntimeGlobals.createScriptUrl); } compilation.addRuntimeModule( @@ -331,15 +336,36 @@ class RuntimePlugin { ); return true; }); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.createScript) + .tap("RuntimePlugin", (chunk, set) => { + if (compilation.outputOptions.trustedTypes) { + set.add(RuntimeGlobals.getTrustedTypesPolicy); + } + compilation.addRuntimeModule(chunk, new CreateScriptRuntimeModule()); + return true; + }); compilation.hooks.runtimeRequirementInTree .for(RuntimeGlobals.createScriptUrl) .tap("RuntimePlugin", (chunk, set) => { + if (compilation.outputOptions.trustedTypes) { + set.add(RuntimeGlobals.getTrustedTypesPolicy); + } compilation.addRuntimeModule( chunk, new CreateScriptUrlRuntimeModule() ); return true; }); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.getTrustedTypesPolicy) + .tap("RuntimePlugin", (chunk, set) => { + compilation.addRuntimeModule( + chunk, + new GetTrustedTypesPolicyRuntimeModule(set) + ); + return true; + }); compilation.hooks.runtimeRequirementInTree .for(RuntimeGlobals.relativeUrl) .tap("RuntimePlugin", (chunk, set) => { diff --git a/lib/dependencies/CreateScriptUrlDependency.js b/lib/dependencies/CreateScriptUrlDependency.js index 08890144a60..00fe8e6df5b 100644 --- a/lib/dependencies/CreateScriptUrlDependency.js +++ b/lib/dependencies/CreateScriptUrlDependency.js @@ -39,6 +39,7 @@ CreateScriptUrlDependency.Template = class CreateScriptUrlDependencyTemplate ext apply(dependency, source, { runtimeRequirements }) { const dep = /** @type {CreateScriptUrlDependency} */ (dependency); + runtimeRequirements.add(RuntimeGlobals.getTrustedTypesPolicy); runtimeRequirements.add(RuntimeGlobals.createScriptUrl); source.insert(dep.range[0], `${RuntimeGlobals.createScriptUrl}(`); diff --git a/lib/runtime/CreateScriptRuntimeModule.js b/lib/runtime/CreateScriptRuntimeModule.js new file mode 100644 index 00000000000..ad174fa4d93 --- /dev/null +++ b/lib/runtime/CreateScriptRuntimeModule.js @@ -0,0 +1,36 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const Template = require("../Template"); +const HelperRuntimeModule = require("./HelperRuntimeModule"); + +class CreateScriptRuntimeModule extends HelperRuntimeModule { + constructor() { + super("trusted types script"); + } + + /** + * @returns {string} runtime code + */ + generate() { + const { compilation } = this; + const { runtimeTemplate, outputOptions } = compilation; + const { trustedTypes } = outputOptions; + const fn = RuntimeGlobals.createScript; + + return Template.asString( + `${fn} = ${runtimeTemplate.returningFunction( + trustedTypes + ? `${RuntimeGlobals.getTrustedTypesPolicy}().createScript(script)` + : "script", + "script" + )};` + ); + } +} + +module.exports = CreateScriptRuntimeModule; diff --git a/lib/runtime/CreateScriptUrlRuntimeModule.js b/lib/runtime/CreateScriptUrlRuntimeModule.js index d12b92caac8..63a5b0eada2 100644 --- a/lib/runtime/CreateScriptUrlRuntimeModule.js +++ b/lib/runtime/CreateScriptUrlRuntimeModule.js @@ -10,7 +10,7 @@ const HelperRuntimeModule = require("./HelperRuntimeModule"); class CreateScriptUrlRuntimeModule extends HelperRuntimeModule { constructor() { - super("trusted types"); + super("trusted types script url"); } /** @@ -22,39 +22,14 @@ class CreateScriptUrlRuntimeModule extends HelperRuntimeModule { const { trustedTypes } = outputOptions; const fn = RuntimeGlobals.createScriptUrl; - if (!trustedTypes) { - // Skip Trusted Types logic. - return Template.asString([ - `${fn} = ${runtimeTemplate.returningFunction("url", "url")};` - ]); - } - - return Template.asString([ - "var policy;", - `${fn} = ${runtimeTemplate.basicFunction("url", [ - "// Create Trusted Type policy if Trusted Types are available and the policy doesn't exist yet.", - "if (policy === undefined) {", - Template.indent([ - "policy = {", - Template.indent([ - `createScriptURL: ${runtimeTemplate.returningFunction( - "url", - "url" - )}` - ]), - "};", - 'if (typeof trustedTypes !== "undefined" && trustedTypes.createPolicy) {', - Template.indent([ - `policy = trustedTypes.createPolicy(${JSON.stringify( - trustedTypes.policyName - )}, policy);` - ]), - "}" - ]), - "}", - "return policy.createScriptURL(url);" - ])};` - ]); + return Template.asString( + `${fn} = ${runtimeTemplate.returningFunction( + trustedTypes + ? `${RuntimeGlobals.getTrustedTypesPolicy}().createScriptURL(url)` + : "url", + "url" + )};` + ); } } diff --git a/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js b/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js new file mode 100644 index 00000000000..9f719e3ac1b --- /dev/null +++ b/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js @@ -0,0 +1,76 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const Template = require("../Template"); +const HelperRuntimeModule = require("./HelperRuntimeModule"); + +class GetTrustedTypesPolicyRuntimeModule extends HelperRuntimeModule { + /** + * @param {Set} runtimeRequirements runtime requirements + */ + constructor(runtimeRequirements) { + super("trusted types policy"); + this.runtimeRequirements = runtimeRequirements; + } + + /** + * @returns {string} runtime code + */ + generate() { + const { compilation } = this; + const { runtimeTemplate, outputOptions } = compilation; + const { trustedTypes } = outputOptions; + const fn = RuntimeGlobals.getTrustedTypesPolicy; + + return Template.asString([ + "var policy;", + `${fn} = ${runtimeTemplate.basicFunction("", [ + "// Create Trusted Type policy if Trusted Types are available and the policy doesn't exist yet.", + "if (policy === undefined) {", + Template.indent([ + "policy = {", + Template.indent( + [ + ...(this.runtimeRequirements.has(RuntimeGlobals.createScript) + ? [ + `createScript: ${runtimeTemplate.returningFunction( + "script", + "script" + )}` + ] + : []), + ...(this.runtimeRequirements.has(RuntimeGlobals.createScriptUrl) + ? [ + `createScriptURL: ${runtimeTemplate.returningFunction( + "url", + "url" + )}` + ] + : []) + ].join(",\n") + ), + "};", + ...(trustedTypes + ? [ + 'if (typeof trustedTypes !== "undefined" && trustedTypes.createPolicy) {', + Template.indent([ + `policy = trustedTypes.createPolicy(${JSON.stringify( + trustedTypes.policyName + )}, policy);` + ]), + "}" + ] + : []) + ]), + "}", + "return policy;" + ])};` + ]); + } +} + +module.exports = GetTrustedTypesPolicyRuntimeModule; diff --git a/lib/webworker/ImportScriptsChunkLoadingPlugin.js b/lib/webworker/ImportScriptsChunkLoadingPlugin.js index e14f384ffdb..c0d417dd0ec 100644 --- a/lib/webworker/ImportScriptsChunkLoadingPlugin.js +++ b/lib/webworker/ImportScriptsChunkLoadingPlugin.js @@ -43,7 +43,10 @@ class ImportScriptsChunkLoadingPlugin { const withCreateScriptUrl = !!compilation.outputOptions.trustedTypes; set.add(RuntimeGlobals.moduleFactoriesAddOnly); set.add(RuntimeGlobals.hasOwnProperty); - if (withCreateScriptUrl) set.add(RuntimeGlobals.createScriptUrl); + if (withCreateScriptUrl) { + set.add(RuntimeGlobals.getTrustedTypesPolicy); + set.add(RuntimeGlobals.createScriptUrl); + } compilation.addRuntimeModule( chunk, new ImportScriptsChunkLoadingRuntimeModule(set, withCreateScriptUrl) diff --git a/test/configCases/trusted-types/devtool-eval/index.js b/test/configCases/trusted-types/devtool-eval/index.js new file mode 100644 index 00000000000..c87c08d9c34 --- /dev/null +++ b/test/configCases/trusted-types/devtool-eval/index.js @@ -0,0 +1,34 @@ +it("should pass TrustedScript to eval", function() { + class TrustedScript { + constructor(script) { + this._script = script; + } + }; + + var policy = __webpack_require__.tt(); + policy.createScript = jest.fn((script) => { + expect(typeof script).toEqual("string"); + return new TrustedScript(script); + }); + + const globalEval = eval; + window.module = {}; + window.eval = jest.fn((x) => { + expect(x).toBeInstanceOf(TrustedScript); + return globalEval(x._script); + }); + + require("./test.js"); + expect(window.module.exports).toBeInstanceOf(Object); + expect(window.module.exports.foo).toEqual('bar'); + + const testPattern = "var test = {\\s*foo: \'bar\'\\s*};\\s*module.exports = test;"; + expect(policy.createScript).toBeCalledWith( + expect.stringMatching(testPattern) + ); + expect(window.eval).toBeCalledWith( + expect.objectContaining({ + _script: expect.stringMatching(testPattern) + }) + ); +}); diff --git a/test/configCases/trusted-types/devtool-eval/test.js b/test/configCases/trusted-types/devtool-eval/test.js new file mode 100644 index 00000000000..0c72e78b18d --- /dev/null +++ b/test/configCases/trusted-types/devtool-eval/test.js @@ -0,0 +1,5 @@ +var test = { + foo: 'bar' +}; + +module.exports = test; diff --git a/test/configCases/trusted-types/devtool-eval/webpack.config.js b/test/configCases/trusted-types/devtool-eval/webpack.config.js new file mode 100644 index 00000000000..c24db96e194 --- /dev/null +++ b/test/configCases/trusted-types/devtool-eval/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web", + output: { + filename: "bundle0.js", + trustedTypes: true + }, + devtool: "eval-source-map" + }, + { + target: "web", + output: { + filename: "bundle1.js", + trustedTypes: true + }, + devtool: "eval" + } +] From ba5bda1dca7eb30cb9d7b6f4ac22f2888b24fe0a Mon Sep 17 00:00:00 2001 From: Tobias Smolka Date: Wed, 8 Sep 2021 12:57:40 +0200 Subject: [PATCH 2/6] Fix linting errors --- test/configCases/trusted-types/devtool-eval/webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/configCases/trusted-types/devtool-eval/webpack.config.js b/test/configCases/trusted-types/devtool-eval/webpack.config.js index c24db96e194..1356571fd81 100644 --- a/test/configCases/trusted-types/devtool-eval/webpack.config.js +++ b/test/configCases/trusted-types/devtool-eval/webpack.config.js @@ -16,4 +16,4 @@ module.exports = [ }, devtool: "eval" } -] +]; From 59aa7b7c0b9956b823eabf250c3e02baa1e81ca1 Mon Sep 17 00:00:00 2001 From: Tobias Smolka Date: Wed, 8 Sep 2021 13:09:01 +0200 Subject: [PATCH 3/6] Fix linting errors --- lib/EvalDevToolModulePlugin.js | 2 +- lib/EvalSourceMapDevToolPlugin.js | 2 +- lib/RuntimePlugin.js | 2 +- types.d.ts | 3 +++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/EvalDevToolModulePlugin.js b/lib/EvalDevToolModulePlugin.js index 7bb46dafa24..2de2c88144b 100644 --- a/lib/EvalDevToolModulePlugin.js +++ b/lib/EvalDevToolModulePlugin.js @@ -8,8 +8,8 @@ const { ConcatSource, RawSource } = require("webpack-sources"); const ExternalModule = require("./ExternalModule"); const ModuleFilenameHelpers = require("./ModuleFilenameHelpers"); -const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin"); const RuntimeGlobals = require("./RuntimeGlobals"); +const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("./Compiler")} Compiler */ diff --git a/lib/EvalSourceMapDevToolPlugin.js b/lib/EvalSourceMapDevToolPlugin.js index 7bee36237a9..b5301c88aa5 100644 --- a/lib/EvalSourceMapDevToolPlugin.js +++ b/lib/EvalSourceMapDevToolPlugin.js @@ -8,11 +8,11 @@ const { ConcatSource, RawSource } = require("webpack-sources"); const ModuleFilenameHelpers = require("./ModuleFilenameHelpers"); const NormalModule = require("./NormalModule"); +const RuntimeGlobals = require("./RuntimeGlobals"); const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin"); const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin"); const ConcatenatedModule = require("./optimize/ConcatenatedModule"); const { makePathsAbsolute } = require("./util/identifier"); -const RuntimeGlobals = require("./RuntimeGlobals"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("../declarations/WebpackOptions").DevTool} DevToolOptions */ diff --git a/lib/RuntimePlugin.js b/lib/RuntimePlugin.js index 956b204ac7a..33a77b0fb22 100644 --- a/lib/RuntimePlugin.js +++ b/lib/RuntimePlugin.js @@ -15,11 +15,11 @@ const CompatRuntimeModule = require("./runtime/CompatRuntimeModule"); const CreateFakeNamespaceObjectRuntimeModule = require("./runtime/CreateFakeNamespaceObjectRuntimeModule"); const CreateScriptRuntimeModule = require("./runtime/CreateScriptRuntimeModule"); const CreateScriptUrlRuntimeModule = require("./runtime/CreateScriptUrlRuntimeModule"); -const GetTrustedTypesPolicyRuntimeModule = require("./runtime/GetTrustedTypesPolicyRuntimeModule"); const DefinePropertyGettersRuntimeModule = require("./runtime/DefinePropertyGettersRuntimeModule"); const EnsureChunkRuntimeModule = require("./runtime/EnsureChunkRuntimeModule"); const GetChunkFilenameRuntimeModule = require("./runtime/GetChunkFilenameRuntimeModule"); const GetMainFilenameRuntimeModule = require("./runtime/GetMainFilenameRuntimeModule"); +const GetTrustedTypesPolicyRuntimeModule = require("./runtime/GetTrustedTypesPolicyRuntimeModule"); const GlobalRuntimeModule = require("./runtime/GlobalRuntimeModule"); const HasOwnPropertyRuntimeModule = require("./runtime/HasOwnPropertyRuntimeModule"); const LoadScriptRuntimeModule = require("./runtime/LoadScriptRuntimeModule"); diff --git a/types.d.ts b/types.d.ts index 6ee0078061c..07cc49cd504 100644 --- a/types.d.ts +++ b/types.d.ts @@ -6139,6 +6139,7 @@ declare interface LoaderRunnerLoaderContext { /** * An array of all the loaders. It is writeable in the pitch phase. * loaders = [{request: string, path: string, query: string, module: function}] + * * In the example: * [ * { request: "/abc/loader1.js?xyz", @@ -12062,7 +12063,9 @@ declare namespace exports { export let uncaughtErrorHandler: string; export let scriptNonce: string; export let loadScript: string; + export let createScript: string; export let createScriptUrl: string; + export let getTrustedTypesPolicy: string; export let chunkName: string; export let runtimeId: string; export let getChunkScriptFilename: string; From dcbba885ba85129a46372957304ae3bc8fab2be7 Mon Sep 17 00:00:00 2001 From: Tobias Smolka Date: Wed, 8 Sep 2021 14:58:29 +0200 Subject: [PATCH 4/6] Fix linting errors --- types.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/types.d.ts b/types.d.ts index 07cc49cd504..8a7c6a8c1be 100644 --- a/types.d.ts +++ b/types.d.ts @@ -6139,7 +6139,6 @@ declare interface LoaderRunnerLoaderContext { /** * An array of all the loaders. It is writeable in the pitch phase. * loaders = [{request: string, path: string, query: string, module: function}] - * * In the example: * [ * { request: "/abc/loader1.js?xyz", From 0670cf5ba424e5034b4552ef2b7338c4fbcf4522 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 20 Jan 2022 15:54:40 +0100 Subject: [PATCH 5/6] remove unneeded transitive runtime requirement --- lib/RuntimePlugin.js | 1 - lib/dependencies/CreateScriptUrlDependency.js | 1 - lib/webworker/ImportScriptsChunkLoadingPlugin.js | 11 ----------- 3 files changed, 13 deletions(-) diff --git a/lib/RuntimePlugin.js b/lib/RuntimePlugin.js index 33a77b0fb22..4f6faddd70f 100644 --- a/lib/RuntimePlugin.js +++ b/lib/RuntimePlugin.js @@ -327,7 +327,6 @@ class RuntimePlugin { .tap("RuntimePlugin", (chunk, set) => { const withCreateScriptUrl = !!compilation.outputOptions.trustedTypes; if (withCreateScriptUrl) { - set.add(RuntimeGlobals.getTrustedTypesPolicy); set.add(RuntimeGlobals.createScriptUrl); } compilation.addRuntimeModule( diff --git a/lib/dependencies/CreateScriptUrlDependency.js b/lib/dependencies/CreateScriptUrlDependency.js index 00fe8e6df5b..08890144a60 100644 --- a/lib/dependencies/CreateScriptUrlDependency.js +++ b/lib/dependencies/CreateScriptUrlDependency.js @@ -39,7 +39,6 @@ CreateScriptUrlDependency.Template = class CreateScriptUrlDependencyTemplate ext apply(dependency, source, { runtimeRequirements }) { const dep = /** @type {CreateScriptUrlDependency} */ (dependency); - runtimeRequirements.add(RuntimeGlobals.getTrustedTypesPolicy); runtimeRequirements.add(RuntimeGlobals.createScriptUrl); source.insert(dep.range[0], `${RuntimeGlobals.createScriptUrl}(`); diff --git a/lib/webworker/ImportScriptsChunkLoadingPlugin.js b/lib/webworker/ImportScriptsChunkLoadingPlugin.js index c0d417dd0ec..b0dda12cb0c 100644 --- a/lib/webworker/ImportScriptsChunkLoadingPlugin.js +++ b/lib/webworker/ImportScriptsChunkLoadingPlugin.js @@ -6,7 +6,6 @@ "use strict"; const RuntimeGlobals = require("../RuntimeGlobals"); -const CreateScriptUrlRuntimeModule = require("../runtime/CreateScriptUrlRuntimeModule"); const StartupChunkDependenciesPlugin = require("../runtime/StartupChunkDependenciesPlugin"); const ImportScriptsChunkLoadingRuntimeModule = require("./ImportScriptsChunkLoadingRuntimeModule"); @@ -44,7 +43,6 @@ class ImportScriptsChunkLoadingPlugin { set.add(RuntimeGlobals.moduleFactoriesAddOnly); set.add(RuntimeGlobals.hasOwnProperty); if (withCreateScriptUrl) { - set.add(RuntimeGlobals.getTrustedTypesPolicy); set.add(RuntimeGlobals.createScriptUrl); } compilation.addRuntimeModule( @@ -64,15 +62,6 @@ class ImportScriptsChunkLoadingPlugin { compilation.hooks.runtimeRequirementInTree .for(RuntimeGlobals.baseURI) .tap("ImportScriptsChunkLoadingPlugin", handler); - compilation.hooks.runtimeRequirementInTree - .for(RuntimeGlobals.createScriptUrl) - .tap("RuntimePlugin", (chunk, set) => { - compilation.addRuntimeModule( - chunk, - new CreateScriptUrlRuntimeModule() - ); - return true; - }); compilation.hooks.runtimeRequirementInTree .for(RuntimeGlobals.ensureChunkHandlers) From 70da0dd0432299c674e603fd1efd4d321ad1fa60 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 20 Jan 2022 16:35:35 +0100 Subject: [PATCH 6/6] improve test case --- .../trusted-types/devtool-eval/index.js | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/test/configCases/trusted-types/devtool-eval/index.js b/test/configCases/trusted-types/devtool-eval/index.js index c87c08d9c34..5499320847f 100644 --- a/test/configCases/trusted-types/devtool-eval/index.js +++ b/test/configCases/trusted-types/devtool-eval/index.js @@ -1,28 +1,16 @@ -it("should pass TrustedScript to eval", function() { - class TrustedScript { - constructor(script) { - this._script = script; - } - }; - +it("should pass TrustedScript to eval", function () { var policy = __webpack_require__.tt(); - policy.createScript = jest.fn((script) => { + policy.createScript = jest.fn(script => { expect(typeof script).toEqual("string"); return new TrustedScript(script); }); - const globalEval = eval; - window.module = {}; - window.eval = jest.fn((x) => { - expect(x).toBeInstanceOf(TrustedScript); - return globalEval(x._script); - }); - require("./test.js"); expect(window.module.exports).toBeInstanceOf(Object); - expect(window.module.exports.foo).toEqual('bar'); + expect(window.module.exports.foo).toEqual("bar"); - const testPattern = "var test = {\\s*foo: \'bar\'\\s*};\\s*module.exports = test;"; + const testPattern = + "var test = {\\s*foo: 'bar'\\s*};\\s*module.exports = test;"; expect(policy.createScript).toBeCalledWith( expect.stringMatching(testPattern) ); @@ -32,3 +20,26 @@ it("should pass TrustedScript to eval", function() { }) ); }); + +class TrustedScript { + constructor(script) { + this._script = script; + } +} + +let globalEval; +beforeEach(done => { + globalEval = eval; + window.module = {}; + window.eval = jest.fn(x => { + expect(x).toBeInstanceOf(TrustedScript); + return globalEval(x._script); + }); + done(); +}); + +afterEach(done => { + delete window.module; + window.eval = globalEval; + done(); +});