diff --git a/BrowserDetector.sln b/BrowserDetector.sln index a52935f..39a25be 100644 --- a/BrowserDetector.sln +++ b/BrowserDetector.sln @@ -15,12 +15,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{5AB86EFC-4 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.Benchmarks", "perf\BrowserDetector.Benchmarks\BrowserDetector.Benchmarks.csproj", "{74E28CEE-CBE2-49DB-811A-B63E8FDD744E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.Net", "src\BrowserDetector.NetCore\BrowserDetector.Net.csproj", "{2E0D3C7A-98AA-475A-816B-3B51EA377C6A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.WebApi", "sample\BrowserDetector.WebApi\BrowserDetector.WebApi.csproj", "{6369627B-5878-4CFE-A996-859D8663603C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{31BD75C3-015A-4308-9B08-07786C191BAC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.Abstractions", "src\BrowserDetector.Abstractions\BrowserDetector.Abstractions.csproj", "{B5A6CB28-4F5D-4D59-AE9C-E4F4F359AAC8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.AzureFunctions", "src\BrowserDetector.AzureFunctions\BrowserDetector.AzureFunctions.csproj", "{53502D05-344E-4B98-A4B1-C840CB5B670F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.AspNetCore", "src\BrowserDetector.AspNetCore\BrowserDetector.AspNetCore.csproj", "{B4EA5350-7ECB-465F-A680-F4B8EA4CC3DF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrowserDetector.Core", "src\BrowserDetector.Core\BrowserDetector.Core.csproj", "{510FD940-A579-45F4-9152-C88EDB72AE8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrowserDetector.FunctionApp", "sample\BrowserDetector.FunctionApp\BrowserDetector.FunctionApp.csproj", "{B81C6FDE-21E0-4FF0-9C15-17B1EE53952D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,14 +43,30 @@ Global {74E28CEE-CBE2-49DB-811A-B63E8FDD744E}.Debug|Any CPU.Build.0 = Debug|Any CPU {74E28CEE-CBE2-49DB-811A-B63E8FDD744E}.Release|Any CPU.ActiveCfg = Release|Any CPU {74E28CEE-CBE2-49DB-811A-B63E8FDD744E}.Release|Any CPU.Build.0 = Release|Any CPU - {2E0D3C7A-98AA-475A-816B-3B51EA377C6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E0D3C7A-98AA-475A-816B-3B51EA377C6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E0D3C7A-98AA-475A-816B-3B51EA377C6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E0D3C7A-98AA-475A-816B-3B51EA377C6A}.Release|Any CPU.Build.0 = Release|Any CPU {6369627B-5878-4CFE-A996-859D8663603C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6369627B-5878-4CFE-A996-859D8663603C}.Debug|Any CPU.Build.0 = Debug|Any CPU {6369627B-5878-4CFE-A996-859D8663603C}.Release|Any CPU.ActiveCfg = Release|Any CPU {6369627B-5878-4CFE-A996-859D8663603C}.Release|Any CPU.Build.0 = Release|Any CPU + {B5A6CB28-4F5D-4D59-AE9C-E4F4F359AAC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5A6CB28-4F5D-4D59-AE9C-E4F4F359AAC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5A6CB28-4F5D-4D59-AE9C-E4F4F359AAC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5A6CB28-4F5D-4D59-AE9C-E4F4F359AAC8}.Release|Any CPU.Build.0 = Release|Any CPU + {53502D05-344E-4B98-A4B1-C840CB5B670F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53502D05-344E-4B98-A4B1-C840CB5B670F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53502D05-344E-4B98-A4B1-C840CB5B670F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53502D05-344E-4B98-A4B1-C840CB5B670F}.Release|Any CPU.Build.0 = Release|Any CPU + {B4EA5350-7ECB-465F-A680-F4B8EA4CC3DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4EA5350-7ECB-465F-A680-F4B8EA4CC3DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4EA5350-7ECB-465F-A680-F4B8EA4CC3DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4EA5350-7ECB-465F-A680-F4B8EA4CC3DF}.Release|Any CPU.Build.0 = Release|Any CPU + {510FD940-A579-45F4-9152-C88EDB72AE8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {510FD940-A579-45F4-9152-C88EDB72AE8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {510FD940-A579-45F4-9152-C88EDB72AE8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {510FD940-A579-45F4-9152-C88EDB72AE8E}.Release|Any CPU.Build.0 = Release|Any CPU + {B81C6FDE-21E0-4FF0-9C15-17B1EE53952D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B81C6FDE-21E0-4FF0-9C15-17B1EE53952D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B81C6FDE-21E0-4FF0-9C15-17B1EE53952D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B81C6FDE-21E0-4FF0-9C15-17B1EE53952D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -50,8 +74,12 @@ Global GlobalSection(NestedProjects) = preSolution {AC18FC9B-5E79-4FDA-9B35-9F2E716C2BD9} = {12F52172-93E2-490D-B544-6BC9BFCBDE4F} {74E28CEE-CBE2-49DB-811A-B63E8FDD744E} = {5AB86EFC-4E36-4570-BB16-C09AC8C71BAC} - {2E0D3C7A-98AA-475A-816B-3B51EA377C6A} = {B909FEDF-3397-4308-B8E3-E538D84AC14D} {6369627B-5878-4CFE-A996-859D8663603C} = {9E1E33C8-9F0A-42A5-909F-54079AB3AEF3} + {B5A6CB28-4F5D-4D59-AE9C-E4F4F359AAC8} = {B909FEDF-3397-4308-B8E3-E538D84AC14D} + {53502D05-344E-4B98-A4B1-C840CB5B670F} = {B909FEDF-3397-4308-B8E3-E538D84AC14D} + {B4EA5350-7ECB-465F-A680-F4B8EA4CC3DF} = {B909FEDF-3397-4308-B8E3-E538D84AC14D} + {510FD940-A579-45F4-9152-C88EDB72AE8E} = {B909FEDF-3397-4308-B8E3-E538D84AC14D} + {B81C6FDE-21E0-4FF0-9C15-17B1EE53952D} = {9E1E33C8-9F0A-42A5-909F-54079AB3AEF3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {05CFD6CC-3235-4365-8458-99DED6DBDE2D} diff --git a/docs/azfunc/readme.md b/docs/azfunc/readme.md new file mode 100644 index 0000000..277b221 --- /dev/null +++ b/docs/azfunc/readme.md @@ -0,0 +1,102 @@ + +# BrowserDetector + +Browser detection capabilities for Azure functions .NET Isolated model. + + + +This library does + +1. Browser detection +2. Device type detection +3. Operating System detection + +**Step 1:** +Install the [BrowserDetector.AzureFunctions nuget package](https://www.nuget.org/packages/Shyjus.BrowserDetector.AzureFunctions/) + + +```` +Install-Package Shyjus.BrowserDetector.AzureFunctions +```` + +**Step 2:** Enable the browser detection service by calling `AddBrowserDetection` method on `IFunctionsWorkerApplicationBuilder` in your startup code. + +```csharp +using Microsoft.Extensions.Hosting; +using BrowserDetector; + +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults((b) => + { + b.AddBrowserDetection(); + }) + .Build(); + +host.Run(); + +```` +**Step 3:** Inject `IBrowserDetector` to your function class e and access the `Browser` property. + +### Example usage in controller code + +```csharp +public class Function1 +{ + private readonly ILogger _logger; + private readonly IBrowserDetector _detector; + + public Function1(ILoggerFactory loggerFactory, IBrowserDetector detector) + { + _logger = loggerFactory.CreateLogger(); + _detector = detector ?? throw new ArgumentNullException(nameof(detector)); + } + + [Function("Function1")] + public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) + { + var response = req.CreateResponse(HttpStatusCode.OK); + response.WriteString($"Browser: {_detector.Browser?.ToString()}"); + + return response; + } +} +```` + + + +### Example usage in custom middleware + +You can get instance of the `IBrowserDetector` from FunctionContext. + +```csharp +public sealed class MyFuncMiddleware : IFunctionsWorkerMiddleware +{ + public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) + { + var logger = context.GetLogger(); + var browserDetector = context.InstanceServices.GetRequiredService(); + + IBrowser? browser = browserDetector.Browser; + logger.LogInformation($"MyFuncMiddleware executing. Browser:{browser?.Name} {browser?.OS}"); + + await next(context); + } +} +```` +and make sure you register this middleware after enabling the browser detection feature. + +```csharp +using Microsoft.Extensions.Hosting; +using BrowserDetector; +using BrowserDetector.FunctionApp; + +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults((b) => + { + b.AddBrowserDetection(); + b.UseMiddleware(); + }) + .Build(); + +host.Run(); +``` diff --git a/docs/readme.md b/docs/readme.md index 6fc4323..2ebaa4a 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -3,14 +3,16 @@ Browser detection capabilities for asp.net core. - - This library does 1. Browser detection 2. Device type detection 3. Operating System detection +> For browser detection in Azure Functions .NET Isolated, check `Shyjus.BrowserDetector.AzureFunctions` package. + +#### Getting started + **Step 1:** Install the [BrowserDetector nuget package](https://www.nuget.org/packages/Shyjus.BrowserDetector/) diff --git a/perf/BrowserDetector.Benchmarks/BrowserDetector.Benchmarks.csproj b/perf/BrowserDetector.Benchmarks/BrowserDetector.Benchmarks.csproj index 9af0390..573dac6 100644 --- a/perf/BrowserDetector.Benchmarks/BrowserDetector.Benchmarks.csproj +++ b/perf/BrowserDetector.Benchmarks/BrowserDetector.Benchmarks.csproj @@ -12,7 +12,7 @@ - + diff --git a/perf/BrowserDetector.Benchmarks/DetectorBenchmarks.cs b/perf/BrowserDetector.Benchmarks/DetectorBenchmarks.cs index 7427223..aa786af 100644 --- a/perf/BrowserDetector.Benchmarks/DetectorBenchmarks.cs +++ b/perf/BrowserDetector.Benchmarks/DetectorBenchmarks.cs @@ -3,7 +3,7 @@ namespace BrowserDetector.Benchmarks { using System; using BenchmarkDotNet.Attributes; - using Shyjus.BrowserDetection; + using Shyjus.BrowserDetector; [MemoryDiagnoser] public class DetectorBenchmarks diff --git a/sample/BrowserDetector.FunctionApp/.gitignore b/sample/BrowserDetector.FunctionApp/.gitignore new file mode 100644 index 0000000..ff5b00c --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/.gitignore @@ -0,0 +1,264 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# Azure Functions localsettings file +local.settings.json + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/sample/BrowserDetector.FunctionApp/BrowserDetector.FunctionApp.csproj b/sample/BrowserDetector.FunctionApp/BrowserDetector.FunctionApp.csproj new file mode 100644 index 0000000..f677f3a --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/BrowserDetector.FunctionApp.csproj @@ -0,0 +1,31 @@ + + + net8.0 + v4 + Exe + enable + enable + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + Never + + + + + + \ No newline at end of file diff --git a/sample/BrowserDetector.FunctionApp/Function1.cs b/sample/BrowserDetector.FunctionApp/Function1.cs new file mode 100644 index 0000000..a497eb4 --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/Function1.cs @@ -0,0 +1,30 @@ +using System.Net; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Http; +using Microsoft.Extensions.Logging; +using Shyjus.BrowserDetector; + +namespace BrowserDetector.FunctionApp +{ +public class Function1 +{ + private readonly ILogger _logger; + private readonly IBrowserDetector _detector; + + public Function1(ILoggerFactory loggerFactory, IBrowserDetector detector) + { + _logger = loggerFactory.CreateLogger(); + _detector = detector ?? throw new ArgumentNullException(nameof(detector)); + } + + [Function("Function1")] + public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) + { + var response = req.CreateResponse(HttpStatusCode.OK); + + response.WriteString($"Browser: {_detector.Browser?.ToString()}"); + + return response; + } +} +} diff --git a/sample/BrowserDetector.FunctionApp/MyFuncMiddleware.cs b/sample/BrowserDetector.FunctionApp/MyFuncMiddleware.cs new file mode 100644 index 0000000..12f29d0 --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/MyFuncMiddleware.cs @@ -0,0 +1,22 @@ +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Middleware; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Shyjus.BrowserDetector; + +namespace BrowserDetector.FunctionApp +{ + public sealed class MyFuncMiddleware : IFunctionsWorkerMiddleware + { + public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) + { + var logger = context.GetLogger(); + var browserDetector = context.InstanceServices.GetRequiredService(); + + IBrowser? browser = browserDetector.Browser; + logger.LogInformation($"MyFuncMiddleware executing. Browser:{browser?.Name} {browser?.OS}"); + + await next(context); + } + } +} diff --git a/sample/BrowserDetector.FunctionApp/Program.cs b/sample/BrowserDetector.FunctionApp/Program.cs new file mode 100644 index 0000000..23f2fd1 --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/Program.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.Hosting; +using BrowserDetector.FunctionApp; +using Shyjus.BrowserDetector; + +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults((b) => + { + b.UseMiddleware(); + + b.AddBrowserDetection(); + }) + .Build(); + +host.Run(); diff --git a/sample/BrowserDetector.FunctionApp/host.json b/sample/BrowserDetector.FunctionApp/host.json new file mode 100644 index 0000000..ee5cf5f --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/host.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + }, + "enableLiveMetricsFilters": true + } + } +} \ No newline at end of file diff --git a/sample/BrowserDetector.FunctionApp/local.settings.json b/sample/BrowserDetector.FunctionApp/local.settings.json new file mode 100644 index 0000000..64a872f --- /dev/null +++ b/sample/BrowserDetector.FunctionApp/local.settings.json @@ -0,0 +1,7 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" + } +} \ No newline at end of file diff --git a/sample/BrowserDetector.WebApi/BrowserDetector.WebApi.csproj b/sample/BrowserDetector.WebApi/BrowserDetector.WebApi.csproj index 6b67644..b3e96ee 100644 --- a/sample/BrowserDetector.WebApi/BrowserDetector.WebApi.csproj +++ b/sample/BrowserDetector.WebApi/BrowserDetector.WebApi.csproj @@ -8,7 +8,7 @@ - + diff --git a/sample/BrowserDetector.WebApi/Controllers/HomeController.cs b/sample/BrowserDetector.WebApi/Controllers/HomeController.cs index 9fbbf54..9b4d4eb 100644 --- a/sample/BrowserDetector.WebApi/Controllers/HomeController.cs +++ b/sample/BrowserDetector.WebApi/Controllers/HomeController.cs @@ -1,5 +1,5 @@ using Microsoft.AspNetCore.Mvc; -using Shyjus.BrowserDetection; +using Shyjus.BrowserDetector; namespace BrowserDetector.WebApi.Controllers { diff --git a/sample/BrowserDetector.WebApi/Middlewares/BrowserDetectionMiddleware.cs b/sample/BrowserDetector.WebApi/Middlewares/MyBrowserDetectionMiddleware.cs similarity index 74% rename from sample/BrowserDetector.WebApi/Middlewares/BrowserDetectionMiddleware.cs rename to sample/BrowserDetector.WebApi/Middlewares/MyBrowserDetectionMiddleware.cs index 669ce3c..36c5fdc 100644 --- a/sample/BrowserDetector.WebApi/Middlewares/BrowserDetectionMiddleware.cs +++ b/sample/BrowserDetector.WebApi/Middlewares/MyBrowserDetectionMiddleware.cs @@ -1,11 +1,12 @@ -using Shyjus.BrowserDetection; + +using Shyjus.BrowserDetector; namespace BrowserDetector.WebApi.Middlewares { - public class BrowserDetectionMiddleware + public class MyBrowserDetectionMiddleware { private RequestDelegate _next; - public BrowserDetectionMiddleware(RequestDelegate next) + public MyBrowserDetectionMiddleware(RequestDelegate next) { _next = next; } diff --git a/sample/BrowserDetector.WebApi/Program.cs b/sample/BrowserDetector.WebApi/Program.cs index d5a1eb2..495137b 100644 --- a/sample/BrowserDetector.WebApi/Program.cs +++ b/sample/BrowserDetector.WebApi/Program.cs @@ -1,5 +1,5 @@ using BrowserDetector.WebApi.Middlewares; - +using Shyjus.BrowserDetector; namespace BrowserDetector.WebApi { public class Program @@ -18,7 +18,7 @@ public static void Main(string[] args) app.MapControllers(); - app.UseMiddleware(); + app.UseMiddleware(); app.Run(); } diff --git a/src/BrowserDetector.Abstractions/BrowserDetector.Abstractions.csproj b/src/BrowserDetector.Abstractions/BrowserDetector.Abstractions.csproj new file mode 100644 index 0000000..2f344c6 --- /dev/null +++ b/src/BrowserDetector.Abstractions/BrowserDetector.Abstractions.csproj @@ -0,0 +1,13 @@ + + + + net6.0;net7.0;net8.0 + enable + enable + + + + + + + diff --git a/src/BrowserDetector.Abstractions/DeviceType.cs b/src/BrowserDetector.Abstractions/DeviceType.cs new file mode 100644 index 0000000..ee157d5 --- /dev/null +++ b/src/BrowserDetector.Abstractions/DeviceType.cs @@ -0,0 +1,27 @@ +namespace Shyjus.BrowserDetector +{ + public enum DeviceType + { + /// + /// Unknown + /// + Unknown = 0, + + /// + /// Desktop + /// + + Desktop, + + /// + /// Tablet + /// + + Tablet, + + /// + /// Mobile + /// + Mobile + } +} diff --git a/src/BrowserDetector.NetCore/Browsers/IBrowser.cs b/src/BrowserDetector.Abstractions/IBrowser.cs similarity index 70% rename from src/BrowserDetector.NetCore/Browsers/IBrowser.cs rename to src/BrowserDetector.Abstractions/IBrowser.cs index 116b27a..91f1c68 100644 --- a/src/BrowserDetector.NetCore/Browsers/IBrowser.cs +++ b/src/BrowserDetector.Abstractions/IBrowser.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { /// /// A type representing the browser information. @@ -7,12 +7,8 @@ public interface IBrowser { /// /// Gets the device type. - /// Possible values are - /// 1. Desktop - /// 2. Tablet - /// 3. Mobile /// - string DeviceType { get; } + DeviceType DeviceType { get; } /// /// Gets the browser name. @@ -30,5 +26,11 @@ public interface IBrowser /// Gets the browser version. /// string Version { get; } + + /// + /// Gets a string representation of the IBrowser instance. + /// + /// + string? ToString(); } -} \ No newline at end of file +} diff --git a/src/BrowserDetector.NetCore/Detection/IBrowserDetector.cs b/src/BrowserDetector.Abstractions/IBrowserDetector.cs similarity index 83% rename from src/BrowserDetector.NetCore/Detection/IBrowserDetector.cs rename to src/BrowserDetector.Abstractions/IBrowserDetector.cs index 17ac290..c237ed7 100644 --- a/src/BrowserDetector.NetCore/Detection/IBrowserDetector.cs +++ b/src/BrowserDetector.Abstractions/IBrowserDetector.cs @@ -1,5 +1,4 @@ -#nullable enable -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { /// /// An abstraction to get browser information. diff --git a/src/BrowserDetector.NetCore/Detection/BrowserDetector.cs b/src/BrowserDetector.AspNetCore/AspNetCoreBrowserDetector.cs similarity index 85% rename from src/BrowserDetector.NetCore/Detection/BrowserDetector.cs rename to src/BrowserDetector.AspNetCore/AspNetCoreBrowserDetector.cs index 853c3c1..aa65625 100644 --- a/src/BrowserDetector.NetCore/Detection/BrowserDetector.cs +++ b/src/BrowserDetector.AspNetCore/AspNetCoreBrowserDetector.cs @@ -1,13 +1,13 @@ -#nullable enable -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { using System; using Microsoft.AspNetCore.Http; + using Shyjus.BrowserDetector; /// /// A class to get browser and platform information. /// - public sealed class BrowserDetector : IBrowserDetector + internal sealed class AspNetCoreBrowserDetector : IBrowserDetector { private readonly Lazy _browser; @@ -17,7 +17,7 @@ public sealed class BrowserDetector : IBrowserDetector /// Initializes a new instance of the class. /// /// The IHttpContextAccessor instance. - public BrowserDetector(IHttpContextAccessor httpContextAccessor) + public AspNetCoreBrowserDetector(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; _browser = this.GetBrowserLazy(); diff --git a/src/BrowserDetector.AspNetCore/AssemblyInfo.cs b/src/BrowserDetector.AspNetCore/AssemblyInfo.cs new file mode 100644 index 0000000..00adc8f --- /dev/null +++ b/src/BrowserDetector.AspNetCore/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("BrowserDetector.Benchmarks")] +[assembly: InternalsVisibleTo("BrowserDetector.Tests")] + diff --git a/src/BrowserDetector.NetCore/Extensions/BrowserDetectionServiceCollectionExtensions.cs b/src/BrowserDetector.AspNetCore/BrowserDetectionServiceCollectionExtensions.cs similarity index 70% rename from src/BrowserDetector.NetCore/Extensions/BrowserDetectionServiceCollectionExtensions.cs rename to src/BrowserDetector.AspNetCore/BrowserDetectionServiceCollectionExtensions.cs index cfa7641..897f2de 100644 --- a/src/BrowserDetector.NetCore/Extensions/BrowserDetectionServiceCollectionExtensions.cs +++ b/src/BrowserDetector.AspNetCore/BrowserDetectionServiceCollectionExtensions.cs @@ -1,9 +1,7 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Shyjus.BrowserDetection; +using Microsoft.Extensions.DependencyInjection; using System; -namespace Microsoft.Extensions.DependencyInjection +namespace Shyjus.BrowserDetector { /// /// Extension methods for setting up browser detection services in an . @@ -22,10 +20,11 @@ public static IServiceCollection AddBrowserDetection(this IServiceCollection ser throw new ArgumentNullException(nameof(services)); } - services.TryAddEnumerable(ServiceDescriptor.Singleton()); - services.AddScoped(); + //services.TryAddEnumerable(ServiceDescriptor.Singleton()); + services.AddScoped(); return services; } } -} \ No newline at end of file + +} diff --git a/src/BrowserDetector.NetCore/BrowserDetector.Net.csproj b/src/BrowserDetector.AspNetCore/BrowserDetector.AspNetCore.csproj similarity index 69% rename from src/BrowserDetector.NetCore/BrowserDetector.Net.csproj rename to src/BrowserDetector.AspNetCore/BrowserDetector.AspNetCore.csproj index d69b7c8..f5eba5c 100644 --- a/src/BrowserDetector.NetCore/BrowserDetector.Net.csproj +++ b/src/BrowserDetector.AspNetCore/BrowserDetector.AspNetCore.csproj @@ -2,22 +2,27 @@ net6.0;net7.0;net8.0 + enable Shyjus.BrowserDetector - Shyjus.BrowserDetector + Shyjus.BrowserDetector.AspNetCore Shyjus.BrowserDetector Shyju Krishnankutty Browser detection, device detection and operating system detection capabilities in asp.net core. https://github.com/kshyju/BrowserDetector BrowserDetection BrowserCapabilities BrowserDetectionASP.NETCore HttpContext.Request.Browser DeviceDetection true + true + 3.0.0-preview2 readme.md - 3.0.0-preview1 - + + + - + + diff --git a/src/BrowserDetector.AzureFunctions/BrowserDetector.AzureFunctions.csproj b/src/BrowserDetector.AzureFunctions/BrowserDetector.AzureFunctions.csproj new file mode 100644 index 0000000..36a646c --- /dev/null +++ b/src/BrowserDetector.AzureFunctions/BrowserDetector.AzureFunctions.csproj @@ -0,0 +1,30 @@ + + + + net6.0;net7.0;net8.0 + enable + Shyjus.BrowserDetector.AzureFunctions + Shyjus.BrowserDetector.AzureFunctions + Shyjus.BrowserDetector.AzureFunctions + Shyju Krishnankutty + Browser detection, device detection and operating system detection capabilities in Azure Functions .NET Isolated model. + https://github.com/kshyju/BrowserDetector + BrowserDetection BrowserCapabilities BrowserDetectionAzureFunction HttpContext.Request.Browser DeviceDetection + true + 1.0.0-preview1 + readme.md + + + + + + + + + + + + + + + diff --git a/src/BrowserDetector.AzureFunctions/BrowserDetectorMiddleware.cs b/src/BrowserDetector.AzureFunctions/BrowserDetectorMiddleware.cs new file mode 100644 index 0000000..9ac9ee4 --- /dev/null +++ b/src/BrowserDetector.AzureFunctions/BrowserDetectorMiddleware.cs @@ -0,0 +1,35 @@ +using Shyjus.BrowserDetector; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Middleware; +using Microsoft.Extensions.DependencyInjection; +using System.Linq; +using System.Threading.Tasks; + +namespace Shyjus.BrowserDetector.AzureFunctions +{ + internal class BrowserDetectorMiddleware : IFunctionsWorkerMiddleware + { + public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) + { + var request = await context.GetHttpRequestDataAsync(); + if (request != null) + { + if (request.Headers.TryGetValues("User-Agent", out var value) && value.Any()) + { + // temp fix until .net worker is fixed. + var ua = string.Join(" ", value); + + var userAgent = ua; + + var funcDetector = context.InstanceServices.GetRequiredService(); + if (funcDetector is FunctionsBrowserDetector detector) + { + detector.Init(userAgent); + } + } + } + + await next(context); + } + } +} diff --git a/src/BrowserDetector.AzureFunctions/FunctionsBrowserDetector.cs b/src/BrowserDetector.AzureFunctions/FunctionsBrowserDetector.cs new file mode 100644 index 0000000..836d144 --- /dev/null +++ b/src/BrowserDetector.AzureFunctions/FunctionsBrowserDetector.cs @@ -0,0 +1,42 @@ +using System; + +namespace Shyjus.BrowserDetector +{ + internal class FunctionsBrowserDetector : IBrowserDetector + { + private string? _userAgent = null; + private readonly Lazy _browser; + + public FunctionsBrowserDetector() + { + _browser = this.GetBrowserLazy(); + } + + internal void Init(string userAgent) + { + _userAgent = userAgent; + } + public IBrowser? Browser + { + get + { + return _browser.Value; + } + } + + private Lazy GetBrowserLazy() + { + return new Lazy(GetBrowser); + } + + private IBrowser? GetBrowser() + { + if (_userAgent != null) + { + return Detector.GetBrowser(_userAgent.AsSpan()); + } + + return default; + } + } +} diff --git a/src/BrowserDetector.AzureFunctions/IFunctionsWorkerApplicationBuilderExtensions.cs b/src/BrowserDetector.AzureFunctions/IFunctionsWorkerApplicationBuilderExtensions.cs new file mode 100644 index 0000000..ff3e589 --- /dev/null +++ b/src/BrowserDetector.AzureFunctions/IFunctionsWorkerApplicationBuilderExtensions.cs @@ -0,0 +1,21 @@ +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Shyjus.BrowserDetector.AzureFunctions; + +namespace Shyjus.BrowserDetector +{ + public static class IFunctionsWorkerApplicationBuilderExtensions + { + /// + /// Adds browser detection capabilities to the Azure Functions worker. + /// + public static IFunctionsWorkerApplicationBuilder AddBrowserDetection(this IFunctionsWorkerApplicationBuilder builder) + { + builder.UseMiddleware(); + builder.Services.AddScoped(); + + return builder; + } + } +} diff --git a/src/BrowserDetector.Core/AssemblyInfo.cs b/src/BrowserDetector.Core/AssemblyInfo.cs new file mode 100644 index 0000000..0f90559 --- /dev/null +++ b/src/BrowserDetector.Core/AssemblyInfo.cs @@ -0,0 +1,7 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("BrowserDetector.Benchmarks")] +[assembly: InternalsVisibleTo("BrowserDetector.Tests")] +[assembly: InternalsVisibleTo("Shyjus.BrowserDetector.AzureFunctions")] +[assembly: InternalsVisibleTo("Shyjus.BrowserDetector.AspNetCore")] + diff --git a/src/BrowserDetector.Core/BrowserDetector.Core.csproj b/src/BrowserDetector.Core/BrowserDetector.Core.csproj new file mode 100644 index 0000000..0eda44b --- /dev/null +++ b/src/BrowserDetector.Core/BrowserDetector.Core.csproj @@ -0,0 +1,13 @@ + + + + net6.0;net7.0;net8.0 + enable + enable + + + + + + + diff --git a/src/BrowserDetector.NetCore/Browsers/Browser.cs b/src/BrowserDetector.Core/Browsers/Browser.cs similarity index 64% rename from src/BrowserDetector.NetCore/Browsers/Browser.cs rename to src/BrowserDetector.Core/Browsers/Browser.cs index a09140c..df6aded 100644 --- a/src/BrowserDetector.NetCore/Browsers/Browser.cs +++ b/src/BrowserDetector.Core/Browsers/Browser.cs @@ -1,20 +1,19 @@ -using System.Runtime.CompilerServices; +using Shyjus.BrowserDetector.Core; -[assembly: InternalsVisibleTo("BrowserDetector.Tests")] -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { using System; internal abstract class Browser : IBrowser { - private readonly string platform; + private readonly string _platform; protected Browser(ReadOnlySpan userAgent, string version) { this.Version = version; var platform = PlatformDetector.GetPlatformAndOS(userAgent); - this.platform = platform.Platform; + this._platform = platform.Platform; this.OS = platform.OS; // Get the device type from platform info. @@ -25,7 +24,7 @@ protected Browser(ReadOnlySpan userAgent, string version) public abstract string Name { get; } /// - public string DeviceType { get; } + public DeviceType DeviceType { get; } /// public string Version { get; } @@ -33,13 +32,19 @@ protected Browser(ReadOnlySpan userAgent, string version) /// public string OS { get; } + + public override string? ToString() + { + return $"{this.Name} {this.Version} on {this.OS} ({this.DeviceType})"; + } + /// /// Gets the version segment from user agent for the key passed in. /// /// The user agent value. /// The key to use for looking up the version segment. /// The version segment. - protected static string GetVersionIfKeyPresent(ReadOnlySpan userAgent, string key) + protected static string? GetVersionIfKeyPresent(ReadOnlySpan userAgent, string key) { var keyStartIndex = userAgent.IndexOf(key.AsSpan()); @@ -64,34 +69,34 @@ protected static string GetVersionIfKeyPresent(ReadOnlySpan userAgent, str /// /// The platform information. /// The device type value. - private string GetDeviceType((string Platform, string OS, bool MobileDetected) platform) + private DeviceType GetDeviceType((string Platform, string OS, bool MobileDetected) platform) { - if (this.platform == Platforms.iPhone) + if (this._platform == Platforms.iPhone) { - return DeviceTypes.Mobile; + return DeviceType.Mobile; } - else if (this.platform == Platforms.iPad || this.platform == "GalaxyTabS4") + else if (this._platform == Platforms.iPad || this._platform == "GalaxyTabS4") { - return DeviceTypes.Tablet; + return DeviceType.Tablet; } // IPad also has Mobile in it. So make sure to check that first if (platform.MobileDetected) { - return DeviceTypes.Mobile; + return DeviceType.Mobile; } - else if (this.platform == Platforms.Macintosh || this.platform.StartsWith("Windows NT")) + else if (this._platform == Platforms.Macintosh || this._platform.StartsWith("Windows NT")) { - return DeviceTypes.Desktop; + return DeviceType.Desktop; } // Samsung Chrome_GalaxyTabS4 does not have "Mobile", but it has Linux and Android. - if (this.platform == "Linux" && platform.OS == "Android" && platform.MobileDetected == false) + if (this._platform == "Linux" && platform.OS == "Android" && platform.MobileDetected == false) { - return DeviceTypes.Tablet; + return DeviceType.Tablet; } - return string.Empty; + return DeviceType.Unknown; } } } diff --git a/src/BrowserDetector.NetCore/Browsers/Chrome.cs b/src/BrowserDetector.Core/Browsers/Chrome.cs similarity index 90% rename from src/BrowserDetector.NetCore/Browsers/Chrome.cs rename to src/BrowserDetector.Core/Browsers/Chrome.cs index 6de31d9..f9eae3e 100644 --- a/src/BrowserDetector.NetCore/Browsers/Chrome.cs +++ b/src/BrowserDetector.Core/Browsers/Chrome.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { using System; @@ -23,14 +23,14 @@ private Chrome(ReadOnlySpan userAgent, string version) /// User agent value /// When this method returns True, the result will contain a Chrome object populated /// True if parsing succeeded, else False - public static bool TryParse(ReadOnlySpan userAgent, out Chrome result) + internal static bool TryParse(ReadOnlySpan userAgent, out Chrome? result) { var chromeIndex = userAgent.IndexOf("Chrome/".AsSpan()); var safariIndex = userAgent.IndexOf("Safari/".AsSpan()); - var crIOS = userAgent.IndexOf("CriOS/".AsSpan()); + var crIos = userAgent.IndexOf("CriOS/".AsSpan()); // Chrome should have both "Safari" and "Chrome" words in it. - if ((safariIndex > -1 && chromeIndex > -1) || (safariIndex > -1 && crIOS > -1)) + if ((safariIndex > -1 && chromeIndex > -1) || (safariIndex > -1 && crIos > -1)) { var fireFoxVersion = GetVersionIfKeyPresent(userAgent, "Chrome/"); if (fireFoxVersion != null) diff --git a/src/BrowserDetector.NetCore/Browsers/EdgeChromium.cs b/src/BrowserDetector.Core/Browsers/Edge.cs similarity index 66% rename from src/BrowserDetector.NetCore/Browsers/EdgeChromium.cs rename to src/BrowserDetector.Core/Browsers/Edge.cs index e18d074..4515a46 100644 --- a/src/BrowserDetector.NetCore/Browsers/EdgeChromium.cs +++ b/src/BrowserDetector.Core/Browsers/Edge.cs @@ -1,17 +1,15 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("BrowserDetector.Tests")] - -namespace Shyjus.BrowserDetection + +namespace Shyjus.BrowserDetector { + using Shyjus.BrowserDetector; using System; /// - /// Represents an instance of EdgeChromium Browser. + /// Represents an instance of the chromium based Edge browser. /// - internal class EdgeChromium : Browser + internal class Edge : Browser { - private EdgeChromium(ReadOnlySpan userAgent, string version) + private Edge(ReadOnlySpan userAgent, string version) : base(userAgent, version) { } @@ -26,13 +24,13 @@ private EdgeChromium(ReadOnlySpan userAgent, string version) /// The user agent value. /// An EdgeChromium browser instance. /// A boolean value that indicates whether the parsing succeeded. - public static bool TryParse(ReadOnlySpan userAgent, out EdgeChromium result) + internal static bool TryParse(ReadOnlySpan userAgent, out Edge? result) { var edgChromiumVersion = GetVersionIfKeyPresent(userAgent, "Edg/"); if (edgChromiumVersion != null) { - result = new EdgeChromium(userAgent, edgChromiumVersion); + result = new Edge(userAgent, edgChromiumVersion); return true; } diff --git a/src/BrowserDetector.NetCore/Browsers/Edge.cs b/src/BrowserDetector.Core/Browsers/EdgeLegacy.cs similarity index 58% rename from src/BrowserDetector.NetCore/Browsers/Edge.cs rename to src/BrowserDetector.Core/Browsers/EdgeLegacy.cs index 8d4ad44..b73b408 100644 --- a/src/BrowserDetector.NetCore/Browsers/Edge.cs +++ b/src/BrowserDetector.Core/Browsers/EdgeLegacy.cs @@ -1,27 +1,27 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { using System; /// - /// Represents an instance of Edge Browser. + /// Represents an instance of EdgeLegacy Browser. /// - internal class Edge : Browser + internal class EdgeLegacy : Browser { - private Edge(ReadOnlySpan userAgent, string version) + private EdgeLegacy(ReadOnlySpan userAgent, string version) : base(userAgent, version) { } /// - public override string Name => BrowserNames.Edge; + public override string Name => BrowserNames.EdgeLegacy; /// - /// Tries to create an Edge browser object from the user agent passed in. + /// Tries to create an EdgeLegacy browser object from the user agent passed in. /// /// The user agent. - /// An instance of Edge browser, if parsing was successful. + /// An instance of EdgeLegacy browser, if parsing was successful. /// A boolean value indicating whether the parsing was successful. - public static bool TryParse(ReadOnlySpan userAgent, out Browser result) + internal static bool TryParse(ReadOnlySpan userAgent, out Browser? result) { var edgeVersion = GetVersionIfKeyPresent(userAgent, "Edge/"); var edgeIosVersion = GetVersionIfKeyPresent(userAgent, "EdgiOS/"); @@ -35,7 +35,7 @@ public static bool TryParse(ReadOnlySpan userAgent, out Browser result) return false; } - result = new Edge(userAgent, version); + result = new EdgeLegacy(userAgent, version); return true; } } diff --git a/src/BrowserDetector.NetCore/Browsers/Firefox.cs b/src/BrowserDetector.Core/Browsers/Firefox.cs similarity index 87% rename from src/BrowserDetector.NetCore/Browsers/Firefox.cs rename to src/BrowserDetector.Core/Browsers/Firefox.cs index 8558bd2..1fa25d5 100644 --- a/src/BrowserDetector.NetCore/Browsers/Firefox.cs +++ b/src/BrowserDetector.Core/Browsers/Firefox.cs @@ -1,5 +1,6 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { + using Shyjus.BrowserDetector; using System; /// @@ -12,7 +13,7 @@ private Firefox(ReadOnlySpan userAgent, string version) { } - public string Platform { get; } + public string? Platform { get; } /// public override string Name => BrowserNames.Firefox; @@ -24,7 +25,7 @@ private Firefox(ReadOnlySpan userAgent, string version) /// The user agent value. /// A Firefox browser instance. /// A boolean value that indicates whether the parsing succeeded. - public static bool TryParse(ReadOnlySpan userAgent, out Firefox result) + internal static bool TryParse(ReadOnlySpan userAgent, out Firefox? result) { // Desktop version of Firefox. var fireFoxVersion = GetVersionIfKeyPresent(userAgent, "Firefox/"); diff --git a/src/BrowserDetector.NetCore/Browsers/InternetExplorer.cs b/src/BrowserDetector.Core/Browsers/InternetExplorer.cs similarity index 83% rename from src/BrowserDetector.NetCore/Browsers/InternetExplorer.cs rename to src/BrowserDetector.Core/Browsers/InternetExplorer.cs index a3ae4e4..56c589a 100644 --- a/src/BrowserDetector.NetCore/Browsers/InternetExplorer.cs +++ b/src/BrowserDetector.Core/Browsers/InternetExplorer.cs @@ -1,9 +1,10 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { + using Shyjus.BrowserDetector; using System; /// - /// Represents an instance of Edge Browser + /// Represents an instance of EdgeLegacy Browser /// internal class InternetExplorer : Browser { @@ -21,7 +22,7 @@ private protected InternetExplorer(ReadOnlySpan userAgent, string version) /// The user agent value. /// An instance of EdgeChromium browser. /// A boolean value that indicates whether the parsing succeeded. - public static bool TryParse(ReadOnlySpan userAgent, out InternetExplorer result) + internal static bool TryParse(ReadOnlySpan userAgent, out InternetExplorer? result) { var tridentVersion = GetVersionIfKeyPresent(userAgent, "Trident/"); diff --git a/src/BrowserDetector.NetCore/Browsers/Opera.cs b/src/BrowserDetector.Core/Browsers/Opera.cs similarity index 87% rename from src/BrowserDetector.NetCore/Browsers/Opera.cs rename to src/BrowserDetector.Core/Browsers/Opera.cs index e7082be..fd092fc 100644 --- a/src/BrowserDetector.NetCore/Browsers/Opera.cs +++ b/src/BrowserDetector.Core/Browsers/Opera.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { using System; @@ -21,7 +21,7 @@ private protected Opera(ReadOnlySpan userAgent, string version) /// The user agent value. /// An instance of Opera browser. /// A boolean value that indicates whether the parsing succeeded. - public static bool TryParse(ReadOnlySpan userAgent, out Opera result) + internal static bool TryParse(ReadOnlySpan userAgent, out Opera? result) { var operaVersion = GetVersionIfKeyPresent(userAgent, "OPR/"); var operaTouchVersion = GetVersionIfKeyPresent(userAgent, " OPT/"); @@ -34,7 +34,7 @@ public static bool TryParse(ReadOnlySpan userAgent, out Opera result) if (operaTouchVersion != null) { - result = new Opera(userAgent, operaVersion); + result = new Opera(userAgent, operaTouchVersion); return true; } diff --git a/src/BrowserDetector.NetCore/Browsers/Safari.cs b/src/BrowserDetector.Core/Browsers/Safari.cs similarity index 90% rename from src/BrowserDetector.NetCore/Browsers/Safari.cs rename to src/BrowserDetector.Core/Browsers/Safari.cs index 19d1697..1aaa26c 100644 --- a/src/BrowserDetector.NetCore/Browsers/Safari.cs +++ b/src/BrowserDetector.Core/Browsers/Safari.cs @@ -1,5 +1,6 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { + using Shyjus.BrowserDetector; using System; internal class Safari : Browser @@ -18,7 +19,7 @@ private Safari(ReadOnlySpan userAgent, string version) /// When this method returns True, the result will contain a Safari object populated /// True if parsing succeeded, else False /// Thrown when userAgent parameter value is null - public static bool TryParse(ReadOnlySpan userAgent, out Safari result) + internal static bool TryParse(ReadOnlySpan userAgent, out Safari? result) { var chromeIndex = userAgent.IndexOf("Chrome/".AsSpan()); var safariIndex = userAgent.IndexOf("Safari/".AsSpan()); diff --git a/src/BrowserDetector.Core/Constants/BrowserNames.cs b/src/BrowserDetector.Core/Constants/BrowserNames.cs new file mode 100644 index 0000000..9320675 --- /dev/null +++ b/src/BrowserDetector.Core/Constants/BrowserNames.cs @@ -0,0 +1,16 @@ +namespace Shyjus.BrowserDetector +{ + /// + /// Browser name constants. + /// + internal static class BrowserNames + { + internal const string Chrome = "Chrome"; + internal const string EdgeLegacy = "EdgeLegacy"; + internal const string Firefox = "Firefox"; + internal const string Opera = "Opera"; + internal const string Safari = "Safari"; + internal const string EdgeChromium = "Edge"; + internal const string InternetExplorer = "InternetExplorer"; + } +} diff --git a/src/BrowserDetector.NetCore/Constants/Constants.cs b/src/BrowserDetector.Core/Constants/Constants.cs similarity index 73% rename from src/BrowserDetector.NetCore/Constants/Constants.cs rename to src/BrowserDetector.Core/Constants/Constants.cs index c2252fb..e345aa3 100644 --- a/src/BrowserDetector.NetCore/Constants/Constants.cs +++ b/src/BrowserDetector.Core/Constants/Constants.cs @@ -1,4 +1,5 @@ -namespace Shyjus.BrowserDetection + +namespace Shyjus.BrowserDetector { internal static class Headers { diff --git a/src/BrowserDetector.NetCore/Constants/DeviceType.cs b/src/BrowserDetector.Core/Constants/DeviceType.cs similarity index 84% rename from src/BrowserDetector.NetCore/Constants/DeviceType.cs rename to src/BrowserDetector.Core/Constants/DeviceType.cs index 70e4af9..2793600 100644 --- a/src/BrowserDetector.NetCore/Constants/DeviceType.cs +++ b/src/BrowserDetector.Core/Constants/DeviceType.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { public static class DeviceTypes { diff --git a/src/BrowserDetector.NetCore/Constants/OperatingSystems.cs b/src/BrowserDetector.Core/Constants/OperatingSystems.cs similarity index 86% rename from src/BrowserDetector.NetCore/Constants/OperatingSystems.cs rename to src/BrowserDetector.Core/Constants/OperatingSystems.cs index 2492718..df01ecf 100644 --- a/src/BrowserDetector.NetCore/Constants/OperatingSystems.cs +++ b/src/BrowserDetector.Core/Constants/OperatingSystems.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { public class OperatingSystems { diff --git a/src/BrowserDetector.NetCore/Constants/Platforms.cs b/src/BrowserDetector.Core/Constants/Platforms.cs similarity index 90% rename from src/BrowserDetector.NetCore/Constants/Platforms.cs rename to src/BrowserDetector.Core/Constants/Platforms.cs index cfb86d3..549be1a 100644 --- a/src/BrowserDetector.NetCore/Constants/Platforms.cs +++ b/src/BrowserDetector.Core/Constants/Platforms.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { internal class Platforms { diff --git a/src/BrowserDetector.NetCore/Detection/Detector.cs b/src/BrowserDetector.Core/Detector.cs similarity index 75% rename from src/BrowserDetector.NetCore/Detection/Detector.cs rename to src/BrowserDetector.Core/Detector.cs index cba4c35..956c199 100644 --- a/src/BrowserDetector.NetCore/Detection/Detector.cs +++ b/src/BrowserDetector.Core/Detector.cs @@ -1,9 +1,9 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("BrowserDetector.Benchmarks")] -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector { + using BrowserDetector; using System; /// @@ -16,17 +16,17 @@ internal static class Detector /// /// The user agent string. /// An instance of IBrowser. - internal static IBrowser GetBrowser(ReadOnlySpan userAgentString) + internal static IBrowser? GetBrowser(ReadOnlySpan userAgentString) { // Order is important, Go from most specific to generic - // For example, The string "Chrome" is present in both Chrome and Edge, - // So we will first check if it is Edge because Edge has something more specific we can check. + // For example, The string "Chrome" is present in both Chrome and EdgeLegacy, + // So we will first check if it is EdgeLegacy because EdgeLegacy has something more specific we can check. if (Firefox.TryParse(userAgentString, out var firefox)) { return firefox; } - if (EdgeChromium.TryParse(userAgentString, out var edgeChromium)) + if (Edge.TryParse(userAgentString, out var edgeChromium)) { return edgeChromium; } @@ -41,7 +41,7 @@ internal static IBrowser GetBrowser(ReadOnlySpan userAgentString) return opera; } - if (Edge.TryParse(userAgentString, out var edge)) + if (EdgeLegacy.TryParse(userAgentString, out var edge)) { return edge; } diff --git a/src/BrowserDetector.NetCore/Detection/PlatformDetector.cs b/src/BrowserDetector.Core/PlatformDetector.cs similarity index 98% rename from src/BrowserDetector.NetCore/Detection/PlatformDetector.cs rename to src/BrowserDetector.Core/PlatformDetector.cs index 578ad55..978a2ca 100644 --- a/src/BrowserDetector.NetCore/Detection/PlatformDetector.cs +++ b/src/BrowserDetector.Core/PlatformDetector.cs @@ -1,4 +1,4 @@ -namespace Shyjus.BrowserDetection +namespace Shyjus.BrowserDetector.Core { using System; diff --git a/src/BrowserDetector.NetCore/Constants/BrowserNames.cs b/src/BrowserDetector.NetCore/Constants/BrowserNames.cs deleted file mode 100644 index b8a3771..0000000 --- a/src/BrowserDetector.NetCore/Constants/BrowserNames.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Shyjus.BrowserDetection -{ - /// - /// Browser name constants. - /// - public static class BrowserNames - { - public const string Chrome = "Chrome"; - public const string Edge = "Edge"; - public const string Firefox = "Firefox"; - public const string Opera = "Opera"; - public const string Safari = "Safari"; - public const string EdgeChromium = "EdgeChromium"; - public const string InternetExplorer = "InternetExplorer"; - } -} diff --git a/tests/BrowserDetector.Tests/BrowserDetector.Tests.csproj b/tests/BrowserDetector.Tests/BrowserDetector.Tests.csproj index 27b09b2..2231ab9 100644 --- a/tests/BrowserDetector.Tests/BrowserDetector.Tests.csproj +++ b/tests/BrowserDetector.Tests/BrowserDetector.Tests.csproj @@ -2,8 +2,9 @@ net8.0 + BrowserDetector.Tests - false + false false @@ -20,7 +21,7 @@ - + diff --git a/tests/BrowserDetector.Tests/BrowserDetectorTests.OSX.cs b/tests/BrowserDetector.Tests/BrowserDetectorTests.OSX.cs index 86644d6..6379c41 100644 --- a/tests/BrowserDetector.Tests/BrowserDetectorTests.OSX.cs +++ b/tests/BrowserDetector.Tests/BrowserDetectorTests.OSX.cs @@ -1,6 +1,7 @@ namespace Shyjus.BrowserDetection.Tests { using System.Collections.Generic; + using BrowserDetector; using Microsoft.Extensions.Primitives; using Xunit; @@ -18,7 +19,7 @@ public void Opera_OSX() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; @@ -34,7 +35,7 @@ public void Chrome_OSX() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; @@ -50,7 +51,7 @@ public void Safari_OSX() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; @@ -66,7 +67,7 @@ public void Firefox_OSX() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; diff --git a/tests/BrowserDetector.Tests/BrowserDetectorTests.Windows.cs b/tests/BrowserDetector.Tests/BrowserDetectorTests.Windows.cs index 03af70d..c06c430 100644 --- a/tests/BrowserDetector.Tests/BrowserDetectorTests.Windows.cs +++ b/tests/BrowserDetector.Tests/BrowserDetectorTests.Windows.cs @@ -1,6 +1,7 @@ namespace Shyjus.BrowserDetection.Tests { using System.Collections.Generic; + using BrowserDetector; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; using Moq; @@ -22,14 +23,14 @@ public void Chrome76_Windows() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); // Act var actual = detector.Browser; // Assert Assert.Equal(BrowserNames.Chrome, actual.Name); - Assert.Equal(DeviceTypes.Desktop, actual.DeviceType); + Assert.Equal(DeviceType.Desktop, actual.DeviceType); } [Fact] @@ -42,19 +43,19 @@ public void IE11_Windows() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); // Act var actual = detector.Browser; // Assert Assert.Equal(BrowserNames.InternetExplorer, actual.Name); - Assert.Equal(DeviceTypes.Desktop, actual.DeviceType); + Assert.Equal(DeviceType.Desktop, actual.DeviceType); Assert.Equal(OperatingSystems.Windows, actual.OS); } [Fact] - public void Edge18_Windows() + public void EdgeLegacy_Windows() { // Arrange var headers = new Dictionary @@ -63,14 +64,14 @@ public void Edge18_Windows() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); // Act var actual = detector.Browser; // Assert - Assert.Equal(BrowserNames.Edge, actual.Name); - Assert.Equal(DeviceTypes.Desktop, actual.DeviceType); + Assert.Equal(BrowserNames.EdgeLegacy, actual.Name); + Assert.Equal(DeviceType.Desktop, actual.DeviceType); } [Fact] @@ -82,12 +83,12 @@ public void EdgeChromium_Windows() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); - var actual = detector.Browser; + IBrowser actual = detector.Browser; Assert.Equal(BrowserNames.EdgeChromium, actual.Name); - Assert.Equal(DeviceTypes.Desktop, actual.DeviceType); + Assert.Equal(DeviceType.Desktop, actual.DeviceType); } [Fact] @@ -99,12 +100,12 @@ public void Opera_Windows() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; Assert.Equal(BrowserNames.Opera, actual.Name); - Assert.Equal(DeviceTypes.Desktop, actual.DeviceType); + Assert.Equal(DeviceType.Desktop, actual.DeviceType); } [Fact] @@ -116,7 +117,7 @@ public void Handles_Gracefully_When_UserAgent_Header_Missing() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; diff --git a/tests/BrowserDetector.Tests/BrowserDetectorTests.iPhone.cs b/tests/BrowserDetector.Tests/BrowserDetectorTests.iPhone.cs index cb1d070..95a6961 100644 --- a/tests/BrowserDetector.Tests/BrowserDetectorTests.iPhone.cs +++ b/tests/BrowserDetector.Tests/BrowserDetectorTests.iPhone.cs @@ -1,6 +1,7 @@ namespace Shyjus.BrowserDetection.Tests { using System.Collections.Generic; + using BrowserDetector; using Microsoft.Extensions.Primitives; using Shyjus.BrowserDetection; using Xunit; @@ -20,14 +21,14 @@ public void OperaTouch_iPhone() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); // Act IBrowser actual = detector.Browser; // Assert Assert.Equal(BrowserNames.Opera, actual.Name); - Assert.Equal(DeviceTypes.Mobile, actual.DeviceType); + Assert.Equal(DeviceType.Mobile, actual.DeviceType); } } } diff --git a/tests/BrowserDetector.Tests/BrowserDetectorTestsTablet.cs b/tests/BrowserDetector.Tests/BrowserDetectorTestsTablet.cs index 2e7d366..7f737bb 100644 --- a/tests/BrowserDetector.Tests/BrowserDetectorTestsTablet.cs +++ b/tests/BrowserDetector.Tests/BrowserDetectorTestsTablet.cs @@ -1,6 +1,7 @@ namespace Shyjus.BrowserDetection.Tests { using System.Collections.Generic; + using BrowserDetector; using Microsoft.Extensions.Primitives; using Xunit; @@ -18,7 +19,7 @@ public void Chrome_In_IPad() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; @@ -35,7 +36,7 @@ public void Safari_In_IPad() headers.Add(Headers.UserAgent, UserAgents.SafariIPad); var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; @@ -54,11 +55,11 @@ public void Edge_In_IPad() }; var httpContextAccessor = this.GetMockedHttpContextAccessor(headers); - var detector = new BrowserDetector(httpContextAccessor); + var detector = new AspNetCoreBrowserDetector(httpContextAccessor); var actual = detector.Browser; - Assert.Equal(BrowserNames.Edge, actual.Name); + Assert.Equal(BrowserNames.EdgeLegacy, actual.Name); } } } diff --git a/tests/BrowserDetector.Tests/ChromeTests.cs b/tests/BrowserDetector.Tests/ChromeTests.cs index b2a1e68..6b391a5 100644 --- a/tests/BrowserDetector.Tests/ChromeTests.cs +++ b/tests/BrowserDetector.Tests/ChromeTests.cs @@ -2,6 +2,7 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; /// @@ -16,7 +17,7 @@ public void Chrome_IPad() Assert.True(isChrome); Assert.Equal(BrowserNames.Chrome, browser.Name); - Assert.Equal(DeviceTypes.Tablet, browser.DeviceType); + Assert.Equal(DeviceType.Tablet, browser.DeviceType); Assert.Equal(OperatingSystems.IOS, browser.OS); } @@ -26,7 +27,7 @@ public void Chrome_IPhone() var isChrome = Chrome.TryParse(UserAgents.ChromeIPhone, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Mobile, browser.DeviceType); + Assert.Equal(DeviceType.Mobile, browser.DeviceType); Assert.Equal(OperatingSystems.IOS, browser.OS); } @@ -36,7 +37,7 @@ public void Chrome_Windows_Desktop() var isChrome = Chrome.TryParse(UserAgents.ChromeWindows, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Desktop, browser.DeviceType); + Assert.Equal(DeviceType.Desktop, browser.DeviceType); Assert.Equal(OperatingSystems.Windows, browser.OS); } @@ -46,7 +47,7 @@ public void Chrome_Windows_Desktop_32Bit() var isChrome = Chrome.TryParse(UserAgents.ChromeWindows32, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Desktop, browser.DeviceType); + Assert.Equal(DeviceType.Desktop, browser.DeviceType); Assert.Equal(OperatingSystems.Windows, browser.OS); } @@ -56,7 +57,7 @@ public void Chrome_OSX_Desktop() var isChrome = Chrome.TryParse(UserAgents.ChromeOsx, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Desktop, browser.DeviceType); + Assert.Equal(DeviceType.Desktop, browser.DeviceType); Assert.Equal(OperatingSystems.MacOSX, browser.OS); } @@ -66,7 +67,7 @@ public void Chrome_Pixel3() var isChrome = Chrome.TryParse(UserAgents.ChromePixel3, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Mobile, browser.DeviceType); + Assert.Equal(DeviceType.Mobile, browser.DeviceType); Assert.Equal(OperatingSystems.Android, browser.OS); } @@ -76,7 +77,7 @@ public void Chrome_Galaxy_Note8_Mobile() var isChrome = Chrome.TryParse(UserAgents.ChromeGalaxyNote8Mobile, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Mobile, browser.DeviceType); + Assert.Equal(DeviceType.Mobile, browser.DeviceType); Assert.Equal(OperatingSystems.Android, browser.OS); } @@ -86,7 +87,7 @@ public void Chrome_GalaxyTabS4() var isChrome = Chrome.TryParse(UserAgents.ChromeGalaxyTabS4, out var browser); Assert.True(isChrome); - Assert.Equal(DeviceTypes.Tablet, browser.DeviceType); + Assert.Equal(DeviceType.Tablet, browser.DeviceType); Assert.Equal(OperatingSystems.Android, browser.OS); } } diff --git a/tests/BrowserDetector.Tests/EdgeChromiumTests.cs b/tests/BrowserDetector.Tests/EdgeChromiumTests.cs index 059fa65..b1cc204 100644 --- a/tests/BrowserDetector.Tests/EdgeChromiumTests.cs +++ b/tests/BrowserDetector.Tests/EdgeChromiumTests.cs @@ -2,6 +2,7 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; public class EdgeChromiumTests @@ -9,20 +10,20 @@ public class EdgeChromiumTests [Fact] public void EdgeChromium_OSX() { - var isEdgeChromiun = EdgeChromium.TryParse(UserAgents.EdgeChromiumOsx, out var edgeChromium); + var isEdgeChromium = Edge.TryParse(UserAgents.EdgeChromiumOsx, out var edgeChromium); - Assert.True(isEdgeChromiun); - Assert.Equal(DeviceTypes.Desktop, edgeChromium.DeviceType); + Assert.True(isEdgeChromium); + Assert.Equal(DeviceType.Desktop, edgeChromium.DeviceType); Assert.Equal(OperatingSystems.MacOSX, edgeChromium.OS); } [Fact] public void EdgeChromium_Windows() { - var isEdgeChromium = EdgeChromium.TryParse(UserAgents.EdgeChromeWindows, out var edgeChromium); + var isEdgeChromium = Edge.TryParse(UserAgents.EdgeChromeWindows, out var edgeChromium); Assert.True(isEdgeChromium); - Assert.Equal(DeviceTypes.Desktop, edgeChromium.DeviceType); + Assert.Equal(DeviceType.Desktop, edgeChromium.DeviceType); Assert.Equal(OperatingSystems.Windows, edgeChromium.OS); } } diff --git a/tests/BrowserDetector.Tests/EdgeTests.cs b/tests/BrowserDetector.Tests/EdgeTests.cs index c6842a6..4529789 100644 --- a/tests/BrowserDetector.Tests/EdgeTests.cs +++ b/tests/BrowserDetector.Tests/EdgeTests.cs @@ -2,52 +2,53 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; /// - /// Tests for Edge browser. + /// Tests for Edge legacy browser. /// - public sealed class EdgeTests + public sealed class EdgeLegacyTests { /// - /// Verifies Edge 18 in desktop. + /// Verifies EdgeLegacy 18 in desktop. /// [Fact] public void Edge18_Windows() { - var isEdge = Edge.TryParse(UserAgents.Edge18Windows, out var edge); + var isEdge = EdgeLegacy.TryParse(UserAgents.Edge18Windows, out var edge); Assert.True(isEdge); - Assert.Equal(BrowserNames.Edge, edge.Name); - Assert.Equal(DeviceTypes.Desktop, edge.DeviceType); + Assert.Equal(BrowserNames.EdgeLegacy, edge.Name); + Assert.Equal(DeviceType.Desktop, edge.DeviceType); Assert.Equal(OperatingSystems.Windows, edge.OS); } /// - /// Verifies Edge in iPad. + /// Verifies EdgeLegacy in iPad. /// [Fact] public void Edge_IPad() { - var isEdge = Edge.TryParse(UserAgents.EdgeIPad, out var edge); + var isEdge = EdgeLegacy.TryParse(UserAgents.EdgeIPad, out var edge); Assert.True(isEdge); - Assert.Equal(BrowserNames.Edge, edge.Name); - Assert.Equal(DeviceTypes.Tablet, edge.DeviceType); + Assert.Equal(BrowserNames.EdgeLegacy, edge.Name); + Assert.Equal(DeviceType.Tablet, edge.DeviceType); Assert.Equal(OperatingSystems.IOS, edge.OS); } /// - /// Verifies Edge in iPhone. + /// Verifies EdgeLegacy in iPhone. /// [Fact] public void Edge_IPhone() { - var isEdge = Edge.TryParse(UserAgents.EdgeIPhone, out var edge); + var isEdge = EdgeLegacy.TryParse(UserAgents.EdgeIPhone, out var edge); Assert.True(isEdge); - Assert.Equal(BrowserNames.Edge, edge.Name); - Assert.Equal(DeviceTypes.Mobile, edge.DeviceType); + Assert.Equal(BrowserNames.EdgeLegacy, edge.Name); + Assert.Equal(DeviceType.Mobile, edge.DeviceType); Assert.Equal(OperatingSystems.IOS, edge.OS); } } diff --git a/tests/BrowserDetector.Tests/FirefoxTests.cs b/tests/BrowserDetector.Tests/FirefoxTests.cs index ba0ad1d..f378ccf 100644 --- a/tests/BrowserDetector.Tests/FirefoxTests.cs +++ b/tests/BrowserDetector.Tests/FirefoxTests.cs @@ -2,6 +2,7 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; public class FirefoxTests @@ -12,7 +13,7 @@ public void Firefox_Windows_Desktop() var isFireFox = Firefox.TryParse(UserAgents.FirefoxWindows, out var firefox); Assert.True(isFireFox); - Assert.Equal(DeviceTypes.Desktop, firefox.DeviceType); + Assert.Equal(DeviceType.Desktop, firefox.DeviceType); Assert.Equal(OperatingSystems.Windows, firefox.OS); } @@ -22,7 +23,7 @@ public void Firefox_OSX_Desktop() var isFireFox = Firefox.TryParse(UserAgents.FirefoxOsx, out var firefox); Assert.True(isFireFox); - Assert.Equal(DeviceTypes.Desktop, firefox.DeviceType); + Assert.Equal(DeviceType.Desktop, firefox.DeviceType); Assert.Equal(OperatingSystems.MacOSX, firefox.OS); } @@ -32,7 +33,7 @@ public void Firefox_IOS_iPhone() var isFireFox = Firefox.TryParse(UserAgents.FirefoxIPhone, out var firefox); Assert.True(isFireFox); - Assert.Equal(DeviceTypes.Mobile, firefox.DeviceType); + Assert.Equal(DeviceType.Mobile, firefox.DeviceType); Assert.Equal(OperatingSystems.IOS, firefox.OS); } @@ -42,7 +43,7 @@ public void Firefox_IOS_iPad() var isFireFox = Firefox.TryParse(UserAgents.FirefoxIPad, out var firefox); Assert.True(isFireFox); - Assert.Equal(DeviceTypes.Tablet, firefox.DeviceType); + Assert.Equal(DeviceType.Tablet, firefox.DeviceType); Assert.Equal(OperatingSystems.IOS, firefox.OS); } @@ -52,7 +53,7 @@ public void Firefox_Android() var isFireFox = Firefox.TryParse(UserAgents.FirefoxAndroid, out var firefox); Assert.True(isFireFox); - Assert.Equal(DeviceTypes.Mobile, firefox.DeviceType); + Assert.Equal(DeviceType.Mobile, firefox.DeviceType); Assert.Equal(OperatingSystems.Android, firefox.OS); } } diff --git a/tests/BrowserDetector.Tests/InternetExplorerTests.cs b/tests/BrowserDetector.Tests/InternetExplorerTests.cs index 6162918..27380e3 100644 --- a/tests/BrowserDetector.Tests/InternetExplorerTests.cs +++ b/tests/BrowserDetector.Tests/InternetExplorerTests.cs @@ -2,6 +2,7 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; /// @@ -16,7 +17,7 @@ public void IE11() Assert.True(isInternetExplorer); Assert.Equal(BrowserNames.InternetExplorer, internetExplorer.Name); - Assert.Equal(DeviceTypes.Desktop, internetExplorer.DeviceType); + Assert.Equal(DeviceType.Desktop, internetExplorer.DeviceType); Assert.Equal(OperatingSystems.Windows, internetExplorer.OS); } } diff --git a/tests/BrowserDetector.Tests/OperaTests.cs b/tests/BrowserDetector.Tests/OperaTests.cs index 8fcb3bc..aef284f 100644 --- a/tests/BrowserDetector.Tests/OperaTests.cs +++ b/tests/BrowserDetector.Tests/OperaTests.cs @@ -2,6 +2,7 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; /// @@ -15,7 +16,7 @@ public void Opera_OSX() var isOpera = Opera.TryParse(UserAgents.OperaOsx, out var opera); Assert.True(isOpera); - Assert.Equal(DeviceTypes.Desktop, opera.DeviceType); + Assert.Equal(DeviceType.Desktop, opera.DeviceType); Assert.Equal(OperatingSystems.MacOSX, opera.OS); } @@ -25,7 +26,7 @@ public void Opera_Windows() var isOpera = Opera.TryParse(UserAgents.OperaWindows, out var operea); Assert.True(isOpera); - Assert.Equal(DeviceTypes.Desktop, operea.DeviceType); + Assert.Equal(DeviceType.Desktop, operea.DeviceType); Assert.Equal(OperatingSystems.Windows, operea.OS); } @@ -35,7 +36,7 @@ public void Opera_IPhone() var isOpera = Opera.TryParse(UserAgents.OperaTouchIPhone, out var opera); Assert.True(isOpera); - Assert.Equal(DeviceTypes.Mobile, opera.DeviceType); + Assert.Equal(DeviceType.Mobile, opera.DeviceType); Assert.Equal(OperatingSystems.IOS, opera.OS); } } diff --git a/tests/BrowserDetector.Tests/PlatformDetectorTests.cs b/tests/BrowserDetector.Tests/PlatformDetectorTests.cs index 39dd906..3bc6d9b 100644 --- a/tests/BrowserDetector.Tests/PlatformDetectorTests.cs +++ b/tests/BrowserDetector.Tests/PlatformDetectorTests.cs @@ -1,5 +1,7 @@ namespace Shyjus.BrowserDetection.Tests { + using Shyjus.BrowserDetector; + using Shyjus.BrowserDetector.Core; using System; using Xunit; diff --git a/tests/BrowserDetector.Tests/SafariTests.cs b/tests/BrowserDetector.Tests/SafariTests.cs index 37e0a38..c93822e 100644 --- a/tests/BrowserDetector.Tests/SafariTests.cs +++ b/tests/BrowserDetector.Tests/SafariTests.cs @@ -2,6 +2,7 @@ { using Shyjus.BrowserDetection; using Shyjus.BrowserDetection.Tests; + using Shyjus.BrowserDetector; using Xunit; public class SafariTests @@ -12,7 +13,7 @@ public void Safari_IPad() var isSafari = Safari.TryParse(UserAgents.SafariIPad, out var safari); Assert.True(isSafari); - Assert.Equal(DeviceTypes.Tablet, safari.DeviceType); + Assert.Equal(DeviceType.Tablet, safari.DeviceType); Assert.Equal(OperatingSystems.IOS, safari.OS); } @@ -22,7 +23,7 @@ public void Safari_IPhone() var isSafari = Safari.TryParse(UserAgents.SafariIPhone, out var safari); Assert.True(isSafari); - Assert.Equal(DeviceTypes.Mobile, safari.DeviceType); + Assert.Equal(DeviceType.Mobile, safari.DeviceType); Assert.Equal(OperatingSystems.IOS, safari.OS); } @@ -32,7 +33,7 @@ public void Safari_OSX() var isSafari = Safari.TryParse(UserAgents.Safari12Osx, out var safari); Assert.True(isSafari); - Assert.Equal(DeviceTypes.Desktop, safari.DeviceType); + Assert.Equal(DeviceType.Desktop, safari.DeviceType); Assert.Equal(OperatingSystems.MacOSX, safari.OS); } @@ -42,7 +43,7 @@ public void Safari_Windows() var isSafari = Safari.TryParse(UserAgents.Safari12Windows, out var safari); Assert.True(isSafari); - Assert.Equal(DeviceTypes.Desktop, safari.DeviceType); + Assert.Equal(DeviceType.Desktop, safari.DeviceType); Assert.Equal(OperatingSystems.Windows, safari.OS); } }