Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ jobs:
ci:
permissions:
contents: read
uses: mortenn/BrowserPicker.Actions/.github/workflows/ci.yml@acb9b119377245e0bb213408e8da15f7b0a678b5
uses: mortenn/BrowserPicker.Actions/.github/workflows/ci.yml@1f35242bb89d3bc12c83ca4bd4727f3414204340
with:
dotnet_version: 10.x
2 changes: 1 addition & 1 deletion .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ jobs:
validate:
permissions:
contents: read
uses: mortenn/BrowserPicker.Actions/.github/workflows/pr-validation.yml@acb9b119377245e0bb213408e8da15f7b0a678b5
uses: mortenn/BrowserPicker.Actions/.github/workflows/pr-validation.yml@1f35242bb89d3bc12c83ca4bd4727f3414204340
with:
dotnet_version: 10.x
47 changes: 47 additions & 0 deletions BrowserPicker.sln
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{4F9A9F0E
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrowserPicker.SchemaGen", "tools\BrowserPicker.SchemaGen\BrowserPicker.SchemaGen.csproj", "{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrowserPicker.Common.Tests", "tests\BrowserPicker.Common.Tests\BrowserPicker.Common.Tests.csproj", "{74803C00-9215-44D9-B3DC-FD1BFB45B020}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Debug|Any CPU = Debug|Any CPU
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Debug|ARM64.ActiveCfg = Debug|x64
Expand All @@ -57,61 +63,101 @@ Global
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Debug|x64.Build.0 = Debug|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Debug|x86.ActiveCfg = Debug|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Debug|x86.Build.0 = Debug|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|ARM64.ActiveCfg = Release|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|ARM64.Build.0 = Release|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|x64.ActiveCfg = Release|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|x64.Build.0 = Release|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|x86.ActiveCfg = Release|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|x86.Build.0 = Release|x64
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7695535-9C0D-4983-B8F7-09B067347E7E}.Release|Any CPU.Build.0 = Release|Any CPU
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|ARM64.ActiveCfg = Debug|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|ARM64.Build.0 = Debug|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|x64.ActiveCfg = Debug|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|x64.Build.0 = Debug|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|x86.ActiveCfg = Debug|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|x86.Build.0 = Debug|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|ARM64.ActiveCfg = Release|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|ARM64.Build.0 = Release|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|x64.ActiveCfg = Release|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|x64.Build.0 = Release|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|x86.ActiveCfg = Release|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|x86.Build.0 = Release|x64
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B875AE86-5212-4F7F-BB1C-2BAA1FC110BC}.Release|Any CPU.Build.0 = Release|Any CPU
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|ARM64.ActiveCfg = Debug|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|ARM64.Build.0 = Debug|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|x64.ActiveCfg = Debug|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|x64.Build.0 = Debug|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|x86.ActiveCfg = Debug|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|x86.Build.0 = Debug|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|ARM64.ActiveCfg = Release|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|ARM64.Build.0 = Release|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|x64.ActiveCfg = Release|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|x64.Build.0 = Release|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|x86.ActiveCfg = Release|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|x86.Build.0 = Release|x64
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3CE17EA-BAAE-4DE7-AFB2-319D50ECB2C8}.Release|Any CPU.Build.0 = Release|Any CPU
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Debug|ARM64.ActiveCfg = Debug|ARM64
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Debug|x64.ActiveCfg = Debug|x64
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Debug|x86.ActiveCfg = Debug|x86
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|ARM64.ActiveCfg = Release|ARM64
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|ARM64.Build.0 = Release|ARM64
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|x64.ActiveCfg = Release|x64
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|x86.ActiveCfg = Release|x86
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|x86.Build.0 = Release|x86
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F9D9359C-6DA4-463E-86B9-505E04E01C3A}.Release|Any CPU.Build.0 = Release|Any CPU
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Debug|x64.ActiveCfg = Debug|x64
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Debug|x86.ActiveCfg = Debug|x86
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|ARM64.ActiveCfg = Release|ARM64
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|ARM64.Build.0 = Release|ARM64
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|x64.ActiveCfg = Release|x64
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|x86.ActiveCfg = Release|x86
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|x86.Build.0 = Release|x86
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA}.Release|Any CPU.Build.0 = Release|Any CPU
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Debug|ARM64.ActiveCfg = Debug|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Debug|x64.ActiveCfg = Debug|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Debug|x86.ActiveCfg = Debug|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|ARM64.ActiveCfg = Release|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|ARM64.Build.0 = Release|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|x64.ActiveCfg = Release|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|x64.Build.0 = Release|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|x86.ActiveCfg = Release|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|x86.Build.0 = Release|x64
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900}.Release|Any CPU.Build.0 = Release|Any CPU
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|ARM64.ActiveCfg = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|ARM64.Build.0 = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|x64.ActiveCfg = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|x64.Build.0 = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|x86.ActiveCfg = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|x86.Build.0 = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|Any CPU.ActiveCfg = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Debug|Any CPU.Build.0 = Debug|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|ARM64.ActiveCfg = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|ARM64.Build.0 = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|x64.ActiveCfg = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|x64.Build.0 = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|x86.ActiveCfg = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|x86.Build.0 = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|Any CPU.ActiveCfg = Release|x64
{74803C00-9215-44D9-B3DC-FD1BFB45B020}.Release|Any CPU.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -123,6 +169,7 @@ Global
{F9D9359C-6DA4-463E-86B9-505E04E01C3A} = {CD1CE02F-9EBF-48E0-81E4-E047F20F10C8}
{FADE3CC5-5631-4BF0-A92B-A3464BA5A5EA} = {CD1CE02F-9EBF-48E0-81E4-E047F20F10C8}
{9D34ABBC-3A7D-BA41-F4CD-EED86E736900} = {4F9A9F0E-98B5-459D-BFD1-9CFEAFE5D116}
{74803C00-9215-44D9-B3DC-FD1BFB45B020} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FA02F9A8-CC4F-4C63-A345-418FC0D10D32}
Expand Down
4 changes: 3 additions & 1 deletion src/BrowserPicker.Common/DefaultSetting.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,9 @@ public int MatchLength(Uri url)
return Type switch
{
MatchType.Default => 1,
MatchType.Hostname when pattern is not null => url.Host.EndsWith(pattern) ? pattern.Length : 0,
MatchType.Hostname when pattern is not null && !url.IsFile => url.Host.EndsWith(pattern)
? pattern.Length
: 0,
MatchType.Prefix when pattern is not null => url.OriginalString.StartsWith(pattern) ? pattern.Length : 0,
MatchType.Regex when pattern is not null => Regex.Match(url.OriginalString, pattern).Length,
MatchType.Contains when pattern is not null => url.OriginalString.Contains(pattern) ? pattern.Length : 0,
Expand Down
44 changes: 38 additions & 6 deletions src/BrowserPicker.Common/UrlHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public UrlHandler(ILogger<UrlHandler> logger, string? requestedUrl, IApplication
try
{
uri = new Uri(requestedUrl);
host_name = uri.Host;
host_name = uri.IsFile ? null : uri.Host;
}
catch
{
Expand Down Expand Up @@ -99,7 +99,7 @@ public async Task Start(CancellationToken cancellationToken)
{
return;
}
HostName = uri.IsFile && !uri.IsUnc ? null : uri.Host;
HostName = uri.IsFile ? null : uri.Host;
while (true)
{
var jump = ResolveJumpPage(uri);
Expand All @@ -108,7 +108,7 @@ public async Task Start(CancellationToken cancellationToken)
logger.LogJumpUrl(uri);
UnderlyingTargetURL = jump;
uri = new Uri(jump);
HostName = uri.IsFile && !uri.IsUnc ? null : uri.Host;
HostName = uri.IsFile ? null : uri.Host;
continue;
}

Expand All @@ -119,7 +119,7 @@ public async Task Start(CancellationToken cancellationToken)
IsShortenedURL = true;
UnderlyingTargetURL = shortened;
uri = new Uri(shortened);
HostName = uri.IsFile && !uri.IsUnc ? null : uri.Host;
HostName = uri.IsFile ? null : uri.Host;
continue;
}

Expand Down Expand Up @@ -462,6 +462,9 @@ public string? UnderlyingTargetURL
if (SetProperty(ref underlying_target_url, value))
{
OnPropertyChanged(nameof(DisplayURL));
OnPropertyChanged(nameof(SecurityPresentation));
OnPropertyChanged(nameof(RegistrableDomain));
OnPropertyChanged(nameof(CanRememberRegistrableDomain));
}
}
}
Expand All @@ -476,14 +479,38 @@ public bool IsShortenedURL
}

