internal async Task <CoverageEntry[]> StopAsync() { if (!_enabled) { throw new InvalidOperationException("JSCoverage is not enabled"); } _enabled = false; var profileResponseTask = _client.SendAsync <ProfilerTakePreciseCoverageResponse>("Profiler.takePreciseCoverage"); await Task.WhenAll( profileResponseTask, _client.SendAsync("Profiler.stopPreciseCoverage"), _client.SendAsync("Profiler.disable"), _client.SendAsync("Debugger.disable") ).ConfigureAwait(false); _client.MessageReceived -= Client_MessageReceived; var coverage = new List <CoverageEntry>(); foreach (var entry in profileResponseTask.Result.Result) { _scriptURLs.TryGetValue(entry.ScriptId, out var url); if (string.IsNullOrEmpty(url) && _reportAnonymousScripts) { url = "debugger://VM" + entry.ScriptId; } if (string.IsNullOrEmpty(url) || !_scriptSources.TryGetValue(entry.ScriptId, out var text)) { continue; } var flattenRanges = entry.Functions.SelectMany(f => f.Ranges).ToList(); var ranges = Coverage.ConvertToDisjointRanges(flattenRanges); coverage.Add(new CoverageEntry { Url = url, Ranges = ranges, Text = text }); } return(coverage.ToArray()); }