Skip to content

Commit 465eac4

Browse files
authored
Update chromium flags (#2364)
1 parent 6f8bab4 commit 465eac4

File tree

4 files changed

+168
-41
lines changed

4 files changed

+168
-41
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using PuppeteerSharp.Nunit;
3+
using NUnit.Framework;
4+
5+
namespace PuppeteerSharp.Tests.ChromeLauncherTests
6+
{
7+
public class GetFeaturesTests : PuppeteerPageBaseTest
8+
{
9+
10+
[PuppeteerTest("ChromeLauncher.test.ts", "getFeatures", "returns an empty array when no options are provided")]
11+
public void ReturnsAnEmptyArrayWhenNoOptionsAreProvided()
12+
{
13+
var result = ChromiumLauncher.GetFeatures("--foo", Array.Empty<string>());
14+
Assert.IsEmpty(result);
15+
}
16+
17+
[PuppeteerTest("ChromeLauncher.test.ts", "getFeatures", "returns an empty array when no options match the flag")]
18+
public void ReturnsAnEmptyArrayWhenNoOptionsMatchTheFlag()
19+
{
20+
var result = ChromiumLauncher.GetFeatures("--foo", new[] { "--bar", "--baz" });
21+
Assert.IsEmpty(result);
22+
}
23+
24+
[PuppeteerTest("ChromeLauncher.test.ts", "getFeatures", "returns an array of values when options match the flag")]
25+
public void ReturnsAnArrayOfValuesWhenOptionsMatchTheFlag()
26+
{
27+
var result = ChromiumLauncher.GetFeatures("--foo", new[] { "--foo=bar", "--foo=baz" });
28+
Assert.AreEqual(new[] { "bar", "baz" }, result);
29+
}
30+
31+
[PuppeteerTest("ChromeLauncher.test.ts", "getFeatures", "does not handle whitespace")]
32+
public void DoesNotHandleWhitespace()
33+
{
34+
var result = ChromiumLauncher.GetFeatures("--foo", new[] { "--foo bar", "--foo baz " });
35+
Assert.IsEmpty(result);
36+
}
37+
38+
[PuppeteerTest("ChromeLauncher.test.ts", "getFeatures", "handles equals sign around the flag and value")]
39+
public void HandlesEqualsSignAroundTheFlagAndValue()
40+
{
41+
var result = ChromiumLauncher.GetFeatures("--foo", new[] { "--foo=bar", "--foo=baz" });
42+
Assert.AreEqual(new[] { "bar", "baz" }, result);
43+
}
44+
}
45+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using PuppeteerSharp.Nunit;
3+
using NUnit.Framework;
4+
5+
namespace PuppeteerSharp.Tests.ChromeLauncherTests
6+
{
7+
public class RemoveMatchingFlagsTests : PuppeteerPageBaseTest
8+
{
9+
10+
[PuppeteerTest("ChromeLauncher.test.ts", "removeMatchingFlags", "empty")]
11+
public void Empty()
12+
{
13+
var a = Array.Empty<string>();
14+
var result = ChromiumLauncher.RemoveMatchingFlags(a, "--foo");
15+
Assert.IsEmpty(result);
16+
}
17+
18+
[PuppeteerTest("ChromeLauncher.test.ts", "removeMatchingFlags", "with one match")]
19+
public void WithOneMatch()
20+
{
21+
var a = new[] { "--foo=1", "--bar=baz" };
22+
var result = ChromiumLauncher.RemoveMatchingFlags(a, "--foo");
23+
Assert.AreEqual(new[] { "--bar=baz" }, result);
24+
}
25+
26+
[PuppeteerTest("ChromeLauncher.test.ts", "removeMatchingFlags", "with multiple matches")]
27+
public void WithMultipleMatches()
28+
{
29+
var a = new[] { "--foo=1", "--bar=baz", "--foo=2" };
30+
var result = ChromiumLauncher.RemoveMatchingFlags(a, "--foo");
31+
Assert.AreEqual(new[] { "--bar=baz" }, result);
32+
}
33+
34+
[PuppeteerTest("ChromeLauncher.test.ts", "removeMatchingFlags", "with no matches")]
35+
public void WithNoMatches()
36+
{
37+
var a = new[] { "--foo=1", "--bar=baz" };
38+
var result = ChromiumLauncher.RemoveMatchingFlags(a, "--baz");
39+
Assert.AreEqual(new[] { "--foo=1", "--bar=baz" }, result);
40+
}
41+
}
42+
}

lib/PuppeteerSharp/ChromiumLauncher.cs

Lines changed: 79 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics;
43
using System.Linq;
54
using System.Threading.Tasks;
65
using PuppeteerSharp.BrowserData;
@@ -30,41 +29,6 @@ public ChromiumLauncher(string executable, LaunchOptions options)
3029
Process.StartInfo.Arguments = string.Join(" ", chromiumArgs);
3130
}
3231

33-
/// <summary>
34-
/// The default flags that Chromium will be launched with.
35-
/// </summary>
36-
internal static string[] DefaultArgs { get; } =
37-
{
38-
"--allow-pre-commit-input",
39-
"--disable-background-networking",
40-
"--disable-background-timer-throttling",
41-
"--disable-backgrounding-occluded-windows",
42-
"--disable-breakpad",
43-
"--disable-client-side-phishing-detection",
44-
"--disable-component-extensions-with-background-pages",
45-
"--disable-component-update",
46-
"--disable-default-apps",
47-
"--disable-dev-shm-usage",
48-
"--disable-extensions",
49-
"--disable-features=Translate,BackForwardCache,AcceptCHFrame,MediaRouter,OptimizationHints",
50-
"--disable-hang-monitor",
51-
"--disable-ipc-flooding-protection",
52-
"--disable-popup-blocking",
53-
"--disable-prompt-on-repost",
54-
"--disable-renderer-backgrounding",
55-
"--disable-search-engine-choice-screen",
56-
"--disable-sync",
57-
"--enable-automation",
58-
"--enable-blink-features=IdleDetection",
59-
"--enable-features=NetworkServiceInProcess2",
60-
"--export-tagged-pdf",
61-
"--force-color-profile=srgb",
62-
"--metrics-recording-only",
63-
"--no-first-run",
64-
"--password-store=basic",
65-
"--use-mock-keychain",
66-
};
67-
6832
/// <inheritdoc />
6933
public override Task<string> GetDefaultBuildIdAsync() => Task.FromResult(Chrome.DefaultBuildId);
7034

@@ -73,7 +37,74 @@ public ChromiumLauncher(string executable, LaunchOptions options)
7337

7438
internal static string[] GetDefaultArgs(LaunchOptions options)
7539
{
76-
var chromiumArguments = new List<string>(DefaultArgs);
40+
var userDisabledFeatures = GetFeatures("--disable-features", options.Args);
41+
var args = options.Args;
42+
if (args is not null && userDisabledFeatures.Length > 0)
43+
{
44+
args = RemoveMatchingFlags(options.Args, "--disable-features");
45+
}
46+
47+
// Merge default disabled features with user-provided ones, if any.
48+
var disabledFeatures = new List<string>
49+
{
50+
"Translate",
51+
"AcceptCHFrame",
52+
"MediaRouter",
53+
"OptimizationHints",
54+
"ProcessPerSiteUpToMainFrameThreshold",
55+
};
56+
57+
disabledFeatures.AddRange(userDisabledFeatures);
58+
59+
var userEnabledFeatures = GetFeatures("--enable-features", options.Args);
60+
if (args != null && userEnabledFeatures.Length > 0)
61+
{
62+
args = RemoveMatchingFlags(options.Args, "--enable-features");
63+
}
64+
65+
// Merge default enabled features with user-provided ones, if any.
66+
var enabledFeatures = new List<string>
67+
{
68+
"NetworkServiceInProcess2",
69+
};
70+
71+
disabledFeatures.AddRange(userEnabledFeatures);
72+
73+
var chromiumArguments = new List<string>(
74+
new string[]
75+
{
76+
"--allow-pre-commit-input",
77+
"--disable-background-networking",
78+
"--disable-background-timer-throttling",
79+
"--disable-backgrounding-occluded-windows",
80+
"--disable-breakpad",
81+
"--disable-client-side-phishing-detection",
82+
"--disable-component-extensions-with-background-pages",
83+
"--disable-component-update",
84+
"--disable-default-apps",
85+
"--disable-dev-shm-usage",
86+
"--disable-extensions",
87+
"--disable-field-trial-config",
88+
"--disable-hang-monitor",
89+
"--disable-infobars",
90+
"--disable-ipc-flooding-protection",
91+
"--disable-popup-blocking",
92+
"--disable-prompt-on-repost",
93+
"--disable-renderer-backgrounding",
94+
"--disable-search-engine-choice-screen",
95+
"--disable-sync",
96+
"--enable-automation",
97+
"--enable-blink-features=IdleDetection",
98+
"--export-tagged-pdf",
99+
"--force-color-profile=srgb",
100+
"--metrics-recording-only",
101+
"--no-first-run",
102+
"--password-store=basic",
103+
"--use-mock-keychain",
104+
});
105+
106+
chromiumArguments.Add($"--disable-features={string.Join(",", disabledFeatures)}");
107+
chromiumArguments.Add($"--enable-features={string.Join(",", enabledFeatures)}");
77108

78109
if (!string.IsNullOrEmpty(options.UserDataDir))
79110
{
@@ -95,15 +126,24 @@ internal static string[] GetDefaultArgs(LaunchOptions options)
95126
});
96127
}
97128

