Version 2.15.0-170.0.dev

Merge commit '5fbde4d85036320b51130ab3bfee827728c682dd' into 'dev'
diff --git a/pkg/analyzer/README.md b/pkg/analyzer/README.md
index f574d8c..d35c78b 100644
--- a/pkg/analyzer/README.md
+++ b/pkg/analyzer/README.md
@@ -70,7 +70,7 @@
 
 Many tools embed this library, such as:
 
-* [dartfmt] - a formatter for Dart code
+* [dart format] - a formatter for Dart code
 * [dartdoc] - a documentation generator for Dart code
 * [Dart Analysis Server][analysis_sever] - a stateful server that supports IDEs and editors
 
@@ -102,7 +102,7 @@
 [lintrules]: https://dart-lang.github.io/linter/lints/
 [glob]: https://pub.dev/packages/glob
 [LICENSE]: https://github.com/dart-lang/sdk/blob/main/pkg/analyzer/LICENSE
-[dartfmt]: https://github.com/dart-lang/dart_style
+[dart format]: https://github.com/dart-lang/dart_style
 [dartdoc]: https://github.com/dart-lang/dartdoc
 [analysis_sever]: https://github.com/dart-lang/sdk/tree/main/pkg/analysis_server
 [custom_analysis]: https://dart.dev/guides/language/analysis-options
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 7a72775..09293fc 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -94,7 +94,6 @@
   static const String trustTypeAnnotations = '--trust-type-annotations';
   static const String trustJSInteropTypeAnnotations =
       '--experimental-trust-js-interop-type-annotations';
-  static const String useContentSecurityPolicy = '--csp';
   static const String useMultiSourceInfo = '--use-multi-source-info';
   static const String useNewSourceInfo = '--use-new-source-info';
   static const String useOldRti = '--use-old-rti';
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index bc0d02d..139ebfe 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -601,7 +601,6 @@
     OptionHandler('--disallow-unsafe-eval', ignoreOption),
     OptionHandler(Option.showPackageWarnings, passThrough),
     OptionHandler(Option.enableLanguageExperiments, passThrough),
-    OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     OptionHandler('--enable-experimental-mirrors', ignoreOption),
     OptionHandler(Flags.enableAssertMessage, passThrough),
     OptionHandler('--strong', ignoreOption),
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index 21e2959..638d53d 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -291,7 +291,7 @@
   }
 
   jsAst.Statement instanceTearOffGetter;
