diff --git a/src/PeekF1/PeekF1/PeekF1.csproj b/src/PeekF1/PeekF1/PeekF1.csproj index 81a9e55..5f8e707 100644 --- a/src/PeekF1/PeekF1/PeekF1.csproj +++ b/src/PeekF1/PeekF1/PeekF1.csproj @@ -32,6 +32,9 @@ + + 1.0.3537.50 + diff --git a/src/PeekF1/PeekF1Dev17/PeekF1Dev17.csproj b/src/PeekF1/PeekF1Dev17/PeekF1Dev17.csproj index 86b1e67..1dce715 100644 --- a/src/PeekF1/PeekF1Dev17/PeekF1Dev17.csproj +++ b/src/PeekF1/PeekF1Dev17/PeekF1Dev17.csproj @@ -35,6 +35,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + + 1.0.3537.50 + diff --git a/src/PeekF1/PeekF1Shared/Peek/F1PeekResultPresentation.cs b/src/PeekF1/PeekF1Shared/Peek/F1PeekResultPresentation.cs index fdccab1..c2c61b0 100644 --- a/src/PeekF1/PeekF1Shared/Peek/F1PeekResultPresentation.cs +++ b/src/PeekF1/PeekF1Shared/Peek/F1PeekResultPresentation.cs @@ -1,9 +1,10 @@ -using Microsoft.VisualStudio.Language.Intellisense; +using Microsoft.VisualStudio.Language.Intellisense; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Threading; using System; using System.ComponentModel; +using System.IO; using System.Windows; using System.Windows.Input; using System.Windows.Media; @@ -53,7 +54,7 @@ public IWpfTextView ContainingTextView } } - public System.Windows.Forms.WebBrowser Browser + public Microsoft.Web.WebView2.WinForms.WebView2 Browser { get { @@ -82,12 +83,22 @@ public System.Windows.UIElement Create(IPeekSession session, IPeekResultScrollSt _control = new F1PeekPresentationControl(); _control.DataContext = this; - _browser = new System.Windows.Forms.WebBrowser(); - _browser.Url = _helpUri; - _control.WinFormsHost.Child = _browser; - - _browser.DocumentCompleted += Browser_DocumentCompleted; - _browser.Navigating += Browser_Navigating; + _browser = new Microsoft.Web.WebView2.WinForms.WebView2(); + _control.WinFormsHost.Child = _browser; + + _browser.NavigationCompleted += Browser_NavigationCompleted; + _browser.NavigationStarting += Browser_NavigationStarting; + + ThreadHelper.JoinableTaskFactory.WithPriority(_control.Dispatcher, DispatcherPriority.Background).RunAsync(async () => + { + await Task.Yield(); + + string userDataFolder = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), "VS-PPT-Peek-WV2"); + Microsoft.Web.WebView2.Core.CoreWebView2Environment environment = await Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(userDataFolder: userDataFolder); + await _browser.EnsureCoreWebView2Async(environment); + _browser.CoreWebView2.Settings.AreDevToolsEnabled = false; + _browser.Source = _helpUri; + }); return _control; } @@ -118,27 +129,33 @@ protected void RaisePropertyChanged(string propertyName) } } - private void Browser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e) + private void Browser_NavigationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e) { - _browser.DocumentCompleted -= Browser_DocumentCompleted; + _browser.NavigationCompleted -= Browser_NavigationCompleted; _control.ProgressBar.Visibility = Visibility.Collapsed; Keyboard.Focus(_control.PresentationRoot); - _browser.Document.Focusing += Document_Focusing; + _browser.GotFocus += Browser_GotFocus; } - private void Browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e) + private void Browser_NavigationStarting(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs e) { - if (string.IsNullOrEmpty(e.Url.Fragment) && e.Url.Host != null && e.Url.Host.EndsWith("msdn.microsoft.com")) + UriBuilder uri = new UriBuilder(e.Uri); + if (uri.Host != null) { - e.Cancel = true; - - ThreadHelper.JoinableTaskFactory.RunAsync(async () => - { - await Task.Yield(); - _browser.Navigate(e.Url.AbsoluteUri + "#content"); - }); + bool isMsdn = uri.Host.EndsWith("msdn.microsoft.com"); + if ((isMsdn && string.IsNullOrEmpty(uri.Fragment)) || (uri.Host.EndsWith("learn.microsoft.com") && uri.Fragment == "#content")) + { + e.Cancel = true; + + ThreadHelper.JoinableTaskFactory.RunAsync(async () => + { + await Task.Yield(); + uri.Fragment = isMsdn ? "content" : "article-header"; + _browser.Source = uri.Uri; + }); + } } } @@ -151,7 +168,7 @@ private void SendFocusToPeek() } } - private void Document_Focusing(object sender, System.Windows.Forms.HtmlElementEventArgs e) + private void Browser_GotFocus(object sender, EventArgs e) { SendFocusToPeek(); } @@ -191,12 +208,9 @@ public void Dispose() { if (_browser != null) { - _browser.DocumentCompleted -= Browser_DocumentCompleted; - _browser.Navigating -= Browser_Navigating; - if (_browser.Document != null) - { - _browser.Document.Focusing -= Document_Focusing; - } + _browser.NavigationCompleted -= Browser_NavigationCompleted; + _browser.NavigationStarting -= Browser_NavigationStarting; + _browser.GotFocus -= Browser_GotFocus; _browser.Dispose(); } @@ -230,7 +244,7 @@ public bool IsReadOnly #pragma warning disable 0067 public event EventHandler IsReadOnlyChanged; - private System.Windows.Forms.WebBrowser _browser; + private Microsoft.Web.WebView2.WinForms.WebView2 _browser; #pragma warning restore 0067 event EventHandler IPeekResultPresentation.RecreateContent diff --git a/src/PeekF1/PeekF1Shared/Peek/F1PeekResultScrollState.cs b/src/PeekF1/PeekF1Shared/Peek/F1PeekResultScrollState.cs index 0c8a067..fcd8def 100644 --- a/src/PeekF1/PeekF1Shared/Peek/F1PeekResultScrollState.cs +++ b/src/PeekF1/PeekF1Shared/Peek/F1PeekResultScrollState.cs @@ -22,7 +22,7 @@ public Uri BrowserUrl { if (_presentation.Browser != null) { - return _presentation.Browser.Url; + return _presentation.Browser.Source; } return null; }