8000 Merge pull request #14173 from tosmolka/tosmolka/14075 · webpack/webpack@1ed8aaf · GitHub
[go: up one dir, main page]

Skip to content

Commit 1ed8aaf

Browse files
authored
Merge pull request #14173 from tosmolka/tosmolka/14075
Support Trusted Types in EvalSourceMapDevToolPlugin
2 parents e550b2c + 70da0dd commit 1ed8aaf

12 files changed

+267
-47
lines changed

lib/EvalDevToolModulePlugin.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
const { ConcatSource, RawSource } = require("webpack-sources");
99
const ExternalModule = require("./ExternalModule");
1010
const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
11+
const RuntimeGlobals = require("./RuntimeGlobals");
1112
const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
1213

1314
/** @typedef {import("webpack-sources").Source} Source */
@@ -77,7 +78,13 @@ class EvalDevToolModulePlugin {
7778
.replace(/^\//, "")
7879
);
7980
const result = new RawSource(
80-
`eval(${JSON.stringify(content + footer)});`
81+
`eval(${
82+
compilation.outputOptions.trustedTypes
83+
? `${RuntimeGlobals.createScript}(${JSON.stringify(
84+
content + footer
85+
)})`
86+
: JSON.stringify(content + footer)
87+
});`
8188
);
8289
cache.set(source, result);
8390
return result;
@@ -95,6 +102,14 @@ class EvalDevToolModulePlugin {
95102
hash.update("EvalDevToolModulePlugin");
96103
hash.update("2");
97104
});
105+
if (compilation.outputOptions.trustedTypes) {
106+
compilation.hooks.additionalModuleRuntimeRequirements.tap(
107+
"EvalDevToolModulePlugin",
108+
(module, set, context) => {
109+
set.add(RuntimeGlobals.createScript);
110+
}
111+
);
112+
}
98113
});
99114
}
100115
}

lib/EvalSourceMapDevToolPlugin.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
const { ConcatSource, RawSource } = require("webpack-sources");
99
const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
1010
const NormalModule = require("./NormalModule");
11+
const RuntimeGlobals = require("./RuntimeGlobals");
1112
const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
1213
const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
1314
const ConcatenatedModule = require("./optimize/ConcatenatedModule");
@@ -165,7 +166,15 @@ class EvalSourceMapDevToolPlugin {
165166
) + `\n//# sourceURL=webpack-internal:///${moduleId}\n`; // workaround for chrome bug
166167

167168
return result(
168-
new RawSource(`eval(${JSON.stringify(content + footer)});`)
169+
new RawSource(
170+
`eval(${
171+
compilation.outputOptions.trustedTypes
172+
? `${RuntimeGlobals.createScript}(${JSON.stringify(
173+
content + footer
174+
)})`
175+
: JSON.stringify(content + footer)
176+
});`
177+
)
169178
);
170179
}
171180
);
@@ -181,6 +190,14 @@ class EvalSourceMapDevToolPlugin {
181190
hash.update("EvalSourceMapDevToolPlugin");
182191
hash.update("2");
183192
});
193+
if (compilation.outputOptions.trustedTypes) {
194+
compilation.hooks.additionalModuleRuntimeRequirements.tap(
195+
"EvalSourceMapDevToolPlugin",
196+
(module, set, context) => {
197+
set.add(RuntimeGlobals.createScript);
198+
}
199+
);
200+
}
184201
}
185202
);
186203
}

lib/RuntimeGlobals.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,26 @@ exports.scriptNonce = "__webpack_require__.nc";
168168
*/
169169
exports.loadScript = "__webpack_require__.l";
170170

171+
/**
172+
* function to promote a string to a TrustedScript using webpack's Trusted
173+
* Types policy
174+
* Arguments: (script: string) => TrustedScript
175+
*/
176+
exports.createScript = "__webpack_require__.ts";
177+
171178
/**
172179
* function to promote a string to a TrustedScriptURL using webpack's Trusted
173180
* Types policy
174181
* Arguments: (url: string) => TrustedScriptURL
175182
*/
176183
exports.createScriptUrl = "__webpack_require__.tu";
177184

185+
/**
186+
* function to return webpack's Trusted Types policy
187+
* Arguments: () => TrustedTypePolicy
188+
*/
189+
exports.getTrustedTypesPolicy = "__webpack_require__.tt";
190+
178191
/**
179192
* the chunk name of the chunk with the runtime
180193
*/

