Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 7 Min.

Google-Chrome-Bookmarks

Für den Umstieg auf die Chromium-Engine bietet es sich zunächst an, die bestehenden Lesezeichen von Google Chrome zu importieren.
© dotnetpro
In den vorangegangenen Folgen dieser Artikelserie wurde ein Webbrowser-Steuerelement namens BrowserCtl realisiert, das auf dem Windows-Forms-Steuerelement WebBrowser – und damit auf der Engine des Internet Explorer – basiert und mit einer erweiterten Benutzerumgebung ausgestattet wurde. Im Anschluss daran wurden eigenständige Steuerelemente entwickelt, mit deren Hilfe Sie die Favoriten des Internet Explorer einlesen und komfortabel zur Auswahl bereitstellen [1]. Zusätzlich wurde eine Funktion implementiert, um selbst Favoriten im Internet-Explorer-Format anzulegen.Auch Google Chrome stellt Funktionen zur Anlage und Verwaltung von Favoriten bereit. In Chrome werden die Favoriten über Lesezeichen (Bookmarks) verwaltet (Bild 1). Um Zugriff darauf zu erhalten, nutzen Sie die Menüfunktionen – siehe [2] und [3]) –, die durch Anwahl der drei Punkte im rechten oberen Bereich der Adressleiste angeboten werden. In diesem Menü werden die Lesezeichen im gleichnamigen Untermenü strukturiert und ordnerbasiert angezeigt. Verglichen mit der Strukturansicht im Internet Explorer ist diese Menüansicht allerdings weniger übersichtlich und zudem schwerer zu handhaben. Ein permanentes Anzeigen des Menüs wird nicht unterstützt. Es fehlt zudem das wahlweise und parallele Offenlegen mehrerer Ordnerinhalte. Aus diesem Grunde sollen die Lesezeichen von Google Chrome später auch mit dem Internet Explorer verwaltet werden. Bevor es allerdings so weit ist, sind zunächst die Lesezeichen einzulesen und zu importieren.
In Google Chromewerden Favoriten über Lesezeichen verwaltet(Bild 1) © Autor
Die Lesezeichen werden von Google Chrome auch über ­eine Lesezeichenleiste bereitgestellt, sofern diese aktiviert wurde (Bild 2). Das Aktivieren erfolgt im Google-Chrome-­Menü über den Eintrag Lesezeichenleiste anzeigen. Auch diese Anzeigevariante kann allerdings nicht mit der Strukturansicht konkurrieren.
Die Lesezeichenleistevon Google Chrome(Bild 2) © Autor

Grundlagen zu Chrome-Bookmarks

Bevor Sie sich um die Lesezeichen kümmern können, müssen Sie sich zuerst der Speicherung unter Chrome zuwenden. Sie benötigen Informationen zum Speicherort, zum Speicherformat sowie zum Namen der Datei, in der die Lesezeichen abgelegt werden. Sie finden die Bookmarks im folgenden Ordner:

C:\Users\[Benutzername]\AppData\Local\Google\
  Chrome\User Data\Default 
 
