Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public FirefoxMonoProxy(ILogger logger, string loggerId = null, ProxyOptions opt

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));
}
Expand Down Expand Up @@ -334,7 +334,7 @@ protected override async Task<bool> AcceptCommand(MessageId sessionId, JObject a
{
case "resume":
{
if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
context.PausedOnWasm = false;
if (context.CallStack == null)
Expand Down Expand Up @@ -396,7 +396,7 @@ protected override async Task<bool> AcceptCommand(MessageId sessionId, JObject a
}
case "setBreakpoint":
{
if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
var req = JObject.FromObject(new
{
Expand Down Expand Up @@ -436,7 +436,7 @@ protected override async Task<bool> AcceptCommand(MessageId sessionId, JObject a
}
case "removeBreakpoint":
{
if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
Result resp = await SendCommand(sessionId, "", args, token);

Expand Down
40 changes: 32 additions & 8 deletions src/mono/wasm/debugger/BrowserDebugProxy/MonoProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ internal class MonoProxy : DevToolsProxy
{
private IList<string> urlSymbolServerList;
private HashSet<SessionId> sessions = new HashSet<SessionId>();
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();

Expand All @@ -41,24 +41,37 @@ public MonoProxy(ILogger logger, IList<string> urlSymbolServerList, int runtimeI

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
{
Expand Down Expand Up @@ -93,7 +106,7 @@ protected override async Task<bool> AcceptEvent(SessionId sessionId, JObject par
case "Runtime.consoleAPICalled":
{
// Don't process events from sessions we aren't tracking
if (!contexts.TryGetValue(sessionId, out ExecutionContext context))
if (!TryGetCurrentExecutionContextValue(sessionId, out ExecutionContext context))
return false;
string type = args["type"]?.ToString();
if (type == "debug")
Expand Down Expand Up @@ -169,6 +182,17 @@ protected override async Task<bool> AcceptEvent(SessionId sessionId, JObject par
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":
{
// Don't process events from sessions we aren't tracking
Expand Down Expand Up @@ -254,7 +278,7 @@ 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);
Expand All @@ -277,7 +301,7 @@ protected override async Task<bool> AcceptCommand(MessageId id, JObject parms, C
if (id == SessionId.Null)
await AttachToTarget(id, token);

if (!contexts.TryGetValue(id, out ExecutionContext context))
if (!TryGetCurrentExecutionContextValue(id, out ExecutionContext context))
{
if (method == "Debugger.setPauseOnExceptions")
{
Expand Down