using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Web.WebView2.Core;
namespace WebView2WpfBrowser
{
///
/// Interaction logic for Extensions.xaml
///
public partial class Extensions : Window
{
private CoreWebView2 m_coreWebView2;
public Extensions(CoreWebView2 coreWebView2)
{
m_coreWebView2 = coreWebView2;
InitializeComponent();
_ = FillViewAsync();
}
public class ListEntry
{
public string Name;
public string Id;
public bool Enabled;
public override string ToString()
{
return (Enabled ? "" : "Disabled ") + Name + " (" + Id + ")";
}
}
List m_listData = new List();
private async System.Threading.Tasks.Task FillViewAsync()
{
IReadOnlyList extensionsList = await m_coreWebView2.Profile.GetBrowserExtensionsAsync();
m_listData.Clear();
for (int i = 0; i < extensionsList.Count; ++i)
{
ListEntry entry = new ListEntry();
entry.Name = extensionsList[i].Name;
entry.Id = extensionsList[i].Id;
entry.Enabled = extensionsList[i].IsEnabled;
m_listData.Add(entry);
}
ExtensionsList.ItemsSource = m_listData;
ExtensionsList.Items.Refresh();
}
private void ExtensionsToggleEnabled(object sender, RoutedEventArgs e)
{
_ = ExtensionsToggleEnabledAsync(sender, e);
}
private async System.Threading.Tasks.Task ExtensionsToggleEnabledAsync(object sender, RoutedEventArgs e)
{
ListEntry entry = (ListEntry)ExtensionsList.SelectedItem;
IReadOnlyList extensionsList = await m_coreWebView2.Profile.GetBrowserExtensionsAsync();
bool found = false;
for (int i = 0; i < extensionsList.Count; ++i)
{
if (extensionsList[i].Id == entry.Id)
{
try
{
await extensionsList[i].EnableAsync(extensionsList[i].IsEnabled ? false : true);
}
catch (Exception exception)
{
MessageBox.Show("Failed to toggle extension enabled: " + exception);
}
found = true;
break;
}
}
if (!found)
{
MessageBox.Show("Failed to find extension");
}
await FillViewAsync();
}
private void ExtensionsAdd(object sender, RoutedEventArgs e)
{
_ = ExtensionsAddAsync(sender, e);
}
private async System.Threading.Tasks.Task ExtensionsAddAsync(object sender, RoutedEventArgs e)
{
var dialog = new TextInputDialog(
title: "Add extension",
description: "Enter the absolute Windows file path to the unpackaged browser extension",
defaultInput: "");
if (dialog.ShowDialog() == true)
{
try
{
CoreWebView2BrowserExtension extension = await m_coreWebView2.Profile.AddBrowserExtensionAsync(dialog.Input.Text);
MessageBox.Show("Added extension " + extension.Name + " (" + extension.Id + ")");
await FillViewAsync();
}
catch (Exception exception)
{
MessageBox.Show("Failed to add extension: " + exception);
}
}
}
private void ExtensionsRemove(object sender, RoutedEventArgs e)
{
_ = ExtensionsRemoveAsync(sender, e);
}
private async System.Threading.Tasks.Task ExtensionsRemoveAsync(object sender, RoutedEventArgs e)
{
ListEntry entry = (ListEntry)ExtensionsList.SelectedItem;
if (MessageBox.Show("Remove extension " + entry + "?", "Confirm removal", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
IReadOnlyList extensionsList = await m_coreWebView2.Profile.GetBrowserExtensionsAsync();
bool found = false;
for (int i = 0; i < extensionsList.Count; ++i)
{
if (extensionsList[i].Id == entry.Id)
{
try
{
await extensionsList[i].RemoveAsync();
}
catch (Exception exception)
{
MessageBox.Show("Failed to remove extension: " + exception);
}
found = true;
break;
}
}
if (!found)
{
MessageBox.Show("Failed to find extension");
}
}
await FillViewAsync();
}
}
}