/// <summary> /// Open DevTools using your own Control as the parent. If inspectElementAtX and/or inspectElementAtY are specified then /// the element at the specified (x,y) location will be inspected. /// For resize/moving to work correctly you will need to use the <see cref="CefSharp.WinForms.Handler.LifeSpanHandler"/> implementation. /// (Set <see cref="ChromiumWebBrowser.LifeSpanHandler"/> to an instance of <see cref="CefSharp.WinForms.Handler.LifeSpanHandler"/>) /// </summary> /// <param name="chromiumWebBrowser"><see cref="ChromiumWebBrowser"/> instance</param> /// <param name="addParentControl"> /// Action that is Invoked when the DevTools Host Control has been created and needs to be added to it's parent. /// It's important the control is added to it's intended parent at this point so the <see cref="Control.ClientRectangle"/> /// can be calculated to set the initial display size.</param> /// <param name="inspectElementAtX">x coordinate (used for inspectElement)</param> /// <param name="inspectElementAtY">y coordinate (used for inspectElement)</param> /// <returns>Returns the <see cref="Control"/> that hosts the DevTools instance if successful, otherwise returns null on error.</returns> public static Control ShowDevToolsDocked(this IChromiumWebBrowserBase chromiumWebBrowser, Action <ChromiumHostControl> addParentControl, string controlName = nameof(ChromiumHostControl) + "DevTools", DockStyle dockStyle = DockStyle.Fill, int inspectElementAtX = 0, int inspectElementAtY = 0) { if (chromiumWebBrowser.IsDisposed || addParentControl == null) { return(null); } var host = chromiumWebBrowser.GetBrowserHost(); if (host == null) { return(null); } var control = new ChromiumHostControl() { Name = controlName, Dock = dockStyle }; control.CreateControl(); //It's now time for the user to add the control to it's parent addParentControl(control); //Devtools will be a child of the ChromiumHostControl var rect = control.ClientRectangle; var windowInfo = new WindowInfo(); var windowBounds = new CefSharp.Structs.Rect(rect.X, rect.Y, rect.Width, rect.Height); windowInfo.SetAsChild(control.Handle, windowBounds); host.ShowDevTools(windowInfo, inspectElementAtX, inspectElementAtY); return(control); }
/// <summary> /// Retrieve the current <see cref="NavigationEntry"/>. Contains information like /// <see cref="NavigationEntry.HttpStatusCode"/> and <see cref="NavigationEntry.SslStatus"/> /// </summary> /// <param name="browser">The ChromiumWebBrowser instance this method extends.</param> /// <returns> /// <see cref="Task{NavigationEntry}"/> that when executed returns the current <see cref="NavigationEntry"/> or null /// </returns> public static Task <NavigationEntry> GetVisibleNavigationEntryAsync(this IChromiumWebBrowserBase browser) { var host = browser.GetBrowserHost(); if (host == null) { return(Task.FromResult <NavigationEntry>(null)); } if (Cef.CurrentlyOnThread(CefThreadIds.TID_UI)) { var entry = host.GetVisibleNavigationEntry(); return(Task.FromResult <NavigationEntry>(entry)); } var tcs = new TaskCompletionSource <NavigationEntry>(); Cef.UIThreadTaskFactory.StartNew(delegate { var entry = host.GetVisibleNavigationEntry(); tcs.TrySetResultAsync(entry); }); return(tcs.Task); }