Skip to content

Commit

Permalink
Support Opera & Opera Developer (#27)
Browse files Browse the repository at this point in the history
  • Loading branch information
TBM13 committed Feb 22, 2025
1 parent f0b3ab7 commit 83ddb76
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 24 deletions.
24 changes: 19 additions & 5 deletions BrowserSearch/Browsers/Chromium.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ namespace BrowserSearch.Browsers
{
internal class Chromium : IBrowser
{
protected string UserDataDir { get; }
protected string[] UserDataDirCandidates { get; }
protected Dictionary<string, ChromiumProfile> Profiles { get; } = [];
private readonly string? _selectedProfileName;
private readonly List<Result> _history = [];
// Key is query, Value is a list of predictions for that query
private readonly Dictionary<string, List<ChromiumPrediction>> _predictions = [];

public Chromium(string userDataDir, string? profileName)
public Chromium(string[] userDataDirCandidates, string? profileName)
{
UserDataDir = userDataDir;
UserDataDirCandidates = userDataDirCandidates;
_selectedProfileName = profileName;
}

Expand Down Expand Up @@ -54,8 +54,22 @@ void IBrowser.Init()

protected virtual void CreateProfiles()
{
string? userDataDir = null;
foreach (string candidate in UserDataDirCandidates)
{
if (Directory.Exists(candidate))
{
userDataDir = candidate;
break;
}
}

if (userDataDir is null)
throw new NullReferenceException("Couldn\'t find UserData directory");

Log.Info($"Found UserData directory: {userDataDir}", typeof(Chromium));
using StreamReader jsonFileReader = new(
new FileStream(Path.Join(UserDataDir, "Local State"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
new FileStream(Path.Join(userDataDir, "Local State"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
);

JsonDocument localState = JsonDocument.Parse(jsonFileReader.ReadToEnd());
Expand All @@ -65,7 +79,7 @@ protected virtual void CreateProfiles()
JsonElement infoCache = localState.RootElement.GetProperty("profile").GetProperty("info_cache");
foreach (JsonProperty profileInfo in infoCache.EnumerateObject())
{
ChromiumProfile profile = new(Path.Join(UserDataDir, profileInfo.Name));
ChromiumProfile profile = new(Path.Join(userDataDir, profileInfo.Name));
Profiles[profileInfo.Name.ToLower()] = profile;

foreach (string nameProp in nameProperties)
Expand Down
6 changes: 3 additions & 3 deletions BrowserSearch/Browsers/OperaGX.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace BrowserSearch.Browsers
{
internal class OperaGX : Chromium
{
public OperaGX(string userDataDir, string? profileName) : base(userDataDir, null)
public OperaGX(string userDataDir, string? profileName) : base([userDataDir], null)
{
// I don't understand how profiles work on OperaGX nor I could get them to work
// on the browser itself, so multiple profiles is currently unsupported and untested
Expand All @@ -16,8 +16,8 @@ public OperaGX(string userDataDir, string? profileName) : base(userDataDir, null

protected override void CreateProfiles()
{
// Unlike most Chromium-based browsers, OperaGX doesn't have a "Local State" folder
Profiles["default"] = new ChromiumProfile(UserDataDir);
// Unlike most Chromium-based browsers, OperaGX doesn't have a "Local State" file
Profiles["default"] = new ChromiumProfile(UserDataDirCandidates[0]);
}
}
}
38 changes: 22 additions & 16 deletions BrowserSearch/Main.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,19 +116,19 @@ private void InitDefaultBrowser()
{
case "Arc":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Packages\TheBrowserCompany.Arc_ttt1ap7aakyb4\LocalCache\Local\Arc\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Packages\TheBrowserCompany.Arc_ttt1ap7aakyb4\LocalCache\Local\Arc\User Data")], _selectedProfileName);
break;
case "Brave":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"BraveSoftware\Brave-Browser\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"BraveSoftware\Brave-Browser\User Data")], _selectedProfileName);
break;
case "Brave Beta":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"BraveSoftware\Brave-Browser-Beta\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"BraveSoftware\Brave-Browser-Beta\User Data")], _selectedProfileName);
break;
case "Brave Nightly":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"BraveSoftware\Brave-Browser-Nightly\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"BraveSoftware\Brave-Browser-Nightly\User Data")], _selectedProfileName);
break;
case "Firefox":
_defaultBrowser = new Firefox([
Expand All @@ -138,51 +138,57 @@ private void InitDefaultBrowser()
break;
case "Google Chrome":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Google\Chrome\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Google\Chrome\User Data")], _selectedProfileName);
break;
case "Google Chrome Beta":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Google\Chrome Beta\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Google\Chrome Beta\User Data")], _selectedProfileName);
break;
case "Google Chrome Dev":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Google\Chrome Dev\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Google\Chrome Dev\User Data")], _selectedProfileName);
break;
case "Google Chrome Canary":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Google\Chrome SxS\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Google\Chrome SxS\User Data")], _selectedProfileName);
break;
case "Microsoft Edge":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Microsoft\Edge\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Microsoft\Edge\User Data")], _selectedProfileName);
break;
case "Microsoft Edge Beta":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Microsoft\Edge Beta\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Microsoft\Edge Beta\User Data")], _selectedProfileName);
break;
case "Microsoft Edge Dev":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Microsoft\Edge Dev\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Microsoft\Edge Dev\User Data")], _selectedProfileName);
break;
case "Microsoft Edge Canary":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Microsoft\Edge SxS\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Microsoft\Edge SxS\User Data")], _selectedProfileName);
break;
case "NAVER Whale":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Naver\Naver Whale\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Naver\Naver Whale\User Data")], _selectedProfileName);
break;
case "Opera":
_defaultBrowser = new Chromium([
Path.Join(roamingappdata, @"Opera Software\Opera Stable"), // Opera
Path.Join(roamingappdata, @"Opera Software\Opera Developer") // Opera Developer
], _selectedProfileName);
break;
case "Opera GX":
_defaultBrowser = new OperaGX(
Path.Join(roamingappdata, @"Opera Software\Opera GX Stable"), _selectedProfileName);
break;
case "Thorium":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Thorium\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Thorium\User Data")], _selectedProfileName);
break;
case "Vivaldi":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"Vivaldi\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"Vivaldi\User Data")], _selectedProfileName);
break;
case "Waterfox":
_defaultBrowser = new Firefox([
Expand All @@ -191,7 +197,7 @@ private void InitDefaultBrowser()
break;
case "Wavebox":
_defaultBrowser = new Chromium(
Path.Join(localappdata, @"WaveboxApp\User Data"), _selectedProfileName);
[Path.Join(localappdata, @"WaveboxApp\User Data")], _selectedProfileName);
break;
default:
Log.Error($"Unsupported/unrecognized default browser '{BrowserInfo.Name}'", typeof(Main));
Expand Down

0 comments on commit 83ddb76

Please sign in to comment.