/// <inheritdoc/> protected override bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser) { if (browser.IsPopup) { var control = ChromiumHostControl.FromBrowser(browser); //We don't have a parent control so we allow the default behaviour, required to close //default popups e.g. DevTools if (control == null) { return(false); } //If the main browser is disposed or the handle has been released then we don't //need to remove the popup (likely removed from menu) if (!control.IsDisposed && control.IsHandleCreated) { //We need to invoke in a sync fashion so our IBrowser object is still in scope //Calling in an async fashion leads to the IBrowser being disposed before we //can access it. control.InvokeSyncOnUiThreadIfRequired(new Action(() => { onPopupDestroyed?.Invoke(control, browser); })); } } //No WM_CLOSE message will be sent, manually handle closing return(true); }
/// <inheritdoc /> protected override void OnLoadingStateChange(IWebBrowser chromiumWebBrowser, LoadingStateChangedEventArgs args) { var browser = args.Browser; if (browser.IsPopup) { var control = ChromiumHostControl.FromBrowser(browser); control?.OnLoadingStateChange(args); } base.OnLoadingStateChange(chromiumWebBrowser, args); }
/// <inheritdoc /> protected override void OnFrameLoadStart(IWebBrowser chromiumWebBrowser, FrameLoadStartEventArgs args) { var browser = args.Browser; if (browser.IsPopup) { var control = ChromiumHostControl.FromBrowser(browser); control?.OnFrameLoadStart(args); } base.OnFrameLoadStart(chromiumWebBrowser, args); }
/// <inheritdoc /> protected override void OnStatusMessage(IWebBrowser chromiumWebBrowser, StatusMessageEventArgs args) { var browser = args.Browser; if (browser.IsPopup) { var control = ChromiumHostControl.FromBrowser(browser); control?.OnStatusMessage(args); } base.OnStatusMessage(chromiumWebBrowser, args); }
/// <inheritdoc /> protected override bool OnConsoleMessage(IWebBrowser chromiumWebBrowser, ConsoleMessageEventArgs args) { var browser = args.Browser; if (browser.IsPopup) { var control = ChromiumHostControl.FromBrowser(browser); control?.OnConsoleMessage(args); } return(base.OnConsoleMessage(chromiumWebBrowser, args)); }
/// <inheritdoc /> protected override void OnAddressChanged(IWebBrowser chromiumWebBrowser, AddressChangedEventArgs args) { var browser = args.Browser; if (browser.IsPopup) { var control = ChromiumHostControl.FromBrowser(browser); control?.OnAddressChanged(args); } base.OnAddressChanged(chromiumWebBrowser, args); }
/// <inheritdoc/> protected override void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser) { if (browser.IsPopup) { //WinForms will kindly lookup the child control from it's handle //If no parentControl then likely it's a native popup created by CEF //(Devtools by default will open as a popup, at this point the Url hasn't been set, so // we're going with this assumption as it fits the use case currently) var control = ChromiumHostControl.FromBrowser(browser); //If control is null then we'll treat as a native popup (do nothing) //If control is disposed there's nothing for us to do either. if (control != null && !control.IsDisposed) { control.BrowserHwnd = browser.GetHost().GetWindowHandle(); control.InvokeOnUiThreadIfRequired(() => { var interceptor = new ParentFormMessageInterceptor(control); interceptor.Moving += (sender, args) => { if (!browser.IsDisposed) { browser?.GetHost()?.NotifyMoveOrResizeStarted(); } }; popupParentFormMessageInterceptors.Add(browser.Identifier, interceptor); }); control.BrowserCore = browser; control.RaiseIsBrowserInitializedChangedEvent(); } onPopupBrowserCreated?.Invoke(control, browser); } }