|
| 1 | +// Copyright © 2015 The CefSharp Authors. All rights reserved. |
| 2 | +// |
| 3 | +// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. |
| 4 | + |
| 5 | +using System.Windows; |
| 6 | +using System.Windows.Interop; |
| 7 | + |
| 8 | +namespace CefSharp.Wpf.Example.Handlers |
| 9 | +{ |
| 10 | + /// <summary> |
| 11 | + /// LifeSpanHandler implementation that demos hosting a popup in a new ChromiumWebBrowser instance. |
| 12 | + /// This example code is EXPERIMENTAL |
| 13 | + /// </summary> |
| 14 | + public class ExperimentalLifespanHandler : ILifeSpanHandler |
| 15 | + { |
| 16 | + bool ILifeSpanHandler.OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) |
| 17 | + { |
| 18 | + //Set newBrowser to null unless your attempting to host the popup in a new instance of ChromiumWebBrowser |
| 19 | + newBrowser = null; |
| 20 | + |
| 21 | + var chromiumWebBrowser = (ChromiumWebBrowser)browserControl; |
| 22 | + |
| 23 | + ChromiumWebBrowser chromiumBrowser = null; |
| 24 | + |
| 25 | + var windowX = (windowInfo.X == int.MinValue) ? double.NaN : windowInfo.X; |
| 26 | + var windowY = (windowInfo.Y == int.MinValue) ? double.NaN : windowInfo.Y; |
| 27 | + var windowWidth = (windowInfo.Width == int.MinValue) ? double.NaN : windowInfo.Width; |
| 28 | + var windowHeight = (windowInfo.Height == int.MinValue) ? double.NaN : windowInfo.Height; |
| 29 | + |
| 30 | + chromiumWebBrowser.Dispatcher.Invoke(() => |
| 31 | + { |
| 32 | + var owner = Window.GetWindow(chromiumWebBrowser); |
| 33 | + chromiumBrowser = new ChromiumWebBrowser |
| 34 | + { |
| 35 | + Address = targetUrl, |
| 36 | + }; |
| 37 | + |
| 38 | + chromiumBrowser.SetAsPopup(); |
| 39 | + chromiumBrowser.LifeSpanHandler = this; |
| 40 | + |
| 41 | + var popup = new Window |
| 42 | + { |
| 43 | + Left = windowX, |
| 44 | + Top = windowY, |
| 45 | + Width = windowWidth, |
| 46 | + Height = windowHeight, |
| 47 | + Content = chromiumBrowser, |
| 48 | + Owner = owner, |
| 49 | + Title = targetFrameName |
| 50 | + }; |
| 51 | + |
| 52 | + var windowInteropHelper = new WindowInteropHelper(popup); |
| 53 | + //Create the handle Window handle (In WPF there's only one handle per window, not per control) |
| 54 | + var handle = windowInteropHelper.EnsureHandle(); |
| 55 | + |
| 56 | + //The parentHandle value will be used to identify monitor info and to act as the parent window for dialogs, |
| 57 | + //context menus, etc. If parentHandle is not provided then the main screen monitor will be used and some |
| 58 | + //functionality that requires a parent window may not function correctly. |
| 59 | + windowInfo.SetAsWindowless(handle); |
| 60 | + |
| 61 | + popup.Closed += (o, e) => |
| 62 | + { |
| 63 | + var w = o as Window; |
| 64 | + if (w != null && w.Content is IWebBrowser) |
| 65 | + { |
| 66 | + (w.Content as IWebBrowser).Dispose(); |
| 67 | + w.Content = null; |
| 68 | + } |
| 69 | + }; |
| 70 | + }); |
| 71 | + |
| 72 | + newBrowser = chromiumBrowser; |
| 73 | + |
| 74 | + return false; |
| 75 | + } |
| 76 | + |
| 77 | + void ILifeSpanHandler.OnAfterCreated(IWebBrowser browserControl, IBrowser browser) |
| 78 | + { |
| 79 | + if (!browser.IsDisposed && browser.IsPopup) |
| 80 | + { |
| 81 | + //DevTools is hosted in it's own popup, we don't perform any action here |
| 82 | + if (!browser.MainFrame.Url.Equals("devtools://devtools/devtools_app.html")) |
| 83 | + { |
| 84 | + var chromiumWebBrowser = (ChromiumWebBrowser)browserControl; |
| 85 | + |
| 86 | + chromiumWebBrowser.Dispatcher.Invoke(() => |
| 87 | + { |
| 88 | + var owner = Window.GetWindow(chromiumWebBrowser); |
| 89 | + |
| 90 | + if (owner != null && owner.Content == browserControl) |
| 91 | + { |
| 92 | + owner.Show(); |
| 93 | + } |
| 94 | + }); |
| 95 | + } |
| 96 | + } |
| 97 | + } |
| 98 | + |
| 99 | + bool ILifeSpanHandler.DoClose(IWebBrowser browserControl, IBrowser browser) |
| 100 | + { |
| 101 | + return false; |
| 102 | + } |
| 103 | + |
| 104 | + void ILifeSpanHandler.OnBeforeClose(IWebBrowser browserControl, IBrowser browser) |
| 105 | + { |
| 106 | + if (!browser.IsDisposed && browser.IsPopup) |
| 107 | + { |
| 108 | + //DevTools is hosted in it's own popup, we don't perform any action here |
| 109 | + if (!browser.MainFrame.Url.Equals("devtools://devtools/devtools_app.html")) |
| 110 | + { |
| 111 | + var chromiumWebBrowser = (ChromiumWebBrowser)browserControl; |
| 112 | + |
| 113 | + chromiumWebBrowser.Dispatcher.Invoke(() => |
| 114 | + { |
| 115 | + var owner = Window.GetWindow(chromiumWebBrowser); |
| 116 | + |
| 117 | + if (owner != null && owner.Content == browserControl) |
| 118 | + { |
| 119 | + owner.Close(); |
| 120 | + } |
| 121 | + }); |
| 122 | + } |
| 123 | + } |
| 124 | + } |
| 125 | + } |
| 126 | +} |
0 commit comments