mirror of https://github.com/cefsharp/CefSharp.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
16 KiB
275 lines
16 KiB
// Copyright © 2014 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.Diagnostics;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using CefSharp.Example.Proxy;
|
|
using CefSharp.SchemeHandler;
|
|
|
|
namespace CefSharp.Example
|
|
{
|
|
public static class CefExample
|
|
{
|
|
//TODO: Revert after https://github.com/chromiumembedded/cef/issues/2685
|
|
//has been fixed.
|
|
public const string ExampleDomain = "cefsharp.example";
|
|
public const string BaseUrl = "https://" + ExampleDomain;
|
|
public const string DefaultUrl = BaseUrl + "/home.html";
|
|
#if NETCOREAPP
|
|
public const string BindingTestUrl = BaseUrl + "/BindingTestNetCore.html";
|
|
#else
|
|
public const string BindingTestUrl = BaseUrl + "/BindingTest.html";
|
|
#endif
|
|
public const string BindingTestNetCoreUrl = BaseUrl + "/BindingTestNetCore.html";
|
|
public const string BindingTestSingleUrl = BaseUrl + "/BindingTestSingle.html";
|
|
public const string BindingTestsAsyncTaskUrl = BaseUrl + "/BindingTestsAsyncTask.html";
|
|
public const string LegacyBindingTestUrl = BaseUrl + "/LegacyBindingTest.html";
|
|
public const string PostMessageTestUrl = BaseUrl + "/PostMessageTest.html";
|
|
public const string PopupTestUrl = BaseUrl + "/PopupTest.html";
|
|
public const string TooltipTestUrl = BaseUrl + "/TooltipTest.html";
|
|
public const string BasicSchemeTestUrl = BaseUrl + "/SchemeTest.html";
|
|
public const string ResponseFilterTestUrl = BaseUrl + "/ResponseFilterTest.html";
|
|
public const string DraggableRegionTestUrl = BaseUrl + "/DraggableRegionTest.html";
|
|
public const string DragDropCursorsTestUrl = BaseUrl + "/DragDropCursorsTest.html";
|
|
public const string CssAnimationTestUrl = BaseUrl + "/CssAnimationTest.html";
|
|
public const string CdmSupportTestUrl = BaseUrl + "/CdmSupportTest.html";
|
|
public const string HelloWorldUrl = BaseUrl + "/HelloWorld.html";
|
|
public const string BindingApiCustomObjectNameTestUrl = BaseUrl + "/BindingApiCustomObjectNameTest.html";
|
|
public const string TestResourceUrl = "http://test/resource/load";
|
|
public const string RenderProcessCrashedUrl = "http://processcrashed";
|
|
public const string TestUnicodeResourceUrl = "http://test/resource/loadUnicode";
|
|
public const string PopupParentUrl = "http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_close";
|
|
public const string ChromeInternalUrls = "chrome://chrome-urls";
|
|
public const string ChromeNetInternalUrls = "chrome://net-internals";
|
|
public const string ChromeProcessInternalUrls = "chrome://process-internals";
|
|
|
|
// Use when debugging the actual SubProcess, to make breakpoints etc. inside that project work.
|
|
private static readonly bool DebuggingSubProcess = Debugger.IsAttached;
|
|
|
|
public static void Init(CefSettingsBase settings, IBrowserProcessHandler browserProcessHandler)
|
|
{
|
|
// Set Google API keys, used for Geolocation requests sans GPS. See http://www.chromium.org/developers/how-tos/api-keys
|
|
// Environment.SetEnvironmentVariable("GOOGLE_API_KEY", "");
|
|
// Environment.SetEnvironmentVariable("GOOGLE_DEFAULT_CLIENT_ID", "");
|
|
// Environment.SetEnvironmentVariable("GOOGLE_DEFAULT_CLIENT_SECRET", "");
|
|
|
|
//Chromium Command Line args
|
|
//http://peter.sh/experiments/chromium-command-line-switches/
|
|
//NOTE: Not all relevant in relation to `CefSharp`, use for reference purposes only.
|
|
//CEF specific command line args
|
|
//https://bitbucket.org/chromiumembedded/cef/src/master/libcef/common/cef_switches.cc?fileviewer=file-view-default
|
|
|
|
//**IMPORTANT**: For enabled/disabled command line arguments like disable-gpu specifying a value of "0" like
|
|
//settings.CefCommandLineArgs.Add("disable-gpu", "0"); will have no effect as the second argument is ignored.
|
|
|
|
//**IMPORTANT**: When using command line arguments the behaviour may change between Chromium versions, if you are experiencing
|
|
//issues after upgrading to a newer version, you should remove all custom command line arguments and add test them in
|
|
//isolation to determine if they are causing issues.
|
|
//The command line arguments shown here are here as a reference only and are not tested to confirm they work with each version
|
|
|
|
settings.RemoteDebuggingPort = 8088;
|
|
//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.RootCachePath = Path.GetFullPath("cache");
|
|
//If non-null then CachePath must be equal to or a child of RootCachePath
|
|
//We're using a sub folder.
|
|
//
|
|
settings.CachePath = Path.GetFullPath("cache\\global");
|
|
//settings.UserAgent = "CefSharp Browser" + Cef.CefSharpVersion; // Example User Agent
|
|
//settings.CefCommandLineArgs.Add("renderer-startup-dialog");
|
|
//settings.CefCommandLineArgs.Add("disable-site-isolation-trials");
|
|
//settings.CefCommandLineArgs.Add("enable-media-stream"); //Enable WebRTC
|
|
//settings.CefCommandLineArgs.Add("no-proxy-server"); //Don't use a proxy server, always make direct connections. Overrides any other proxy server flags that are passed.
|
|
//settings.CefCommandLineArgs.Add("allow-running-insecure-content"); //By default, an https page cannot run JavaScript or CSS from http URLs. This provides an override to get the old insecure behavior. Only available in 47 and above.
|
|
//https://peter.sh/experiments/chromium-command-line-switches/#disable-site-isolation-trials
|
|
//settings.CefCommandLineArgs.Add("disable-site-isolation-trials");
|
|
//NOTE: Running the Network Service in Process is not something CEF officially supports
|
|
//It may or may not work for newer versions.
|
|
//settings.CefCommandLineArgs.Add("enable-features", "CastMediaRouteProvider,NetworkServiceInProcess");
|
|
|
|
//settings.CefCommandLineArgs.Add("enable-logging"); //Enable Logging for the Renderer process (will open with a cmd prompt and output debug messages - use in conjunction with setting LogSeverity = LogSeverity.Verbose;)
|
|
//settings.LogSeverity = LogSeverity.Verbose; // Needed for enable-logging to output messages
|
|
|
|
//settings.CefCommandLineArgs.Add("disable-extensions"); //Extension support can be disabled
|
|
//settings.CefCommandLineArgs.Add("disable-pdf-extension"); //The PDF extension specifically can be disabled
|
|
|
|
//Audo play example
|
|
//settings.CefCommandLineArgs["autoplay-policy"] = "no-user-gesture-required";
|
|
|
|
//NOTE: For OSR best performance you should run with GPU disabled:
|
|
// `--disable-gpu --disable-gpu-compositing --enable-begin-frame-scheduling`
|
|
// (you'll loose WebGL support but gain increased FPS and reduced CPU usage).
|
|
// http://magpcss.org/ceforum/viewtopic.php?f=6&t=13271#p27075
|
|
//https://bitbucket.org/chromiumembedded/cef/commits/e3c1d8632eb43c1c2793d71639f3f5695696a5e8
|
|
|
|
//NOTE: The following function will set all three params
|
|
//settings.SetOffScreenRenderingBestPerformanceArgs();
|
|
//settings.CefCommandLineArgs.Add("disable-gpu");
|
|
//settings.CefCommandLineArgs.Add("disable-gpu-compositing");
|
|
//settings.CefCommandLineArgs.Add("enable-begin-frame-scheduling");
|
|
|
|
//settings.CefCommandLineArgs.Add("disable-gpu-vsync"); //Disable Vsync
|
|
|
|
// The following options control accessibility state for all frames.
|
|
// These options only take effect if accessibility state is not set by IBrowserHost.SetAccessibilityState call.
|
|
// --force-renderer-accessibility enables browser accessibility.
|
|
// --disable-renderer-accessibility completely disables browser accessibility.
|
|
//settings.CefCommandLineArgs.Add("force-renderer-accessibility");
|
|
//settings.CefCommandLineArgs.Add("disable-renderer-accessibility");
|
|
|
|
//Enables Uncaught exception handler
|
|
settings.UncaughtExceptionStackSize = 10;
|
|
|
|
//Disable WebAssembly
|
|
//settings.JavascriptFlags = "--noexpose_wasm";
|
|
|
|
// Off Screen rendering (WPF/Offscreen)
|
|
if (settings.WindowlessRenderingEnabled)
|
|
{
|
|
//Disable Direct Composition to test https://github.com/cefsharp/CefSharp/issues/1634
|
|
//settings.CefCommandLineArgs.Add("disable-direct-composition");
|
|
|
|
// DevTools doesn't seem to be working when this is enabled
|
|
// http://magpcss.org/ceforum/viewtopic.php?f=6&t=14095
|
|
//settings.CefCommandLineArgs.Add("enable-begin-frame-scheduling");
|
|
}
|
|
|
|
var proxy = ProxyConfig.GetProxyInformation();
|
|
switch (proxy.AccessType)
|
|
{
|
|
case InternetOpenType.Direct:
|
|
{
|
|
//Don't use a proxy server, always make direct connections.
|
|
settings.CefCommandLineArgs.Add("no-proxy-server");
|
|
break;
|
|
}
|
|
case InternetOpenType.Proxy:
|
|
{
|
|
settings.CefCommandLineArgs.Add("proxy-server", proxy.ProxyAddress);
|
|
break;
|
|
}
|
|
case InternetOpenType.PreConfig:
|
|
{
|
|
settings.CefCommandLineArgs.Add("proxy-auto-detect");
|
|
break;
|
|
}
|
|
}
|
|
|
|
//settings.LogSeverity = LogSeverity.Verbose;
|
|
|
|
if (DebuggingSubProcess)
|
|
{
|
|
var architecture = RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant();
|
|
#if NETCOREAPP
|
|
settings.BrowserSubprocessPath = Path.GetFullPath("..\\..\\..\\..\\..\\..\\CefSharp.BrowserSubprocess\\bin.netcore\\" + architecture + "\\Debug\\net6.0-windows\\CefSharp.BrowserSubprocess.exe");
|
|
#else
|
|
settings.BrowserSubprocessPath = Path.GetFullPath("..\\..\\..\\..\\CefSharp.BrowserSubprocess\\bin\\" + architecture + "\\Debug\\CefSharp.BrowserSubprocess.exe");
|
|
#endif
|
|
}
|
|
|
|
settings.CookieableSchemesList = "custom";
|
|
|
|
settings.RegisterScheme(new CefCustomScheme
|
|
{
|
|
SchemeName = CefSharpSchemeHandlerFactory.SchemeName,
|
|
SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),
|
|
IsSecure = true, //treated with the same security rules as those applied to "https" URLs
|
|
});
|
|
|
|
settings.RegisterScheme(new CefCustomScheme
|
|
{
|
|
SchemeName = "https",
|
|
SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),
|
|
DomainName = ExampleDomain
|
|
});
|
|
|
|
settings.RegisterScheme(new CefCustomScheme
|
|
{
|
|
SchemeName = CefSharpSchemeHandlerFactory.SchemeNameTest,
|
|
SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),
|
|
IsSecure = true //treated with the same security rules as those applied to "https" URLs
|
|
});
|
|
|
|
//You can use the http/https schemes - best to register for a specific domain
|
|
settings.RegisterScheme(new CefCustomScheme
|
|
{
|
|
SchemeName = "https",
|
|
SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),
|
|
DomainName = "cefsharp.com",
|
|
IsSecure = true //treated with the same security rules as those applied to "https" URLs
|
|
});
|
|
|
|
const string cefSharpExampleResourcesFolder =
|
|
#if !NETCOREAPP
|
|
@"..\..\..\..\CefSharp.Example\Resources";
|
|
#else
|
|
@"..\..\..\..\..\..\CefSharp.Example\Resources";
|
|
#endif
|
|
|
|
settings.RegisterScheme(new CefCustomScheme
|
|
{
|
|
SchemeName = "localfolder",
|
|
SchemeHandlerFactory = new FolderSchemeHandlerFactory(rootFolder: cefSharpExampleResourcesFolder,
|
|
schemeName: "localfolder", //Optional param no schemename checking if null
|
|
hostName: "cefsharp", //Optional param no hostname checking if null
|
|
defaultPage: "home.html") //Optional param will default to index.html
|
|
});
|
|
|
|
//This must be set before Cef.Initialized is called
|
|
CefSharpSettings.FocusedNodeChangedEnabled = true;
|
|
|
|
//Async Javascript Binding - methods are queued on TaskScheduler.Default.
|
|
//Set this to true to when you have methods that return Task<T>
|
|
//CefSharpSettings.ConcurrentTaskExecution = true;
|
|
|
|
//Legacy Binding Behaviour - Same as Javascript Binding in version 57 and below
|
|
//See issue https://github.com/cefsharp/CefSharp/issues/1203 for details
|
|
//CefSharpSettings.LegacyJavascriptBindingEnabled = true;
|
|
|
|
//Exit the subprocess if the parent process happens to close
|
|
//This is optional at the moment
|
|
//https://github.com/cefsharp/CefSharp/pull/2375/
|
|
CefSharpSettings.SubprocessExitIfParentProcessClosed = true;
|
|
|
|
//NOTE: Set this before any calls to Cef.Initialize to specify a proxy with username and password
|
|
//One set this cannot be changed at runtime. If you need to change the proxy at runtime (dynamically) then
|
|
//see https://github.com/cefsharp/CefSharp/wiki/General-Usage#proxy-resolution
|
|
//CefSharpSettings.Proxy = new ProxyOptions(ip: "127.0.0.1", port: "8080", username: "cefsharp", password: "123");
|
|
|
|
bool performDependencyCheck = !DebuggingSubProcess;
|
|
|
|
if (!Cef.Initialize(settings, performDependencyCheck: performDependencyCheck, browserProcessHandler: browserProcessHandler))
|
|
{
|
|
throw new Exception("Unable to Initialize Cef");
|
|
}
|
|
|
|
Cef.AddCrossOriginWhitelistEntry(BaseUrl, "https", "cefsharp.com", false);
|
|
}
|
|
|
|
public static void RegisterTestResources(IWebBrowser browser)
|
|
{
|
|
if (browser.ResourceRequestHandlerFactory == null)
|
|
{
|
|
browser.ResourceRequestHandlerFactory = new ResourceRequestHandlerFactory();
|
|
}
|
|
|
|
var handler = browser.ResourceRequestHandlerFactory as ResourceRequestHandlerFactory;
|
|
|
|
if (handler != null)
|
|
{
|
|
const string renderProcessCrashedBody = "<html><body><h1>Render Process Crashed</h1><p>Your seeing this message as the render process has crashed</p></body></html>";
|
|
handler.RegisterHandler(RenderProcessCrashedUrl, ResourceHandler.GetByteArray(renderProcessCrashedBody, Encoding.UTF8));
|
|
|
|
const string responseBody = "<html><body><h1>Success</h1><p>This document is loaded from a System.IO.Stream</p></body></html>";
|
|
handler.RegisterHandler(TestResourceUrl, ResourceHandler.GetByteArray(responseBody, Encoding.UTF8));
|
|
|
|
const string unicodeResponseBody = "<html><body>整体满意度</body></html>";
|
|
handler.RegisterHandler(TestUnicodeResourceUrl, ResourceHandler.GetByteArray(unicodeResponseBody, Encoding.UTF8));
|
|
}
|
|
}
|
|
}
|
|
}
|