Skip to content

Commit

Permalink
Release 0.9.9.8 (#545)
Browse files Browse the repository at this point in the history
* Synchronize browser history

* Intercept mouse button navigation
Closes #535
Closes #544
  • Loading branch information
AlexMacocian authored Jan 26, 2024
1 parent 9b3b083 commit 3ee58e2
Show file tree
Hide file tree
Showing 21 changed files with 327 additions and 33 deletions.
5 changes: 3 additions & 2 deletions Daybreak/Configuration/Options/FocusViewOptions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Daybreak.Attributes;
using Daybreak.Configuration.FocusView;
using Daybreak.Models.Browser;
using Newtonsoft.Json;

namespace Daybreak.Configuration.Options;
Expand Down Expand Up @@ -49,7 +50,7 @@ public sealed class FocusViewOptions
[OptionName(Name = "Energy Display Mode", Description = "Sets how should the energy display show the information")]
public PointsDisplay EnergyDisplay { get; set; }

[JsonProperty(nameof(BrowserUrl))]
[JsonProperty(nameof(BrowserHistory))]
[OptionIgnore]
public string? BrowserUrl { get; set; } = "https://wiki.guildwars.com/wiki/Main_Page";
public BrowserHistory BrowserHistory { get; set; } = new();
}
3 changes: 2 additions & 1 deletion Daybreak/Configuration/ProjectConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@
using Daybreak.Views.Onboarding.DirectSong;
using Daybreak.Services.SevenZip;
using Daybreak.Services.ReShade.Notifications;
using Daybreak.Services.BrowserExtensions;
using Daybreak.Services.UBlockOrigin;
using Daybreak.Services.Browser;

namespace Daybreak.Configuration;

Expand Down Expand Up @@ -261,6 +261,7 @@ public override void RegisterServices(IServiceCollection services)
services.AddScoped<IToolboxClient, ToolboxClient>();
services.AddScoped<IProcessInjector, ProcessInjector>();
services.AddScoped<ILaunchConfigurationService, LaunchConfigurationService>();
services.AddScoped<IBrowserHistoryManager, BrowserHistoryManager>();
}

public override void RegisterViews(IViewProducer viewProducer)
Expand Down
5 changes: 3 additions & 2 deletions Daybreak/Controls/ChromiumBrowserWrapper.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
mc:Ignorable="d"
Loaded="UserControl_Loaded"
Unloaded="UserControl_Unloaded"
PreviewMouseDown="Browser_PreviewMouseDown"
x:Name="_this"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
Expand Down Expand Up @@ -51,11 +52,11 @@
<WrapPanel>
<buttons:BackButton Height="30" Width="30"
Clicked="BackButton_Clicked" Margin="5" Cursor="Hand"
IsEnabled="{Binding ElementName=WebBrowser, Path=CanGoBack, Mode=OneWay}"
IsEnabled="{Binding ElementName=_this, Path=BrowserHistoryManager.CanGoBack, Mode=OneWay}"
ToolTip="Go back"/>
<buttons:BackButton Height="30" Width="30"
Clicked="ForwardButton_Clicked" Margin="5" Cursor="Hand"
IsEnabled="{Binding ElementName=WebBrowser, Path=CanGoForward, Mode=OneWay}"
IsEnabled="{Binding ElementName=_this, Path=BrowserHistoryManager.CanGoForward, Mode=OneWay}"
ToolTip="Go forward">
<buttons:BackButton.RenderTransform>
<RotateTransform Angle="180" CenterX="15" CenterY="15"></RotateTransform>
Expand Down
65 changes: 56 additions & 9 deletions Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
using Daybreak.Models;
using Daybreak.Models.Browser;
using Daybreak.Models.Guildwars;
using Daybreak.Services.BrowserExtensions;
using Daybreak.Services.Browser;
using Daybreak.Services.BuildTemplates;
using Daybreak.Utils;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Web.WebView2.Core;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Core.Extensions;
using System.Diagnostics;
Expand All @@ -22,6 +23,7 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Extensions;
using System.Windows.Input;

namespace Daybreak.Controls;

Expand All @@ -40,7 +42,7 @@ public partial class ChromiumBrowserWrapper : UserControl
private const string BrowserSearchLink = $"https://www.google.com/search?q={BrowserSearchPlaceholder}";
private const string BrowserDownloadLink = "https://developer.microsoft.com/en-us/microsoft-edge/webview2/";

private static readonly Regex WebAddressRegex = new("^((http|ftp|https)://)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?", RegexOptions.Compiled);
private static readonly Regex WebAddressRegex = BuildWebAddressRegex();
private static readonly SemaphoreSlim SemaphoreSlim = new(1, 1);

