11import { get , writable } from 'svelte/store' ;
22import browser , { type Bookmarks } from 'webextension-polyfill' ;
33
4- import {
5- BOOKMARK_TREE_NODE_TYPE_BOOKMARK ,
6- BOOKMARK_TREE_NODE_TYPE_FOLDER ,
7- BOOKMARK_TREE_NODE_TYPE_SEPARATOR ,
8- BOOKMARKS_MENU_GUID ,
9- BOOKMARKS_TOOLBAR_GUID ,
10- OTHER_BOOKMARKS_GUID ,
11- } from './constants' ;
4+ import { isBookmark , isFolder , isSeparator } from './bookmarktreenode-utils' ;
5+ import { MOBILE_BOOKMARKS_GUID } from './constants' ;
126import * as Treetop from './types' ;
137
14- // Map bookmarks.BookmarkTreeNodeType to Treetop.NodeType
15- const BookmarkTypeMap : Map < Bookmarks . BookmarkTreeNodeType , Treetop . NodeType > =
16- new Map ( [
17- [ BOOKMARK_TREE_NODE_TYPE_BOOKMARK , Treetop . NodeType . Bookmark ] ,
18- [ BOOKMARK_TREE_NODE_TYPE_FOLDER , Treetop . NodeType . Folder ] ,
19- [ BOOKMARK_TREE_NODE_TYPE_SEPARATOR , Treetop . NodeType . Separator ] ,
20- ] ) ;
21-
228/**
239 * Class to initialize and manage updating bookmark node stores.
2410 */
2511export class BookmarksManager {
26- constructor ( private readonly nodeStoreMap : Treetop . NodeStoreMap ) { }
12+ constructor (
13+ private readonly nodeStoreMap : Treetop . NodeStoreMap ,
14+ private readonly builtInFolderInfo : Treetop . BuiltInFolderInfo
15+ ) { }
2716
2817 /**
2918 * Load all bookmarks and initialize node stores for folders.
19+ * Initialize built-in folder info.
3020 */
3121 async loadBookmarks ( ) : Promise < void > {
3222 const nodes = await browser . bookmarks . getTree ( ) ;
33- this . orderBookmarksRootChildren ( nodes [ 0 ] ) ;
3423
24+ // Store root node ID
25+ const rootNode = nodes [ 0 ] ;
26+ this . builtInFolderInfo . rootNodeId = rootNode . id ;
27+
28+ // Firefox: Exclude Mobile Bookmarks folder
29+ rootNode . children = rootNode . children ?. filter (
30+ ( { id } ) => id !== MOBILE_BOOKMARKS_GUID
31+ ) ;
32+
33+ // Store built-in folder IDs (e.g. Other Bookmarks)
34+ this . builtInFolderInfo . builtInFolderIds = rootNode . children ! . map (
35+ ( { id } ) => id
36+ ) ;
37+
38+ // Initialize node stores for folders
3539 while ( nodes . length > 0 ) {
3640 const node = nodes . pop ( ) ! ;
3741
38- if ( node . type === BOOKMARK_TREE_NODE_TYPE_FOLDER ) {
42+ if ( isFolder ( node ) ) {
3943 this . buildNodeStore ( node ) ;
4044 nodes . push ( ...node . children ! ) ;
4145 }
@@ -54,32 +58,27 @@ export class BookmarksManager {
5458 title : node . title ,
5559 children : node . children ! . map ( ( child ) : Treetop . Node => {
5660 let newChild : Treetop . Node ;
57- const type = BookmarkTypeMap . get ( child . type ! ) ! ;
58- switch ( type ) {
59- case Treetop . NodeType . Bookmark :
60- newChild = {
61- type,
62- id : child . id ,
63- title : child . title ,
64- url : child . url ! ,
65- } ;
66- break ;
67- case Treetop . NodeType . Folder :
68- newChild = {
69- type,
70- id : child . id ,
71- title : child . title ,
72- children : [ ] ,
73- } ;
74- break ;
75- case Treetop . NodeType . Separator :
76- newChild = {
77- type,
78- id : child . id ,
79- } ;
80- break ;
81- default :
82- throw new TypeError ( ) ;
61+ if ( isBookmark ( child ) ) {
62+ newChild = {
63+ id : child . id ,
64+ title : child . title ,
65+ type : Treetop . NodeType . Bookmark ,
66+ url : child . url ! ,
67+ } ;
68+ } else if ( isFolder ( child ) ) {
69+ newChild = {
70+ id : child . id ,
71+ title : child . title ,
72+ type : Treetop . NodeType . Folder ,
73+ children : [ ] ,
74+ } ;
75+ } else if ( isSeparator ( child ) ) {
76+ newChild = {
77+ id : child . id ,
78+ type : Treetop . NodeType . Separator ,
79+ } ;
80+ } else {
81+ throw new TypeError ( ) ;
8382 }
8483
8584 return newChild ;
@@ -93,10 +92,6 @@ export class BookmarksManager {
9392 * Create and record a node store for the specified bookmark node.
9493 */
9594 private buildNodeStore ( node : Bookmarks . BookmarkTreeNode ) : void {
96- if ( node . type !== BOOKMARK_TREE_NODE_TYPE_FOLDER ) {
97- throw new TypeError ( ) ;
98- }
99-
10095 const newNode = this . convertNode ( node ) ;
10196 const nodeStore = writable ( newNode ) ;
10297 this . nodeStoreMap . set ( node . id , nodeStore ) ;
@@ -108,7 +103,7 @@ export class BookmarksManager {
108103 private async updateNodeStore ( nodeId : string ) : Promise < void > {
109104 const [ node ] = await browser . bookmarks . get ( nodeId ) ;
110105
111- if ( node . type !== BOOKMARK_TREE_NODE_TYPE_FOLDER ) {
106+ if ( ! isFolder ( node ) ) {
112107 throw new TypeError ( ) ;
113108 }
114109
@@ -126,7 +121,7 @@ export class BookmarksManager {
126121 id : string ,
127122 bookmark : Bookmarks . BookmarkTreeNode
128123 ) : Promise < void > {
129- if ( bookmark . type === BOOKMARK_TREE_NODE_TYPE_FOLDER ) {
124+ if ( isFolder ( bookmark ) ) {
130125 // Add node store for the new folder
131126 const [ node ] = await browser . bookmarks . get ( id ) ;
132127 node . children = await browser . bookmarks . getChildren ( id ) ;
@@ -149,7 +144,7 @@ export class BookmarksManager {
149144 ) : Promise < string [ ] > {
150145 const removedNodeIds = [ ] ;
151146
152- if ( removeInfo . node . type === BOOKMARK_TREE_NODE_TYPE_FOLDER ) {
147+ if ( isFolder ( removeInfo . node ) ) {
153148 const nodeStore = this . nodeStoreMap . get ( id ) ! ;
154149 const nodes : [ Treetop . FolderNode ] = [ get ( nodeStore ) ] ;
155150
@@ -219,35 +214,4 @@ export class BookmarksManager {
219214 await this . updateNodeStore ( oldParentId ) ;
220215 }
221216 }
222-
223- /**
224- * Order root bookmark node children like:
225- * - Bookmarks Toolbar
226- * - Bookmarks Menu
227- * - Other Bookmarks
228- *
229- * Respect preference settings for whether to include each folder.
230- *
231- * Omit Mobile Bookmarks.
232- */
233- private orderBookmarksRootChildren ( node : Bookmarks . BookmarkTreeNode ) : void {
234- const children : Bookmarks . BookmarkTreeNode [ ] = [ ] ;
235-
236- const bookmarksToolbarNode = node . children ! . find (
237- ( { id } ) => id === BOOKMARKS_TOOLBAR_GUID
238- ) ! ;
239- children . push ( bookmarksToolbarNode ) ;
240-
241- const bookmarksMenuNode = node . children ! . find (
242- ( { id } ) => id === BOOKMARKS_MENU_GUID
243- ) ! ;
244- children . push ( bookmarksMenuNode ) ;
245-
246- const otherBookmarksNode = node . children ! . find (
247- ( { id } ) => id === OTHER_BOOKMARKS_GUID
248- ) ! ;
249- children . push ( otherBookmarksNode ) ;
250-
251- node . children = children ;
252- }
253217}
0 commit comments