示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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));
        }
示例#6
0
        /// <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);
        }
示例#7
0
        /// <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);
            }
        }