private static CoreWebView2Environment? CoreWebView2Environment;
Expand All @@ -51,11 +53,14 @@ public partial class ChromiumBrowserWrapper : UserControl
public event EventHandler<DownloadPayload>? DownloadingFile;
public event EventHandler<string>? DownloadedFile;

private readonly HashSet<ulong> domNavigationIds = [];
private readonly Task initializationTask;
private readonly IHttpClient<ChromiumBrowserWrapper> httpClient;
private readonly ILiveOptions<BrowserOptions> liveOptions;
private readonly ILogger<ChromiumBrowserWrapper> logger;
private readonly IBuildTemplateManager buildTemplateManager;
private readonly IBrowserHistoryManager historyManager;

private readonly IBrowserExtensionsManager browserExtensionsManager;

[GenerateDependencyProperty(InitialValue = true)]
Expand Down Expand Up @@ -97,8 +102,11 @@ public string Address
set => this.SetValue(AddressProperty, value);
}

public IBrowserHistoryManager BrowserHistoryManager => this.historyManager;

public ChromiumBrowserWrapper()
: this(
Launch.Launcher.Instance.ApplicationServiceProvider.GetRequiredService<IBrowserHistoryManager>(),
Launch.Launcher.Instance.ApplicationServiceProvider.GetRequiredService<IBrowserExtensionsManager>(),
Launch.Launcher.Instance.ApplicationServiceProvider.GetRequiredService<IHttpClient<ChromiumBrowserWrapper>>(),
Launch.Launcher.Instance.ApplicationServiceProvider.GetRequiredService<ILiveOptions<BrowserOptions>>(),
Expand All @@ -108,19 +116,22 @@ public ChromiumBrowserWrapper()
}

public ChromiumBrowserWrapper(
IBrowserHistoryManager historyManager,
IBrowserExtensionsManager browserExtensionsManager,
IHttpClient<ChromiumBrowserWrapper> httpClient,
ILiveOptions<BrowserOptions> liveOptions,
IBuildTemplateManager buildTemplateManager,
ILogger<ChromiumBrowserWrapper> logger)
{
this.historyManager = historyManager.ThrowIfNull();
this.browserExtensionsManager = browserExtensionsManager.ThrowIfNull();
this.httpClient = httpClient.ThrowIfNull();
this.liveOptions = liveOptions.ThrowIfNull();
this.buildTemplateManager = buildTemplateManager.ThrowIfNull();
this.logger = logger.ThrowIfNull();
this.InitializeComponent();

this.historyManager.InitializeHistoryManager(this);
this.initializationTask = Task.Run(this.InitializeBrowserSafe);
}

Expand Down Expand Up @@ -223,6 +234,21 @@ private async Task InitializeBrowser()
this.AddressBarReadonly = this.liveOptions!.Value.AddressBarReadonly;
this.CanDownloadBuild = this.liveOptions.Value.DynamicBuildLoading;
this.WebBrowser.CoreWebView2.NewWindowRequested += (browser, args) => args.Handled = true;
this.WebBrowser.KeyDown += (sender, e) =>
{
if ((e.Key == Key.Left && Keyboard.Modifiers == ModifierKeys.Alt) ||
(e.Key == Key.BrowserBack))
{
this.BrowserHistoryManager.GoBack();
e.Handled = true; // Prevent default behavior
}
else if ((e.Key == Key.Right && Keyboard.Modifiers == ModifierKeys.Alt) ||
(e.Key == Key.BrowserForward))
{
this.BrowserHistoryManager.GoForward();
e.Handled = true; // Prevent default behavior
}
};
this.WebBrowser.NavigationStarting += (browser, args) =>
{
if (this.CanNavigate is false && args.Uri != this.Address)
Expand Down Expand Up @@ -277,6 +303,13 @@ private async Task InitializeBrowser()
};
this.WebBrowser.CoreWebView2.DOMContentLoaded += async (browser, args) =>
{
if (this.domNavigationIds.Contains(args.NavigationId))
{
return;
}

this.domNavigationIds.Add(args.NavigationId);
await this.WebBrowser.CoreWebView2.ExecuteScriptAsync(Scripts.CaptureNavigationButtons);
if (this.CanDownloadBuild)
{
await this.WebBrowser.CoreWebView2.ExecuteScriptAsync(Scripts.SendSelectionOnContextMenu);
Expand Down Expand Up @@ -387,7 +420,7 @@ private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessa
this.logger!.LogError(e, $"Exception encountered when deserializing {nameof(BrowserPayload)}");
}

if (payload?.Key == BrowserPayload.PayloadKeys.ContextMenu)
if (payload?.Key is BrowserPayload.PayloadKeys.ContextMenu)
{
var contextMenuPayload = args.WebMessageAsJson.Deserialize<BrowserPayload<OnContextMenuPayload>>();
var maybeTemplate = contextMenuPayload?.Value?.Selection?.Trim();
Expand Down Expand Up @@ -423,6 +456,14 @@ private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessa
}
});
}
else if (payload?.Key is BrowserPayload.PayloadKeys.XButton1Pressed)
{
this.BrowserHistoryManager.GoBack();
}
else if (payload?.Key is BrowserPayload.PayloadKeys.XButton2Pressed)
{
this.BrowserHistoryManager.GoForward();
}
}