/// <summary>
/// Host name of the (possibly resolved) URL; null for file URLs when not UNC.
/// Host name of the (possibly resolved) URL; null for file URLs.
/// </summary>
public string? HostName
{
get => host_name;
set => SetProperty(ref host_name, value);
set
{
if (SetProperty(ref host_name, value))
{
OnPropertyChanged(nameof(CanRememberChoice));
OnPropertyChanged(nameof(CanRememberRegistrableDomain));
}
}
}

/// <summary>
/// True when the current URL has a host that can be stored as a hostname default.
/// </summary>
public bool CanRememberChoice => !string.IsNullOrWhiteSpace(HostName);

/// <summary>
/// Registrable domain derived from the current display URL, if it can be classified locally.
/// </summary>
public string? RegistrableDomain => SecurityPresentation.RegistrableDomain;

/// <summary>
/// True when the registrable domain is a useful broader default than the full host.
/// </summary>
public bool CanRememberRegistrableDomain =>
!string.IsNullOrWhiteSpace(RegistrableDomain)
&& !string.Equals(RegistrableDomain, HostName, StringComparison.OrdinalIgnoreCase);

/// <summary>
/// Favicon image bytes loaded from the target page, if available.
/// </summary>
Expand All @@ -507,6 +534,11 @@ public bool FavIconProbed
/// </summary>
public string? DisplayURL => UnderlyingTargetURL ?? TargetURL;

/// <summary>
/// Local-only URL presentation hints derived from <see cref="DisplayURL"/>.
/// </summary>
public UrlSecurityPresentation SecurityPresentation => UrlSecurityPresentation.FromDisplayUrl(DisplayURL);

/// <summary>
/// Default list of URL shortener host names used to resolve redirects.
/// </summary>
Expand Down
Loading