e1d687cb9e
This CL migrates the `dwds` and `dwds_test_common` packages into the Dart SDK repository. Key Changes: - Migration: Moved source code and tests into `pkg/dwds` & `pkg/dwds_test_common`. - Linting and path resolution were updated in https://github.com/dart-lang/webdev/pull/2797, https://github.com/dart-lang/webdev/pull/2798 & https://github.com/dart-lang/webdev/pull/2799 to support both environments (webdev and sdk). Testing: - All tests passing locally. - CI try bots are green. Design Doc: http://goto.google.com/migrating-webdev and http://goto.google.com/migrating-dwds Fixes https://github.com/dart-lang/sdk/issues/62100 Fixes https://github.com/dart-lang/sdk/issues/62101 Fixes https://github.com/dart-lang/sdk/issues/62102 Fixes https://github.com/dart-lang/sdk/issues/62103 Cq-Include-Trybots: luci.dart.try:pkg-win-release-try,pkg-win-release-arm64-try,pkg-mac-release-try,pkg-mac-release-arm64-try,pkg-linux-release-try,pkg-linux-release-arm64-try,pkg-linux-debug-try Change-Id: Icc2bf9a86efb79d04a67053962a4548fe6e894f7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/494640 Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Nate Biggs <natebiggs@google.com> Reviewed-by: Ivan Inozemtsev <iinozemtsev@google.com> Reviewed-by: Ben Konyi <bkonyi@google.com> Reviewed-by: Mark Zhou <markzipan@google.com>
52 lines
1.7 KiB
Dart
52 lines
1.7 KiB
Dart
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'dart:js_interop';
|
|
import 'package:web/web.dart';
|
|
|
|
// According to the CSP3 spec a nonce must be a valid base64 string.
|
|
final _noncePattern = RegExp('^[\\w+/_-]+[=]{0,2}\$');
|
|
|
|
/// Returns CSP nonce, if set for any script tag.
|
|
String? _findNonce() {
|
|
final elements = window.document.querySelectorAll('script');
|
|
|
|
for (var i = 0; i < elements.length; i++) {
|
|
final element = elements.item(i);
|
|
final nonceValue = (element as HTMLElement).nonce;
|
|
if (_noncePattern.hasMatch(nonceValue)) {
|
|
return nonceValue;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// Creates a script that will run properly when strict CSP is enforced.
|
|
///
|
|
/// More specifically, the script has the correct `nonce` value set.
|
|
final HTMLElement Function() _createScript = (() {
|
|
final nonce = _findNonce();
|
|
|
|
if (nonce == null) {
|
|
return () => document.createElement('script') as HTMLElement;
|
|
}
|
|
return () {
|
|
final scriptElement = document.createElement('script') as HTMLElement;
|
|
return scriptElement..setAttribute('nonce', nonce);
|
|
};
|
|
})();
|
|
|
|
/// Runs `window.$dartRunMain()` by injecting a script tag.
|
|
///
|
|
/// We do this so that we don't see user exceptions bubble up in our own error
|
|
/// handling zone.
|
|
void runMain() {
|
|
final scriptElement = _createScript()
|
|
..innerHTML = r'window.$dartRunMain();'.toJS;
|
|
document.body!.append(scriptElement.jsify()!);
|
|
// External tear-offs are not allowed.
|
|
// ignore: unnecessary_lambdas
|
|
Future.microtask(() => scriptElement.remove());
|
|
}
|