private void DownloadOperation_StateChanged(object? sender, object? e)
Expand Down Expand Up @@ -467,26 +508,24 @@ private void UserControl_Unloaded(object sender, RoutedEventArgs e)
return;
}

this.historyManager.UnInitializeHistoryManager();
this.WebBrowser?.Dispose();
this.browserInitialized = false;
}

private void BackButton_Clicked(object sender, EventArgs e)
{
this.WebBrowser.GoBack();
this.Address = this.WebBrowser.Source.ToString();
this.historyManager.GoBack();
}

private void ForwardButton_Clicked(object sender, EventArgs e)
{
this.WebBrowser.GoForward();
this.Address = this.WebBrowser.Source.ToString();
this.historyManager.GoForward();
}

private void RefreshGlyph_Clicked(object sender, EventArgs e)
{
this.WebBrowser.Reload();
this.Address = this.WebBrowser.Source.ToString();
this.BrowserHistoryManager.Reload();
}

private void CancelGlyph_Clicked(object sender, EventArgs e)
Expand All @@ -510,6 +549,11 @@ private void MaximizeButton_Clicked(object sender, EventArgs e)
this.MaximizeClicked?.Invoke(this, e);
}

private void Browser_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{

}

private void CheckFavoriteAddress()
{
if (this.Address == this.FavoriteAddress)
Expand Down Expand Up @@ -547,4 +591,7 @@ private static string SanitizeAddress(string address)
Uri.TryCreate(address, UriKind.Absolute, out var uri);
return uri?.ToString() ?? string.Empty;
}

[GeneratedRegex("^((http|ftp|https)://)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?", RegexOptions.Compiled)]
private static partial Regex BuildWebAddressRegex();
}
2 changes: 1 addition & 1 deletion Daybreak/Daybreak.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<LangVersion>preview</LangVersion>
<ApplicationIcon>Daybreak.ico</ApplicationIcon>
<IncludePackageReferencesDuringMarkupCompilation>true</IncludePackageReferencesDuringMarkupCompilation>
<Version>0.9.9.7</Version>
<Version>0.9.9.8</Version>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
<UserSecretsId>cfb2a489-db80-448d-a969-80270f314c46</UserSecretsId>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
Expand Down
2 changes: 1 addition & 1 deletion Daybreak/Launch/Launcher.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Daybreak.Configuration;
using Daybreak.Models.Progress;
using Daybreak.Services.BrowserExtensions;
using Daybreak.Services.Browser;
using Daybreak.Services.Drawing;
using Daybreak.Services.ExceptionHandling;
using Daybreak.Services.Mods;
Expand Down
8 changes: 8 additions & 0 deletions Daybreak/Models/Browser/BrowserHistory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Collections.Generic;

namespace Daybreak.Models.Browser;
public sealed class BrowserHistory
{
public List<string> History { get; set; } = [];
public int CurrentPosition { get; set; } = -1;
}
4 changes: 3 additions & 1 deletion Daybreak/Models/Browser/BrowserPayload.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ public class BrowserPayload
public enum PayloadKeys
{
None,
ContextMenu
ContextMenu,
XButton1Pressed,
XButton2Pressed
}

[JsonProperty(nameof(Key))]
Expand Down
2 changes: 1 addition & 1 deletion Daybreak/Models/Plugins/PluginConfigurationBase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Daybreak.Configuration.Options;
using Daybreak.Services.BrowserExtensions;
using Daybreak.Services.Browser;
using Daybreak.Services.Drawing;
using Daybreak.Services.Metrics;
using Daybreak.Services.Mods;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
using System.Extensions;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Daybreak.Services.BrowserExtensions;
namespace Daybreak.Services.Browser;

public sealed class BrowserExtensionsManager : IBrowserExtensionsManager, IBrowserExtensionsProducer
{
Expand Down
Loading

0 comments on commit 3ee58e2

Please sign in to comment.