44
55// @dart = 2.9
66
7+ import 'package:async/async.dart' ;
78import 'package:logging/logging.dart' ;
89import 'package:vm_service/vm_service.dart' ;
910import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart' ;
@@ -29,9 +30,9 @@ import 'libraries.dart';
2930/// Provides information about currently loaded scripts and objects and support
3031/// for eval.
3132class AppInspector extends Domain {
32- Future <List <ScriptRef >> _cachedScriptRefs ;
33+ final _scriptCacheMemoizer = AsyncMemoizer <List <ScriptRef >>() ;
3334
34- Future <List <ScriptRef >> get scriptRefs => _cachedScriptRefs ?? = _getScripts ();
35+ Future <List <ScriptRef >> get scriptRefs => _populateScriptCaches ();
3536
3637 final _logger = Logger ('AppInspector' );
3738
@@ -87,7 +88,7 @@ class AppInspector extends Domain {
8788 isolate.libraries.addAll (libraries);
8889 await DartUri .recordAbsoluteUris (libraries.map ((lib) => lib.uri));
8990
90- var scripts = await _getScripts () ;
91+ var scripts = await scriptRefs ;
9192 await DartUri .recordAbsoluteUris (scripts.map ((script) => script.uri));
9293
9394 isolate.extensionRPCs.addAll (await _getExtensionRpcs ());
@@ -483,38 +484,38 @@ function($argsString) {
483484 return ScriptList (scripts: await scriptRefs);
484485 }
485486
486- Future <List <ScriptRef >> _getScripts () async {
487- await _populateScriptCaches ();
488- return _scriptRefsById.values.toList ();
489- }
490-
491487 /// Request and cache <ScriptRef>s for all the scripts in the application.
492488 ///
493489 /// This populates [_scriptRefsById] , [_scriptIdToLibraryId] and
494490 /// [_serverPathToScriptRef] . It is a one-time operation, because if we do a
495491 /// reload the inspector will get re-created.
496- Future <void > _populateScriptCaches () async {
497- var libraryUris = [for (var library in isolate.libraries) library.uri];
498- var scripts = await globalLoadStrategy
499- .metadataProviderFor (appConnection.request.entrypointPath)
500- .scripts;
501- // For all the non-dart: libraries, find their parts and create scriptRefs
502- // for them.
503- var userLibraries = libraryUris.where ((uri) => ! uri.startsWith ('dart:' ));
504- for (var uri in userLibraries) {
505- var parts = scripts[uri];
506- var scriptRefs = [
507- ScriptRef (uri: uri, id: createId ()),
508- for (var part in parts) ScriptRef (uri: part, id: createId ())
509- ];
510- var libraryRef = await libraryHelper.libraryRefFor (uri);
511- for (var scriptRef in scriptRefs) {
512- _scriptRefsById[scriptRef.id] = scriptRef;
513- _scriptIdToLibraryId[scriptRef.id] = libraryRef.id;
514- _serverPathToScriptRef[DartUri (scriptRef.uri, _root).serverPath] =
515- scriptRef;
492+ ///
493+ /// Returns the list of scripts refs cached.
494+ Future <List <ScriptRef >> _populateScriptCaches () async {
495+ return _scriptCacheMemoizer.runOnce (() async {
496+ var libraryUris = [for (var library in isolate.libraries) library.uri];
497+ var scripts = await globalLoadStrategy
498+ .metadataProviderFor (appConnection.request.entrypointPath)
499+ .scripts;
500+ // For all the non-dart: libraries, find their parts and create scriptRefs
501+ // for them.
502+ var userLibraries = libraryUris.where ((uri) => ! uri.startsWith ('dart:' ));
503+ for (var uri in userLibraries) {
504+ var parts = scripts[uri];
505+ var scriptRefs = [
506+ ScriptRef (uri: uri, id: createId ()),
507+ for (var part in parts) ScriptRef (uri: part, id: createId ())
508+ ];
509+ var libraryRef = await libraryHelper.libraryRefFor (uri);
510+ for (var scriptRef in scriptRefs) {
511+ _scriptRefsById[scriptRef.id] = scriptRef;
512+ _scriptIdToLibraryId[scriptRef.id] = libraryRef.id;
513+ _serverPathToScriptRef[DartUri (scriptRef.uri, _root).serverPath] =
514+ scriptRef;
515+ }
516516 }
517- }
517+ return _scriptRefsById.values.toList ();
518+ });
518519 }
519520
520521 /// Look up the script by id in an isolate.
0 commit comments