Skip to content

Commit 34f35f2

Browse files
authored
LoadStrategy (#894)
Towards #893 Collect module strategy and related loading logic into new `LoadStrategy` abstraction. This will allow us to make an explicit contract for the `RequireStrategy`.
1 parent 08251b8 commit 34f35f2

28 files changed

+211
-139
lines changed

dwds/CHANGELOG.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## 2.0.0-dev
2+
3+
**Breaking Changes:**
4+
- Now require a `LoadStrategy` to `Dwds.start`. This package defines two
5+
compatible load strategies, `RequireStrategy` and `LegacyStrategy.
6+
- `Dwds.start` function signature has been changed to accept one more parameter
7+
of new interface type `ExpressionCompiler` to support expression
8+
evaluation
9+
110
## 1.0.1
211

312
- Make the `root` optional for the `ProxyServerAssetReader`.
@@ -21,9 +30,6 @@
2130
clearly defined. The new abstraction is now consumed through `dwds.dart`.
2231
- `BuildRunnerAssetHandler` has been renamed to `ProxyServerAssetReader` and is
2332
now consumed through `dwds.dart`.
24-
- `Dwds.start` function signature has been changed to accept one more parameter
25-
of new interface type `ExpressionCompiler` to support expression
26-
evaluation
2733

2834
## 0.9.0
2935

dwds/lib/dwds.dart

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,29 @@
44

55
import 'dart:async';
66

7-
import 'package:dwds/data/build_result.dart';
8-
import 'package:dwds/src/services/expression_compiler.dart';
9-
import 'package:dwds/src/utilities/shared.dart';
107
import 'package:logging/logging.dart';
118
import 'package:meta/meta.dart';
129
import 'package:shelf/shelf.dart';
1310
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
1411

12+
import 'data/build_result.dart';
1513
import 'src/connections/app_connection.dart';
1614
import 'src/connections/debug_connection.dart';
1715
import 'src/handlers/dev_handler.dart';
1816
import 'src/handlers/injected_handler.dart';
17+
import 'src/loaders/strategy.dart';
1918
import 'src/readers/asset_reader.dart';
2019
import 'src/servers/devtools.dart';
2120
import 'src/servers/extension_backend.dart';
21+
import 'src/services/expression_compiler.dart';
22+
import 'src/utilities/shared.dart';
2223

2324
export 'src/connections/app_connection.dart' show AppConnection;
2425
export 'src/connections/debug_connection.dart' show DebugConnection;
2526
export 'src/handlers/dev_handler.dart' show AppConnectionException;
27+
export 'src/loaders/legacy.dart' show LegacyStrategy;
28+
export 'src/loaders/require.dart' show RequireStrategy;
29+
export 'src/loaders/strategy.dart' show LoadStrategy, ReloadConfiguration;
2630
export 'src/readers/asset_reader.dart' show AssetReader;
2731
export 'src/readers/frontend_server_asset_reader.dart'
2832
show FrontendServerAssetReader;
@@ -33,8 +37,6 @@ export 'src/services/expression_compiler.dart'
3337

3438
typedef ConnectionProvider = Future<ChromeConnection> Function();
3539
typedef UrlEncoder = Future<String> Function(String url);
36-
enum ReloadConfiguration { none, hotReload, hotRestart, liveReload }
37-
enum ModuleStrategy { requireJS, legacy }
3840

3941
/// The Dart Web Debug Service.
4042
class Dwds {
@@ -68,33 +70,32 @@ class Dwds {
6870
return DebugConnection(appDebugServices);
6971
}
7072

71-
static Future<Dwds> start(
72-
{@required AssetReader assetReader,
73-
@required Stream<BuildResult> buildResults,
74-
@required ConnectionProvider chromeConnection,
75-
@required bool enableDebugging,
76-
String hostname,
77-
ReloadConfiguration reloadConfiguration,
78-
bool useSseForDebugProxy,
79-
bool serveDevTools,
80-
LogWriter logWriter,
81-
bool verbose,
82-
bool enableDebugExtension,
83-
ModuleStrategy moduleStrategy,
84-
UrlEncoder urlEncoder,
85-
@deprecated bool restoreBreakpoints,
86-
// TODO(annagrin): make expressionCompiler argument required
87-
// [issue 881](https://github.com/dart-lang/webdev/issues/881)
88-
ExpressionCompiler expressionCompiler}) async {
73+
static Future<Dwds> start({
74+
@required AssetReader assetReader,
75+
@required Stream<BuildResult> buildResults,
76+
@required ConnectionProvider chromeConnection,
77+
@required LoadStrategy loadStrategy,
78+
@required bool enableDebugging,
79+
bool enableDebugExtension,
80+
String hostname,
81+
bool useSseForDebugProxy,
82+
bool serveDevTools,
83+
LogWriter logWriter,
84+
bool verbose,
85+
UrlEncoder urlEncoder,
86+
// TODO(annagrin): make expressionCompiler argument required
87+
// [issue 881](https://github.com/dart-lang/webdev/issues/881)
88+
ExpressionCompiler expressionCompiler,
89+
@deprecated bool restoreBreakpoints,
90+
}) async {
8991
hostname ??= 'localhost';
90-
reloadConfiguration ??= ReloadConfiguration.none;
9192
enableDebugging ??= true;
9293
enableDebugExtension ??= false;
9394
useSseForDebugProxy ??= true;
9495
serveDevTools ??= true;
9596
logWriter ??= (level, message) => print(message);
9697
verbose ??= false;
97-
globalModuleStrategy = moduleStrategy ?? ModuleStrategy.requireJS;
98+
globalLoadStrategy = loadStrategy;
9899
restoreBreakpoints ??= false;
99100

100101
DevTools devTools;
@@ -135,7 +136,6 @@ class Dwds {
135136

136137
return Dwds._(
137138
createInjectedHandler(
138-
reloadConfiguration,
139139
extensionUri: extensionUri,
140140
urlEncoder: urlEncoder,
141141
),

dwds/lib/src/debugging/classes.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.import 'dart:async';
44

5+
import '../loaders/strategy.dart';
56
import '../utilities/domain.dart';
67
import '../utilities/shared.dart';
78
import '../utilities/wrapped_service.dart';
@@ -68,7 +69,7 @@ class ClassHelper extends Domain {
6869
var rawName = classRef.name.split('<').first;
6970
var expression = '''
7071
(function() {
71-
${getLibrarySnippet(libraryRef.uri)}
72+
${globalLoadStrategy.loadLibrarySnippet(libraryRef.uri)}
7273
var result = {};
7374
var clazz = library["$rawName"];
7475
var descriptor = {

dwds/lib/src/debugging/dart_scope.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:dwds/src/utilities/shared.dart';
6-
5+
import '../loaders/strategy.dart';
76
import '../utilities/objects.dart';
87
import 'debugger.dart';
98

@@ -59,7 +58,7 @@ Future<Property> _findMissingThis(String callFrameId, Debugger debugger) async {
5958
final findCurrent = '''
6059
(function (THIS) {
6160
if (THIS === window) { return null; }
62-
$getLibraries
61+
${globalLoadStrategy.loadLibrariesSnippet}
6362
for (let lib of libs) {
6463
if (lib === THIS) {
6564
return null;

dwds/lib/src/debugging/debugger.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:meta/meta.dart';
1010
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
1111
hide StackTrace;
1212

13+
import '../loaders/strategy.dart';
1314
import '../readers/asset_reader.dart';
1415
import '../services/chrome_proxy_service.dart';
1516
import '../utilities/conversions.dart';
@@ -388,7 +389,7 @@ class Debugger extends Domain {
388389
// want. To make those alternatives easier in JS, pass both count and end.
389390
var expression = '''
390391
function (offset, count, end) {
391-
const sdk = $loadModule("dart_sdk");
392+
const sdk = ${globalLoadStrategy.loadModuleSnippet}("dart_sdk");
392393
if (sdk.core.Map.is(this)) {
393394
const entries = sdk.dart.dload(this, "entries");
394395
const skipped = sdk.dart.dsend(entries, "skip", [offset])

dwds/lib/src/debugging/inspector.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
1313
import '../connections/app_connection.dart';
1414
import '../debugging/location.dart';
1515
import '../debugging/remote_debugger.dart';
16+
import '../loaders/strategy.dart';
1617
import '../readers/asset_reader.dart';
1718
import '../utilities/conversions.dart';
1819
import '../utilities/dart_uri.dart';
@@ -151,7 +152,7 @@ class AppInspector extends Domain {
151152
Future<RemoteObject> loadField(RemoteObject receiver, String fieldName) {
152153
var load = '''
153154
function() {
154-
return $loadModule("dart_sdk").dart.dloadRepl(this, "$fieldName");
155+
return ${globalLoadStrategy.loadModuleSnippet}("dart_sdk").dart.dloadRepl(this, "$fieldName");
155156
}
156157
''';
157158
return jsCallFunctionOn(receiver, load, []);
@@ -170,7 +171,7 @@ class AppInspector extends Domain {
170171
var send = '''
171172
function () {
172173
if (!(this.__proto__)) { return 'Instance of PlainJavaScriptObject';}
173-
return $loadModule("dart_sdk").dart.dsendRepl(this, "$methodName", arguments);
174+
return ${globalLoadStrategy.loadModuleSnippet}("dart_sdk").dart.dsendRepl(this, "$methodName", arguments);
174175
}
175176
''';
176177
var remote = await jsCallFunctionOn(receiver, send, positionalArgs);
@@ -251,7 +252,7 @@ class AppInspector extends Domain {
251252
String expression, String libraryUri) {
252253
var evalExpression = '''
253254
(function() {
254-
${getLibrarySnippet(libraryUri)};
255+
${globalLoadStrategy.loadLibrarySnippet(libraryUri)};
255256
return library.$expression;
256257
})();
257258
''';
@@ -278,7 +279,7 @@ class AppInspector extends Domain {
278279
Library library, String jsFunction, List<RemoteObject> arguments) async {
279280
var findLibrary = '''
280281
(function() {
281-
${getLibrarySnippet(library.uri)};
282+
${globalLoadStrategy.loadLibrarySnippet(library.uri)};
282283
return library;
283284
})();
284285
''';
@@ -294,7 +295,7 @@ class AppInspector extends Domain {
294295
var arguments = scope.values.map(remoteObjectFor).toList();
295296
var evalExpression = '''
296297
function($argsString) {
297-
${getLibrarySnippet(library.uri)};
298+
${globalLoadStrategy.loadLibrarySnippet(library.uri)};
298299
return library.$expression;
299300
}
300301
''';
@@ -370,7 +371,7 @@ function($argsString) {
370371
(function() {
371372
var uris = JSON.parse('$listAsJson');
372373
var allScripts = {};
373-
var sdkUtils = $loadModule('dart_sdk').dart;
374+
var sdkUtils = ${globalLoadStrategy.loadModuleSnippet}('dart_sdk').dart;
374375
for (var uri of uris) {
375376
var parts = sdkUtils.getParts(uri);
376377
allScripts[uri] = parts;
@@ -414,7 +415,7 @@ function($argsString) {
414415
/// Runs an eval on the page to compute all existing registered extensions.
415416
Future<List<String>> _getExtensionRpcs() async {
416417
var expression =
417-
"$loadModule('dart_sdk').developer._extensions.keys.toList();";
418+
"${globalLoadStrategy.loadModuleSnippet}('dart_sdk').developer._extensions.keys.toList();";
418419
var extensionsResult =
419420
await remoteDebugger.sendCommand('Runtime.evaluate', params: {
420421
'expression': expression,

dwds/lib/src/debugging/instance.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:math';
66

77
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
88

9+
import '../loaders/strategy.dart';
910
import '../utilities/conversions.dart';
1011
import '../utilities/domain.dart';
1112
import '../utilities/objects.dart';
@@ -172,7 +173,7 @@ class InstanceHelper extends Domain {
172173
// values that we need to be RemoteObject, e.g. a List of int.
173174
var expression = '''
174175
function() {
175-
var sdkUtils = $loadModule('dart_sdk').dart;
176+
var sdkUtils = ${globalLoadStrategy.loadModuleSnippet}('dart_sdk').dart;
176177
var entries = sdkUtils.dloadRepl(this, "entries");
177178
entries = sdkUtils.dsendRepl(entries, "toList", []);
178179
function asKey(entry) {
@@ -268,7 +269,7 @@ class InstanceHelper extends Domain {
268269
// of these as special.
269270
// TODO(alanknight): Handle superclass fields.
270271
final fieldNameExpression = '''function() {
271-
const sdk = $loadModule("dart_sdk");
272+
const sdk = ${globalLoadStrategy.loadModuleSnippet}("dart_sdk");
272273
const sdk_utils = sdk.dart;
273274
const fields = sdk_utils.getFields(sdk_utils.getType(this)) || [];
274275
if (!fields && (dart_sdk._interceptors.JSArray.is(this) ||

dwds/lib/src/debugging/libraries.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:dwds/src/debugging/inspector.dart';
66

7+
import '../loaders/strategy.dart';
78
import '../utilities/domain.dart';
89
import '../utilities/shared.dart';
910
import '../utilities/wrapped_service.dart';
@@ -26,7 +27,7 @@ class LibraryHelper extends Domain {
2627
if (_libraryRefsById.isNotEmpty) return _libraryRefsById.values.toList();
2728
var expression = '''
2829
(function() {
29-
$getLibraries
30+
${globalLoadStrategy.loadLibrariesSnippet}
3031
return libs;
3132
})()
3233
''';
@@ -64,7 +65,7 @@ class LibraryHelper extends Domain {
6465
// Fetch information about all the classes in this library.
6566
var expression = '''
6667
(function() {
67-
${getLibrarySnippet(libraryRef.uri)}
68+
${globalLoadStrategy.loadLibrarySnippet(libraryRef.uri)}
6869
var result = {};
6970
var classes = Object.values(Object.getOwnPropertyDescriptors(library))
7071
.filter((p) => 'value' in p)

dwds/lib/src/debugging/metadata.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
66

77
import '../debugging/classes.dart';
88
import '../debugging/inspector.dart';
9+
import '../loaders/strategy.dart';
910
import '../services/chrome_proxy_service.dart';
1011
import '../utilities/shared.dart';
1112
import '../utilities/wrapped_service.dart';
@@ -51,7 +52,7 @@ class ClassMetaData {
5152
try {
5253
var evalExpression = '''
5354
function(arg) {
54-
const sdkUtils = $loadModule('dart_sdk').dart;
55+
const sdkUtils = ${globalLoadStrategy.loadModuleSnippet}('dart_sdk').dart;
5556
const classObject = sdkUtils.getReifiedType(arg);
5657
const isFunction = sdkUtils.AbstractFunctionType.is(classObject);
5758
const result = {};
@@ -101,7 +102,7 @@ class FunctionMetaData {
101102
RemoteDebugger remoteDebugger, RemoteObject remoteObject) async {
102103
var evalExpression = '''
103104
function(remoteObject) {
104-
var sdkUtils = $loadModule('dart_sdk').dart;
105+
var sdkUtils = ${globalLoadStrategy.loadModuleSnippet}('dart_sdk').dart;
105106
var name = remoteObject.name;
106107
if(remoteObject._boundObject) {
107108
name = sdkUtils.getType(remoteObject._boundObject).name +

dwds/lib/src/debugging/modules.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:async';
77
import 'package:dwds/src/debugging/execution_context.dart';
88
import 'package:path/path.dart' as p;
99

10+
import '../loaders/strategy.dart';
1011
import '../utilities/dart_uri.dart';
1112
import '../utilities/shared.dart';
1213
import 'remote_debugger.dart';
@@ -110,7 +111,7 @@ class Modules {
110111
Future<void> _initializeMapping() async {
111112
var expression = '''
112113
(function() {
113-
var dart = $loadModule('dart_sdk').dart;
114+
var dart = ${globalLoadStrategy.loadModuleSnippet}('dart_sdk').dart;
114115
var result = {};
115116
dart.getModuleNames().forEach(function(module){
116117
Object.keys(dart.getModuleLibraries(module)).forEach(

dwds/lib/src/handlers/injected_handler.dart

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:io';
77
import 'dart:isolate';
88

99
import 'package:crypto/crypto.dart';
10-
import 'package:dwds/src/utilities/shared.dart';
10+
import 'package:dwds/src/loaders/strategy.dart';
1111
import 'package:dwds/src/version.dart';
1212
import 'package:shelf/shelf.dart';
1313

@@ -26,9 +26,7 @@ const mainExtensionMarker = '/* MAIN_EXTENSION_MARKER */';
2626
const _clientScript = 'dwds/src/injected/client';
2727

2828
Handler Function(Handler) createInjectedHandler(
29-
ReloadConfiguration configuration,
30-
{String extensionUri,
31-
UrlEncoder urlEncoder}) =>
29+
{String extensionUri, UrlEncoder urlEncoder}) =>
3230
(innerHandler) {
3331
return (Request request) async {
3432
if (request.url.path.endsWith('$_clientScript.js')) {
@@ -74,7 +72,6 @@ Handler Function(Handler) createInjectedHandler(
7472
requestedUriBase = await urlEncoder(requestedUriBase);
7573
}
7674
body += _injectedClientJs(
77-
configuration,
7875
appId,
7976
mainFunction,
8077
requestedUriBase,
@@ -99,7 +96,6 @@ Handler Function(Handler) createInjectedHandler(
9996
};
10097

10198
String _injectedClientJs(
102-
ReloadConfiguration configuration,
10399
String appId,
104100
String mainFunction,
105101
String requestedUriBase, {
@@ -108,11 +104,11 @@ String _injectedClientJs(
108104
var injectedBody = '// Injected by webdev for build results support.\n'
109105
'window.\$dartAppId = "$appId";\n'
110106
'window.\$dartRunMain = $mainFunction;\n'
111-
'window.\$dartReloadConfiguration = "$configuration";\n'
107+
'window.\$dartReloadConfiguration = "${globalLoadStrategy.reloadConfiguration}";\n'
112108
'window.\$dartLoader.forceLoadModule("$_clientScript");\n'
113-
'window.\$dartModuleStrategy = "$loadModule";\n'
109+
'window.\$dartModuleStrategy = "${globalLoadStrategy.id}";\n'
114110
'window.\$dartUriBase = "$requestedUriBase";\n'
115-
'window.\$loadModuleConfig = $loadModule;\n'
111+
'window.\$loadModuleConfig = ${globalLoadStrategy.loadModuleSnippet};\n'
116112
'window.\$dwdsVersion = "$packageVersion";\n';
117113
if (extensionUri != null) {
118114
injectedBody += 'window.\$dartExtensionUri = "$extensionUri";\n';

0 commit comments

Comments
 (0)