Skip to content

Commit f0d2995

Browse files
committed
WPF Example - Improve demo of hosting popup in ChromiumWebBrowser instance
- LifespanHandler renamed to ExperimentalLifespanHandler to make it clear the feature is experimental - Add additional check for devtools popup
1 parent aa09702 commit f0d2995

File tree

4 files changed

+130
-130
lines changed

4 files changed

+130
-130
lines changed

CefSharp.Wpf.Example/CefSharp.Wpf.Example.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
<Compile Include="Handlers\DisplayHandler.cs" />
117117
<Compile Include="Handlers\DragHandler.cs" />
118118
<Compile Include="Handlers\MenuHandler.cs" />
119-
<Compile Include="Handlers\LifespanHandler.cs" />
119+
<Compile Include="Handlers\ExperimentalLifespanHandler.cs" />
120120
<Compile Include="Handlers\RequestContextHandler.cs" />
121121
<Compile Include="Handlers\WpfBrowserProcessHandler.cs" />
122122
<Compile Include="Program.cs" />
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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+
}

CefSharp.Wpf.Example/Handlers/LifespanHandler.cs

Lines changed: 0 additions & 128 deletions
This file was deleted.

CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ public BrowserTabView()
9090
};
9191

9292
browser.DisplayHandler = new DisplayHandler();
93-
browser.LifeSpanHandler = new LifespanHandler();
93+
//This LifeSpanHandler implementaion demos hosting a popup in a ChromiumWebBrowser
94+
//instance, it's still considered Experimental
95+
//browser.LifeSpanHandler = new ExperimentalLifespanHandler();
9496
browser.MenuHandler = new MenuHandler();
9597
browser.AccessibilityHandler = new AccessibilityHandler();
9698
var downloadHandler = new DownloadHandler();

0 commit comments

Comments
 (0)