diff --git a/src/Playwright.Tests/PageNetworkResponseTests.cs b/src/Playwright.Tests/PageNetworkResponseTests.cs index 98ced53d1..d4eca2754 100644 --- a/src/Playwright.Tests/PageNetworkResponseTests.cs +++ b/src/Playwright.Tests/PageNetworkResponseTests.cs @@ -331,4 +331,20 @@ public async Task ShouldReportIfRequestWasFromServiceWorker() Assert.True(res.FromServiceWorker); } } + + [PlaywrightTest("", "should collect stale handles")] + public async Task ShouldCollectStaleHandels() + { + Page.Request += (sender, request) => { }; + var response = await Page.GotoAsync(Server.EmptyPage); + for (var i = 0; i < 1000; i++) + { + await Page.EvaluateAsync(@"async () => { + const response = await fetch('/'); + await response.text(); + }"); + } + var exception = await PlaywrightAssert.ThrowsAsync(async () => await response.AllHeadersAsync()); + StringAssert.Contains("The object has been collected to prevent unbounded heap growth.", exception.Message); + } } diff --git a/src/Playwright/Core/Artifact.cs b/src/Playwright/Core/Artifact.cs index b0aebe405..5802e667b 100644 --- a/src/Playwright/Core/Artifact.cs +++ b/src/Playwright/Core/Artifact.cs @@ -33,12 +33,10 @@ namespace Microsoft.Playwright.Core; internal class Artifact : ChannelOwnerBase, IChannelOwner { - private readonly Connection _connection; private readonly ArtifactChannel _channel; internal Artifact(IChannelOwner parent, string guid, ArtifactInitializer initializer) : base(parent, guid) { - _connection = parent.Connection; _channel = new(guid, parent.Connection, this); AbsolutePath = initializer.AbsolutePath; } diff --git a/src/Playwright/Core/PlaywrightImpl.cs b/src/Playwright/Core/PlaywrightImpl.cs index 45816572f..6e6cde6ef 100644 --- a/src/Playwright/Core/PlaywrightImpl.cs +++ b/src/Playwright/Core/PlaywrightImpl.cs @@ -36,7 +36,6 @@ internal class PlaywrightImpl : ChannelOwnerBase, IPlaywright, IChannelOwner _devices = new(StringComparer.InvariantCultureIgnoreCase); @@ -44,7 +43,6 @@ internal class PlaywrightImpl : ChannelOwnerBase, IPlaywright, IChannelOwner _channelOwner.Connection.SendMessageToServerAsync(_channelOwner.Channel.Guid, "waitForEventInfo", afterArgs), true).IgnoreException(); + _channelOwner.WrapApiCallAsync(() => _channelOwner._connection.SendMessageToServerAsync(_channelOwner, "waitForEventInfo", afterArgs), true).IgnoreException(); _onDisposeCts.Cancel(); _onDisposeCts.Dispose(); @@ -109,7 +109,7 @@ internal void Log(string log) ["message"] = log, }, }; - _channelOwner.WrapApiCallAsync(() => _channelOwner.Connection.SendMessageToServerAsync(_channelOwner.Channel.Guid, "waitForEventInfo", logArgs), true).IgnoreException(); + _channelOwner.WrapApiCallAsync(() => _channelOwner._connection.SendMessageToServerAsync(_channelOwner, "waitForEventInfo", logArgs), true).IgnoreException(); } internal void RejectImmediately(Exception exception) diff --git a/src/Playwright/Transport/ChannelOwnerBase.cs b/src/Playwright/Transport/ChannelOwnerBase.cs index 422199e83..22b8e6b24 100644 --- a/src/Playwright/Transport/ChannelOwnerBase.cs +++ b/src/Playwright/Transport/ChannelOwnerBase.cs @@ -34,8 +34,9 @@ namespace Microsoft.Playwright.Transport; internal class ChannelOwnerBase : IChannelOwner { - private readonly Connection _connection; + internal readonly Connection _connection; private readonly ConcurrentDictionary _objects = new(); + internal bool _wasCollected; internal ChannelOwnerBase(IChannelOwner parent, string guid) : this(parent, null, guid) { @@ -76,14 +77,15 @@ void IChannelOwner.Adopt(ChannelOwnerBase child) } /// - void IChannelOwner.DisposeOwner() + void IChannelOwner.DisposeOwner(string reason) { Parent?.Objects?.TryRemove(Guid, out var _); _connection?.Objects.TryRemove(Guid, out var _); + _wasCollected = reason == "gc"; foreach (var item in _objects.Values) { - item.DisposeOwner(); + item.DisposeOwner(reason); } _objects.Clear(); } @@ -121,7 +123,7 @@ private void UpdateEventSubscription(string eventName, bool enabled) { WrapApiCallAsync( () => _connection.SendMessageToServerAsync( - Guid, + this, "updateSubscription", new Dictionary { diff --git a/src/Playwright/Transport/Channels/APIRequestContextChannel.cs b/src/Playwright/Transport/Channels/APIRequestContextChannel.cs index 2dccbdee7..7ea4c0873 100644 --- a/src/Playwright/Transport/Channels/APIRequestContextChannel.cs +++ b/src/Playwright/Transport/Channels/APIRequestContextChannel.cs @@ -36,7 +36,7 @@ public APIRequestContextChannel(string guid, Connection connection, APIRequestCo { } - internal Task DisposeAsync() => Connection.SendMessageToServerAsync(Guid, "dispose"); + internal Task DisposeAsync() => Connection.SendMessageToServerAsync(Object, "dispose"); internal async Task FetchAsync( string url, @@ -68,16 +68,16 @@ internal async Task FetchAsync( ["multipartData"] = multipartData?.ToProtocol(), }; - var response = await Connection.SendMessageToServerAsync(Guid, "fetch", message, keepNulls: true).ConfigureAwait(false); + var response = await Connection.SendMessageToServerAsync(Object, "fetch", message, keepNulls: true).ConfigureAwait(false); return new Core.APIResponse(Object, response?.GetProperty("response").ToObject()); } internal Task StorageStateAsync() - => Connection.SendMessageToServerAsync(Guid, "storageState", null); + => Connection.SendMessageToServerAsync(Object, "storageState", null); internal async Task FetchResponseBodyAsync(string fetchUid) { - var response = await Connection.SendMessageToServerAsync(Guid, "fetchResponseBody", new Dictionary { ["fetchUid"] = fetchUid }).ConfigureAwait(false); + var response = await Connection.SendMessageToServerAsync(Object, "fetchResponseBody", new Dictionary { ["fetchUid"] = fetchUid }).ConfigureAwait(false); if (response?.TryGetProperty("binary", out var binary) == true) { return binary.ToString(); @@ -87,10 +87,10 @@ internal async Task FetchResponseBodyAsync(string fetchUid) internal async Task> FetchResponseLogAsync(string fetchUid) { - var response = await Connection.SendMessageToServerAsync(Guid, "fetchLog", new Dictionary { ["fetchUid"] = fetchUid }).ConfigureAwait(false); + var response = await Connection.SendMessageToServerAsync(Object, "fetchLog", new Dictionary { ["fetchUid"] = fetchUid }).ConfigureAwait(false); return response.Value.GetProperty("log").ToObject>(); } internal Task DisposeAPIResponseAsync(string fetchUid) - => Connection.SendMessageToServerAsync(Guid, "disposeAPIResponse", new Dictionary { ["fetchUid"] = fetchUid }); + => Connection.SendMessageToServerAsync(Object, "disposeAPIResponse", new Dictionary { ["fetchUid"] = fetchUid }); } diff --git a/src/Playwright/Transport/Channels/ArtifactChannel.cs b/src/Playwright/Transport/Channels/ArtifactChannel.cs index bf640a754..843d65ac6 100644 --- a/src/Playwright/Transport/Channels/ArtifactChannel.cs +++ b/src/Playwright/Transport/Channels/ArtifactChannel.cs @@ -38,14 +38,14 @@ public ArtifactChannel(string guid, Connection connection, Artifact owner) : bas internal async Task PathAfterFinishedAsync() => (await Connection.SendMessageToServerAsync( - Guid, + Object, "pathAfterFinished", null) .ConfigureAwait(false)).GetString("value", true); internal Task SaveAsAsync(string path) => Connection.SendMessageToServerAsync( - Guid, + Object, "saveAs", new Dictionary { @@ -54,32 +54,32 @@ internal Task SaveAsAsync(string path) internal async Task SaveAsStreamAsync() => (await Connection.SendMessageToServerAsync( - Guid, + Object, "saveAsStream", null) .ConfigureAwait(false)).GetObject("stream", Connection); internal async Task FailureAsync() => (await Connection.SendMessageToServerAsync( - Guid, + Object, "failure", null) .ConfigureAwait(false)).GetString("error", true); internal async Task StreamAsync() => (await Connection.SendMessageToServerAsync( - Guid, + Object, "stream", null) .ConfigureAwait(false))?.GetObject("stream", Connection); internal Task CancelAsync() => Connection.SendMessageToServerAsync( - Guid, + Object, "cancel"); internal Task DeleteAsync() => Connection.SendMessageToServerAsync( - Guid, + Object, "delete"); } diff --git a/src/Playwright/Transport/Channels/BindingCallChannel.cs b/src/Playwright/Transport/Channels/BindingCallChannel.cs index c9f62c4ba..7bd56ed35 100644 --- a/src/Playwright/Transport/Channels/BindingCallChannel.cs +++ b/src/Playwright/Transport/Channels/BindingCallChannel.cs @@ -39,7 +39,7 @@ public BindingCallChannel(string guid, Connection connection, BindingCall owner) internal Task RejectAsync(Exception error) => Connection.SendMessageToServerAsync( - Guid, + Object, "reject", new Dictionary { @@ -48,7 +48,7 @@ internal Task RejectAsync(Exception error) internal Task ResolveAsync(object result) => Connection.SendMessageToServerAsync( - Guid, + Object, "resolve", new Dictionary { diff --git a/src/Playwright/Transport/Channels/BrowserChannel.cs b/src/Playwright/Transport/Channels/BrowserChannel.cs index 4ea0d063c..a86dbb3a9 100644 --- a/src/Playwright/Transport/Channels/BrowserChannel.cs +++ b/src/Playwright/Transport/Channels/BrowserChannel.cs @@ -103,7 +103,7 @@ internal override void OnMessage(string method, JsonElement? serverParams) internal Task NewBrowserCDPSessionAsync() => Connection.SendMessageToServerAsync( - Guid, + Object, "newBrowserCDPSession"); internal Task NewContextAsync( @@ -208,12 +208,12 @@ internal Task NewContextAsync( } return Connection.SendMessageToServerAsync( - Guid, + Object, "newContext", args); } - internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close", null); + internal Task CloseAsync() => Connection.SendMessageToServerAsync(Object, "close", null); internal Task StartTracingAsync(IPage page, bool screenshots, string path, IEnumerable categories) { @@ -225,9 +225,9 @@ internal Task StartTracingAsync(IPage page, bool screenshots, string path, IEnum ["categories"] = categories, }; - return Connection.SendMessageToServerAsync(Guid, "crStartTracing", args); + return Connection.SendMessageToServerAsync(Object, "crStartTracing", args); } internal async Task StopTracingAsync() - => (await Connection.SendMessageToServerAsync(Guid, "crStopTracing", null).ConfigureAwait(false))?.GetProperty("binary").ToString(); + => (await Connection.SendMessageToServerAsync(Object, "crStopTracing", null).ConfigureAwait(false))?.GetProperty("binary").ToString(); } diff --git a/src/Playwright/Transport/Channels/BrowserContextChannel.cs b/src/Playwright/Transport/Channels/BrowserContextChannel.cs index d7144dcdf..61358bd1d 100644 --- a/src/Playwright/Transport/Channels/BrowserContextChannel.cs +++ b/src/Playwright/Transport/Channels/BrowserContextChannel.cs @@ -123,7 +123,7 @@ internal override void OnMessage(string method, JsonElement? serverParams) internal Task NewCDPSessionAsync(Page page) => Connection.SendMessageToServerAsync( - Guid, + Object, "newCDPSession", new Dictionary { @@ -132,7 +132,7 @@ internal Task NewCDPSessionAsync(Page page) internal Task NewCDPSessionAsync(Frame frame) => Connection.SendMessageToServerAsync( - Guid, + Object, "newCDPSession", new Dictionary { @@ -141,18 +141,18 @@ internal Task NewCDPSessionAsync(Frame frame) internal Task NewPageAsync() => Connection.SendMessageToServerAsync( - Guid, + Object, "newPage", null); - internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close"); + internal Task CloseAsync() => Connection.SendMessageToServerAsync(Object, "close"); internal Task PauseAsync() - => Connection.SendMessageToServerAsync(Guid, "pause"); + => Connection.SendMessageToServerAsync(Object, "pause"); internal Task SetDefaultNavigationTimeoutNoReplyAsync(float? timeout) => Connection.SendMessageToServerAsync( - Guid, + Object, "setDefaultNavigationTimeoutNoReply", new Dictionary { @@ -161,7 +161,7 @@ internal Task SetDefaultNavigationTimeoutNoReplyAsync(float? timeout) internal Task SetDefaultTimeoutNoReplyAsync(float? timeout) => Connection.SendMessageToServerAsync( - Guid, + Object, "setDefaultTimeoutNoReply", new Dictionary { @@ -170,7 +170,7 @@ internal Task SetDefaultTimeoutNoReplyAsync(float? timeout) internal Task ExposeBindingAsync(string name, bool needsHandle) => Connection.SendMessageToServerAsync( - Guid, + Object, "exposeBinding", new Dictionary { @@ -180,7 +180,7 @@ internal Task ExposeBindingAsync(string name, bool needsHandle) internal Task AddInitScriptAsync(string script) => Connection.SendMessageToServerAsync( - Guid, + Object, "addInitScript", new Dictionary { @@ -189,13 +189,13 @@ internal Task AddInitScriptAsync(string script) internal Task SetNetworkInterceptionPatternsAsync(Dictionary args) => Connection.SendMessageToServerAsync( - Guid, + Object, "setNetworkInterceptionPatterns", args); internal Task SetOfflineAsync(bool offline) => Connection.SendMessageToServerAsync( - Guid, + Object, "setOffline", new Dictionary { @@ -205,7 +205,7 @@ internal Task SetOfflineAsync(bool offline) internal async Task> CookiesAsync(IEnumerable urls) { return (await Connection.SendMessageToServerAsync( - Guid, + Object, "cookies", new Dictionary { @@ -215,7 +215,7 @@ internal async Task> CookiesAsync(IEn internal Task AddCookiesAsync(IEnumerable cookies) => Connection.SendMessageToServerAsync( - Guid, + Object, "addCookies", new Dictionary { @@ -229,25 +229,25 @@ internal Task GrantPermissionsAsync(IEnumerable permissions, string orig ["permissions"] = permissions?.ToArray(), ["origin"] = origin, }; - return Connection.SendMessageToServerAsync(Guid, "grantPermissions", args); + return Connection.SendMessageToServerAsync(Object, "grantPermissions", args); } - internal Task ClearPermissionsAsync() => Connection.SendMessageToServerAsync(Guid, "clearPermissions"); + internal Task ClearPermissionsAsync() => Connection.SendMessageToServerAsync(Object, "clearPermissions"); internal Task SetGeolocationAsync(Geolocation geolocation) => Connection.SendMessageToServerAsync( - Guid, + Object, "setGeolocation", new Dictionary { ["geolocation"] = geolocation, }); - internal Task ClearCookiesAsync() => Connection.SendMessageToServerAsync(Guid, "clearCookies"); + internal Task ClearCookiesAsync() => Connection.SendMessageToServerAsync(Object, "clearCookies"); internal Task SetExtraHTTPHeadersAsync(IEnumerable> headers) => Connection.SendMessageToServerAsync( - Guid, + Object, "setExtraHTTPHeaders", new Dictionary { @@ -255,12 +255,12 @@ internal Task SetExtraHTTPHeadersAsync(IEnumerable> }); internal Task GetStorageStateAsync() - => Connection.SendMessageToServerAsync(Guid, "storageState", null); + => Connection.SendMessageToServerAsync(Object, "storageState", null); internal async Task HarExportAsync(string harId) { var result = await Connection.SendMessageToServerAsync( - Guid, + Object, "harExport", new Dictionary { @@ -283,7 +283,7 @@ internal async Task HarStartAsync( { "page", page?.Channel }, { "options", BrowserChannel.PrepareHarOptions(harContentPolicy ?? HarContentPolicy.Attach, harMode ?? HarMode.Minimal, path, null, recordHarUrlFilter, recordHarUrlFilterString, recordHarUrlFilterRegex) }, }; - var result = await Connection.SendMessageToServerAsync(Guid, "harStart", args).ConfigureAwait(false); + var result = await Connection.SendMessageToServerAsync(Object, "harStart", args).ConfigureAwait(false); return result.GetString("harId", false); } @@ -293,7 +293,7 @@ internal async Task CreateTempFileAsync(string name) { { "name", name }, }; - var result = await Connection.SendMessageToServerAsync(Guid, "createTempFile", args).ConfigureAwait(false); + var result = await Connection.SendMessageToServerAsync(Object, "createTempFile", args).ConfigureAwait(false); return result.GetObject("writableStream", Connection); } } diff --git a/src/Playwright/Transport/Channels/BrowserTypeChannel.cs b/src/Playwright/Transport/Channels/BrowserTypeChannel.cs index be18ad79b..dd43b804e 100644 --- a/src/Playwright/Transport/Channels/BrowserTypeChannel.cs +++ b/src/Playwright/Transport/Channels/BrowserTypeChannel.cs @@ -79,7 +79,7 @@ public Task LaunchAsync( }; return Connection.SendMessageToServerAsync( - Guid, + Object, "launch", args); } @@ -201,7 +201,7 @@ internal Task LaunchPersistentContextAsync( channelArgs.Add("viewport", viewportSize); } - return Connection.SendMessageToServerAsync(Guid, "launchPersistentContext", channelArgs); + return Connection.SendMessageToServerAsync(Object, "launchPersistentContext", channelArgs); } internal Task ConnectOverCDPAsync(string endpointURL, IEnumerable> headers = default, float? slowMo = default, float? timeout = default) @@ -213,6 +213,6 @@ internal Task ConnectOverCDPAsync(string endpointURL, IEnumerable(Guid, "connectOverCDP", channelArgs); + return Connection.SendMessageToServerAsync(Object, "connectOverCDP", channelArgs); } } diff --git a/src/Playwright/Transport/Channels/CDPChannel.cs b/src/Playwright/Transport/Channels/CDPChannel.cs index 7be3f7af0..9f5d9a134 100644 --- a/src/Playwright/Transport/Channels/CDPChannel.cs +++ b/src/Playwright/Transport/Channels/CDPChannel.cs @@ -48,7 +48,7 @@ internal override void OnMessage(string method, JsonElement? serverParams) internal Task DetachAsync() { return Connection.SendMessageToServerAsync( - Guid, + Object, "detach"); } @@ -60,7 +60,7 @@ internal Task DetachAsync() newArgs["params"] = args; } var result = await Connection.SendMessageToServerAsync( - Guid, + Object, "send", newArgs).ConfigureAwait(false); return result?.GetProperty("result"); diff --git a/src/Playwright/Transport/Channels/DialogChannel.cs b/src/Playwright/Transport/Channels/DialogChannel.cs index f9cbbe690..d457f5aaa 100644 --- a/src/Playwright/Transport/Channels/DialogChannel.cs +++ b/src/Playwright/Transport/Channels/DialogChannel.cs @@ -36,12 +36,12 @@ public DialogChannel(string guid, Connection connection, Dialog owner) : base(gu internal Task AcceptAsync(string promptText) => Connection.SendMessageToServerAsync( - Guid, + Object, "accept", new Dictionary { ["promptText"] = promptText, }); - internal Task DismissAsync() => Connection.SendMessageToServerAsync(Guid, "dismiss"); + internal Task DismissAsync() => Connection.SendMessageToServerAsync(Object, "dismiss"); } diff --git a/src/Playwright/Transport/Channels/ElementHandleChannel.cs b/src/Playwright/Transport/Channels/ElementHandleChannel.cs index 7adc493e0..6f1620f8f 100644 --- a/src/Playwright/Transport/Channels/ElementHandleChannel.cs +++ b/src/Playwright/Transport/Channels/ElementHandleChannel.cs @@ -65,14 +65,14 @@ internal Task WaitForSelectorAsync(string selector, WaitFo }; return Connection.SendMessageToServerAsync( - Guid, + Object, "waitForSelector", args); } internal Task QuerySelectorAsync(string selector) => Connection.SendMessageToServerAsync( - Guid, + Object, "querySelector", new Dictionary { @@ -87,12 +87,12 @@ internal Task WaitForElementStateAsync(ElementState state, float? timeout) ["timeout"] = timeout, }; - return Connection.SendMessageToServerAsync(Guid, "waitForElementState", args); + return Connection.SendMessageToServerAsync(Object, "waitForElementState", args); } internal Task QuerySelectorAllAsync(string selector) => Connection.SendMessageToServerAsync( - Guid, + Object, "querySelectorAll", new Dictionary { @@ -122,12 +122,12 @@ internal async Task ScreenshotAsync(string path, bool? omitBackground, S }).ToArray(); } - return (await Connection.SendMessageToServerAsync(Guid, "screenshot", args).ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64(); + return (await Connection.SendMessageToServerAsync(Object, "screenshot", args).ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64(); } internal Task EvalOnSelectorAsync(string selector, string script, object arg) => Connection.SendMessageToServerAsync( - Guid, + Object, "evalOnSelector", new Dictionary { @@ -138,7 +138,7 @@ internal async Task ScreenshotAsync(string path, bool? omitBackground, S internal Task EvalOnSelectorAllAsync(string selector, string script, object arg) => Connection.SendMessageToServerAsync( - Guid, + Object, "evalOnSelectorAll", new Dictionary { @@ -147,9 +147,9 @@ internal async Task ScreenshotAsync(string path, bool? omitBackground, S ["arg"] = arg, }); - internal Task ContentFrameAsync() => Connection.SendMessageToServerAsync(Guid, "contentFrame", null); + internal Task ContentFrameAsync() => Connection.SendMessageToServerAsync(Object, "contentFrame", null); - internal Task OwnerFrameAsync() => Connection.SendMessageToServerAsync(Guid, "ownerFrame", null); + internal Task OwnerFrameAsync() => Connection.SendMessageToServerAsync(Object, "ownerFrame", null); internal Task HoverAsync( IEnumerable modifiers, @@ -169,10 +169,10 @@ internal Task HoverAsync( ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "hover", args); + return Connection.SendMessageToServerAsync(Object, "hover", args); } - internal Task FocusAsync() => Connection.SendMessageToServerAsync(Guid, "focus", null); + internal Task FocusAsync() => Connection.SendMessageToServerAsync(Object, "focus", null); internal Task ClickAsync( float? delay, @@ -198,7 +198,7 @@ internal Task ClickAsync( ["modifiers"] = modifiers?.Select(m => m.ToValueString()), }; - return Connection.SendMessageToServerAsync(Guid, "click", args); + return Connection.SendMessageToServerAsync(Object, "click", args); } internal Task DblClickAsync( @@ -223,12 +223,12 @@ internal Task DblClickAsync( ["modifiers"] = modifiers?.Select(m => m.ToValueString()), }; - return Connection.SendMessageToServerAsync(Guid, "dblclick", args); + return Connection.SendMessageToServerAsync(Object, "dblclick", args); } internal async Task BoundingBoxAsync() { - var result = (await Connection.SendMessageToServerAsync(Guid, "boundingBox", null).ConfigureAwait(false)).Value; + var result = (await Connection.SendMessageToServerAsync(Object, "boundingBox", null).ConfigureAwait(false)).Value; if (result.TryGetProperty("value", out var value)) { @@ -245,7 +245,7 @@ internal Task ScrollIntoViewIfNeededAsync(float? timeout) ["timeout"] = timeout, }; - return Connection.SendMessageToServerAsync(Guid, "scrollIntoViewIfNeeded", args); + return Connection.SendMessageToServerAsync(Object, "scrollIntoViewIfNeeded", args); } internal Task FillAsync(string value, bool? noWaitAfter, bool? force, float? timeout) @@ -258,7 +258,7 @@ internal Task FillAsync(string value, bool? noWaitAfter, bool? force, float? tim ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "fill", args); + return Connection.SendMessageToServerAsync(Object, "fill", args); } internal Task DispatchEventAsync(string type, object eventInit) @@ -269,7 +269,7 @@ internal Task DispatchEventAsync(string type, object eventInit) ["eventInit"] = eventInit, }; - return Connection.SendMessageToServerAsync(Guid, "dispatchEvent", args); + return Connection.SendMessageToServerAsync(Object, "dispatchEvent", args); } internal Task SetInputFilesAsync(IEnumerable files, bool? noWaitAfter, float? timeout) @@ -281,7 +281,7 @@ internal Task SetInputFilesAsync(IEnumerable files, bool? noWait ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "setInputFiles", args); + return Connection.SendMessageToServerAsync(Object, "setInputFiles", args); } internal Task SetInputFilePathsAsync(IEnumerable localPaths, IEnumerable streams, bool? noWaitAfter, float? timeout) @@ -294,7 +294,7 @@ internal Task SetInputFilePathsAsync(IEnumerable localPaths, IEnumerable ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "setInputFilePaths", args); + return Connection.SendMessageToServerAsync(Object, "setInputFilePaths", args); } internal async Task GetAttributeAsync(string name) @@ -304,7 +304,7 @@ internal async Task GetAttributeAsync(string name) ["name"] = name, }; - if ((await Connection.SendMessageToServerAsync(Guid, "getAttribute", args).ConfigureAwait(false))?.TryGetProperty("value", out var value) ?? false) + if ((await Connection.SendMessageToServerAsync(Object, "getAttribute", args).ConfigureAwait(false))?.TryGetProperty("value", out var value) ?? false) { return value.ToString(); } @@ -312,13 +312,13 @@ internal async Task GetAttributeAsync(string name) } internal async Task InnerHTMLAsync() - => (await Connection.SendMessageToServerAsync(Guid, "innerHTML").ConfigureAwait(false))?.GetProperty("value").ToString(); + => (await Connection.SendMessageToServerAsync(Object, "innerHTML").ConfigureAwait(false))?.GetProperty("value").ToString(); internal async Task InnerTextAsync() - => (await Connection.SendMessageToServerAsync(Guid, "innerText").ConfigureAwait(false))?.GetProperty("value").ToString(); + => (await Connection.SendMessageToServerAsync(Object, "innerText").ConfigureAwait(false))?.GetProperty("value").ToString(); internal async Task TextContentAsync() - => (await Connection.SendMessageToServerAsync(Guid, "textContent").ConfigureAwait(false))?.GetProperty("value").ToString(); + => (await Connection.SendMessageToServerAsync(Object, "textContent").ConfigureAwait(false))?.GetProperty("value").ToString(); internal Task SelectTextAsync(bool? force = null, float? timeout = null) { @@ -328,7 +328,7 @@ internal Task SelectTextAsync(bool? force = null, float? timeout = null) ["timeout"] = timeout, }; - return Connection.SendMessageToServerAsync(Guid, "selectText", args); + return Connection.SendMessageToServerAsync(Object, "selectText", args); } internal async Task> SelectOptionAsync(IEnumerable values, bool? noWaitAfter, bool? force, float? timeout) @@ -341,7 +341,7 @@ internal async Task> SelectOptionAsync(IEnumerable(); + return (await Connection.SendMessageToServerAsync(Object, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject(); } internal async Task> SelectOptionAsync(IEnumerable values, bool? noWaitAfter, bool? force, float? timeout) @@ -354,23 +354,23 @@ internal async Task> SelectOptionAsync(IEnumerable(); + return (await Connection.SendMessageToServerAsync(Object, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject(); } internal async Task IsVisibleAsync() - => (await Connection.SendMessageToServerAsync(Guid, "isVisible", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + => (await Connection.SendMessageToServerAsync(Object, "isVisible", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; internal async Task IsHiddenAsync() - => (await Connection.SendMessageToServerAsync(Guid, "isHidden", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + => (await Connection.SendMessageToServerAsync(Object, "isHidden", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; internal async Task IsEnabledAsync() - => (await Connection.SendMessageToServerAsync(Guid, "isEnabled", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + => (await Connection.SendMessageToServerAsync(Object, "isEnabled", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; internal async Task IsEditableAsync() - => (await Connection.SendMessageToServerAsync(Guid, "isEditable", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + => (await Connection.SendMessageToServerAsync(Object, "isEditable", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; internal async Task IsDisabledAsync() - => (await Connection.SendMessageToServerAsync(Guid, "isDisabled", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + => (await Connection.SendMessageToServerAsync(Object, "isDisabled", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; internal async Task InputValueAsync(float? timeout) { @@ -379,11 +379,11 @@ internal async Task InputValueAsync(float? timeout) { "timeout", timeout }, }; - return (await Connection.SendMessageToServerAsync(Guid, "inputValue", args).ConfigureAwait(false))?.GetProperty("value").GetString(); + return (await Connection.SendMessageToServerAsync(Object, "inputValue", args).ConfigureAwait(false))?.GetProperty("value").GetString(); } internal async Task IsCheckedAsync() - => (await Connection.SendMessageToServerAsync(Guid, "isChecked", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + => (await Connection.SendMessageToServerAsync(Object, "isChecked", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; internal Task CheckAsync(Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial) { @@ -396,7 +396,7 @@ internal Task CheckAsync(Position position, float? timeout, bool? force, bool? n ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "check", args); + return Connection.SendMessageToServerAsync(Object, "check", args); } internal Task UncheckAsync(Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial) @@ -410,7 +410,7 @@ internal Task UncheckAsync(Position position, float? timeout, bool? force, bool? ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "uncheck", args); + return Connection.SendMessageToServerAsync(Object, "uncheck", args); } internal Task TypeAsync(string text, float? delay, float? timeout, bool? noWaitAfter) @@ -423,7 +423,7 @@ internal Task TypeAsync(string text, float? delay, float? timeout, bool? noWaitA ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "type", args); + return Connection.SendMessageToServerAsync(Object, "type", args); } internal Task PressAsync(string key, float? delay, float? timeout, bool? noWaitAfter) @@ -436,7 +436,7 @@ internal Task PressAsync(string key, float? delay, float? timeout, bool? noWaitA ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "press", args); + return Connection.SendMessageToServerAsync(Object, "press", args); } internal Task TapAsync( @@ -457,6 +457,6 @@ internal Task TapAsync( ["timeout"] = timeout, }; - return Connection.SendMessageToServerAsync(Guid, "tap", args); + return Connection.SendMessageToServerAsync(Object, "tap", args); } } diff --git a/src/Playwright/Transport/Channels/FrameChannel.cs b/src/Playwright/Transport/Channels/FrameChannel.cs index a1f1f5252..f10f03047 100644 --- a/src/Playwright/Transport/Channels/FrameChannel.cs +++ b/src/Playwright/Transport/Channels/FrameChannel.cs @@ -74,7 +74,7 @@ internal Task QuerySelectorAsync(string selector, bool? st ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "querySelector", args); + return Connection.SendMessageToServerAsync(Object, "querySelector", args); } internal Task GotoAsync(string url, float? timeout, WaitUntilState? waitUntil, string referer) @@ -86,7 +86,7 @@ internal Task GotoAsync(string url, float? timeout, WaitUntilSt ["waitUntil"] = waitUntil, ["referer"] = referer, }; - return Connection.SendMessageToServerAsync(Guid, "goto", args); + return Connection.SendMessageToServerAsync(Object, "goto", args); } internal Task EvaluateExpressionHandleAsync( @@ -94,7 +94,7 @@ internal Task EvaluateExpressionHandleAsync( object arg) { return Connection.SendMessageToServerAsync( - Guid, + Object, "evaluateExpressionHandle", new Dictionary { @@ -117,7 +117,7 @@ internal Task WaitForFunctionAsync( ["pollingInterval"] = polling, }; return Connection.SendMessageToServerAsync( - Guid, + Object, "waitForFunction", args); } @@ -127,7 +127,7 @@ internal Task WaitForFunctionAsync( object arg) { return Connection.SendMessageToServerAsync( - Guid, + Object, "evaluateExpression", new Dictionary { @@ -138,7 +138,7 @@ internal Task WaitForFunctionAsync( internal Task EvalOnSelectorAsync(string selector, string script, object arg, bool? strict) => Connection.SendMessageToServerAsync( - Guid, + Object, "evalOnSelector", new Dictionary { @@ -150,7 +150,7 @@ internal Task WaitForFunctionAsync( internal Task EvalOnSelectorAllAsync(string selector, string script, object arg) => Connection.SendMessageToServerAsync( - Guid, + Object, "evalOnSelectorAll", new Dictionary { @@ -159,10 +159,10 @@ internal Task WaitForFunctionAsync( ["arg"] = arg, }); - internal Task FrameElementAsync() => Connection.SendMessageToServerAsync(Guid, "frameElement"); + internal Task FrameElementAsync() => Connection.SendMessageToServerAsync(Object, "frameElement"); internal async Task TitleAsync() - => (await Connection.SendMessageToServerAsync(Guid, "title", null).ConfigureAwait(false))?.GetProperty("value").ToString(); + => (await Connection.SendMessageToServerAsync(Object, "title", null).ConfigureAwait(false))?.GetProperty("value").ToString(); internal Task WaitForSelectorAsync(string selector, WaitForSelectorState? state, float? timeout, bool? strict, bool? omitReturnValue = default) { @@ -175,7 +175,7 @@ internal Task WaitForSelectorAsync(string selector, WaitFo ["omitReturnValue"] = omitReturnValue, }; return Connection.SendMessageToServerAsync( - Guid, + Object, "waitForSelector", args); } @@ -187,7 +187,7 @@ internal Task WaitForTimeoutAsync(float timeout) ["timeout"] = timeout, }; return Connection.SendMessageToServerAsync( - Guid, + Object, "waitForTimeout", args); } @@ -201,7 +201,7 @@ internal Task AddScriptTagAsync(string url, string path, s ["content"] = content, ["type"] = type, }; - return Connection.SendMessageToServerAsync(Guid, "addScriptTag", args); + return Connection.SendMessageToServerAsync(Object, "addScriptTag", args); } internal Task BlurAsync(string selector, bool strict, float? timeout) @@ -212,7 +212,7 @@ internal Task BlurAsync(string selector, bool strict, float? timeout) ["strict"] = strict, ["timeout"] = timeout, }; - return Connection.SendMessageToServerAsync(Guid, "blur", args); + return Connection.SendMessageToServerAsync(Object, "blur", args); } internal Task AddStyleTagAsync(string url, string path, string content) @@ -223,7 +223,7 @@ internal Task AddStyleTagAsync(string url, string path, st ["path"] = path, ["content"] = content, }; - return Connection.SendMessageToServerAsync(Guid, "addStyleTag", args); + return Connection.SendMessageToServerAsync(Object, "addStyleTag", args); } internal Task WaitForNavigationAsync(LoadState? waitUntil, string url, float? timeout) @@ -235,7 +235,7 @@ internal Task WaitForNavigationAsync(LoadState? waitUntil, stri ["waitUntil"] = waitUntil, }; - return Connection.SendMessageToServerAsync(Guid, "waitForNavigation", args); + return Connection.SendMessageToServerAsync(Object, "waitForNavigation", args); } internal Task WaitForLoadStateAsync(LoadState? state, float? timeout) @@ -247,7 +247,7 @@ internal Task WaitForLoadStateAsync(LoadState? state, float? timeout) }; return Connection.SendMessageToServerAsync( - Guid, + Object, "waitForLoadState", args); } @@ -259,7 +259,7 @@ internal async Task QueryCountAsync(string selector) ["selector"] = selector, }; - var result = await Connection.SendMessageToServerAsync(Guid, "queryCount", args).ConfigureAwait(false); + var result = await Connection.SendMessageToServerAsync(Object, "queryCount", args).ConfigureAwait(false); return result.Value.GetProperty("value").GetInt32(); } @@ -272,7 +272,7 @@ internal Task SetContentAsync(string html, float? timeout, WaitUntilState? waitU ["timeout"] = timeout, }; - return Connection.SendMessageToServerAsync(Guid, "setContent", args); + return Connection.SendMessageToServerAsync(Object, "setContent", args); } internal Task ClickAsync( @@ -303,7 +303,7 @@ internal Task ClickAsync( ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "click", args); + return Connection.SendMessageToServerAsync(Object, "click", args); } internal Task DblClickAsync( @@ -332,12 +332,12 @@ internal Task DblClickAsync( ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "dblclick", args); + return Connection.SendMessageToServerAsync(Object, "dblclick", args); } internal Task QuerySelectorAsync(string selector) => Connection.SendMessageToServerAsync( - Guid, + Object, "querySelector", new Dictionary { @@ -346,7 +346,7 @@ internal Task QuerySelectorAsync(string selector) internal Task QuerySelectorAllAsync(string selector) => Connection.SendMessageToServerAsync( - Guid, + Object, "querySelectorAll", new Dictionary { @@ -365,7 +365,7 @@ internal Task FillAsync(string selector, string value, bool? force, float? timeo ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "fill", args); + return Connection.SendMessageToServerAsync(Object, "fill", args); } internal Task CheckAsync(string selector, Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial, bool? strict) @@ -381,7 +381,7 @@ internal Task CheckAsync(string selector, Position position, float? timeout, boo ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "check", args); + return Connection.SendMessageToServerAsync(Object, "check", args); } internal Task UncheckAsync(string selector, Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial, bool? strict) @@ -397,7 +397,7 @@ internal Task UncheckAsync(string selector, Position position, float? timeout, b ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "uncheck", args); + return Connection.SendMessageToServerAsync(Object, "uncheck", args); } internal Task DispatchEventAsync(string selector, string type, object eventInit, float? timeout, bool? strict) @@ -411,7 +411,7 @@ internal Task DispatchEventAsync(string selector, string type, object eventInit, ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "dispatchEvent", args); + return Connection.SendMessageToServerAsync(Object, "dispatchEvent", args); } internal Task HoverAsync( @@ -436,7 +436,7 @@ internal Task HoverAsync( ["noWaitAfter"] = noWaitAfter, }; - return Connection.SendMessageToServerAsync(Guid, "hover", args); + return Connection.SendMessageToServerAsync(Object, "hover", args); } internal Task PressAsync(string selector, string text, float? delay, float? timeout, bool? noWaitAfter, bool? strict) @@ -451,7 +451,7 @@ internal Task PressAsync(string selector, string text, float? delay, float? time ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "press", args); + return Connection.SendMessageToServerAsync(Object, "press", args); } internal async Task SelectOptionAsync(string selector, IEnumerable values, bool? noWaitAfter, bool? strict, bool? force, float? timeout) @@ -466,7 +466,7 @@ internal async Task SelectOptionAsync(string selector, IEnumerable(); + return (await Connection.SendMessageToServerAsync(Object, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject(); } internal async Task SelectOptionAsync(string selector, IEnumerable values, bool? noWaitAfter, bool? strict, bool? force, float? timeout) @@ -481,7 +481,7 @@ internal async Task SelectOptionAsync(string selector, IEnumerable(); + return (await Connection.SendMessageToServerAsync(Object, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject(); } internal async Task GetAttributeAsync(string selector, string name, float? timeout, bool? strict) @@ -495,7 +495,7 @@ internal async Task GetAttributeAsync(string selector, string name, floa }; JsonElement retValue = default; - if ((await Connection.SendMessageToServerAsync(Guid, "getAttribute", args).ConfigureAwait(false))?.TryGetProperty("value", out retValue) ?? false) + if ((await Connection.SendMessageToServerAsync(Object, "getAttribute", args).ConfigureAwait(false))?.TryGetProperty("value", out retValue) ?? false) { return retValue.ToString(); } @@ -512,7 +512,7 @@ internal async Task InnerHTMLAsync(string selector, float? timeout, bool ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "innerHTML", args).ConfigureAwait(false))?.GetProperty("value").ToString(); + return (await Connection.SendMessageToServerAsync(Object, "innerHTML", args).ConfigureAwait(false))?.GetProperty("value").ToString(); } internal Task TypeAsync(string selector, string text, float? delay, float? timeout, bool? noWaitAfter, bool? strict) @@ -527,11 +527,11 @@ internal Task TypeAsync(string selector, string text, float? delay, float? timeo ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "type", args); + return Connection.SendMessageToServerAsync(Object, "type", args); } internal async Task ContentAsync() - => (await Connection.SendMessageToServerAsync(Guid, "content").ConfigureAwait(false))?.GetProperty("value").ToString(); + => (await Connection.SendMessageToServerAsync(Object, "content").ConfigureAwait(false))?.GetProperty("value").ToString(); internal Task FocusAsync(string selector, float? timeout, bool? strict) { @@ -542,7 +542,7 @@ internal Task FocusAsync(string selector, float? timeout, bool? strict) ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "focus", args); + return Connection.SendMessageToServerAsync(Object, "focus", args); } internal async Task InnerTextAsync(string selector, float? timeout, bool? strict) @@ -554,7 +554,7 @@ internal async Task InnerTextAsync(string selector, float? timeout, bool ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "innerText", args).ConfigureAwait(false))?.GetProperty("value").ToString(); + return (await Connection.SendMessageToServerAsync(Object, "innerText", args).ConfigureAwait(false))?.GetProperty("value").ToString(); } internal Task SetInputFilesAsync(string selector, IEnumerable files, bool? noWaitAfter, float? timeout, bool? strict) @@ -568,7 +568,7 @@ internal Task SetInputFilesAsync(string selector, IEnumerable fi ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "setInputFiles", args); + return Connection.SendMessageToServerAsync(Object, "setInputFiles", args); } internal Task SetInputFilePathsAsync(string selector, IEnumerable localPaths, IEnumerable streams, bool? noWaitAfter, float? timeout, bool? strict) @@ -583,7 +583,7 @@ internal Task SetInputFilePathsAsync(string selector, IEnumerable localP ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "setInputFilePaths", args); + return Connection.SendMessageToServerAsync(Object, "setInputFilePaths", args); } internal async Task TextContentAsync(string selector, float? timeout, bool? strict) @@ -595,7 +595,7 @@ internal async Task TextContentAsync(string selector, float? timeout, bo ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "textContent", args).ConfigureAwait(false))?.GetProperty("value").ToString(); + return (await Connection.SendMessageToServerAsync(Object, "textContent", args).ConfigureAwait(false))?.GetProperty("value").ToString(); } internal Task TapAsync( @@ -620,7 +620,7 @@ internal Task TapAsync( ["strict"] = strict, }; - return Connection.SendMessageToServerAsync(Guid, "tap", args); + return Connection.SendMessageToServerAsync(Object, "tap", args); } internal async Task IsCheckedAsync(string selector, float? timeout, bool? strict) @@ -632,7 +632,7 @@ internal async Task IsCheckedAsync(string selector, float? timeout, bool? ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "isChecked", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + return (await Connection.SendMessageToServerAsync(Object, "isChecked", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; } internal async Task IsDisabledAsync(string selector, float? timeout, bool? strict) @@ -644,7 +644,7 @@ internal async Task IsDisabledAsync(string selector, float? timeout, bool? ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "isDisabled", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + return (await Connection.SendMessageToServerAsync(Object, "isDisabled", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; } internal async Task IsEditableAsync(string selector, float? timeout, bool? strict) @@ -656,7 +656,7 @@ internal async Task IsEditableAsync(string selector, float? timeout, bool? ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "isEditable", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + return (await Connection.SendMessageToServerAsync(Object, "isEditable", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; } internal async Task IsEnabledAsync(string selector, float? timeout, bool? strict) @@ -668,7 +668,7 @@ internal async Task IsEnabledAsync(string selector, float? timeout, bool? ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "isEnabled", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + return (await Connection.SendMessageToServerAsync(Object, "isEnabled", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; } internal async Task IsHiddenAsync(string selector, float? timeout, bool? strict) @@ -680,7 +680,7 @@ internal async Task IsHiddenAsync(string selector, float? timeout, bool? s ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "isHidden", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + return (await Connection.SendMessageToServerAsync(Object, "isHidden", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; } internal async Task IsVisibleAsync(string selector, float? timeout, bool? strict) @@ -692,7 +692,7 @@ internal async Task IsVisibleAsync(string selector, float? timeout, bool? ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "isVisible", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; + return (await Connection.SendMessageToServerAsync(Object, "isVisible", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default; } internal async Task InputValueAsync(string selector, float? timeout, bool? strict) @@ -704,7 +704,7 @@ internal async Task InputValueAsync(string selector, float? timeout, boo ["strict"] = strict, }; - return (await Connection.SendMessageToServerAsync(Guid, "inputValue", args).ConfigureAwait(false))?.GetProperty("value").ToString(); + return (await Connection.SendMessageToServerAsync(Object, "inputValue", args).ConfigureAwait(false))?.GetProperty("value").ToString(); } internal Task DragAndDropAsync(string source, string target, bool? force, bool? noWaitAfter, float? timeout, bool? trial, bool? strict, SourcePosition sourcePosition, TargetPosition targetPosition) @@ -722,7 +722,7 @@ internal Task DragAndDropAsync(string source, string target, bool? force, bool? ["targetPosition"] = targetPosition, }; - return Connection.SendMessageToServerAsync(Guid, "dragAndDrop", args); + return Connection.SendMessageToServerAsync(Object, "dragAndDrop", args); } internal async Task ExpectAsync(string selector, string expression, object expressionArg, ExpectedTextValue[] expectedText, float? expectedNumber, object expectedValue, bool? useInnerText, bool? isNot, float? timeout) @@ -739,7 +739,7 @@ internal async Task ExpectAsync(string selector, string expre ["isNot"] = isNot, ["timeout"] = timeout, }; - var result = await Connection.SendMessageToServerAsync(Guid, "expect", args).ConfigureAwait(false); + var result = await Connection.SendMessageToServerAsync(Object, "expect", args).ConfigureAwait(false); var parsed = result.Value.ToObject(); if (result.Value.TryGetProperty("received", out var received)) { @@ -756,7 +756,7 @@ internal async Task HighlightAsync(string selector) ["selector"] = selector, }; - await Connection.SendMessageToServerAsync(Guid, "highlight", args).ConfigureAwait(false); + await Connection.SendMessageToServerAsync(Object, "highlight", args).ConfigureAwait(false); } } diff --git a/src/Playwright/Transport/Channels/IChannelOwner.cs b/src/Playwright/Transport/Channels/IChannelOwner.cs index fdbad9c24..1d898eb04 100644 --- a/src/Playwright/Transport/Channels/IChannelOwner.cs +++ b/src/Playwright/Transport/Channels/IChannelOwner.cs @@ -48,10 +48,7 @@ internal interface IChannelOwner /// ConcurrentDictionary Objects { get; } - /// - /// Removes the object from the parent and the connection list. - /// - void DisposeOwner(); + void DisposeOwner(string reason); void Adopt(ChannelOwnerBase child); diff --git a/src/Playwright/Transport/Channels/JSHandleChannel.cs b/src/Playwright/Transport/Channels/JSHandleChannel.cs index efe8ae1e0..aec71fd25 100644 --- a/src/Playwright/Transport/Channels/JSHandleChannel.cs +++ b/src/Playwright/Transport/Channels/JSHandleChannel.cs @@ -38,7 +38,7 @@ public JSHandleChannel(string guid, Connection connection, JSHandle owner) : bas internal Task EvaluateExpressionAsync(string script, object arg) => Connection.SendMessageToServerAsync( - Guid, + Object, "evaluateExpression", new Dictionary { @@ -48,7 +48,7 @@ public JSHandleChannel(string guid, Connection connection, JSHandle owner) : bas internal Task EvaluateExpressionHandleAsync(string script, object arg) => Connection.SendMessageToServerAsync( - Guid, + Object, "evaluateExpressionHandle", new Dictionary { @@ -56,13 +56,13 @@ internal Task EvaluateExpressionHandleAsync(string script, obje ["arg"] = arg, }); - internal Task JsonValueAsync() => Connection.SendMessageToServerAsync(Guid, "jsonValue"); + internal Task JsonValueAsync() => Connection.SendMessageToServerAsync(Object, "jsonValue"); - internal Task DisposeAsync() => Connection.SendMessageToServerAsync(Guid, "dispose"); + internal Task DisposeAsync() => Connection.SendMessageToServerAsync(Object, "dispose"); internal Task GetPropertyAsync(string propertyName) => Connection.SendMessageToServerAsync( - Guid, + Object, "getProperty", new Dictionary { @@ -70,7 +70,7 @@ internal Task GetPropertyAsync(string propertyName) }); internal async Task> GetPropertiesAsync() - => (await Connection.SendMessageToServerAsync(Guid, "getPropertyList", null).ConfigureAwait(false))? + => (await Connection.SendMessageToServerAsync(Object, "getPropertyList", null).ConfigureAwait(false))? .GetProperty("properties").ToObject>(Connection.DefaultJsonSerializerOptions); internal class JSElementProperty diff --git a/src/Playwright/Transport/Channels/JsonPipeChannel.cs b/src/Playwright/Transport/Channels/JsonPipeChannel.cs index 7ed937211..2398cda6a 100644 --- a/src/Playwright/Transport/Channels/JsonPipeChannel.cs +++ b/src/Playwright/Transport/Channels/JsonPipeChannel.cs @@ -63,10 +63,10 @@ internal override void OnMessage(string method, JsonElement? serverParams) } internal Task SendAsync(object message) => - Connection.SendMessageToServerAsync(Guid, "send", new Dictionary + Connection.SendMessageToServerAsync(Object, "send", new Dictionary { { "message", message }, }); - internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close"); + internal Task CloseAsync() => Connection.SendMessageToServerAsync(Object, "close"); } diff --git a/src/Playwright/Transport/Channels/LocalUtilsChannel.cs b/src/Playwright/Transport/Channels/LocalUtilsChannel.cs index 024e73710..fa917635d 100644 --- a/src/Playwright/Transport/Channels/LocalUtilsChannel.cs +++ b/src/Playwright/Transport/Channels/LocalUtilsChannel.cs @@ -38,7 +38,7 @@ public LocalUtilsChannel(string guid, Connection connection, LocalUtils owner) : } internal Task ZipAsync(string zipFile, List entries, string mode, string stacksId, bool includeSources) => - Connection.SendMessageToServerAsync(Guid, "zip", new Dictionary + Connection.SendMessageToServerAsync(Object, "zip", new Dictionary { { "zipFile", zipFile }, { "entries", entries }, @@ -49,7 +49,7 @@ internal Task ZipAsync(string zipFile, List entries, string mode, str internal async Task<(string HarId, string Error)> HarOpenAsync(string file) { - var response = await Connection.SendMessageToServerAsync(Guid, "harOpen", new Dictionary + var response = await Connection.SendMessageToServerAsync(Object, "harOpen", new Dictionary { { "file", file }, }).ConfigureAwait(false); @@ -64,7 +64,7 @@ internal async Task HarLookupAsync( byte[] postData, bool isNavigationRequest) { - var response = await Connection.SendMessageToServerAsync(Guid, "harLookup", new Dictionary + var response = await Connection.SendMessageToServerAsync(Object, "harLookup", new Dictionary { { "harId", harId }, { "url", url }, @@ -77,13 +77,13 @@ internal async Task HarLookupAsync( } internal Task HarCloseAsync(string harId) => - Connection.SendMessageToServerAsync(Guid, "HarCloseAsync", new Dictionary + Connection.SendMessageToServerAsync(Object, "HarCloseAsync", new Dictionary { { "harId", harId }, }); internal Task HarUnzipAsync(string zipFile, string harFile) => - Connection.SendMessageToServerAsync(Guid, "harUnzip", new Dictionary + Connection.SendMessageToServerAsync(Object, "harUnzip", new Dictionary { { "zipFile", zipFile }, { "harFile", harFile }, @@ -99,11 +99,11 @@ internal async Task ConnectAsync(string wsEndpoint, IEnumerable("pipe", Connection); + return (await Connection.SendMessageToServerAsync(Object, "connect", args).ConfigureAwait(false)).Value.GetObject("pipe", Connection); } internal void AddStackToTracingNoReply(List frames, int id) - => Connection.SendMessageToServerAsync(Guid, "addStackToTracingNoReply", new Dictionary + => Connection.SendMessageToServerAsync(Object, "addStackToTracingNoReply", new Dictionary { { "callData", new ClientSideCallMetadata() @@ -115,14 +115,14 @@ internal void AddStackToTracingNoReply(List frames, int id) }).IgnoreException(); internal Task TraceDiscardedAsync(string stacksId) - => Connection.SendMessageToServerAsync(Guid, "traceDiscarded", new Dictionary + => Connection.SendMessageToServerAsync(Object, "traceDiscarded", new Dictionary { { "stacksId", stacksId }, }); internal async Task TracingStartedAsync(string tracesDir, string traceName) { - var response = await Connection.SendMessageToServerAsync(Guid, "tracingStarted", new Dictionary + var response = await Connection.SendMessageToServerAsync(Object, "tracingStarted", new Dictionary { { "tracesDir", tracesDir }, { "traceName", traceName }, diff --git a/src/Playwright/Transport/Channels/PageChannel.cs b/src/Playwright/Transport/Channels/PageChannel.cs index 1ce82fed5..ec09ce43f 100644 --- a/src/Playwright/Transport/Channels/PageChannel.cs +++ b/src/Playwright/Transport/Channels/PageChannel.cs @@ -113,7 +113,7 @@ internal override void OnMessage(string method, JsonElement? serverParams) internal Task SetDefaultTimeoutNoReplyAsync(float timeout) => Connection.SendMessageToServerAsync( - Guid, + Object, "setDefaultTimeoutNoReply", new Dictionary { @@ -122,7 +122,7 @@ internal Task SetDefaultTimeoutNoReplyAsync(float timeout) internal Task SetDefaultNavigationTimeoutNoReplyAsync(float timeout) => Connection.SendMessageToServerAsync( - Guid, + Object, "setDefaultNavigationTimeoutNoReply", new Dictionary { @@ -131,7 +131,7 @@ internal Task SetDefaultNavigationTimeoutNoReplyAsync(float timeout) internal Task CloseAsync(bool runBeforeUnload) => Connection.SendMessageToServerAsync( - Guid, + Object, "close", new Dictionary { @@ -140,7 +140,7 @@ internal Task CloseAsync(bool runBeforeUnload) internal Task ExposeBindingAsync(string name, bool needsHandle) => Connection.SendMessageToServerAsync( - Guid, + Object, "exposeBinding", new Dictionary { @@ -150,14 +150,14 @@ internal Task ExposeBindingAsync(string name, bool needsHandle) internal Task AddInitScriptAsync(string script) => Connection.SendMessageToServerAsync( - Guid, + Object, "addInitScript", new Dictionary { ["source"] = script, }); - internal Task BringToFrontAsync() => Connection.SendMessageToServerAsync(Guid, "bringToFront"); + internal Task BringToFrontAsync() => Connection.SendMessageToServerAsync(Object, "bringToFront"); internal Task GoBackAsync(float? timeout, WaitUntilState? waitUntil) { @@ -166,7 +166,7 @@ internal Task GoBackAsync(float? timeout, WaitUntilState? waitU ["timeout"] = timeout, ["waitUntil"] = waitUntil, }; - return Connection.SendMessageToServerAsync(Guid, "goBack", args); + return Connection.SendMessageToServerAsync(Object, "goBack", args); } internal Task GoForwardAsync(float? timeout, WaitUntilState? waitUntil) @@ -176,7 +176,7 @@ internal Task GoForwardAsync(float? timeout, WaitUntilState? wa ["timeout"] = timeout, ["waitUntil"] = waitUntil, }; - return Connection.SendMessageToServerAsync(Guid, "goForward", args); + return Connection.SendMessageToServerAsync(Object, "goForward", args); } internal Task ReloadAsync(float? timeout, WaitUntilState? waitUntil) @@ -186,12 +186,12 @@ internal Task ReloadAsync(float? timeout, WaitUntilState? waitU ["timeout"] = timeout, ["waitUntil"] = waitUntil, }; - return Connection.SendMessageToServerAsync(Guid, "reload", args); + return Connection.SendMessageToServerAsync(Object, "reload", args); } internal Task SetNetworkInterceptionPatternsAsync(Dictionary args) => Connection.SendMessageToServerAsync( - Guid, + Object, "setNetworkInterceptionPatterns", args); @@ -203,7 +203,7 @@ internal Task SetNetworkInterceptionPatternsAsync(Dictionary arg ["root"] = root, }; - if ((await Connection.SendMessageToServerAsync(Guid, "accessibilitySnapshot", args).ConfigureAwait(false)).Value.TryGetProperty("rootAXNode", out var jsonElement)) + if ((await Connection.SendMessageToServerAsync(Object, "accessibilitySnapshot", args).ConfigureAwait(false)).Value.TryGetProperty("rootAXNode", out var jsonElement)) { return jsonElement; } @@ -213,7 +213,7 @@ internal Task SetNetworkInterceptionPatternsAsync(Dictionary arg internal Task SetViewportSizeAsync(PageViewportSizeResult viewport) => Connection.SendMessageToServerAsync( - Guid, + Object, "setViewportSize", new Dictionary { @@ -222,7 +222,7 @@ internal Task SetViewportSizeAsync(PageViewportSizeResult viewport) internal Task KeyboardDownAsync(string key) => Connection.SendMessageToServerAsync( - Guid, + Object, "keyboardDown", new Dictionary { @@ -230,11 +230,11 @@ internal Task KeyboardDownAsync(string key) }); internal Task EmulateMediaAsync(Dictionary args) - => Connection.SendMessageToServerAsync(Guid, "emulateMedia", args); + => Connection.SendMessageToServerAsync(Object, "emulateMedia", args); internal Task KeyboardUpAsync(string key) => Connection.SendMessageToServerAsync( - Guid, + Object, "keyboardUp", new Dictionary { @@ -243,7 +243,7 @@ internal Task KeyboardUpAsync(string key) internal Task TypeAsync(string text, float? delay) => Connection.SendMessageToServerAsync( - Guid, + Object, "keyboardType", new Dictionary { @@ -253,7 +253,7 @@ internal Task TypeAsync(string text, float? delay) internal Task PressAsync(string key, float? delay) => Connection.SendMessageToServerAsync( - Guid, + Object, "keyboardPress", new Dictionary { @@ -263,7 +263,7 @@ internal Task PressAsync(string key, float? delay) internal Task InsertTextAsync(string text) => Connection.SendMessageToServerAsync( - Guid, + Object, "keyboardInsertText", new Dictionary { @@ -272,7 +272,7 @@ internal Task InsertTextAsync(string text) internal Task MouseDownAsync(MouseButton? button, int? clickCount) => Connection.SendMessageToServerAsync( - Guid, + Object, "mouseDown", new Dictionary { @@ -282,7 +282,7 @@ internal Task MouseDownAsync(MouseButton? button, int? clickCount) internal Task MouseMoveAsync(float x, float y, int? steps) => Connection.SendMessageToServerAsync( - Guid, + Object, "mouseMove", new Dictionary { @@ -293,7 +293,7 @@ internal Task MouseMoveAsync(float x, float y, int? steps) internal Task MouseUpAsync(MouseButton? button, int? clickCount) => Connection.SendMessageToServerAsync( - Guid, + Object, "mouseUp", new Dictionary { @@ -303,7 +303,7 @@ internal Task MouseUpAsync(MouseButton? button, int? clickCount) internal Task MouseClickAsync(float x, float y, float? delay, MouseButton? button, int? clickCount) => Connection.SendMessageToServerAsync( - Guid, + Object, "mouseClick", new Dictionary { @@ -316,7 +316,7 @@ internal Task MouseClickAsync(float x, float y, float? delay, MouseButton? butto internal Task MouseWheelAsync(float deltaX, float deltaY) => Connection.SendMessageToServerAsync( - Guid, + Object, "mouseWheel", new Dictionary { @@ -326,7 +326,7 @@ internal Task MouseWheelAsync(float deltaX, float deltaY) internal Task TouchscreenTapAsync(float x, float y) => Connection.SendMessageToServerAsync( - Guid, + Object, "touchscreenTap", new Dictionary { @@ -336,7 +336,7 @@ internal Task TouchscreenTapAsync(float x, float y) internal Task SetExtraHTTPHeadersAsync(IEnumerable> headers) => Connection.SendMessageToServerAsync( - Guid, + Object, "setExtraHTTPHeaders", new Dictionary { @@ -376,12 +376,12 @@ internal async Task ScreenshotAsync( ["selector"] = ((Locator)locator)._selector, }).ToArray(), }; - return (await Connection.SendMessageToServerAsync(Guid, "screenshot", args).ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64(); + return (await Connection.SendMessageToServerAsync(Object, "screenshot", args).ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64(); } internal Task StartCSSCoverageAsync(bool resetOnNavigation) => Connection.SendMessageToServerAsync( - Guid, + Object, "crStartCSSCoverage", new Dictionary { @@ -390,7 +390,7 @@ internal Task StartCSSCoverageAsync(bool resetOnNavigation) internal Task StartJSCoverageAsync(bool resetOnNavigation, bool reportAnonymousScripts) => Connection.SendMessageToServerAsync( - Guid, + Object, "crStartJSCoverage", new Dictionary { @@ -427,6 +427,6 @@ internal async Task PdfAsync( ["format"] = format, ["height"] = height, }; - return (await Connection.SendMessageToServerAsync(Guid, "pdf", args).ConfigureAwait(false))?.GetProperty("pdf").GetBytesFromBase64(); + return (await Connection.SendMessageToServerAsync(Object, "pdf", args).ConfigureAwait(false))?.GetProperty("pdf").GetBytesFromBase64(); } } diff --git a/src/Playwright/Transport/Channels/PlaywrightChannel.cs b/src/Playwright/Transport/Channels/PlaywrightChannel.cs index a3940e8ab..ca50a602a 100644 --- a/src/Playwright/Transport/Channels/PlaywrightChannel.cs +++ b/src/Playwright/Transport/Channels/PlaywrightChannel.cs @@ -73,7 +73,7 @@ internal async Task NewRequestAsync( } var response = await Connection.SendMessageToServerAsync( - Guid, + Object, "newRequest", args).ConfigureAwait(false); return response.Object; diff --git a/src/Playwright/Transport/Channels/RequestChannel.cs b/src/Playwright/Transport/Channels/RequestChannel.cs index 2672c0a8c..d102082d2 100644 --- a/src/Playwright/Transport/Channels/RequestChannel.cs +++ b/src/Playwright/Transport/Channels/RequestChannel.cs @@ -36,8 +36,8 @@ public RequestChannel(string guid, Connection connection, Request owner) : base( { } - internal Task GetResponseAsync() => Connection.SendMessageToServerAsync(Guid, "response"); + internal Task GetResponseAsync() => Connection.SendMessageToServerAsync(Object, "response"); internal async Task> GetRawRequestHeadersAsync() => - (await Connection.SendMessageToServerAsync(Guid, "rawRequestHeaders", null).ConfigureAwait(false))?.GetProperty("headers").ToObject>(); + (await Connection.SendMessageToServerAsync(Object, "rawRequestHeaders", null).ConfigureAwait(false))?.GetProperty("headers").ToObject>(); } diff --git a/src/Playwright/Transport/Channels/ResponseChannel.cs b/src/Playwright/Transport/Channels/ResponseChannel.cs index 9f95f2e68..4bcff78f1 100644 --- a/src/Playwright/Transport/Channels/ResponseChannel.cs +++ b/src/Playwright/Transport/Channels/ResponseChannel.cs @@ -37,19 +37,19 @@ public ResponseChannel(string guid, Connection connection, Response owner) : bas } internal async Task GetBodyAsync() - => (await Connection.SendMessageToServerAsync(Guid, "body").ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64(); + => (await Connection.SendMessageToServerAsync(Object, "body").ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64(); internal async Task ServerAddrAsync() - => (await Connection.SendMessageToServerAsync(Guid, "serverAddr").ConfigureAwait(false)) + => (await Connection.SendMessageToServerAsync(Object, "serverAddr").ConfigureAwait(false)) ?.GetProperty("value").ToObject(Connection.DefaultJsonSerializerOptions); internal async Task SecurityDetailsAsync() - => (await Connection.SendMessageToServerAsync(Guid, "securityDetails").ConfigureAwait(false)) + => (await Connection.SendMessageToServerAsync(Object, "securityDetails").ConfigureAwait(false)) ?.GetProperty("value").ToObject(Connection.DefaultJsonSerializerOptions); internal async Task SizesAsync() => - (await Connection.SendMessageToServerAsync(Guid, "sizes").ConfigureAwait(false))?.GetProperty("sizes").ToObject(); + (await Connection.SendMessageToServerAsync(Object, "sizes").ConfigureAwait(false))?.GetProperty("sizes").ToObject(); internal async Task> GetRawHeadersAsync() => - (await Connection.SendMessageToServerAsync(Guid, "rawResponseHeaders").ConfigureAwait(false))?.GetProperty("headers").ToObject>(); + (await Connection.SendMessageToServerAsync(Object, "rawResponseHeaders").ConfigureAwait(false))?.GetProperty("headers").ToObject>(); } diff --git a/src/Playwright/Transport/Channels/Root.cs b/src/Playwright/Transport/Channels/Root.cs index 3e7758cf5..0403ca36b 100644 --- a/src/Playwright/Transport/Channels/Root.cs +++ b/src/Playwright/Transport/Channels/Root.cs @@ -31,11 +31,8 @@ namespace Microsoft.Playwright.Transport.Channels; internal class Root : ChannelOwnerBase { - private readonly Connection _connection; - internal Root(IChannelOwner parent, Connection connection, string guid) : base(parent, connection, guid) { - _connection = connection; } internal async Task InitializeAsync() @@ -45,7 +42,7 @@ internal async Task InitializeAsync() ["sdkLanguage"] = "csharp", }; - var jsonElement = await _connection.SendMessageToServerAsync(string.Empty, "initialize", args).ConfigureAwait(false); + var jsonElement = await _connection.SendMessageToServerAsync(this, "initialize", args).ConfigureAwait(false); return jsonElement.GetObject("playwright", _connection); } } diff --git a/src/Playwright/Transport/Channels/RouteChannel.cs b/src/Playwright/Transport/Channels/RouteChannel.cs index 1e644d11e..bdd9fc972 100644 --- a/src/Playwright/Transport/Channels/RouteChannel.cs +++ b/src/Playwright/Transport/Channels/RouteChannel.cs @@ -39,7 +39,7 @@ public RouteChannel(string guid, Connection connection, Route owner) : base(guid public Task AbortAsync(string requestUrl, string errorCode) => Connection.SendMessageToServerAsync( - Guid, + Object, "abort", new Dictionary { @@ -49,7 +49,7 @@ public Task AbortAsync(string requestUrl, string errorCode) public Task FulfillAsync(Dictionary args) => Connection.SendMessageToServerAsync( - Guid, + Object, "fulfill", args); @@ -66,14 +66,14 @@ public Task ContinueAsync(string requestUrl, string url, string method, byte[] p }; return Connection.SendMessageToServerAsync( - Guid, + Object, "continue", args); } internal Task RedirectNavigationRequestAsync(string url) => Connection.SendMessageToServerAsync( - Guid, + Object, "redirectNavigationRequest", new Dictionary { diff --git a/src/Playwright/Transport/Channels/SelectorsChannel.cs b/src/Playwright/Transport/Channels/SelectorsChannel.cs index c1c968c5e..0b37548d5 100644 --- a/src/Playwright/Transport/Channels/SelectorsChannel.cs +++ b/src/Playwright/Transport/Channels/SelectorsChannel.cs @@ -37,7 +37,7 @@ public SelectorsChannel(string guid, Connection connection, Selectors owner) : b internal Task RegisterAsync(SelectorsRegisterParams @params) => Connection.SendMessageToServerAsync( - Guid, + Object, "register", new Dictionary { @@ -48,7 +48,7 @@ internal Task RegisterAsync(SelectorsRegisterParams @params) internal Task SetTestIdAttributeAsync(string name) => Connection.SendMessageToServerAsync( - Guid, + Object, "setTestIdAttributeName", new Dictionary { diff --git a/src/Playwright/Transport/Channels/StreamChannel.cs b/src/Playwright/Transport/Channels/StreamChannel.cs index 3e523c276..ec6c5d33c 100644 --- a/src/Playwright/Transport/Channels/StreamChannel.cs +++ b/src/Playwright/Transport/Channels/StreamChannel.cs @@ -37,7 +37,7 @@ public StreamChannel(string guid, Connection connection, Stream owner) : base(gu internal async Task ReadAsync(int size) { var response = await Connection.SendMessageToServerAsync( - Guid, + Object, "read", new Dictionary { @@ -46,5 +46,5 @@ internal async Task ReadAsync(int size) return response.Value.GetProperty("binary").GetBytesFromBase64(); } - internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close"); + internal Task CloseAsync() => Connection.SendMessageToServerAsync(Object, "close"); } diff --git a/src/Playwright/Transport/Channels/TracingChannel.cs b/src/Playwright/Transport/Channels/TracingChannel.cs index 0d4789648..dcebea2c7 100644 --- a/src/Playwright/Transport/Channels/TracingChannel.cs +++ b/src/Playwright/Transport/Channels/TracingChannel.cs @@ -44,7 +44,7 @@ public TracingChannel(string guid, Connection connection, Tracing owner) : base( internal Task TracingStartAsync(string name, string title, bool? screenshots, bool? snapshots, bool? sources) => Connection.SendMessageToServerAsync( - Guid, + Object, "tracingStart", new Dictionary { @@ -57,11 +57,11 @@ internal Task TracingStartAsync(string name, string title, bool? screenshots, bo internal Task TracingStopAsync() => Connection.SendMessageToServerAsync( - Guid, + Object, "tracingStop"); internal async Task StartChunkAsync(string title = null, string name = null) - => (await Connection.SendMessageToServerAsync(Guid, "tracingStartChunk", new Dictionary + => (await Connection.SendMessageToServerAsync(Object, "tracingStartChunk", new Dictionary { ["title"] = title, ["name"] = name, @@ -69,7 +69,7 @@ internal async Task StartChunkAsync(string title = null, string name = n internal async Task<(Artifact Artifact, List Entries)> TracingStopChunkAsync(string mode) { - var result = await Connection.SendMessageToServerAsync(Guid, "tracingStopChunk", new Dictionary + var result = await Connection.SendMessageToServerAsync(Object, "tracingStopChunk", new Dictionary { ["mode"] = mode, }).ConfigureAwait(false); diff --git a/src/Playwright/Transport/Channels/WorkerChannel.cs b/src/Playwright/Transport/Channels/WorkerChannel.cs index 866d8d075..b949a5613 100644 --- a/src/Playwright/Transport/Channels/WorkerChannel.cs +++ b/src/Playwright/Transport/Channels/WorkerChannel.cs @@ -54,7 +54,7 @@ internal async Task EvaluateExpressionAsync( bool? isFunction, object arg) => (await Connection.SendMessageToServerAsync( - Guid, + Object, "evaluateExpression", new Dictionary { @@ -69,7 +69,7 @@ internal async Task EvaluateExpressionHandleAsync( bool? isFunction, object arg) => (await Connection.SendMessageToServerAsync( - Guid, + Object, "evaluateExpressionHandle", new Dictionary { diff --git a/src/Playwright/Transport/Channels/WritableStreamChannel.cs b/src/Playwright/Transport/Channels/WritableStreamChannel.cs index d42e70f0a..55d139090 100644 --- a/src/Playwright/Transport/Channels/WritableStreamChannel.cs +++ b/src/Playwright/Transport/Channels/WritableStreamChannel.cs @@ -37,7 +37,7 @@ public WritableStreamChannel(string guid, Connection connection, WritableStream internal async Task WriteAsync(string binary) { await Connection.SendMessageToServerAsync( - Guid, + Object, "write", new Dictionary { @@ -45,5 +45,5 @@ await Connection.SendMessageToServerAsync( }).ConfigureAwait(false); } - internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close"); + internal Task CloseAsync() => Connection.SendMessageToServerAsync(Object, "close"); } diff --git a/src/Playwright/Transport/Connection.cs b/src/Playwright/Transport/Connection.cs index ec9f37d19..1525af68e 100644 --- a/src/Playwright/Transport/Connection.cs +++ b/src/Playwright/Transport/Connection.cs @@ -109,20 +109,20 @@ internal void SetIsTracing(bool isTracing) } internal Task SendMessageToServerAsync( - string guid, + ChannelOwnerBase @object, string method, Dictionary args = null, bool keepNulls = false) - => SendMessageToServerAsync(guid, method, args, keepNulls); + => SendMessageToServerAsync(@object, method, args, keepNulls); internal Task SendMessageToServerAsync( - string guid, + ChannelOwnerBase @object, string method, Dictionary args = null, - bool keepNulls = false) => WrapApiCallAsync(() => InnerSendMessageToServerAsync(guid, method, args, keepNulls)); + bool keepNulls = false) => WrapApiCallAsync(() => InnerSendMessageToServerAsync(@object, method, args, keepNulls)); private async Task InnerSendMessageToServerAsync( - string guid, + ChannelOwnerBase @object, string method, Dictionary dictionary = null, bool keepNulls = false) @@ -131,6 +131,10 @@ private async Task InnerSendMessageToServerAsync( { throw new PlaywrightException(this._closedErrorMessage); } + if (@object._wasCollected) + { + throw new PlaywrightException("The object has been collected to prevent unbounded heap growth."); + } int id = Interlocked.Increment(ref _lastId); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); @@ -168,7 +172,7 @@ private async Task InnerSendMessageToServerAsync( }; } - if (_tracingCount > 0 && frames.Count > 0 && guid != "localUtils") + if (_tracingCount > 0 && frames.Count > 0 && @object.Guid != "localUtils") { LocalUtils.AddStackToTracingNoReply(frames, id); } @@ -178,7 +182,7 @@ await _queue.EnqueueAsync(() => var message = new MessageRequest { Id = id, - Guid = guid, + Guid = @object.Guid, Method = method, Params = sanitizedArgs, Metadata = metadata, @@ -284,7 +288,7 @@ internal void Dispatch(PlaywrightServerMessage message) if (message.Method == "__dispose__") { - @object.DisposeOwner(); + @object.DisposeOwner(message.Params.Value.TryGetProperty("reason", out var reason) ? reason.GetString() : null); return; }