98-
if (options.Args.All(arg => arg.StartsWith("-", StringComparison.Ordinal)))
129+
if (args.All(arg => arg.StartsWith("-", StringComparison.Ordinal)))
99130
{
100131
chromiumArguments.Add("about:blank");
101132
}
102133

103-
chromiumArguments.AddRange(options.Args);
134+
chromiumArguments.AddRange(args);
104135
return chromiumArguments.ToArray();
105136
}
106137

138+
internal static string[] GetFeatures(string flag, string[] options)
139+
=> options
140+
.Where(s => s.StartsWith($"{flag}=", StringComparison.InvariantCultureIgnoreCase))
141+
.Select(s => s.Substring(flag.Length + 1))
142+
.Where(s => !string.IsNullOrEmpty(s)).ToArray();
143+
144+
internal static string[] RemoveMatchingFlags(string[] array, string flag)
145+
=> array.Where(arg => !arg.StartsWith(flag, StringComparison.InvariantCultureIgnoreCase)).ToArray();
146+
107147
private static (List<string> ChromiumArgs, TempDirectory TempUserDataDirectory) PrepareChromiumArgs(LaunchOptions options)
108148
{
109149
var chromiumArgs = new List<string>();

lib/PuppeteerSharp/LaunchOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@ public bool Devtools
9292
public bool LogProcess { get; set; }
9393

9494
/// <summary>
95-
/// If <c>true</c>, then do not use <see cref="ChromiumLauncher.DefaultArgs"/>.
95+
/// If <c>true</c>, then do not use <see cref="ChromiumLauncher.GetDefaultArgs"/>.
9696
/// Dangerous option; use with care. Defaults to <c>false</c>.
9797
/// </summary>
9898
public bool IgnoreDefaultArgs { get; set; }
9999

100100
/// <summary>
101-
/// if <see cref="IgnoreDefaultArgs"/> is set to <c>false</c> this list will be used to filter <see cref="ChromiumLauncher.DefaultArgs"/>.
101+
/// if <see cref="IgnoreDefaultArgs"/> is set to <c>false</c> this list will be used to filter <see cref="ChromiumLauncher.GetDefaultArgs"/>.
102102
/// </summary>
103103
public string[] IgnoredDefaultArgs
104104
{

0 commit comments

Comments
 (0)