25
25
using System ;
26
26
using System . Collections . Generic ;
27
27
using System . Globalization ;
28
+ using System . Linq ;
28
29
using System . Text . Json ;
29
30
using System . Text . Json . Serialization ;
30
31
using System . Threading . Tasks ;
@@ -34,50 +35,66 @@ namespace Microsoft.Playwright.MSTest;
34
35
35
36
internal class BrowserService : IWorkerService
36
37
{
37
- public IBrowser Browser { get ; internal set ; } = null ! ;
38
-
39
- public Task ResetAsync ( ) => Task . CompletedTask ;
40
-
41
- public Task DisposeAsync ( ) => Browser ? . CloseAsync ( ) ?? Task . CompletedTask ;
38
+ public IBrowser Browser { get ; private set ; }
42
39
43
40
private BrowserService ( IBrowser browser )
44
41
{
45
42
Browser = browser ;
46
43
}
47
44
48
- public static Task < BrowserService > Register ( WorkerAwareTest test , IBrowserType browserType )
45
+ public static Task < BrowserService > Register ( WorkerAwareTest test , IBrowserType browserType , PlaywrightConnectOptions ? connectOptions )
49
46
{
50
- return test . RegisterService ( "Browser" , async ( ) => new BrowserService ( await CreateBrowser ( browserType ) . ConfigureAwait ( false ) ) ) ;
47
+ return test . RegisterService ( "Browser" , async ( ) => new BrowserService ( await CreateBrowser ( browserType , connectOptions ) . ConfigureAwait ( false ) ) ) ;
51
48
}
52
49
53
- private static async Task < IBrowser > CreateBrowser ( IBrowserType browserType )
50
+ private static async Task < IBrowser > CreateBrowser ( IBrowserType browserType , PlaywrightConnectOptions ? connectOptions )
51
+ {
52
+ if ( connectOptions != null )
53
+ {
54
+ var options = new BrowserTypeConnectOptions ( connectOptions ) ;
55
+ var headers = options . Headers ? . ToDictionary ( kvp => kvp . Key , kvp => kvp . Value ) ?? [ ] ;
56
+ headers . Add ( "x-playwright-launch-options" , JsonSerializer . Serialize ( PlaywrightSettingsProvider . LaunchOptions , new JsonSerializerOptions ( ) { DefaultIgnoreCondition = JsonIgnoreCondition . WhenWritingNull } ) ) ;
57
+ options . Headers = headers ;
58
+ return await browserType . ConnectAsync ( connectOptions . WSEndpoint , options ) . ConfigureAwait ( false ) ;
59
+ }
60
+
61
+ var legacyBrowser = await ConnectBasedOnEnv ( browserType ) ;
62
+ if ( legacyBrowser != null )
63
+ {
64
+ return legacyBrowser ;
65
+ }
66
+ return await browserType . LaunchAsync ( PlaywrightSettingsProvider . LaunchOptions ) . ConfigureAwait ( false ) ;
67
+ }
68
+
69
+ // TODO: Remove at some point
70
+ private static async Task < IBrowser ? > ConnectBasedOnEnv ( IBrowserType browserType )
54
71
{
55
72
var accessToken = Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_ACCESS_TOKEN" ) ;
56
73
var serviceUrl = Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_URL" ) ;
57
74
58
75
if ( string . IsNullOrEmpty ( accessToken ) || string . IsNullOrEmpty ( serviceUrl ) )
59
76
{
60
- return await browserType . LaunchAsync ( PlaywrightSettingsProvider . LaunchOptions ) . ConfigureAwait ( false ) ;
77
+ return null ;
61
78
}
62
- else
79
+
80
+ var exposeNetwork = Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_EXPOSE_NETWORK" ) ?? "<loopback>" ;
81
+ var os = Uri . EscapeDataString ( Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_OS" ) ?? "linux" ) ;
82
+ var runId = Uri . EscapeDataString ( Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_RUN_ID" ) ?? DateTime . Now . ToUniversalTime ( ) . ToString ( "yyyy-MM-ddTHH:mm:ss" , CultureInfo . InvariantCulture ) ) ;
83
+ var apiVersion = "2023-10-01-preview" ;
84
+ var wsEndpoint = $ "{ serviceUrl } ?os={ os } &runId={ runId } &api-version={ apiVersion } ";
85
+
86
+ return await browserType . ConnectAsync ( wsEndpoint , new BrowserTypeConnectOptions
63
87
{
64
- var exposeNetwork = Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_EXPOSE_NETWORK" ) ?? "<loopback>" ;
65
- var os = Uri . EscapeDataString ( Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_OS" ) ?? "linux" ) ;
66
- var runId = Uri . EscapeDataString ( Environment . GetEnvironmentVariable ( "PLAYWRIGHT_SERVICE_RUN_ID" ) ?? DateTime . Now . ToUniversalTime ( ) . ToString ( "yyyy-MM-ddTHH:mm:ss" , CultureInfo . InvariantCulture ) ) ;
67
- var apiVersion = "2023-10-01-preview" ;
68
- var wsEndpoint = $ "{ serviceUrl } ?os={ os } &runId={ runId } &api-version={ apiVersion } ";
69
- var connectOptions = new BrowserTypeConnectOptions
88
+ Timeout = 3 * 60 * 1000 ,
89
+ ExposeNetwork = exposeNetwork ,
90
+ Headers = new Dictionary < string , string >
70
91
{
71
- Timeout = 3 * 60 * 1000 ,
72
- ExposeNetwork = exposeNetwork ,
73
- Headers = new Dictionary < string , string >
74
- {
75
- [ "Authorization" ] = $ "Bearer { accessToken } ",
76
- [ "x-playwright-launch-options" ] = JsonSerializer . Serialize ( PlaywrightSettingsProvider . LaunchOptions , new JsonSerializerOptions ( ) { DefaultIgnoreCondition = JsonIgnoreCondition . WhenWritingNull } )
77
- }
78
- } ;
79
-
80
- return await browserType . ConnectAsync ( wsEndpoint , connectOptions ) . ConfigureAwait ( false ) ;
81
- }
92
+ [ "Authorization" ] = $ "Bearer { accessToken } ",
93
+ [ "x-playwright-launch-options" ] = JsonSerializer . Serialize ( PlaywrightSettingsProvider . LaunchOptions , new JsonSerializerOptions ( ) { DefaultIgnoreCondition = JsonIgnoreCondition . WhenWritingNull } )
94
+ }
95
+ } ) . ConfigureAwait ( false ) ;
82
96
}
97
+
98
+ public Task ResetAsync ( ) => Task . CompletedTask ;
99
+ public Task DisposeAsync ( ) => Browser . CloseAsync ( ) ;
83
100
}
0 commit comments