-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Expand file tree
/
Copy pathCefSharpFixture.cs
More file actions
141 lines (116 loc) · 4.99 KB
/
CefSharpFixture.cs
File metadata and controls
141 lines (116 loc) · 4.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// Copyright © 2017 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using CefSharp.Example;
using CefSharp.OffScreen;
using Nito.AsyncEx;
using Titanium.Web.Proxy;
using Titanium.Web.Proxy.Models;
using Xunit;
using Xunit.Abstractions;
using Xunit.Sdk;
namespace CefSharp.Test
{
public class CefSharpFixture : IAsyncLifetime, IDisposable
{
private readonly AsyncContextThread contextThread;
private ProxyServer proxyServer;
private readonly IMessageSink diagnosticMessageSink;
public CefSharpFixture(IMessageSink messageSink)
{
contextThread = new AsyncContextThread();
diagnosticMessageSink = messageSink;
}
private void CefInitialize()
{
if (Cef.IsInitialized == null)
{
var isDefault = AppDomain.CurrentDomain.IsDefaultAppDomain();
if (!isDefault)
{
throw new Exception(@"Add <add key=""xunit.appDomain"" value=""denied""/> to your app.config to disable appdomains");
}
var apiHash = Cef.ApiHash(Cef.ApiVersion);
if (Cef.ApiHashPlatform != apiHash)
{
throw new Exception($"CEF API Has does not match expected. {apiHash} {Cef.ApiHashPlatform}");
}
Cef.EnableWaitForBrowsersToClose();
CefSharp.Internals.BrowserRefCounter.Instance.EnableLogging();
CefSharpSettings.ShutdownOnExit = false;
var settings = new CefSettings();
settings.RegisterScheme(new CefCustomScheme
{
SchemeName = "https",
SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),
DomainName = CefExample.ExampleDomain
});
//The location where cache data will be stored on disk. If empty an in-memory cache will be used for some features and a temporary disk cache for others.
//HTML5 databases such as localStorage will only persist across sessions if a cache path is specified.
settings.CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Tests\\Cache");
settings.RootCachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Tests");
//settings.CefCommandLineArgs.Add("renderer-startup-dialog");
//settings.CefCommandLineArgs.Add("disable-features=SpareRendererForSitePerProcess");
//settings.CefCommandLineArgs.Add("disable-site-isolation-trials");
settings.SetOffScreenRenderingBestPerformanceArgs();
var success = Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
diagnosticMessageSink.OnMessage(new DiagnosticMessage("Cef Initialized:" + success));
}
if (Cef.IsInitialized == false)
{
throw new InvalidOperationException("Cef.Initialize failed.");
}
}
private void CefShutdown()
{
if (Cef.IsInitialized == true)
{
diagnosticMessageSink.OnMessage(new DiagnosticMessage("Before Cef Shutdown"));
Cef.WaitForBrowsersToClose();
try
{
Cef.Shutdown();
}
catch(Exception ex)
{
diagnosticMessageSink.OnMessage(new DiagnosticMessage("Cef Shutdown Exception:" + ex.ToString()));
}
diagnosticMessageSink.OnMessage(new DiagnosticMessage("After Cef Shutdown"));
}
StopProxyServer();
}
public Task InitializeAsync()
{
return contextThread.Factory.StartNew(CefInitialize);
}
public Task DisposeAsync()
{
return contextThread.Factory.StartNew(CefShutdown);
}
public void Dispose()
{
contextThread.Dispose();
}
public void StartProxyServerIfRequired()
{
if (proxyServer == null)
{
proxyServer = new ProxyServer(userTrustRootCertificate: false);
var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Loopback, 8080, false);
// An explicit endpoint is where the client knows about the existence of a proxy
// So client sends request in a proxy friendly manner
proxyServer.AddEndPoint(explicitEndPoint);
proxyServer.Start();
}
}
public void StopProxyServer()
{
proxyServer?.Stop();
proxyServer = null;
}
}
}