public BrowserTabView() { InitializeComponent(); //browser.BrowserSettings.BackgroundColor = Cef.ColorSetARGB(0, 255, 255, 255); browser.RequestHandler = new ExampleRequestHandler(); var bindingOptions = new BindingOptions() { Binder = BindingOptions.DefaultBinder.Binder, MethodInterceptor = new MethodInterceptorLogger() // intercept .net methods calls from js and log it }; //To use the ResolveObject below and bind an object with isAsync:false we must set CefSharpSettings.WcfEnabled = true before //the browser is initialized. CefSharpSettings.WcfEnabled = true; if (CefSharpSettings.LegacyJavascriptBindingEnabled) { browser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); browser.JavascriptObjectRepository.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } //If you call CefSharp.BindObjectAsync in javascript and pass in the name of an object which is not yet //bound, then ResolveObject will be called, you can then register it browser.JavascriptObjectRepository.ResolveObject += (sender, e) => { var repo = e.ObjectRepository; if (e.ObjectName == "boundAsync2") { repo.Register("boundAsync2", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } else if (e.ObjectName == "bound") { browser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); } else if (e.ObjectName == "boundAsync") { browser.JavascriptObjectRepository.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } }; browser.JavascriptObjectRepository.ObjectBoundInJavascript += (sender, e) => { var name = e.ObjectName; Debug.WriteLine($"Object {e.ObjectName} was bound successfully."); }; browser.DisplayHandler = new DisplayHandler(); //This LifeSpanHandler implementaion demos hosting a popup in a ChromiumWebBrowser //instance, it's still considered Experimental //browser.LifeSpanHandler = new ExperimentalLifespanHandler(); browser.MenuHandler = new MenuHandler(); browser.AccessibilityHandler = new AccessibilityHandler(); var downloadHandler = new DownloadHandler(); downloadHandler.OnBeforeDownloadFired += OnBeforeDownloadFired; downloadHandler.OnDownloadUpdatedFired += OnDownloadUpdatedFired; browser.DownloadHandler = downloadHandler; //Read an embedded bitmap into a memory stream then register it as a resource you can then load custom://cefsharp/images/beach.jpg var beachImageStream = new MemoryStream(); CefSharp.Example.Properties.Resources.beach.Save(beachImageStream, System.Drawing.Imaging.ImageFormat.Jpeg); browser.RegisterResourceHandler(CefExample.BaseUrl + "/images/beach.jpg", beachImageStream, Cef.GetMimeType("jpg")); var dragHandler = new DragHandler(); dragHandler.RegionsChanged += OnDragHandlerRegionsChanged; browser.DragHandler = dragHandler; //browser.ResourceHandlerFactory = new InMemorySchemeAndResourceHandlerFactory(); //You can specify a custom RequestContext to share settings amount groups of ChromiumWebBrowsers //Also this is now the only way to access OnBeforePluginLoad - need to implement IRequestContextHandler //browser.RequestContext = new RequestContext(new RequestContextHandler()); //NOTE - This is very important for this example as the default page will not load otherwise //browser.RequestContext.RegisterSchemeHandlerFactory(CefSharpSchemeHandlerFactory.SchemeName, null, new CefSharpSchemeHandlerFactory()); //browser.RequestContext.RegisterSchemeHandlerFactory("https", "cefsharp.example", new CefSharpSchemeHandlerFactory()); //You can start setting preferences on a RequestContext that you created straight away, still needs to be called on the CEF UI thread. //Cef.UIThreadTaskFactory.StartNew(delegate //{ // string errorMessage; // //Use this to check that settings preferences are working in your code // var success = browser.RequestContext.SetPreference("webkit.webprefs.minimum_font_size", 24, out errorMessage); //}); browser.RenderProcessMessageHandler = new RenderProcessMessageHandler(); browser.LoadError += (sender, args) => { // Don't display an error for downloaded files. if (args.ErrorCode == CefErrorCode.Aborted) { return; } //Don't display an error for external protocols that we allow the OS to //handle in OnProtocolExecution(). if (args.ErrorCode == CefErrorCode.UnknownUrlScheme && args.Frame.Url.StartsWith("mailto")) { return; } // Display a load error message. var errorBody = string.Format("<html><body bgcolor=\"white\"><h2>Failed to load URL {0} with error {1} ({2}).</h2></body></html>", args.FailedUrl, args.ErrorText, args.ErrorCode); args.Frame.LoadHtml(errorBody, base64Encode: true); }; CefExample.RegisterTestResources(browser); browser.JavascriptMessageReceived += OnBrowserJavascriptMessageReceived; }
private App() { CefExample.Init(); }
public BrowserTabView() { InitializeComponent(); browser.RequestHandler = new RequestHandler(); //See https://github.com/cefsharp/CefSharp/issues/2246 for details on the two different binding options if (CefSharpSettings.LegacyJavascriptBindingEnabled) { browser.RegisterJsObject("bound", new BoundObject(), options: BindingOptions.DefaultBinder); } else { //Register the new way browser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); } var bindingOptions = new BindingOptions() { Binder = BindingOptions.DefaultBinder.Binder, MethodInterceptor = new MethodInterceptorLogger() // intercept .net methods calls from js and log it }; //See https://github.com/cefsharp/CefSharp/issues/2246 for details on the two different binding options if (CefSharpSettings.LegacyJavascriptBindingEnabled) { browser.RegisterAsyncJsObject("boundAsync", new AsyncBoundObject(), options: bindingOptions); } else { //Register the new way browser.JavascriptObjectRepository.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } //If you call CefSharp.BindObjectAsync in javascript and pass in the name of an object which is not yet //bound, then ResolveObject will be called, you can then register it browser.JavascriptObjectRepository.ResolveObject += (sender, e) => { var repo = e.ObjectRepository; if (e.ObjectName == "boundAsync2") { repo.Register("boundAsync2", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } }; browser.JavascriptObjectRepository.ObjectBoundInJavascript += (sender, e) => { var name = e.ObjectName; }; browser.DisplayHandler = new DisplayHandler(); browser.LifeSpanHandler = new LifespanHandler(); browser.MenuHandler = new MenuHandler(); browser.GeolocationHandler = new GeolocationHandler(); var downloadHandler = new DownloadHandler(); downloadHandler.OnBeforeDownloadFired += OnBeforeDownloadFired; downloadHandler.OnDownloadUpdatedFired += OnDownloadUpdatedFired; browser.DownloadHandler = downloadHandler; //Read an embedded bitmap into a memory stream then register it as a resource you can then load custom://cefsharp/images/beach.jpg var beachImageStream = new MemoryStream(); CefSharp.Example.Properties.Resources.beach.Save(beachImageStream, System.Drawing.Imaging.ImageFormat.Jpeg); browser.RegisterResourceHandler(CefExample.BaseUrl + "/images/beach.jpg", beachImageStream, ResourceHandler.GetMimeType(".jpg")); var dragHandler = new DragHandler(); dragHandler.RegionsChanged += OnDragHandlerRegionsChanged; browser.DragHandler = dragHandler; //browser.ResourceHandlerFactory = new InMemorySchemeAndResourceHandlerFactory(); //You can specify a custom RequestContext to share settings amount groups of ChromiumWebBrowsers //Also this is now the only way to access OnBeforePluginLoad - need to implement IRequestContextHandler //browser.RequestContext = new RequestContext(new RequestContextHandler()); //NOTE - This is very important for this example as the default page will not load otherwise //browser.RequestContext.RegisterSchemeHandlerFactory(CefSharpSchemeHandlerFactory.SchemeName, null, new CefSharpSchemeHandlerFactory()); //You can start setting preferences on a RequestContext that you created straight away, still needs to be called on the CEF UI thread. //Cef.UIThreadTaskFactory.StartNew(delegate //{ // string errorMessage; // //Use this to check that settings preferences are working in your code // var success = browser.RequestContext.SetPreference("webkit.webprefs.minimum_font_size", 24, out errorMessage); //}); browser.RenderProcessMessageHandler = new RenderProcessMessageHandler(); browser.LoadError += (sender, args) => { // Don't display an error for downloaded files. if (args.ErrorCode == CefErrorCode.Aborted) { return; } // Don't display an error for external protocols that we allow the OS to // handle. See OnProtocolExecution(). //if (args.ErrorCode == CefErrorCode.UnknownUrlScheme) //{ // var url = args.Frame.Url; // if (url.StartsWith("spotify:")) // { // return; // } //} // Display a load error message. var errorBody = string.Format("<html><body bgcolor=\"white\"><h2>Failed to load URL {0} with error {1} ({2}).</h2></body></html>", args.FailedUrl, args.ErrorText, args.ErrorCode); args.Frame.LoadStringForUrl(errorBody, args.FailedUrl); }; CefExample.RegisterTestResources(browser); }
public BrowserTabUserControl(Action <string, int?> openNewTab, string url, bool multiThreadedMessageLoopEnabled) { InitializeComponent(); var browser = new ChromiumWebBrowser(url) { Dock = DockStyle.Fill }; browserPanel.Controls.Add(browser); Browser = browser; browser.MenuHandler = new MenuHandler(); browser.RequestHandler = new WinFormsRequestHandler(openNewTab); browser.JsDialogHandler = new JsDialogHandler(); browser.DownloadHandler = new DownloadHandler(); browser.AudioHandler = new CefSharp.Handler.AudioHandler(); browser.FrameHandler = new CefSharp.Handler.FrameHandler(); if (multiThreadedMessageLoopEnabled) { browser.KeyboardHandler = new KeyboardHandler(); } //The CefSharp.WinForms.Handler.LifeSpanHandler implementation //allows for Popups to be hosted in Controls/Tabs //This example also demonstrates docking DevTools in a SplitPanel browser.LifeSpanHandler = LifeSpanHandler .Create() .OnPopupCreated((ctrl, targetUrl) => { //Don't try using ctrl.FindForm() here as //the control hasn't been attached to a parent yet. if (FindForm() is BrowserForm owner) { owner.AddTab(ctrl, targetUrl); } }) .OnPopupDestroyed((ctrl, popupBrowser) => { //If we docked DevTools (hosted it ourselves rather than the default popup) //Used when the BrowserTabUserControl.ShowDevToolsDocked method is called if (popupBrowser.MainFrame.Url.Equals("devtools://devtools/devtools_app.html")) { //Dispose of the parent control we used to host DevTools, this will release the DevTools window handle //and the ILifeSpanHandler.OnBeforeClose() will be call after. ctrl.Dispose(); } else { //If browser is disposed or the handle has been released then we don't //need to remove the tab in this example. The user likely used the // File -> Close Tab menu option which also calls BrowserForm.RemoveTab if (!ctrl.IsDisposed && ctrl.IsHandleCreated) { if (ctrl.FindForm() is BrowserForm owner) { var windowHandle = popupBrowser.GetHost().GetWindowHandle(); owner.RemoveTab(windowHandle); } ctrl.Dispose(); } } }) .Build(); browser.LoadingStateChanged += OnBrowserLoadingStateChanged; browser.ConsoleMessage += OnBrowserConsoleMessage; browser.TitleChanged += OnBrowserTitleChanged; browser.AddressChanged += OnBrowserAddressChanged; browser.StatusMessage += OnBrowserStatusMessage; browser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged; browser.LoadError += OnLoadError; #if NETCOREAPP browser.JavascriptObjectRepository.Register("boundAsync", new AsyncBoundObject(), options: BindingOptions.DefaultBinder); #else browser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); browser.JavascriptObjectRepository.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: BindingOptions.DefaultBinder); #endif //If you call CefSharp.BindObjectAsync in javascript and pass in the name of an object which is not yet //bound, then ResolveObject will be called, you can then register it browser.JavascriptObjectRepository.ResolveObject += (sender, e) => { var repo = e.ObjectRepository; if (e.ObjectName == "boundAsync2") { #if NETCOREAPP repo.Register("boundAsync2", new AsyncBoundObject(), options: BindingOptions.DefaultBinder); #else repo.Register("boundAsync2", new AsyncBoundObject(), isAsync: true, options: BindingOptions.DefaultBinder); #endif } }; browser.RenderProcessMessageHandler = new RenderProcessMessageHandler(); browser.DisplayHandler = new DisplayHandler(); //browser.MouseDown += OnBrowserMouseClick; browser.HandleCreated += OnBrowserHandleCreated; //browser.ResourceHandlerFactory = new FlashResourceHandlerFactory(); this.multiThreadedMessageLoopEnabled = multiThreadedMessageLoopEnabled; var eventObject = new ScriptedMethodsBoundObject(); eventObject.EventArrived += OnJavascriptEventArrived; // Use the default of camelCaseJavascriptNames // .Net methods starting with a capitol will be translated to starting with a lower case letter when called from js #if !NETCOREAPP browser.JavascriptObjectRepository.Register("boundEvent", eventObject, isAsync: false, options: BindingOptions.DefaultBinder); #endif CefExample.RegisterTestResources(browser); var version = string.Format("Chromium: {0}, CEF: {1}, CefSharp: {2}", Cef.ChromiumVersion, Cef.CefVersion, Cef.CefSharpVersion); //Set label directly, don't use DisplayOutput as call would be a NOOP (no valid handle yet). outputLabel.Text = version; }
public static int Main(string[] args) { const bool simpleSubProcess = false; //Until https://bitbucket.org/chromiumembedded/cef/issues/1995/ is resolved it's nessicary to //deal with the spawning of the crashpad process here as it's not possible to configure which exe it uses //When running from within VS and using the vshost process you'll see an error in the log and this won't get called. var crashpadHandlerExitCode = Cef.ExecuteProcess(); //crashpadHandlerExitCode will be -1 for normal process execution, only when running as a subprocess will it be greater if (crashpadHandlerExitCode >= 0) { return(crashpadHandlerExitCode); } Cef.EnableHighDPISupport(); //NOTE: Using a simple sub processes uses your existing application executable to spawn instances of the sub process. //Features like JSB, EvaluateScriptAsync, custom schemes require the CefSharp.BrowserSubprocess to function if (simpleSubProcess) { var exitCode = Cef.ExecuteProcess(); if (exitCode >= 0) { return(exitCode); } #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio" + "please make sure you compile in `Release` mode.", "Warning"); } #endif var settings = new CefSettings(); settings.BrowserSubprocessPath = "CefSharp.WinForms.Example.exe"; Cef.Initialize(settings); var browser = new SimpleBrowserForm(); Application.Run(browser); } else { #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio" + "please make sure you compile in `Release` mode.", "Warning"); } #endif const bool multiThreadedMessageLoop = true; var browser = new BrowserForm(multiThreadedMessageLoop); //var browser = new SimpleBrowserForm(); //var browser = new TabulationDemoForm(); IBrowserProcessHandler browserProcessHandler; if (multiThreadedMessageLoop) { browserProcessHandler = new BrowserProcessHandler(); } else { //Get the current taskScheduler (must be called after the form is created) var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); browserProcessHandler = new WinFormsBrowserProcessHandler(scheduler); } CefExample.Init(osr: false, multiThreadedMessageLoop: multiThreadedMessageLoop, browserProcessHandler: browserProcessHandler); Application.Run(browser); } return(0); }
public BrowserTabUserControl(Action <string, int?> openNewTab, string url, bool multiThreadedMessageLoopEnabled) { InitializeComponent(); var browser = new ChromiumWebBrowser(url) { Dock = DockStyle.Fill }; browserPanel.Controls.Add(browser); Browser = browser; browser.MenuHandler = new MenuHandler(); browser.RequestHandler = new WinFormsRequestHandler(openNewTab); browser.JsDialogHandler = new JsDialogHandler(); browser.DownloadHandler = new DownloadHandler(); if (multiThreadedMessageLoopEnabled) { browser.KeyboardHandler = new KeyboardHandler(); } else { //When MultiThreadedMessageLoop is disabled we don't need the //CefSharp focus handler implementation. browser.FocusHandler = null; } //Handling DevTools docked inside the same window requires //an instance of the LifeSpanHandler all the window events, //e.g. creation, resize, moving, closing etc. browser.LifeSpanHandler = new LifeSpanHandler(openPopupsAsTabs: false); browser.LoadingStateChanged += OnBrowserLoadingStateChanged; browser.ConsoleMessage += OnBrowserConsoleMessage; browser.TitleChanged += OnBrowserTitleChanged; browser.AddressChanged += OnBrowserAddressChanged; browser.StatusMessage += OnBrowserStatusMessage; browser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged; browser.LoadError += OnLoadError; browser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); browser.JavascriptObjectRepository.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: BindingOptions.DefaultBinder); //If you call CefSharp.BindObjectAsync in javascript and pass in the name of an object which is not yet //bound, then ResolveObject will be called, you can then register it browser.JavascriptObjectRepository.ResolveObject += (sender, e) => { var repo = e.ObjectRepository; if (e.ObjectName == "boundAsync2") { repo.Register("boundAsync2", new AsyncBoundObject(), isAsync: true, options: BindingOptions.DefaultBinder); } }; browser.RenderProcessMessageHandler = new RenderProcessMessageHandler(); browser.DisplayHandler = new DisplayHandler(); //browser.MouseDown += OnBrowserMouseClick; browser.HandleCreated += OnBrowserHandleCreated; //browser.ResourceHandlerFactory = new FlashResourceHandlerFactory(); this.multiThreadedMessageLoopEnabled = multiThreadedMessageLoopEnabled; var eventObject = new ScriptedMethodsBoundObject(); eventObject.EventArrived += OnJavascriptEventArrived; // Use the default of camelCaseJavascriptNames // .Net methods starting with a capitol will be translated to starting with a lower case letter when called from js browser.JavascriptObjectRepository.Register("boundEvent", eventObject, isAsync: false, options: BindingOptions.DefaultBinder); CefExample.RegisterTestResources(browser); var version = String.Format("Chromium: {0}, CEF: {1}, CefSharp: {2}", Cef.ChromiumVersion, Cef.CefVersion, Cef.CefSharpVersion); DisplayOutput(version); }
public static int Main(string[] args) { const bool simpleSubProcess = false; Cef.EnableHighDPISupport(); //NOTE: Using a simple sub processes uses your existing application executable to spawn instances of the sub process. //Features like JSB, EvaluateScriptAsync, custom schemes require the CefSharp.BrowserSubprocess to function if (simpleSubProcess) { var exitCode = Cef.ExecuteProcess(); if (exitCode >= 0) { return(exitCode); } #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio " + "please make sure you compile in `Release` mode.", "Warning"); } #endif var settings = new CefSettings(); settings.BrowserSubprocessPath = "CefSharp.WinForms.Example.exe"; Cef.Initialize(settings); var browser = new SimpleBrowserForm(true); Application.Run(browser); } else { #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio " + "please make sure you compile in `Release` mode.", "Warning"); } #endif //When multiThreadedMessageLoop = true then externalMessagePump must be set to false // To enable externalMessagePump set multiThreadedMessageLoop = false and externalMessagePump = true const bool multiThreadedMessageLoop = true; const bool externalMessagePump = false; var browser = new BrowserForm(multiThreadedMessageLoop); //var browser = new SimpleBrowserForm(multiThreadedMessageLoop); //var browser = new TabulationDemoForm(); IBrowserProcessHandler browserProcessHandler; if (multiThreadedMessageLoop) { browserProcessHandler = new BrowserProcessHandler(); } else { if (externalMessagePump) { //Get the current taskScheduler (must be called after the form is created) var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); browserProcessHandler = new ScheduleMessagePumpBrowserProcessHandler(scheduler); } else { //We'll add out WinForms timer to the components container so it's Diposed browserProcessHandler = new WinFormsBrowserProcessHandler(browser.Components); } } var settings = new CefSettings(); settings.MultiThreadedMessageLoop = multiThreadedMessageLoop; settings.ExternalMessagePump = externalMessagePump; CefExample.Init(settings, browserProcessHandler: browserProcessHandler); Application.Run(browser); } return(0); }
public BrowserTabView() { InitializeComponent(); browser.RequestHandler = new RequestHandler(); browser.RegisterJsObject("bound", new BoundObject(), BindingOptions.DefaultBinder); browser.RegisterAsyncJsObject("boundAsync", new AsyncBoundObject()); // Enable touch scrolling - once properly tested this will likely become the default //browser.IsManipulationEnabled = true; browser.LifeSpanHandler = new LifespanHandler(); browser.MenuHandler = new MenuHandler(); browser.GeolocationHandler = new GeolocationHandler(); browser.DownloadHandler = new DownloadHandler(); var dragHandler = new DragHandler(); dragHandler.RegionsChanged += OnDragHandlerRegionsChanged; browser.DragHandler = dragHandler; //browser.ResourceHandlerFactory = new InMemorySchemeAndResourceHandlerFactory(); //You can specify a custom RequestContext to share settings amount groups of ChromiumWebBrowsers //Also this is now the only way to access OnBeforePluginLoad - need to implement IPluginHandler //browser.RequestContext = new RequestContext(new PluginHandler()); //NOTE - This is very important for this example as the default page will not load otherwise //browser.RequestContext.RegisterSchemeHandlerFactory(CefSharpSchemeHandlerFactory.SchemeName, null, new CefSharpSchemeHandlerFactory()); //You can start setting preferences on a RequestContext that you created straight away, still needs to be called on the CEF UI thread. //Cef.UIThreadTaskFactory.StartNew(delegate //{ // string errorMessage; // //Use this to check that settings preferences are working in your code // var success = browser.RequestContext.SetPreference("webkit.webprefs.minimum_font_size", 24, out errorMessage); //}); browser.RenderProcessMessageHandler = new RenderProcessMessageHandler(); browser.LoadError += (sender, args) => { // Don't display an error for downloaded files. if (args.ErrorCode == CefErrorCode.Aborted) { return; } // Don't display an error for external protocols that we allow the OS to // handle. See OnProtocolExecution(). //if (args.ErrorCode == CefErrorCode.UnknownUrlScheme) //{ // var url = args.Frame.Url; // if (url.StartsWith("spotify:")) // { // return; // } //} // Display a load error message. var errorBody = string.Format("<html><body bgcolor=\"white\"><h2>Failed to load URL {0} with error {1} ({2}).</h2></body></html>", args.FailedUrl, args.ErrorText, args.ErrorCode); args.Frame.LoadStringForUrl(errorBody, args.FailedUrl); }; CefExample.RegisterTestResources(browser); }
public BrowserTabView() { InitializeComponent(); browser.RequestHandler = new RequestHandler(); if (CefSharpSettings.WcfEnabled) { browser.RegisterJsObject("bound", new BoundObject()); } browser.RegisterAsyncJsObject("boundAsync", new AsyncBoundObject()); browser.LifeSpanHandler = new LifespanHandler(); browser.MenuHandler = new MenuHandler(); browser.GeolocationHandler = new GeolocationHandler(); browser.DownloadHandler = new DownloadHandler(); //NOTE:This code is a workaround for https://github.com/cefsharp/CefSharp/issues/583 // The `upstream` issue has been flagged as resolved, so hopefully this can be removed // in the future. //browser.PreviewTextInput += (sender, args) => //{ // var host = browser.GetBrowser().GetHost(); // var keyEvent = new KeyEvent(); // foreach (var character in args.Text) // { // keyEvent.WindowsKeyCode = character; // keyEvent.Type = KeyEventType.Char; // host.SendKeyEvent(keyEvent); // } // args.Handled = true; //}; browser.LoadError += (sender, args) => { // Don't display an error for downloaded files. if (args.ErrorCode == CefErrorCode.Aborted) { return; } // Don't display an error for external protocols that we allow the OS to // handle. See OnProtocolExecution(). //if (args.ErrorCode == CefErrorCode.UnknownUrlScheme) //{ // var url = args.Frame.Url; // if (url.StartsWith("spotify:")) // { // return; // } //} // Display a load error message. var errorBody = string.Format("<html><body bgcolor=\"white\"><h2>Failed to load URL {0} with error {1} ({2}).</h2></body></html>", args.FailedUrl, args.ErrorText, args.ErrorCode); args.Frame.LoadStringForUrl(errorBody, args.FailedUrl); }; CefExample.RegisterTestResources(browser); }
public BrowserTabView() { InitializeComponent(); DataContextChanged += OnDataContextChanged; //browser.BrowserSettings.BackgroundColor = Cef.ColorSetARGB(0, 255, 255, 255); //Please remove the comments below to use the Experimental WpfImeKeyboardHandler. //browser.WpfKeyboardHandler = new CefSharp.Wpf.Experimental.WpfImeKeyboardHandler(browser); //Please remove the comments below to specify the color of the CompositionUnderline. //var transparent = Colors.Transparent; //var black = Colors.Black; //ImeHandler.ColorBKCOLOR = Cef.ColorSetARGB(transparent.A, transparent.R, transparent.G, transparent.B); //ImeHandler.ColorUNDERLINE = Cef.ColorSetARGB(black.A, black.R, black.G, black.B); browser.RequestHandler = new ExampleRequestHandler(); var bindingOptions = new BindingOptions() { Binder = BindingOptions.DefaultBinder.Binder, MethodInterceptor = new MethodInterceptorLogger() // intercept .net methods calls from js and log it }; //To use the ResolveObject below and bind an object with isAsync:false we must set CefSharpSettings.WcfEnabled = true before //the browser is initialized. #if !NETCOREAPP CefSharpSettings.WcfEnabled = true; #endif //If you call CefSharp.BindObjectAsync in javascript and pass in the name of an object which is not yet //bound, then ResolveObject will be called, you can then register it browser.JavascriptObjectRepository.ResolveObject += (sender, e) => { var repo = e.ObjectRepository; //When JavascriptObjectRepository.Settings.LegacyBindingEnabled = true //This event will be raised with ObjectName == Legacy so you can bind your //legacy objects #if NETCOREAPP if (e.ObjectName == "Legacy") { repo.Register("boundAsync", new AsyncBoundObject(), options: bindingOptions); } else { if (e.ObjectName == "boundAsync") { repo.Register("boundAsync", new AsyncBoundObject(), options: bindingOptions); } else if (e.ObjectName == "boundAsync2") { repo.Register("boundAsync2", new AsyncBoundObject(), options: bindingOptions); } } #else if (e.ObjectName == "Legacy") { repo.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); repo.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } else { if (e.ObjectName == "bound") { repo.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder); } else if (e.ObjectName == "boundAsync") { repo.Register("boundAsync", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } else if (e.ObjectName == "boundAsync2") { repo.Register("boundAsync2", new AsyncBoundObject(), isAsync: true, options: bindingOptions); } } #endif }; browser.JavascriptObjectRepository.ObjectBoundInJavascript += (sender, e) => { var name = e.ObjectName; Debug.WriteLine($"Object {e.ObjectName} was bound successfully."); }; browser.DisplayHandler = new DisplayHandler(); //This LifeSpanHandler implementaion demos hosting a popup in a ChromiumWebBrowser //instance, it's still considered Experimental //browser.LifeSpanHandler = new ExperimentalLifespanHandler(); browser.MenuHandler = new MenuHandler(addDevtoolsMenuItems: true); //Enable experimental Accessibility support browser.AccessibilityHandler = new AccessibilityHandler(browser); browser.IsBrowserInitializedChanged += (sender, args) => { if ((bool)args.NewValue) { //Uncomment to enable support //browser.GetBrowserHost().SetAccessibilityState(CefState.Enabled); } }; var downloadHandler = new DownloadHandler(); downloadHandler.OnBeforeDownloadFired += OnBeforeDownloadFired; downloadHandler.OnDownloadUpdatedFired += OnDownloadUpdatedFired; browser.DownloadHandler = downloadHandler; browser.AudioHandler = new CefSharp.Handler.AudioHandler(); //Read an embedded bitmap into a memory stream then register it as a resource you can then load custom://cefsharp/images/beach.jpg var beachImageStream = new MemoryStream(); CefSharp.Example.Properties.Resources.beach.Save(beachImageStream, System.Drawing.Imaging.ImageFormat.Jpeg); browser.RegisterResourceHandler(CefExample.BaseUrl + "/images/beach.jpg", beachImageStream, Cef.GetMimeType("jpg")); var dragHandler = new DragHandler(); dragHandler.RegionsChanged += OnDragHandlerRegionsChanged; browser.DragHandler = dragHandler; //browser.ResourceHandlerFactory = new InMemorySchemeAndResourceHandlerFactory(); //You can specify a custom RequestContext to share settings amount groups of ChromiumWebBrowsers //browser.RequestContext = new RequestContext(new RequestContextHandler()); //NOTE - This is very important for this example as the default page will not load otherwise //browser.RequestContext.RegisterSchemeHandlerFactory(CefSharpSchemeHandlerFactory.SchemeName, null, new CefSharpSchemeHandlerFactory()); //browser.RequestContext.RegisterSchemeHandlerFactory("https", "cefsharp.example", new CefSharpSchemeHandlerFactory()); //You can start setting preferences on a RequestContext that you created straight away, still needs to be called on the CEF UI thread. //Cef.UIThreadTaskFactory.StartNew(delegate //{ // string errorMessage; // //Use this to check that settings preferences are working in your code // var success = browser.RequestContext.SetPreference("webkit.webprefs.minimum_font_size", 24, out errorMessage); //}); browser.RenderProcessMessageHandler = new RenderProcessMessageHandler(); browser.LoadError += (sender, args) => { //Aborted is generally safe to ignore //Actions like starting a download will trigger an Aborted error //which doesn't require any user action. if (args.ErrorCode == CefErrorCode.Aborted) { return; } //Don't display an error for external protocols that we allow the OS to //handle in OnProtocolExecution(). if (args.ErrorCode == CefErrorCode.UnknownUrlScheme && args.Frame.Url.StartsWith("mailto")) { return; } // Display a load error message. var errorHtml = string.Format("<html><body><h2>Failed to load URL {0} with error {1} ({2}).</h2></body></html>", args.FailedUrl, args.ErrorText, args.ErrorCode); _ = args.Browser.SetMainFrameDocumentContentAsync(errorHtml); //AddressChanged isn't called for failed Urls so we need to manually update the Url TextBox Dispatcher.InvokeAsync(() => { var viewModel = (BrowserTabViewModel)this.DataContext; viewModel.AddressEditable = args.FailedUrl; }); }; CefExample.RegisterTestResources(browser); browser.JavascriptMessageReceived += OnBrowserJavascriptMessageReceived; }
public static int Main(string[] args) { const bool simpleSubProcess = false; Cef.EnableHighDPISupport(); //NOTE: Using a simple sub processes uses your existing application executable to spawn instances of the sub process. //Features like JSB, EvaluateScriptAsync, custom schemes require the CefSharp.BrowserSubprocess to function if (simpleSubProcess) { var exitCode = Cef.ExecuteProcess(); if (exitCode >= 0) { return(exitCode); } #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio" + "please make sure you compile in `Release` mode.", "Warning"); } #endif var settings = new CefSettings(); settings.BrowserSubprocessPath = "CefSharp.WinForms.Example.exe"; Cef.Initialize(settings); var browser = new SimpleBrowserForm(); Application.Run(browser); } else { #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio" + "please make sure you compile in `Release` mode.", "Warning"); } #endif const bool multiThreadedMessageLoop = true; CefExample.Init(false, multiThreadedMessageLoop: multiThreadedMessageLoop); if (multiThreadedMessageLoop == false) { //http://magpcss.org/ceforum/apidocs3/projects/%28default%29/%28_globals%29.html#CefDoMessageLoopWork%28%29 //Perform a single iteration of CEF message loop processing. //This function is used to integrate the CEF message loop into an existing application message loop. //Care must be taken to balance performance against excessive CPU usage. //This function should only be called on the main application thread and only if CefInitialize() is called with a CefSettings.multi_threaded_message_loop value of false. //This function will not block. Application.Idle += (s, e) => Cef.DoMessageLoopWork(); } var browser = new BrowserForm(); //var browser = new SimpleBrowserForm(); //var browser = new TabulationDemoForm(); Application.Run(browser); } return(0); }
public static int Main(string[] args) { const bool simpleSubProcess = false; Cef.EnableHighDPISupport(); //NOTE: Using a simple sub processes uses your existing application executable to spawn instances of the sub process. //Features like JSB, EvaluateScriptAsync, custom schemes require the CefSharp.BrowserSubprocess to function // if (simpleSubProcess) // { // var exitCode = Cef.ExecuteProcess(); // if (exitCode >= 0) // { // return exitCode; // } //#if DEBUG // if (!System.Diagnostics.Debugger.IsAttached) // { // MessageBox.Show("When running this Example outside of Visual Studio" + // "please make sure you compile in `Release` mode.", "Warning"); // } //#endif // var settings = new CefSettings(); // settings.BrowserSubprocessPath = "CefSharp.WinForms.Example.exe"; // Cef.Initialize(settings); // var browser = new SimpleBrowserForm(); // Application.Run(browser); // } // else // { #if DEBUG if (!System.Diagnostics.Debugger.IsAttached) { MessageBox.Show("When running this Example outside of Visual Studio" + "please make sure you compile in `Release` mode.", "Warning"); } #endif const bool multiThreadedMessageLoop = true; var browser = new WebBrowser(multiThreadedMessageLoop); //var browser = new SimpleBrowserForm(); //var browser = new TabulationDemoForm(); IBrowserProcessHandler browserProcessHandler; if (multiThreadedMessageLoop) { browserProcessHandler = new BrowserProcessHandler(); } else { //Get the current taskScheduler (must be called after the form is created) var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); browserProcessHandler = new WinFormsBrowserProcessHandler(scheduler); } CefExample.Init(osr: false, multiThreadedMessageLoop: multiThreadedMessageLoop, browserProcessHandler: browserProcessHandler); Application.Run(browser); return(0); }
static void Main() { CefExample.Init(); Application.Run(new MainForm()); }