add a safety check for getproperty

This commit is contained in:
Hongtao Zhang 2023-12-18 00:30:18 -06:00
parent 15b69a2fac
commit c2ff04f0ad

View file

@ -2,12 +2,14 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text.Json; using System.Text.Json;
using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.Plugin.BrowserBookmark namespace Flow.Launcher.Plugin.BrowserBookmark
{ {
public abstract class ChromiumBookmarkLoader : IBookmarkLoader public abstract class ChromiumBookmarkLoader : IBookmarkLoader
{ {
public abstract List<Bookmark> GetBookmarks(); public abstract List<Bookmark> GetBookmarks();
protected List<Bookmark> LoadBookmarks(string browserDataPath, string name) protected List<Bookmark> LoadBookmarks(string browserDataPath, string name)
{ {
var bookmarks = new List<Bookmark>(); var bookmarks = new List<Bookmark>();
@ -25,47 +27,57 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})"); var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})");
bookmarks.AddRange(LoadBookmarksFromFile(bookmarkPath, source)); bookmarks.AddRange(LoadBookmarksFromFile(bookmarkPath, source));
} }
return bookmarks; return bookmarks;
} }
protected List<Bookmark> LoadBookmarksFromFile(string path, string source) protected List<Bookmark> LoadBookmarksFromFile(string path, string source)
{ {
if (!File.Exists(path)) if (!File.Exists(path))
return new(); return new List<Bookmark>();
var bookmarks = new List<Bookmark>(); var bookmarks = new List<Bookmark>();
using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path)); using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path));
if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement)) if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement))
return new(); return new List<Bookmark>();
foreach (var folder in rootElement.EnumerateObject()) foreach (var folder in rootElement.EnumerateObject())
{ {
if (folder.Value.ValueKind == JsonValueKind.Object) if (folder.Value.ValueKind == JsonValueKind.Object)
EnumerateFolderBookmark(folder.Value, bookmarks, source); EnumerateFolderBookmark(folder.Value, bookmarks, source);
} }
return bookmarks; return bookmarks;
} }
private void EnumerateFolderBookmark(JsonElement folderElement, List<Bookmark> bookmarks, string source) private void EnumerateFolderBookmark(JsonElement folderElement, ICollection<Bookmark> bookmarks,
string source)
{ {
if (!folderElement.TryGetProperty("children", out var childrenElement)) if (!folderElement.TryGetProperty("children", out var childrenElement))
return; return;
foreach (var subElement in childrenElement.EnumerateArray()) foreach (var subElement in childrenElement.EnumerateArray())
{ {
switch (subElement.GetProperty("type").GetString()) if (subElement.TryGetProperty("type", out var type))
{ {
case "folder": switch (type.GetString())
case "workspace": // Edge Workspace {
EnumerateFolderBookmark(subElement, bookmarks, source); case "folder":
break; case "workspace": // Edge Workspace
default: EnumerateFolderBookmark(subElement, bookmarks, source);
bookmarks.Add(new Bookmark( break;
subElement.GetProperty("name").GetString(), default:
subElement.GetProperty("url").GetString(), bookmarks.Add(new Bookmark(
source)); subElement.GetProperty("name").GetString(),
break; subElement.GetProperty("url").GetString(),
source));
break;
}
}
else
{
Log.Error(
$"ChromiumBookmarkLoader: EnumerateFolderBookmark: type property not found for {subElement.GetString()}");
} }
} }
} }
} }
} }