/// <inheritdoc/> /// <remarks> /// NOTE: DevTools popups DO NOT trigger OnBeforePopup. /// </remarks> protected override bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) { newBrowser = null; //No action so we'll go with the default behaviour. if (onPopupCreated == null) { return(false); } var webBrowser = (ChromiumWebBrowser)chromiumWebBrowser; //We need to execute sync here so IWindowInfo.SetAsChild is called before we return false; webBrowser.InvokeSyncOnUiThreadIfRequired(new Action(() => { var control = new ChromiumHostControl { Dock = DockStyle.Fill }; control.CreateControl(); onPopupCreated?.Invoke(control, targetUrl); var rect = control.ClientRectangle; windowInfo.SetAsChild(control.Handle, rect.Left, rect.Top, rect.Right, rect.Bottom); })); return(false); }
/// <inheritdoc/> /// <remarks> /// NOTE: DevTools popups DO NOT trigger OnBeforePopup. /// </remarks> protected override bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) { newBrowser = null; PopupCreation userAction = onBeforePopupCreated?.Invoke(chromiumWebBrowser, browser, frame, targetUrl, targetFrameName, targetDisposition, userGesture, browserSettings) ?? PopupCreation.Continue; //Cancel popup creation if (userAction == PopupCreation.Cancel) { return(true); } if (userAction == PopupCreation.ContinueWithJavascriptDisabled) { noJavascriptAccess = true; } //No action so we'll go with the default behaviour. if (onPopupCreated == null) { return(false); } var webBrowser = (ChromiumWebBrowser)chromiumWebBrowser; //Load and Display Handlers are used to trigger the relevant events. //If they are already assigned we'll leave the user preference in place if (webBrowser.LoadHandler == null) { webBrowser.LoadHandler = new LoadHandler(); } if (webBrowser.DisplayHandler == null) { webBrowser.DisplayHandler = new DisplayHandler(); } //We need to execute sync here so IWindowInfo.SetAsChild is called before we return false; webBrowser.InvokeSyncOnUiThreadIfRequired(new Action(() => { ChromiumHostControl control = chromiumHostControlCreatedDelegate?.Invoke(); if (control == null) { control = new ChromiumHostControl { Dock = DockStyle.Fill }; } control.CreateControl(); onPopupCreated?.Invoke(control, targetUrl); var rect = control.ClientRectangle; var windowBounds = new CefSharp.Structs.Rect(rect.X, rect.Y, rect.Width, rect.Height); windowInfo.SetAsChild(control.Handle, windowBounds); })); return(false); }