public FirefoxExecutionContext GetContextFixefox(SessionId sessionId)
{
- if (contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return context as FirefoxExecutionContext;
throw new ArgumentException($"Invalid Session: \"{sessionId}\"", nameof(sessionId));
}
{
case "resume":
{
- if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
context.PausedOnWasm = false;
if (context.CallStack == null)
}
case "setBreakpoint":
{
- if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
var req = JObject.FromObject(new
{
}
case "removeBreakpoint":
{
- if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
Result resp = await SendCommand(sessionId, "", args, token);
internal string CachePathSymbolServer { get; private set; }
private readonly HashSet<SessionId> sessions = new HashSet<SessionId>();
private static readonly string[] s_executionContextIndependentCDPCommandNames = { "DotnetDebugger.setDebuggerProperty", "DotnetDebugger.runTests" };
- protected Dictionary<SessionId, ExecutionContext> contexts = new Dictionary<SessionId, ExecutionContext>();
+ protected Dictionary<SessionId, List<ExecutionContext>> contexts = new Dictionary<SessionId, List<ExecutionContext>>();
public static HttpClient HttpClient => new HttpClient();
internal ExecutionContext GetContext(SessionId sessionId)
{
- if (contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return context;
throw new ArgumentException($"Invalid Session: \"{sessionId}\"", nameof(sessionId));
private bool UpdateContext(SessionId sessionId, ExecutionContext executionContext, out ExecutionContext previousExecutionContext)
{
- bool previous = contexts.TryGetValue(sessionId, out previousExecutionContext);
- contexts[sessionId] = executionContext;
+ bool previous = TryGetCurrentExecutionContextValue(sessionId, out previousExecutionContext);
+ if (!previous)
+ contexts[sessionId] = new();
+ contexts[sessionId].Add(executionContext);
return previous;
}
+ internal bool TryGetCurrentExecutionContextValue(SessionId id, out ExecutionContext executionContext)
+ {
+ executionContext = null;
+ if (!contexts.TryGetValue(id, out List<ExecutionContext> contextList))
+ return false;
+ if (contextList.Count == 0)
+ return false;
+ executionContext = contextList.Last<ExecutionContext>();
+ return true;
+ }
+
internal virtual Task<Result> SendMonoCommand(SessionId id, MonoCommands cmd, CancellationToken token) => SendCommand(id, "Runtime.evaluate", JObject.FromObject(cmd), token);
internal void SendLog(SessionId sessionId, string message, CancellationToken token, string type = "warning")
{
- if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return;
/*var o = JObject.FromObject(new
{
}
return true;
}
+ case "Runtime.executionContextDestroyed":
+ {
+ int id = args["executionContextId"].Value<int>();
+ if (!contexts.TryGetValue(sessionId, out var contextList))
+ return false;
+ contextList.RemoveAll(x => x.Id == id);
+ if (contextList.Count == 0)
+ contexts.Remove(sessionId);
+ return false;
+ }
case "Debugger.paused":
{
if (args["asyncStackTraceId"] != null)
{
- if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
+ if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
if (context.CopyDataFromParentContext())
{
protected void CreateWorkerExecutionContext(SessionId workerSessionId, SessionId originSessionId)
{
- if (!contexts.TryGetValue(originSessionId, out ExecutionContext context))
+ if (!TryGetCurrentExecutionContextValue(originSessionId, out ExecutionContext context))
{
logger.LogDebug($"Origin sessionId does not exist - {originSessionId}");
return;
logger.LogDebug($"Worker sessionId already exists - {originSessionId}");
return;
}
- contexts[workerSessionId] = context.CreateChildAsyncExecutionContext(workerSessionId);
+ contexts[workerSessionId] = new();
+ contexts[workerSessionId].Add(context.CreateChildAsyncExecutionContext(workerSessionId));
}
protected virtual async Task SendResume(SessionId id, CancellationToken token)
}
protected async Task<bool> IsRuntimeAlreadyReadyAlready(SessionId sessionId, CancellationToken token)
{
- if (contexts.TryGetValue(sessionId, out ExecutionContext context) && context.IsRuntimeReady)
+ if (TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context) && context.IsRuntimeReady)
return true;
Result res = await SendMonoCommand(sessionId, MonoCommands.IsRuntimeReady(RuntimeId), token);
if (id == SessionId.Null)
await AttachToTarget(id, token);
- if (!contexts.TryGetValue(id, out ExecutionContext context) && !s_executionContextIndependentCDPCommandNames.Contains(method))
+ if (!TryGetCurrentExecutionContextValue(id, out ExecutionContext context) && !s_executionContextIndependentCDPCommandNames.Contains(method))
{
if (method == "Debugger.setPauseOnExceptions")
{