diff --git a/lib/CefSharp.Dom.WinForms.Example/CefSharp.Dom.WinForms.Example.csproj b/lib/CefSharp.Dom.WinForms.Example/CefSharp.Dom.WinForms.Example.csproj index d6f36b513..8b559f374 100644 --- a/lib/CefSharp.Dom.WinForms.Example/CefSharp.Dom.WinForms.Example.csproj +++ b/lib/CefSharp.Dom.WinForms.Example/CefSharp.Dom.WinForms.Example.csproj @@ -2,7 +2,7 @@ WinExe - netcoreapp3.1 + net6.0-windows true app.manifest $(NETCoreSdkRuntimeIdentifier) @@ -12,7 +12,7 @@ - + diff --git a/lib/CefSharp.Dom.Wpf.Example/CefSharp.Dom.Wpf.Example.csproj b/lib/CefSharp.Dom.Wpf.Example/CefSharp.Dom.Wpf.Example.csproj index 92d83270c..7996f5021 100644 --- a/lib/CefSharp.Dom.Wpf.Example/CefSharp.Dom.Wpf.Example.csproj +++ b/lib/CefSharp.Dom.Wpf.Example/CefSharp.Dom.Wpf.Example.csproj @@ -2,7 +2,7 @@ WinExe - netcoreapp3.1 + net6.0-windows true $(NETCoreSdkRuntimeIdentifier) false @@ -12,7 +12,7 @@ - + diff --git a/lib/PuppeteerSharp.DevicesFetcher/Program.cs b/lib/PuppeteerSharp.DevicesFetcher/Program.cs index a1bb1692a..51d8221aa 100644 --- a/lib/PuppeteerSharp.DevicesFetcher/Program.cs +++ b/lib/PuppeteerSharp.DevicesFetcher/Program.cs @@ -11,7 +11,8 @@ namespace PuppeteerSharp.DevicesFetcher { class Program { - const string DEVICES_URL = "https://raw.githubusercontent.com/puppeteer/puppeteer/master/src/common/DeviceDescriptors.ts"; + const string DEVICES_URL = + "https://raw.githubusercontent.com/puppeteer/puppeteer/master/src/common/DeviceDescriptors.ts"; static readonly string deviceDescriptorsOutput = "../../../../PuppeteerSharp/Mobile/DeviceDescriptors.cs"; static readonly string deviceDescriptorNameOutput = "../../../../PuppeteerSharp/Mobile/DeviceDescriptorName.cs"; diff --git a/lib/PuppeteerSharp.Tests/CefSharp.Dom.Tests.csproj b/lib/PuppeteerSharp.Tests/CefSharp.Dom.Tests.csproj index 348a952de..789e16e6c 100644 --- a/lib/PuppeteerSharp.Tests/CefSharp.Dom.Tests.csproj +++ b/lib/PuppeteerSharp.Tests/CefSharp.Dom.Tests.csproj @@ -1,7 +1,7 @@ - netcoreapp3.1 + net6.0-windows win-x64 false true @@ -38,7 +38,7 @@ - + diff --git a/lib/PuppeteerSharp.Tests/DevToolsContextBaseTest.cs b/lib/PuppeteerSharp.Tests/DevToolsContextBaseTest.cs index 5c9583396..77d377556 100644 --- a/lib/PuppeteerSharp.Tests/DevToolsContextBaseTest.cs +++ b/lib/PuppeteerSharp.Tests/DevToolsContextBaseTest.cs @@ -47,7 +47,7 @@ public virtual Task DisposeAsync() protected Task WaitForError() { - var wrapper = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); + var wrapper = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); void errorEvent(object sender, ErrorEventArgs e) { diff --git a/lib/PuppeteerSharp/CefSharp.Dom.csproj b/lib/PuppeteerSharp/CefSharp.Dom.csproj index bdd372535..489896dfd 100644 --- a/lib/PuppeteerSharp/CefSharp.Dom.csproj +++ b/lib/PuppeteerSharp/CefSharp.Dom.csproj @@ -1,7 +1,7 @@ - netcoreapp3.1;net462 + net6.0-windows;net462 false ../CefSharp.Dom.ruleset CefSharp.Dom @@ -30,12 +30,12 @@ - + - + diff --git a/lib/PuppeteerSharp/FrameManager.cs b/lib/PuppeteerSharp/FrameManager.cs index e2e3a964d..da860ce48 100644 --- a/lib/PuppeteerSharp/FrameManager.cs +++ b/lib/PuppeteerSharp/FrameManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; using CefSharp.Dom.Helpers; using CefSharp.Dom.Helpers.Json; @@ -109,7 +110,7 @@ private async Task NavigateAsync(DevToolsConnection client, string url, string r { Url = url, Referrer = referrer ?? string.Empty, - ReferrerPolicy = referrerPolicy ?? string.Empty, + ReferrerPolicy = ReferrerPolicyToProtocol(referrerPolicy), FrameId = frameId }).ConfigureAwait(false); @@ -408,5 +409,13 @@ internal async Task EnsureIsolatedWorldAsync(string name) internal Task GetFrameAsync(string frameId) => _asyncFrames.GetItemAsync(frameId); internal Task TryGetFrameAsync(string frameId) => _asyncFrames.TryGetItemAsync(frameId); + + // See https://chromedevtools.github.io/devtools-protocol/tot/Page/#type-ReferrerPolicy. + private static string ReferrerPolicyToProtocol(string referrerPolicy) + { + // Transform kebab-case to camelCase + return string.IsNullOrWhiteSpace(referrerPolicy) ? null : + Regex.Replace(referrerPolicy, "-(.)", match => match.Groups[1].Value.ToUpperInvariant()); + } } } diff --git a/lib/PuppeteerSharp/WebBrowserExtensions.cs b/lib/PuppeteerSharp/WebBrowserExtensions.cs index c3ab6deeb..6614a2bdb 100644 --- a/lib/PuppeteerSharp/WebBrowserExtensions.cs +++ b/lib/PuppeteerSharp/WebBrowserExtensions.cs @@ -12,33 +12,45 @@ public static class WebBrowserExtensions { /// /// Asynchronously creates a new instance of . It's reccommended that you only - /// create a single per instance. Store and reuse a single reference. + /// create a single per ChromiumWebBrowser instance. Store and reuse a single reference. /// If you need to create multiple, make sure to Dispose of the previous instance before creating a new instance. /// - /// CEF Browser instance + /// ChromiumWebBrowser/ChromiumHostControl instance /// ignore HTTPS errors /// Logger factory /// A Task - public static async Task CreateDevToolsContextAsync(this IBrowser browser, bool ignoreHTTPSerrors = false, ILoggerFactory factory = null) + public static async Task CreateDevToolsContextAsync( + this IChromiumWebBrowserBase chromiumWebBrowser, + bool ignoreHTTPSerrors = false, + ILoggerFactory factory = null) { - if (browser == null) + if (chromiumWebBrowser == null) { - throw new ArgumentNullException(nameof(browser)); + throw new ArgumentNullException(nameof(chromiumWebBrowser)); } - if (browser.IsDisposed) + if (chromiumWebBrowser.IsDisposed) { - throw new ObjectDisposedException(browser.GetType().Name); + throw new ObjectDisposedException(chromiumWebBrowser.GetType().Name); } - if (browser.IsValid) + DevToolsContext ctx; + + var internalWebBrowser = chromiumWebBrowser as Internals.IWebBrowserInternal; + + if (internalWebBrowser != null) { - throw new Exception("Invalid Browser"); - } + ctx = internalWebBrowser.DevToolsContext as DevToolsContext; - DevToolsContext ctx; + if (ctx != null && !ctx.IsDisposed) + { + // We already have an existing DevToolsContext, reuse it as having + // multiple concurrent isn't supported. + return ctx; + } + } - var browserHost = browser.GetHost(); + var browserHost = chromiumWebBrowser.GetBrowserHost(); if (browserHost == null) { @@ -46,52 +58,53 @@ public static async Task CreateDevToolsContextAsync(this IBrows } #pragma warning disable CA2000 // Dispose objects before losing scope - var connection = DevToolsConnection.Attach(new CefSharpConnectionTransport(browser.Identifier, browserHost), factory); + var connection = DevToolsConnection.Attach( + new CefSharpConnectionTransport(chromiumWebBrowser.BrowserCore.Identifier, browserHost), factory); #pragma warning restore CA2000 // Dispose objects before losing scope - ctx = await DevToolsContext.CreateDevToolsContextAsync(connection, ignoreHTTPSerrors: ignoreHTTPSerrors).ConfigureAwait(false); + ctx = await DevToolsContext.CreateDevToolsContextAsync(connection, ignoreHTTPSerrors: ignoreHTTPSerrors) + .ConfigureAwait(false); + + if (internalWebBrowser != null) + { + internalWebBrowser.DevToolsContext = ctx; + } return ctx; } /// /// Asynchronously creates a new instance of . It's reccommended that you only - /// create a single per ChromiumWebBrowser instance. Store and reuse a single reference. + /// create a single per instance. Store and reuse a single reference. /// If you need to create multiple, make sure to Dispose of the previous instance before creating a new instance. /// - /// ChromiumWebBrowser/ChromiumHostControl instance + /// CEF Browser instance /// ignore HTTPS errors /// Logger factory /// A Task - public static async Task CreateDevToolsContextAsync(this IChromiumWebBrowserBase chromiumWebBrowser, bool ignoreHTTPSerrors = false, ILoggerFactory factory = null) + public static async Task CreateDevToolsContextAsync( + this IBrowser browser, + bool ignoreHTTPSerrors = false, + ILoggerFactory factory = null) { - if (chromiumWebBrowser == null) + if (browser == null) { - throw new ArgumentNullException(nameof(chromiumWebBrowser)); + throw new ArgumentNullException(nameof(browser)); } - if (chromiumWebBrowser.IsDisposed) + if (browser.IsDisposed) { - throw new ObjectDisposedException(chromiumWebBrowser.GetType().Name); + throw new ObjectDisposedException(browser.GetType().Name); } - DevToolsContext ctx; - - var internalWebBrowser = chromiumWebBrowser as Internals.IWebBrowserInternal; - - if (internalWebBrowser != null) + if (browser.IsValid) { - ctx = internalWebBrowser.DevToolsContext as DevToolsContext; - - if (ctx != null && !ctx.IsDisposed) - { - // We already have an existing DevToolsContext, reuse it as having - // multiple concurrent isn't supported. - return ctx; - } + throw new Exception("Invalid Browser"); } - var browserHost = chromiumWebBrowser.GetBrowserHost(); + DevToolsContext ctx; + + var browserHost = browser.GetHost(); if (browserHost == null) { @@ -99,15 +112,11 @@ public static async Task CreateDevToolsContextAsync(this IChrom } #pragma warning disable CA2000 // Dispose objects before losing scope - var connection = DevToolsConnection.Attach(new CefSharpConnectionTransport(chromiumWebBrowser.BrowserCore.Identifier, browserHost), factory); + var connection = DevToolsConnection.Attach(new CefSharpConnectionTransport(browser.Identifier, browserHost), factory); #pragma warning restore CA2000 // Dispose objects before losing scope - ctx = await DevToolsContext.CreateDevToolsContextAsync(connection, ignoreHTTPSerrors: ignoreHTTPSerrors).ConfigureAwait(false); - - if (internalWebBrowser != null) - { - internalWebBrowser.DevToolsContext = ctx; - } + ctx = await DevToolsContext.CreateDevToolsContextAsync(connection, ignoreHTTPSerrors: ignoreHTTPSerrors) + .ConfigureAwait(false); return ctx; } @@ -122,7 +131,10 @@ public static async Task CreateDevToolsContextAsync(this IChrom /// Logger factory /// A Task [EditorBrowsable(EditorBrowsableState.Never)] - public static Task GetDevToolsContextAsync(this IChromiumWebBrowserBase chromiumWebBrowser, bool ignoreHTTPSerrors = false, ILoggerFactory factory = null) + public static Task GetDevToolsContextAsync( + this IChromiumWebBrowserBase chromiumWebBrowser, + bool ignoreHTTPSerrors = false, + ILoggerFactory factory = null) { return chromiumWebBrowser.CreateDevToolsContextAsync(ignoreHTTPSerrors, factory); }