In diesem Pfad ist der [Benutzername] durch den tatsächlichen aktiven Benutzernamen zu ersetzen. Die Datendatei trägt den Namen Bookmarks und verwendet kein Dateikürzel. Laden Sie diese Datei in einen Text­editor, erkennen Sie, dass für Lesezeichen ein JSON-Format verwendet wird. Einen Auszug aus einer Bookmark-Datendatei sehen Sie in Listing 1.
Listing 1: JSON-Struktur einer Bookmark-Datei  – Teil 1
{ 
  "checksum": "77a1c9f00acf35d68b219197e2eec43b", 
  "roots": { 
     "bookmark_bar": { 
        "children": [ { 
           "children": [ { 
              "date_added": "13286818409413588", 
              "guid": "5ef3158f-2c95-4618-87a8-
                      adcff66279b4", 
              "id": "476", 
              "name": "Altes Kontextmenü öffnen 
              Windows 11 Deskmodder Wiki", 
              "type": "url", 
              "url": "https://www.deskmodder.de/wiki/
              index.php?title=
              Altes_Kontextmen%C3%BC_%C3%B6ffnen." 
           }, { 
              ... 
           } ], 
           "date_added": "13286818436571635", 
           "date_modified": "13293019062394117", 
           "guid": "f1507a59-e6a0-42e7-863b-
          f4d10ff2864b", 
           "id": "477", 
           "name": "Win11 Tuning", 
           "type": "folder" 
        }, { 
           "children": [ { 
              "date_added": "13270300778845295", 
              "guid": "467ff933-11ea-463c-aeca-
              853f8a0587e5", 
              "id": "330", 
              "name": "Ferienhaus in Dänemark an der 
              Nordsee - Urlaub bei Esmark", 
              "type": "url", 
              "url": "https://esmark.de/suche/" 
           }, { 
              ...  
           } ], 
           "date_added": "13270300815501791", 
           "date_modified": "13287324511183956", 
           "guid": "6d1c436a-7ea9-4bfe-bed2-
          23cff9eb4a3a", 
           "id": "331", 
           "name": "Dänemark", 
           "type": "folder" 
        }, { 
           "date_added": "13254190477467234", 
           "guid": "4d378c62-fed3-47f7-
          8e46-7c33d0a3162d", 
           "id": "227", 
           "name": "Gmail", 
           "type": "url", 
           "url": "https://accounts.google.com/b/0/
          AddMailService" 
        }, { 
           ... 
        }, { 
           "children": [ { 
              ... 
           } ], 
           ... 
           "type": "folder" 
        }, { 
     }, 
     "other": { 
        "children": [  ], 
        "date_added": "13172502690915010", 
        "date_modified": "0", 
        "guid": "82b081ec-3dd3-529c-8475-
        ab6c344590dd", 
        "id": "2", 
        "name": "Weitere Lesezeichen", 
        "type": "folder" 
     }, 
     "synced": { 
        "children": [  ], 
        "date_added": "13172502690915010", 
        "date_modified": "0", 
        "guid": "4cf2e351-0e85-532b-bb37-
        df045d8f8d0f", 
        "id": "3", 
        "name": "Mobile Lesezeichen", 
        "type": "folder" 
     } 
  }, 
  "sync_metadata": "...", 
  "version": 1 
}  
Dieses Format soll zur vereinfachten Nutzung zunächst in ein strukturiertes Objektformat überführt werden. Dafür gilt es die Datenstruktur zunächst genau zu analysieren. In der Datei Bookmarks finden Sie die Ordnerstruktur inklusive der Ordnernamen für die inhaltliche Gliederung sowie die zugehörigen URLs. Ebenso wie in der Internet-Explorer-Ordnerstruktur werden hier die Ordner nach Bedarf geschachtelt. Informationen zu Bildsymbolen finden sich in der Textdatei nicht. Hier kommen also nur Standardsymbole zum Einsatz (zum Beispiel favicon.ico) oder Symbole, die über <link rel=“shortcut icon“ href=“URL“ /> adressierbar sind. Gegebenenfalls lassen sich die Symbole auch über folgende Adresse abfragen:

https://www.google.com/s2/favicons?domain_url= 
 
Dazu übergeben Sie den URL, wie im folgenden Beispiel gezeigt wird:

https://www.google.com/s2/favicons?
  domain_url=https://www.dotnetpro.de 

Eine Objekthierarchie für Lesezeichen

Das Schaubild in Bild 3 veranschaulicht die Objektstruktur, die sich aus der Datendatei Bookmarks ergibt. Der Übersichtlichkeit halber sind in der Grafik alle Objekte, Auflistungen (Kollektionen), Eigenschaften und Methoden farbig gekennzeichnet. Das Basisobjekt trägt den Namen ChromeBookmarks. Es verwaltet die Eigenschaften checksum (Prüfsumme), version (Versionsnummer) und Metadaten für die Synchronisation (sync_metadata). Die Metadaten werden an dieser Stelle nicht benötigt und später im Rahmen der Verarbeitung ignoriert. Die Hauptelemente (Wurzelelemente oder Roots) werden über eine Kollektion des Typs roots verwaltet. Hier finden sich die drei Hauptelemente bookmark_bar (Lesezeichenleiste), other (andere) und synced (zwischen Geräten synchronisierte Inhalte). Alle Kollektionen stellen zur Auflistungsverwaltung die Methoden Add, AddRange, Insert, Remove, Clear, IndexOf und Item bereit.
Nachgebildete Objekthierarchieder Google-Chrome-­Bookmarks(Bild 3) © Autor
Jedes Wurzelelement der Auflistung roots ist selbst vom Objekttyp root. Darüber werden der Name (name), alle untergeordneten Ordner inklusive der zugehörigen Webadressen als Auflistung (FolderDatas) sowie direkt zugeordnete URLs als Auflistung verwaltet (childrens). Das Element zur Verwaltung eines einzelnen Lesezeichenordners ist das Objekt FolderData. Diesem werden alle untergeordneten URLs mitsamt Eigenschaften über die Kollektion childrens zugeordnet. Ein einzelnes Objekt des Typs children verwaltet Informationen zum Datum des Hinzufügens (date_added), eine eindeutige GUID (guid), eine Kennung (id), einen Namen (name, entspricht der Menübezeichnung), einen Typ (type, immer die Zeichenkette url) sowie den zugeordneten Uniform Resource Locator (url). Zum Ordner selbst werden über das Objekt FolderData folgende Daten verwaltet: das Datum des Hinzufügens (date_added), das Datum der letzten Änderung (date_modified), eine eindeutige GUID (guid), eine Kennung (id), ein Name (name, entspricht der Menübezeichnung), ein Typ (type, immer die Zeichenkette folder) sowie eine gegebenenfalls untergeordnete SubFolderDatas-Auflistung, über die geschachtelte Menüebenen des Typs DataFolders verwaltbar sind.Für die Elementverwaltung der Kollektionen childrens und DataFolders werden erneut die bereits oben genannten Methoden angeboten.

Klassen für Lesezeichen

Um die Objekthierarchie entsprechend Bild 3 zu definieren und programmintern zu verwalten, sind die Klassen ChromeBookmarks, Root, Roots, FolderData, FolderDatas, Children und Childrens zu definieren. Sie finden alle genannten Klassen in der Projektdatei BrowserFunctions.vb der Steuerelementbibliothek ExtendedControlsLib. Bild 4 zeigt die Klassen mitsamt Schnittstellenelementen und deren Datentypen. Bei den Methoden werden auch die genutzten Datentypen angezeigt. Alle Bezeichner werden innerhalb der Klassen entsprechend den Bezeichnern in der Bookmarks-Datei vergeben, sodass sich Bezüge im direkten Vergleich herstellen lassen.

Die Klasse ChromeBookmarks

Alle neuen Klassenzur Lese­zeichenverwaltung finden sich in der Datei BrowserFunctions.vb der Steuerelementbibliothek ExtendedControlLib(Bild 4) © Autor
Die Klasse ChromeBookmarks verwaltet die Prüfsumme (checksum), die Versionsnummer zum Lesezeichenformat (version) sowie die Auflistung aller Wurzelelemente (roots) über öffentliche Eigenschaften. Die Metadaten werden an dieser Stelle nicht benötigt und dementsprechend ist die zugehörige Eigenschaft sync_metadata auskommentiert. Prüfsumme und Versionsnummer werden als Zeichenketten verwaltet. Die Auflistung der Wurzelelemente roots ist vom Typ Roots. Für die korrekte Verarbeitung wird die Auflistung roots unmittelbar mit New Roots instanziert.
Public Class ChromeBookmarks 
  Public Property checksum 
    As String 
  Public Property roots 
    As New Roots 
  Public Property version As String 
End Class 

Die Klassen Root und Roots

Über die Klasse Root wird ein einzelnes Wurzelelement zur Lesezeichenverwaltung verarbeitet. Der Name des Elements wird über die Zeichenketteneigenschaft Name verwaltet. Jedem Wurzelelement können ein oder mehrere URLs zugewiesen werden. Diese werden über die Auflistung Childrens verwaltet. In jedem Wurzelelement können Unterordner des Typs FolderDatas eingerichtet werden, die hier über die gleichnamige Eigenschaft verwaltet werden. Für die korrekte Verarbeitung werden die Auflistungen Childrens und FolderDatas erneut mit New instanziert.

Public Class Root 
  Public Property Name As String 
  Public Property FolderDatas 
    As New FolderDatas 
  Public Property Childrens As 
    New Childrens 
End Class 
 
Die Auflistungsklasse Roots fasst alle Wurzelelemente zusammen (Listing 2). Sie wird von CollectionBase abgeleitet und definiert die Methoden Add, AddRange, Insert, Remove, Clear, IndexOf und Item:
Listing 2: Die Auflistungsklasse Roots
Public Class Roots 
  Inherits CollectionBase 

  Public Function Add(ByVal Item As Root) As Root 
    List.Add(Item) 
    Return Item 
  End Function 

  Public Sub AddRange(ByVal Items() As Root) 
    For Each Item As Root In Items 
      List.Add(Item) 
    Next 
  End Sub 

  Public Sub Insert(ByVal Index As Integer, 
    ByVal Item As Root) 
    List.Insert(Index, Item) 
  End Sub 

  Public Sub Remove(ByVal Item As Root) 
    List.Remove(Item) 
  End Sub 
  Public Overloads Sub Clear() 
    MyBase.Clear() 
  End Sub 

  Public Function IndexOf(
    ByVal value As Root) As Integer 

    Return List.IndexOf(value) 
  End Function 

  Default Public ReadOnly Property Item(
    ByVal Index As Integer) As Root 

    Get 
      Try 
        Return CType(List(Index), Root) 
      Catch 
        Return Nothing 
      End Try 
    End Get 
  End Property 
End Class  
  • Add: Einzelnes Element (Item) des Typs Root der Auflistung hinzufügen.
  • AddRange: Datenfeld mit Wurzelelementen des Typs Root der Auflistung hinzufügen.
  • Insert: Einzelnes Element (Item) des Typs Root am angegebenen Index der Auflistung einfügen.
  • Remove: Einzelnes Element (Item) des Typs Root am angegebenen Index aus der Auflistung entfernen.
  • Clear: Gesamte Auflistung mit allen Root-Elementen löschen.
  • IndexOf: Indexwert zu einem angegebenen Wurzelelement (Item) abrufen.
  • Item: Wurzelelement zu einem angegebenen Indexwert abrufen.

Die Klassen FolderData und FolderDatas

Jedes Wurzelelement Root kann ein oder mehrere Ordner (Folder) mitsamt den zugehörigen URL-Einträgen, aber auch direkt zugeordnete URL-Einträge verwalten. Für die direkte URL-Zuordnung im Wurzelelement kommt die Auflistungseigenschaft Childrens des Typs Childrens und für die untergeordnete Verwaltung von Ordnern und deren zugeordneten URL-Einträgen die Auflistungseigenschaft SubFolderDatas des Typs FolderDatas zum Einsatz (Listing 3). Beide Kollektionen werden für den direkten Einsatz unmittelbar instanziert. Zusätzliche Zeichenketteneigenschaften verwalten das Datum der Ordneranlage (date_added), das Datum der letzten Änderung (date_added), eine GUID (guid), eine Kennung (id), einen Ordernamen (name) sowie den Ordnertyp (type, hier immer folder). Die Klasse selbst definiert zwei New-Konstruktoren. Ohne Parameterangabe wird das Objekt lediglich neu instanziert. Mit den Parametern lassen sich die Eigenschaften komplett setzen.
Listing 3: Die Klasse FolderData
Public Class FolderData 
  Public Property Childrens As New Childrens 
  Public Property date_added As String 
  Public Property date_modified As String 
  Public Property guid As String 
  Public Property id As String 
  Public Property name As String 
  Public Property type As String 
  Public Property SubFolderDatas As New FolderDatas 

  Public Sub New(Childrens As Childrens, 
    date_added As String, date_modified As String, 
    guid As String,  id As String, 
    name As String, type As String, 
    SubFolderDatas As FolderDatas) 
    Me.Childrens = Childrens 
    Me.date_added = date_added 
    Me.date_modified = date_modified 
    Me.guid = guid 

    Me.id = id 
    Me.name = name 
    Me.type = type 
    Me.SubFolderDatas = SubFolderDatas 
  End Sub 

  Public Sub New() 
    MyBase.New() 
  End Sub 
End Class  
So wie die Auflistungsklasse Roots die Objekte des Typs Root zusammenfasst, führen Sie die Objekte des Typs FolderData in der Auflistungsklasse FolderDatas zusammen. Da die Auflistungsklassen Roots und FolderDatas sich lediglich hinsichtlich ihrer Datentypen unterscheiden, sind im nachfolgenden Quelltextauszug zur Klasse FolderDatas lediglich die Prozedurköpfe der implementierten Methoden wiedergegeben. Die Methoden wurden bereits bei der Klasse Roots beschrieben. Die FolderDatas-Auflistungen kommen innerhalb der Objekthierarchie zur Lesezeichenverwaltung mehrfach zum Einsatz.

Public Class FolderDatas 
  Inherits CollectionBase 

  Public Function Add( 
    ByVal Item As FolderData) As FolderData 
  Public Sub AddRange(ByVal Items() As FolderData) 
  Public Sub Insert(ByVal Index As Integer, 
    ByVal Item As FolderData) 

  Public Sub Remove(ByVal Item As FolderData) 
  Public Overloads Sub Clear() 
  Public Function IndexOf( 
    ByVal value As FolderData) As Integer 

  Default Public ReadOnly Property Item( 
    ByVal Index As Integer) As FolderData 
End Class 

Die Klassen Children und Childrens

Alle URL-Einträge werden mitsamt zugehörigen Eigenschaften über Objekte des Typs Children verwaltet. Als öffentliche Zeichenketteneigenschaften definiert sind date_added, guid, id, name (Bezeichner = Menütitel), type (Standard-String: url) und url (Webadresse). Die Klasse bekommt ebenfalls zwei New-Konstruktoren. Ohne Parameterangabe wird das Objekt lediglich instanziert, mit Parametern lassen sich die zugeordneten Eigenschaften setzen (Listing 4).
Listing 4: Die Klasse Children
Public Class Children 
  Public Property date_added As String 
  Public Property guid As String 
  Public Property id As String 
  Public Property name As String 
  Public Property type As String 
  Public Property url As String 

  Public Sub New(date_added As String, 
    guid As String, id As String, 
    name As String, type As String, url As String) 

    Me.date_added = date_added 
    Me.guid = guid 
    Me.id = id 
    Me.name = name 
    Me.type = type 
    Me.url = url 
  End Sub 

  Public Sub New() 
    MyBase.New() 
  End Sub 
End Class  
Alle URL-Einträge mitsamt deren Eigenschaften verwalten Sie über die Auflistungsklasse Childrens. Da sich die Auflistungsklassen Roots,FolderDatas und Childrens lediglich anhand ihrer Datentypen unterscheiden, sind im nachfolgenden Quelltextauszug zur Klasse Childrens lediglich die Prozedurköpfe der implementierten Methoden wiedergegeben.

Public Class Childrens 
  Inherits CollectionBase 

  Public Function Add( 
    ByVal Item As Children) As Children 
  Public Sub AddRange( 
    ByVal Items() As Children) 
  Public Sub Insert(ByVal Index As Integer, 
    ByVal Item As Children) 
  Public Sub Remove(ByVal Item As Children) 
  Public Overloads Sub Clear() 
  Public Function IndexOf( 
    ByVal value As Children) As Integer 
  Default Public ReadOnly Property Item( 
    ByVal Index As Integer) As Children 
End Class 
 
Prinzipiell können Sie die JSON-Daten per Deserialisierung einlesen. Leichte Abweichungen in der Objekthierarchie führen dann aber mitunter zu schwer lokalisierbaren Fehlern. Dies können Sie durch den Einsatz benutzerdefinierter Methoden zur Datenauswertung und -aufbereitung umgehen. Die dafür erforderlichen Methoden werden im nächsten Heft detailliert vorgestellt.
Projektdateien herunterladen

Fussnoten

  1. Andreas Maslo, Endspurt, Ein eigenes Steuerelement für Webinhalte, Teil 9, ­dotnetpro 6/2022, Seite 166 ff.,
  2. Google-Lesezeichen erstellen, ansehen und bearbeiten,
  3. Google-Lesezeichen exportieren,

Neueste Beiträge

Müssen Ziele SMART sein?
Wenn es um Ziele im Projektmanagement oder in der Führung einer Organisation geht, stoßen wir schnell und fast ausnahmslos auf das Akronym SMART. Was steckt dahinter, und kann es nicht auch sinnvolle Ziele geben, die nicht SMART sind?
8 Minuten
Managed DevOps Pools - Azure DevOps Pipelines Security
Agent Pools als Managed Service mit einfacher Integration in private Netzwerke und Authentisierung mittels Managed Identity tragen deutlich zur Sicherheit der Agent-Infrastruktur bei.
7 Minuten
7. Aug 2025
Browser-Apps mit Avalonia entwickeln - Avalonia
Klassische UI-Frameworks finden ihren Weg in den Browser
7 Minuten
11. Aug 2025
Miscellaneous

Das könnte Dich auch interessieren

Sicher ist sicher - Azure DevOps Pipelines Security
Als integraler Bestandteil der Entwicklungsumgebung ist Azure DevOps Pipelines oft Ziel von Angriffen. Da ist es gut zu wissen, wo die Schwachstellen des Systems liegen.
14 Minuten
16. Jun 2025
CodeProject.AI Server in neuer Version - Lokaler AI-Server
CodeProject.AI Server (jetzt in Version 2.1.10) ist ein lokal installierter, selbstgehosteter, schneller, kostenloser und Open Source Artificial Intelligence Server für jede Plattform und jede Sprache.
2 Minuten
Für Einsteiger: Backend-Webentwicklung mit .NET - Microsoft
Auf YouTube bietet Microsoft eine Videoserie für Einsteiger in die Backend-Webentwicklung mit .NET.
2 Minuten
13. Feb 2024
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige