using System; using System.Diagnostics; using System.Windows; using System.Windows.Input; using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.Wpf; using Microsoft.Web.WebView2.Core.DevToolsProtocolExtension; using System.Text; using System.Linq; using System.Text.Json; namespace WV2CDPExtensionSample { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { bool _isNavigating = false; public static RoutedCommand CallCDPMethodCommand = new RoutedCommand(); DevToolsProtocolHelper _cdpHelper; DevToolsProtocolHelper cdpHelper { get { if (webView == null || webView.CoreWebView2 == null) { throw new Exception("Initialize WebView before using DevToolsProtocolHelper."); } if (_cdpHelper == null) { _cdpHelper = webView.CoreWebView2.GetDevToolsProtocolHelper(); } return _cdpHelper; } } public MainWindow() { InitializeComponent(); } void GoToPageCmdCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = webView != null && !_isNavigating; } async void GoToPageCmdExecuted(object target, ExecutedRoutedEventArgs e) { await webView.EnsureCoreWebView2Async(); webView.CoreWebView2.Navigate((string)e.Parameter); } #region CDP_COMMANDS async void ShowFPSCounter(object sender, RoutedEventArgs e) { await cdpHelper.Overlay.SetShowFPSCounterAsync(true); } async void HideFPSCounter(object sender, RoutedEventArgs e) { await cdpHelper.Overlay.SetShowFPSCounterAsync(false); } async void SetPageScaleTo4(object sender, RoutedEventArgs e) { await cdpHelper.Emulation.SetPageScaleFactorAsync(4); } async void ResetPageScale(object sender, RoutedEventArgs e) { await cdpHelper.Emulation.SetPageScaleFactorAsync(1); } async void ReloadPage(object sender, RoutedEventArgs e) { await cdpHelper.Page.ReloadAsync(); } async void CaptureSnapshot(object sender, RoutedEventArgs e) { Trace.WriteLine(await cdpHelper.Page.CaptureSnapshotAsync()); } async void GetAllCookies(object sender, RoutedEventArgs e) { Network.Cookie[] cookies = await cdpHelper.Network.GetAllCookiesAsync(); StringBuilder cookieResult = new StringBuilder(cookies.Count() + " cookie(s) received\n"); foreach (var cookie in cookies) { cookieResult.Append($"\n{cookie.Name} {cookie.Value} {(cookie.Session ? "[session cookie]" : cookie.Expires.ToString("G"))}"); } MessageBox.Show(cookieResult.ToString(), "Cookies"); } async void AddOrUpdateCookie(object target, RoutedEventArgs e) { bool cookie = await cdpHelper.Network.SetCookieAsync("CookieName", "CookieValue", null, "https://www.bing.com/"); MessageBox.Show(cookie ? "Cookie is added/updated successfully" : "Error adding/updating cookie", "Cookies"); } async void ClearAllCookies(object sender, RoutedEventArgs e) { await cdpHelper.Network.ClearBrowserCookiesAsync(); MessageBox.Show("Browser cookies are deleted", "Cookies"); } async void SetGeolocation(object sender, RoutedEventArgs e) { double latitude = 36.553085; double longitude = 103.97543; double accuracy = 1; await cdpHelper.Emulation.SetGeolocationOverrideAsync(latitude, longitude, accuracy); MessageBox.Show("Overridden the Geolocation Position", "Geolocation"); } async void ClearGeolocation(object sender, RoutedEventArgs e) { await cdpHelper.Emulation.ClearGeolocationOverrideAsync(); MessageBox.Show("Cleared overridden Geolocation Position", "Geolocation"); } #endregion #region CDP_EVENTS async void SubscribeToDataReceived(object sender, RoutedEventArgs e) { await cdpHelper.Network.EnableAsync(); cdpHelper.Network.DataReceived += PrintDataReceived; MessageBox.Show("Subscribed to DataReceived Event!", "DataReceived"); } void UnsubscribeFromDataReceived(object sender, RoutedEventArgs e) { cdpHelper.Network.DataReceived -= PrintDataReceived; MessageBox.Show("Unsubscribed from DataReceived Event!", "DataReceived"); } void PrintDataReceived(object sender, Network.DataReceivedEventArgs args) { Trace.WriteLine(String.Format("DataReceived Event Args - Timestamp: {0} Request Id: {1} DataLength: {2}", args.Timestamp, args.RequestId, args.DataLength)); } async void SubscribeToAnimationCreated(object sender, RoutedEventArgs e) { await cdpHelper.Animation.EnableAsync(); cdpHelper.Animation.AnimationCreated += PrintAnimationCreated; MessageBox.Show("Subscribed to AnimationCreated Event!", "AnimationCreated"); } void UnsubscribeFromAnimationCreated(object sender, RoutedEventArgs e) { cdpHelper.Animation.AnimationCreated -= PrintAnimationCreated; MessageBox.Show("Unsubscribed from AnimationCreated Event!", "AnimationCreated"); } void PrintAnimationCreated(object sender, Animation.AnimationCreatedEventArgs args) { Trace.WriteLine(String.Format("AnimationCreated Event Args - Id: {0}", args.Id)); } async void SubscribeToDocumentUpdated(object sender, RoutedEventArgs e) { await cdpHelper.DOM.EnableAsync(); cdpHelper.DOM.DocumentUpdated += PrintDocumentUpdated; MessageBox.Show("Subscribed to DocumentUpdated Event!", "DocumentUpdated"); } void UnsubscribeFromDocumentUpdated(object sender, RoutedEventArgs e) { cdpHelper.DOM.DocumentUpdated -= PrintDocumentUpdated; MessageBox.Show("Unsubscribed from DocumentUpdated Event!", "DocumentUpdated"); } void PrintDocumentUpdated(object sender, DOM.DocumentUpdatedEventArgs args) { Trace.WriteLine("DocumentUpdated Event Args - No Parameters", "DocumentUpdated"); } async void SubscribeToDownloadWillBegin(object sender, RoutedEventArgs e) { await cdpHelper.Page.EnableAsync(); cdpHelper.Page.DownloadWillBegin += PrintDownloadWillBegin; MessageBox.Show("Subscribed to DownloadWillBegin Event!", "DownloadWillBegin"); } void UnsubscribeFromDownloadWillBegin(object sender, RoutedEventArgs e) { cdpHelper.Page.DownloadWillBegin -= PrintDownloadWillBegin; MessageBox.Show("Unsubscribed from DownloadWillBegin Event!", "DownloadWillBegin"); } void PrintDownloadWillBegin(object sender, Page.DownloadWillBeginEventArgs args) { Trace.WriteLine(String.Format("DownloadWillBegin Event Args - FrameId: {0} Guid: {1} URL: {2}", args.FrameId, args.Guid, args.Url)); } async void SubscribeToNetworkBasics(object sender, RoutedEventArgs e) { await cdpHelper.Network.EnableAsync(); cdpHelper.Network.ResponseReceived += PrintResponseInfo; cdpHelper.Network.RequestWillBeSent += PrintRequestInfo; } void PrintResponseInfo(object sender, Network.ResponseReceivedEventArgs args) { Trace.WriteLine(JsonSerializer.Serialize(args)); } void PrintRequestInfo(object sender, Network.RequestWillBeSentEventArgs args) { Trace.WriteLine(JsonSerializer.Serialize(args)); } async void UnsubscribeFromNetworkBasics(object sender, RoutedEventArgs e) { cdpHelper.Network.ResponseReceived -= PrintResponseInfo; cdpHelper.Network.RequestWillBeSent -= PrintRequestInfo; await cdpHelper.Network.DisableAsync(); } #endregion } }