From d0a1e3ef5be05f001b1890879d6ad3625d5b8b00 Mon Sep 17 00:00:00 2001 From: Stefan Seeland <168659+stesee@users.noreply.github.com> Date: Thu, 24 Nov 2022 05:48:05 +0100 Subject: [PATCH 1/2] Fixed ignored custom launch values --- .github/ISSUE_TEMPLATE.md | 3 +- Codeuctivity.HtmlRenderer.sln | 1 + .../Codeuctivity.HtmlRenderer.csproj | 2 +- Codeuctivity.HtmlRenderer/Renderer.cs | 51 +++++++++++++++---- .../Codeuctivity.HtmlRendererCliTests.csproj | 2 +- .../RendererCliTests.cs | 2 +- .../Codeuctivity.HtmlRendererTests.csproj | 2 +- .../RendererTests.cs | 31 ++++++++++- README.md | 6 +++ 9 files changed, 84 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1413f54..69ab2a6 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -16,4 +16,5 @@ - OS: - CPU Architecture: - .net Version: - - .net Trimming: \ No newline at end of file + - .net Trimming: + - Linux: Output of `cat /proc/version` \ No newline at end of file diff --git a/Codeuctivity.HtmlRenderer.sln b/Codeuctivity.HtmlRenderer.sln index f2f26af..1c7c214 100644 --- a/Codeuctivity.HtmlRenderer.sln +++ b/Codeuctivity.HtmlRenderer.sln @@ -8,6 +8,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig .github\dependabot.yml = .github\dependabot.yml .github\workflows\dotnet.yml = .github\workflows\dotnet.yml + .github\ISSUE_TEMPLATE.md = .github\ISSUE_TEMPLATE.md README.md = README.md EndProjectSection EndProject diff --git a/Codeuctivity.HtmlRenderer/Codeuctivity.HtmlRenderer.csproj b/Codeuctivity.HtmlRenderer/Codeuctivity.HtmlRenderer.csproj index f5d7290..64488ef 100644 --- a/Codeuctivity.HtmlRenderer/Codeuctivity.HtmlRenderer.csproj +++ b/Codeuctivity.HtmlRenderer/Codeuctivity.HtmlRenderer.csproj @@ -40,7 +40,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Codeuctivity.HtmlRenderer/Renderer.cs b/Codeuctivity.HtmlRenderer/Renderer.cs index 28b41a9..1e7059d 100644 --- a/Codeuctivity.HtmlRenderer/Renderer.cs +++ b/Codeuctivity.HtmlRenderer/Renderer.cs @@ -12,13 +12,36 @@ namespace Codeuctivity.HtmlRenderer /// public class Renderer : IAsyncDisposable, IDisposable { + /// + /// Ctor + /// + /// + public Renderer(string? customChromeiumArgs) + { + if (customChromeiumArgs == null) + { + LaunchOptions = SystemSpecificConfig(); + } + else + { + LaunchOptions = new LaunchOptions() { Args = new[] { customChromeiumArgs } }; + } + } + /// /// Ctor /// /// - public Renderer(string? launchOptions = null) + public Renderer(LaunchOptions? launchOptions = null) { - LaunchOptions = launchOptions; + if (launchOptions == null) + { + LaunchOptions = SystemSpecificConfig(); + } + else + { + LaunchOptions = launchOptions; + } } private IBrowser Browser { get; set; } = default!; @@ -29,7 +52,7 @@ public Renderer(string? launchOptions = null) /// public BrowserFetcher BrowserFetcher { get; private set; } = default!; - private string? LaunchOptions { get; } + private LaunchOptions LaunchOptions { get; } /// /// Call CreateAsync before using ConvertHtmlTo* @@ -45,9 +68,20 @@ public static Task CreateAsync() /// Call CreateAsync before using ConvertHtmlTo*, accepts custom BrowserFetcher and custom chromium launch options /// /// - /// Adds launch options to chromium + /// Adds custom arguments to chromium /// - public static Task CreateAsync(BrowserFetcher browserFetcher, string? launchOptions = null) + public static Task CreateAsync(BrowserFetcher browserFetcher, string chromeiumArguments) + { + return CreateAsync(browserFetcher, new LaunchOptions() { Args = new[] { chromeiumArguments } }); + } + + /// + /// Call CreateAsync before using ConvertHtmlTo*, accepts custom BrowserFetcher and custom chromium launch options + /// + /// + /// Adds launch options to puppeteer + /// + public static Task CreateAsync(BrowserFetcher browserFetcher, LaunchOptions? launchOptions = null) { var html2Pdf = new Renderer(launchOptions); return html2Pdf.InitializeAsync(browserFetcher); @@ -59,18 +93,17 @@ private async Task InitializeAsync(BrowserFetcher browserFetcher) BrowserFetcher.DownloadProgressChanged += DownloadProgressChanged; _ = await BrowserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision ?? string.Empty).ConfigureAwait(false); - Browser = await Puppeteer.LaunchAsync(SystemSpecificConfig()).ConfigureAwait(false); + Browser = await Puppeteer.LaunchAsync(LaunchOptions).ConfigureAwait(false); return this; } private LaunchOptions SystemSpecificConfig() { - if (string.IsNullOrEmpty(LaunchOptions) && (IsRunningOnWslOrAzure() || IsRunningOnAzureLinux())) + if (IsRunningOnWslOrAzure() || IsRunningOnAzureLinux()) { return new LaunchOptions { Headless = true, Args = new string[] { "--no-sandbox" } }; } - - return new LaunchOptions { Headless = true }; + return new LaunchOptions(); } private static bool IsRunningOnAzureLinux() diff --git a/Codeuctivity.HtmlRendererCliTests/Codeuctivity.HtmlRendererCliTests.csproj b/Codeuctivity.HtmlRendererCliTests/Codeuctivity.HtmlRendererCliTests.csproj index 0c21288..4d6f51b 100644 --- a/Codeuctivity.HtmlRendererCliTests/Codeuctivity.HtmlRendererCliTests.csproj +++ b/Codeuctivity.HtmlRendererCliTests/Codeuctivity.HtmlRendererCliTests.csproj @@ -8,7 +8,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Codeuctivity.HtmlRendererCliTests/RendererCliTests.cs b/Codeuctivity.HtmlRendererCliTests/RendererCliTests.cs index b1e387d..3883e26 100644 --- a/Codeuctivity.HtmlRendererCliTests/RendererCliTests.cs +++ b/Codeuctivity.HtmlRendererCliTests/RendererCliTests.cs @@ -56,7 +56,7 @@ public void PublishedSelfContainedBinaryShouldWork() }; process.Start(); - var isExited = process.WaitForExit(60000); + var isExited = process.WaitForExit(80000); if (!isExited) { diff --git a/Codeuctivity.HtmlRendererTests/Codeuctivity.HtmlRendererTests.csproj b/Codeuctivity.HtmlRendererTests/Codeuctivity.HtmlRendererTests.csproj index eb68694..6cfe69f 100644 --- a/Codeuctivity.HtmlRendererTests/Codeuctivity.HtmlRendererTests.csproj +++ b/Codeuctivity.HtmlRendererTests/Codeuctivity.HtmlRendererTests.csproj @@ -18,7 +18,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Codeuctivity.HtmlRendererTests/RendererTests.cs b/Codeuctivity.HtmlRendererTests/RendererTests.cs index b967f5f..98b0c64 100644 --- a/Codeuctivity.HtmlRendererTests/RendererTests.cs +++ b/Codeuctivity.HtmlRendererTests/RendererTests.cs @@ -1,6 +1,7 @@ using Codeuctivity.HtmlRenderer; using Codeuctivity.HtmlRendererTests.Infrastructure; using Codeuctivity.PdfjsSharp; +using PuppeteerSharp; using System; using System.IO; using System.Linq; @@ -39,13 +40,14 @@ public async Task ShouldConvertHtmlToPdf(string testFileName) Assert.Single(actualImages); DocumentAsserter.AssertImageIsEqual(actualImages.Single(), expectReferenceFilePath, 2000); } + File.Delete(actualFilePath); } await ChromiumProcessDisposedAsserter.AssertNoChromeProcessIsRunning(); } private static bool IsRunningOnWslOrAzureOrMacos() { - if(RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD)) + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD)) { return true; } @@ -79,9 +81,10 @@ public async Task ShouldConvertHtmlToPng(string testFileName) { await chromiumRenderer.ConvertHtmlToPng(sourceHtmlFilePath, actualFilePath); - DocumentAsserter.AssertImageIsEqual(actualFilePath, expectReferenceFilePath, 7200); + DocumentAsserter.AssertImageIsEqual(actualFilePath, expectReferenceFilePath, 9000); } + File.Delete(actualFilePath); await ChromiumProcessDisposedAsserter.AssertNoChromeProcessIsRunning(); } @@ -97,5 +100,29 @@ public async Task ShouldDisposeGracefull() var afterDisposeChromiumTasks = ChromiumProcessDisposedAsserter.CountChromiumTasks(); Assert.Equal(afterDisposeChromiumTasks, initialChromiumTasks); } + + [Theory] + [InlineData("BasicTextFormated.html")] + public async Task ShouldConvertHtmlToPngNoSandbox(string testFileName) + { + var sourceHtmlFilePath = $"../../../TestInput/{testFileName}"; + var actualFilePath = Path.Combine(Path.GetTempPath(), $"ActualConvertHtmlToPng{testFileName}.png"); + var expectReferenceFilePath = $"../../../ExpectedTestOutcome/ExpectedConvertHtmlToPng{testFileName}.png"; + + if (File.Exists(actualFilePath)) + { + File.Delete(actualFilePath); + } + + using (var chromiumRenderer = await Renderer.CreateAsync(new BrowserFetcher(), "--no-sandbox")) + { + await chromiumRenderer.ConvertHtmlToPng(sourceHtmlFilePath, actualFilePath); + + DocumentAsserter.AssertImageIsEqual(actualFilePath, expectReferenceFilePath, 9000); + } + + File.Delete(actualFilePath); + await ChromiumProcessDisposedAsserter.AssertNoChromeProcessIsRunning(); + } } } \ No newline at end of file diff --git a/README.md b/README.md index 6314794..eb8e5b4 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,9 @@ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash exit nvm install 18 ``` + +... and if that fails you can either find out which dependency is missing on your system or you take a shortcut + +```bash +sudo apt install -y chromium-browser +``` From 7b4f3fb10632650ec8d0eb26965602574e3bb59e Mon Sep 17 00:00:00 2001 From: Stefan Seeland <168659+stesee@users.noreply.github.com> Date: Thu, 24 Nov 2022 05:54:12 +0100 Subject: [PATCH 2/2] Typos --- Codeuctivity.HtmlRenderer/Renderer.cs | 14 +++++++------- .../ChromiumProcessDisposedAsserter.cs | 2 +- Codeuctivity.HtmlRendererTests/RendererTests.cs | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Codeuctivity.HtmlRenderer/Renderer.cs b/Codeuctivity.HtmlRenderer/Renderer.cs index 1e7059d..2faeef8 100644 --- a/Codeuctivity.HtmlRenderer/Renderer.cs +++ b/Codeuctivity.HtmlRenderer/Renderer.cs @@ -15,16 +15,16 @@ public class Renderer : IAsyncDisposable, IDisposable /// /// Ctor /// - /// - public Renderer(string? customChromeiumArgs) + /// + public Renderer(string? customChromiumArgs) { - if (customChromeiumArgs == null) + if (customChromiumArgs == null) { LaunchOptions = SystemSpecificConfig(); } else { - LaunchOptions = new LaunchOptions() { Args = new[] { customChromeiumArgs } }; + LaunchOptions = new LaunchOptions() { Args = new[] { customChromiumArgs } }; } } @@ -68,11 +68,11 @@ public static Task CreateAsync() /// Call CreateAsync before using ConvertHtmlTo*, accepts custom BrowserFetcher and custom chromium launch options /// /// - /// Adds custom arguments to chromium + /// Adds custom arguments to chromium /// - public static Task CreateAsync(BrowserFetcher browserFetcher, string chromeiumArguments) + public static Task CreateAsync(BrowserFetcher browserFetcher, string chromiumArguments) { - return CreateAsync(browserFetcher, new LaunchOptions() { Args = new[] { chromeiumArguments } }); + return CreateAsync(browserFetcher, new LaunchOptions() { Args = new[] { chromiumArguments } }); } /// diff --git a/Codeuctivity.HtmlRendererTests/Infrastructure/ChromiumProcessDisposedAsserter.cs b/Codeuctivity.HtmlRendererTests/Infrastructure/ChromiumProcessDisposedAsserter.cs index dd406cd..2e2c5a4 100644 --- a/Codeuctivity.HtmlRendererTests/Infrastructure/ChromiumProcessDisposedAsserter.cs +++ b/Codeuctivity.HtmlRendererTests/Infrastructure/ChromiumProcessDisposedAsserter.cs @@ -7,7 +7,7 @@ namespace Codeuctivity.HtmlRendererTests.Infrastructure { public static class ChromiumProcessDisposedAsserter { - public static async Task AssertNoChromeProcessIsRunning() + public static async Task AssertNoChromiumProcessIsRunning() { for (var i = 0; i < 20 && CountChromiumTasks() > 0; i++) { diff --git a/Codeuctivity.HtmlRendererTests/RendererTests.cs b/Codeuctivity.HtmlRendererTests/RendererTests.cs index 98b0c64..c32f5a2 100644 --- a/Codeuctivity.HtmlRendererTests/RendererTests.cs +++ b/Codeuctivity.HtmlRendererTests/RendererTests.cs @@ -42,7 +42,7 @@ public async Task ShouldConvertHtmlToPdf(string testFileName) } File.Delete(actualFilePath); } - await ChromiumProcessDisposedAsserter.AssertNoChromeProcessIsRunning(); + await ChromiumProcessDisposedAsserter.AssertNoChromiumProcessIsRunning(); } private static bool IsRunningOnWslOrAzureOrMacos() @@ -85,7 +85,7 @@ public async Task ShouldConvertHtmlToPng(string testFileName) } File.Delete(actualFilePath); - await ChromiumProcessDisposedAsserter.AssertNoChromeProcessIsRunning(); + await ChromiumProcessDisposedAsserter.AssertNoChromiumProcessIsRunning(); } [Fact] @@ -122,7 +122,7 @@ public async Task ShouldConvertHtmlToPngNoSandbox(string testFileName) } File.Delete(actualFilePath); - await ChromiumProcessDisposedAsserter.AssertNoChromeProcessIsRunning(); + await ChromiumProcessDisposedAsserter.AssertNoChromiumProcessIsRunning(); } } } \ No newline at end of file