-  if (options.useContentSecurityPolicy) {
+  if (options.features.useContentSecurityPolicy.isEnabled) {
     instanceTearOffGetter = js.statement(
       '''
       function instanceTearOffGetter(isIntercepted, parameters) {
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 009853e..de9ddca 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -362,7 +362,6 @@
     if (_options.laxRuntimeTypeToString) {
       flavor.write(', lax runtime type');
     }
-    if (_options.useContentSecurityPolicy) flavor.write(', CSP');
     var featureString = _options.features.flavorString();
     if (featureString.isNotEmpty) flavor.write(', $featureString');
     return js.Comment(generatedBy(_options, flavor: '$flavor'));
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 5bacb0e..5f7b288 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -68,11 +68,14 @@
   /// Whether to use optimized holders.
   FeatureOption newHolders = FeatureOption('new-holders');
 
+  /// Whether to generate code compliant with Content Security Policy.
+  FeatureOption useContentSecurityPolicy = FeatureOption('csp');
+
   /// [FeatureOption]s which default to enabled.
   late final List<FeatureOption> shipping = [legacyJavaScript, newHolders];
 
   /// [FeatureOption]s which default to disabled.
-  late final List<FeatureOption> canary = [];
+  late final List<FeatureOption> canary = [useContentSecurityPolicy];
 
   /// Forces canary feature on. This must run after [Option].parse.
   void forceCanary() {
@@ -436,9 +439,6 @@
   /// This is an internal configuration option derived from other flags.
   late CheckPolicy defaultIndexBoundsCheckPolicy;
 
-  /// Whether to generate code compliant with content security policy (CSP).
-  bool useContentSecurityPolicy = false;
-
   /// When obfuscating for minification, whether to use the frequency of a name
   /// as an heuristic to pick shorter names.
   bool useFrequencyNamer = true;
@@ -626,8 +626,6 @@
           _hasOption(options, Flags.laxRuntimeTypeToString)
       ..testMode = _hasOption(options, Flags.testMode)
       ..trustPrimitives = _hasOption(options, Flags.trustPrimitives)
-      ..useContentSecurityPolicy =
-          _hasOption(options, Flags.useContentSecurityPolicy)
       ..useFrequencyNamer =
           !_hasOption(options, Flags.noFrequencyBasedMinification)
       ..useMultiSourceInfo = _hasOption(options, Flags.useMultiSourceInfo)
@@ -709,7 +707,6 @@
     if (benchmarkingExperiment) {
       // Set flags implied by '--benchmarking-x'.
       // TODO(sra): Use this for some null safety variant.
-      useContentSecurityPolicy = true;
       features.forceCanary();
     }
 
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 744a46b..cf8fb72 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -363,7 +363,7 @@
       case 'MUST_RETAIN_METADATA':
         return false;
       case 'USE_CONTENT_SECURITY_POLICY':
-        return options.useContentSecurityPolicy;
+        return options.features.useContentSecurityPolicy.isEnabled;
       case 'VARIANCE':
         return options.enableVariance;
       case 'LEGACY':
diff --git a/pkg/compiler/test/end_to_end/output_type_test.dart b/pkg/compiler/test/end_to_end/output_type_test.dart
index e48e089..848b1ff 100644
--- a/pkg/compiler/test/end_to_end/output_type_test.dart
+++ b/pkg/compiler/test/end_to_end/output_type_test.dart
@@ -87,6 +87,7 @@
       'pkg/compiler/test/deferred/data/deferred_helper.dart',
       '--out=custom.js',
       '--deferred-map=def/deferred.json',
+      '--no-csp',
       Flags.dumpInfo,
     ], [
       'custom.js', 'custom.js.map',
@@ -100,20 +101,19 @@
 
     PRINT_GRAPH = false;
     TRACE_FILTER_PATTERN_FOR_TEST = null;
-    List<String> additionOptionals = <String>[];
-    List<String> expectedOutput = <String>[
+    List<String> additionOptionals = [];
+    List<String> expectedOutput = [
       'out.js',
       'out.js.map',
       'out.js_1.part.js',
       'out.js_1.part.js.map',
     ];
 
-    await test(
-        [
-          'pkg/compiler/test/deferred/data/deferred_helper.dart',
-          Flags.useContentSecurityPolicy,
-        ]..addAll(additionOptionals),
-        expectedOutput);
+    await test([
+      'pkg/compiler/test/deferred/data/deferred_helper.dart',
+      '--csp',
+      ...additionOptionals,
+    ], expectedOutput);
   }
 
   asyncTest(() async {
diff --git a/pkg/compiler/test/sourcemaps/tools/source_mapping_tester.dart b/pkg/compiler/test/sourcemaps/tools/source_mapping_tester.dart
index aca0ca8..6bca3c3 100644
--- a/pkg/compiler/test/sourcemaps/tools/source_mapping_tester.dart
+++ b/pkg/compiler/test/sourcemaps/tools/source_mapping_tester.dart
@@ -153,9 +153,8 @@
     String config, String filename, Uri uri, List<String> options,
     {bool verbose: true}) async {
   SourceMapProcessor processor = new SourceMapProcessor(uri);
-  SourceMaps sourceMaps = await processor.process(
-      [Flags.useContentSecurityPolicy, Flags.disableInlining]..addAll(options),
-      verbose: verbose);
+  SourceMaps sourceMaps = await processor
+      .process(['--csp', Flags.disableInlining, ...options], verbose: verbose);
   TestResult result = new TestResult(config, filename, processor);
   for (SourceMapInfo info in sourceMaps.elementSourceMapInfos.values) {
     if (info.element.library.canonicalUri.scheme == 'dart') continue;
diff --git a/tools/VERSION b/tools/VERSION
index 4eb2c84..d744ad1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 169
+PRERELEASE 170
 PRERELEASE_PATCH 0
\ No newline at end of file