lib/RuntimePlugin.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ const AutoPublicPathRuntimeModule = require("./runtime/AutoPublicPathRuntimeModu
1414
const CompatGetDefaultExportRuntimeModule = require("./runtime/CompatGetDefaultExportRuntimeModule");
1515
const CompatRuntimeModule = require("./runtime/CompatRuntimeModule");
1616
const CreateFakeNamespaceObjectRuntimeModule = require("./runtime/CreateFakeNamespaceObjectRuntimeModule");
17+
const CreateScriptRuntimeModule = require("./runtime/CreateScriptRuntimeModule");
1718
const CreateScriptUrlRuntimeModule = require("./runtime/CreateScriptUrlRuntimeModule");
1819
const DefinePropertyGettersRuntimeModule = require("./runtime/DefinePropertyGettersRuntimeModule");
1920
const EnsureChunkRuntimeModule = require("./runtime/EnsureChunkRuntimeModule");
2021
const GetChunkFilenameRuntimeModule = require("./runtime/GetChunkFilenameRuntimeModule");
2122
const GetMainFilenameRuntimeModule = require("./runtime/GetMainFilenameRuntimeModule");
23+
const GetTrustedTypesPolicyRuntimeModule = require("./runtime/GetTrustedTypesPolicyRuntimeModule");
2224
const GlobalRuntimeModule = require("./runtime/GlobalRuntimeModule");
2325
const HasOwnPropertyRuntimeModule = require("./runtime/HasOwnPropertyRuntimeModule");
2426
const LoadScriptRuntimeModule = require("./runtime/LoadScriptRuntimeModule");
@@ -40,7 +42,9 @@ const GLOBALS_ON_REQUIRE = [
4042
RuntimeGlobals.runtimeId,
4143
RuntimeGlobals.compatGetDefaultExport,
4244
RuntimeGlobals.createFakeNamespaceObject,
45+
RuntimeGlobals.createScript,
4346
RuntimeGlobals.createScriptUrl,
47+
RuntimeGlobals.getTrustedTypesPolicy,
4448
RuntimeGlobals.definePropertyGetters,
4549
RuntimeGlobals.ensureChunk,
4650
RuntimeGlobals.entryModuleId,
@@ -364,15 +368,36 @@ class RuntimePlugin {
364368
);
365369
return true;
366370
});
371+
compilation.hooks.runtimeRequirementInTree
372+
.for(RuntimeGlobals.createScript)
373+
.tap("RuntimePlugin", (chunk, set) => {
374+
if (compilation.outputOptions.trustedTypes) {
375+
set.add(RuntimeGlobals.getTrustedTypesPolicy);
376+
}
377+
compilation.addRuntimeModule(chunk, new CreateScriptRuntimeModule());
378+
return true;
379+
});
367380
compilation.hooks.runtimeRequirementInTree
368381
.for(RuntimeGlobals.createScriptUrl)
369382
.tap("RuntimePlugin", (chunk, set) => {
383+
if (compilation.outputOptions.trustedTypes) {
384+
set.add(RuntimeGlobals.getTrustedTypesPolicy);
385+
}
370386
compilation.addRuntimeModule(
371387
chunk,
372388
new CreateScriptUrlRuntimeModule()
373389
);
374390
return true;
375391
});
392+
compilation.hooks.runtimeRequirementInTree
393+
.for(RuntimeGlobals.getTrustedTypesPolicy)
394+
.tap("RuntimePlugin", (chunk, set) => {
395+
compilation.addRuntimeModule(
396+
chunk,
397+
new GetTrustedTypesPolicyRuntimeModule(set)
398+
);
399+
return true;
400+
});
376401
compilation.hooks.runtimeRequirementInTree
377402
.for(RuntimeGlobals.relativeUrl)
378403
.ta 10000 p("RuntimePlugin", (chunk, set) => {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
*/
4+
5+
"use strict";
6+
7+
const RuntimeGlobals = require("../RuntimeGlobals");
8+
const Template = require("../Template");
9+
const HelperRuntimeModule = require("./HelperRuntimeModule");
10+
11+
class CreateScriptRuntimeModule extends HelperRuntimeModule {
12+
constructor() {
13+
super("trusted types script");
14+
}
15+
16+
/**
17+
* @returns {string} runtime code
18+
*/
19+
generate() {
20+
const { compilation } = this;
21+
const { runtimeTemplate, outputOptions } = compilation;
22+
const { trustedTypes } = outputOptions;
23+
const fn = RuntimeGlobals.createScript;
24+
25+
return Template.asString(
26+
`${fn} = ${runtimeTemplate.returningFunction(
27+
trustedTypes
28+
? `${RuntimeGlobals.getTrustedTypesPolicy}().createScript(script)`
29+
: "script",
30+
"script"
31+
)};`
32+
);
33+
}
34+
}
35+
36+
module.exports = CreateScriptRuntimeModule;

lib/runtime/CreateScriptUrlRuntimeModule.js

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const HelperRuntimeModule = require("./HelperRuntimeModule");
1010

1111
class CreateScriptUrlRuntimeModule extends HelperRuntimeModule {
1212
constructor() {
13-
super("trusted types");
13+
super("trusted types script url");
1414
}
1515

1616
/**
@@ -22,39 +22,14 @@ class CreateScriptUrlRuntimeModule extends HelperRuntimeModule {
2222
const { trustedTypes } = outputOptions;
2323
const fn = RuntimeGlobals.createScriptUrl;
2424

25-
if (!trustedTypes) {
26-
// Skip Trusted Types logic.
27-
return Template.asString([
28-
`${fn} = ${runtimeTemplate.returningFunction("url", "url")};`
29-
]);
30-
}
31-
32-
return Template.asString([
33-
"var policy;",
34-
`${fn} = ${runtimeTemplate.basicFunction("url", [
35-
"// Create Trusted Type policy if Trusted Types are available and the policy doesn't exist yet.",
36-
"if (policy === undefined) {",
37-
Template.indent([
38-
"policy = {",
39-
Template.indent([
40-
`createScriptURL: ${runtimeTemplate.returningFunction(
41-
"url",
42-
"url"
43-
)}`
44-
]),
45-
"};",
46-
'if (typeof trustedTypes !== "undefined" && trustedTypes.createPolicy) {',
47-
Template.indent([
48-
`policy = trustedTypes.createPolicy(${JSON.stringify(
49-
trustedTypes.policyName
50-
)}, policy);`
51-
]),
52-
"}"
53-
]),
54-
"}",
55-
"return policy.createScriptURL(url);"
56-
])};`
57-
]);
25+
return Template.asString(
26+
`${fn} = ${runtimeTemplate.returningFunction(
27+
trustedTypes
28+
? `${RuntimeGlobals.getTrustedTypesPolicy}().createScriptURL(url)`
29+
: "url",
30+
"url"
31+
)};`
32+
);
5833
}
5934
}
6035

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
*/
4+
5+
"use strict";
6+
7+
const RuntimeGlobals = require("../RuntimeGlobals");
8+
const Template = require("../Template");
9+
const HelperRuntimeModule = require("./HelperRuntimeModule");
10+
11+
class GetTrustedTypesPolicyRuntimeModule extends HelperRuntimeModule {
12+
/**
13+
* @param {Set<string>} runtimeRequirements runtime requirements
14+
*/
15+
constructor(runtimeRequirements) {
16+
super("trusted types policy");
17+
this.runtimeRequirements = runtimeRequirements;
18+
}
19+
20+
/**
21+
* @returns {string} runtime code
22+
*/
23+
generate() {
24+
const { compilation } = this;
25+
const { runtimeTemplate, outputOptions } = compilation;
26+
const { trustedTypes } = outputOptions;
27+
const fn = RuntimeGlobals.getTrustedTypesPolicy;
28+
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+
`policy = trustedTypes.createPolicy(${JSON.stringify(
62+
trustedTypes.policyName
63+
)}, policy);`
64+
]),
65+
"}"
66+
]
67+
: [])
68+
]),
69+
"}",
70+
"return policy;"
71+
])};`
72+
]);
73+
}
74+
}
75+
76+
module.exports = GetTrustedTypesPolicyRuntimeModule;

lib/webworker/ImportScriptsChunkLoadingPlugin.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
"use strict";
77

88
const RuntimeGlobals = require("../RuntimeGlobals");
9-
const CreateScriptUrlRuntimeModule = require("../runtime/CreateScriptUrlRuntimeModule");
109
const StartupChunkDependenciesPlugin = require("../runtime/StartupChunkDependenciesPlugin");
1110
const ImportScriptsChunkLoadingRuntimeModule = require("./ImportScriptsChunkLoadingRuntimeModule");
1211

@@ -43,7 +42,9 @@ class ImportScriptsChunkLoadingPlugin {
4342
const withCreateScriptUrl = !!compilation.outputOptions.trustedTypes;
4443
set.add(RuntimeGlobals.moduleFactoriesAddOnly);
4544
set.add(RuntimeGlobals.hasOwnProperty);
46-
if (withCreateScriptUrl) set.add(RuntimeGlobals.createScriptUrl);
45+
if (withCreateScriptUrl) {
46+
set.add(RuntimeGlobals.createScriptUrl);
47+
}
4748
compilation.addRuntimeModule(
4849
chunk,
4950
new ImportScriptsChunkLoadingRuntimeModule(set, withCreateScriptUrl)
@@ -61,15 +62,6 @@ class ImportScriptsChunkLoadingPlugin {
6162
compilation.hooks.runtimeRequirementInTree
6263
.for(RuntimeGlobals.baseURI)
6364
.tap("ImportScriptsChunkLoadingPlugin", handler);
64-
compilation.hooks.runtimeRequirementInTree
65-
.for(RuntimeGlobals.createScriptUrl)
66-
.tap("RuntimePlugin", (chunk, set) => {
67-
compilation.addRuntimeModule(
68-
chunk,
69-
new CreateScriptUrlRuntimeModule()
70-
);
71-
return true;
72-
});
7365

7466
compilation.hooks.runtimeRequirementInTree
7567
.for(RuntimeGlobals.ensureChunkHandlers)

0 commit comments

Comments
 (0)
0