bookmark-stack

web extension to save pages in a stack for reading them later  https://addons.mozilla.org/firefox/addon/bookmark-stack/
git clone https://git.ce9e.org/bookmark-stack.git

commit
1d37de722d976209ae63e681473701ed5c5262d6
parent
df96876306ff1a944f5f13d0989a065c146730c9
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2025-04-23 18:44
use promises

Diffstat

M bg.js 9 ++++-----
M shared.js 110 +++++++++++++++++++++++++++----------------------------------
M stack.js 8 ++++----

3 files changed, 57 insertions, 70 deletions


diff --git a/bg.js b/bg.js

@@ -10,16 +10,15 @@ chrome.contextMenus.create({
   10    10 	contexts: ['link'],
   11    11 });
   12    12 
   13    -1 chrome.contextMenus.onClicked.addListener(function(info, tab) {
   -1    13 chrome.contextMenus.onClicked.addListener(async function(info, tab) {
   14    14 	if (info.menuItemId === 'read-later-link') {
   15    -1 		pushBookmark({
   -1    15 		await pushBookmark({
   16    16 			url: info.linkUrl,
   17    17 			title: info.linkText,
   18    18 		});
   19    19 	} else {
   20    -1 		pushBookmark(tab, function() {
   21    -1 			chrome.tabs.remove(tab.id);
   22    -1 		});
   -1    20 		await pushBookmark(tab);
   -1    21 		await chrome.tabs.remove(tab.id);
   23    22 	}
   24    23 });
   25    24 

diff --git a/shared.js b/shared.js

@@ -1,77 +1,65 @@
    1     1 const FOLDER_TITLE = 'stack';
    2     2 
    3    -1 var getRootFolder = function(callback) {
   -1     3 var getRootFolder = async function() {
    4     4 	// try firefox
    5    -1 	chrome.bookmarks.get('unfiled_____', function(folder) {
    6    -1 		if (!chrome.runtime.lastError) {
    7    -1 			callback(folder[0]);
    8    -1 		} else {
    9    -1 			// In chrome, it the folders are indexed depth-first.
   10    -1 			// So root is 0, "bookmark bar" is 1, "other bookmarks" is 2.
   11    -1 			// However, if you already had bookmarks when ids were introduced,
   12    -1 			// "other bookmarks" may have a higher id.
   13    -1 			//
   14    -1 			// See https://bugs.chromium.org/p/chromium/issues/detail?id=21330
   15    -1 			chrome.bookmarks.getChildren('0', function(children) {
   16    -1 				callback(children[1]);
   17    -1 			});
   18    -1 		}
   19    -1 	});
   -1     5 	var folder = await chrome.bookmarks.get('unfiled_____');
   -1     6 	if (!chrome.runtime.lastError) {
   -1     7 		return folder[0];
   -1     8 	} else {
   -1     9 		// In chrome, it the folders are indexed depth-first.
   -1    10 		// So root is 0, "bookmark bar" is 1, "other bookmarks" is 2.
   -1    11 		// However, if you already had bookmarks when ids were introduced,
   -1    12 		// "other bookmarks" may have a higher id.
   -1    13 		//
   -1    14 		// See https://bugs.chromium.org/p/chromium/issues/detail?id=21330
   -1    15 		var children = await chrome.bookmarks.getChildren('0');
   -1    16 		return children[1];
   -1    17 	}
   20    18 };
   21    19 
   22    -1 var ensureFolder = function(callback) {
   23    -1 	getRootFolder(function(root) {
   24    -1 		chrome.bookmarks.getChildren(root.id, function(children) {
   25    -1 			var folder = children.find(child => child.title === FOLDER_TITLE);
   26    -1 			if (!folder) {
   27    -1 				chrome.bookmarks.create({
   28    -1 					parentId: root.id,
   29    -1 					title: FOLDER_TITLE,
   30    -1 				}, callback);
   31    -1 			} else {
   32    -1 				callback(folder);
   33    -1 			}
   -1    20 var ensureFolder = async function() {
   -1    21 	var root = await getRootFolder();
   -1    22 	var children = await chrome.bookmarks.getChildren(root.id);
   -1    23 	var folder = children.find(child => child.title === FOLDER_TITLE);
   -1    24 	if (!folder) {
   -1    25 		return await chrome.bookmarks.create({
   -1    26 			parentId: root.id,
   -1    27 			title: FOLDER_TITLE,
   34    28 		});
   35    -1 	});
   -1    29 	} else {
   -1    30 		return folder;
   -1    31 	}
   36    32 };
   37    33 
   38    -1 var getBookmarks = function(callback) {
   39    -1 	ensureFolder(function(folder) {
   40    -1 		chrome.bookmarks.getChildren(folder.id, callback);
   41    -1 	});
   -1    34 var getBookmarks = async function() {
   -1    35 	var folder = await ensureFolder();
   -1    36 	return await chrome.bookmarks.getChildren(folder.id);
   42    37 };
   43    38 
   44    -1 var updateCount = function(callback) {
   45    -1 	getBookmarks(function(bookmarks) {
   46    -1 		chrome.action.setBadgeText({text: '' + bookmarks.length});
   47    -1 		if (callback) callback();
   48    -1 	});
   -1    39 var updateCount = async function() {
   -1    40 	var bookmarks = await getBookmarks();
   -1    41 	chrome.action.setBadgeText({text: '' + bookmarks.length});
   49    42 };
   50    43 
   51    -1 var popBookmark = function(id, callback) {
   52    -1 	chrome.bookmarks.get(id, function(items) {
   53    -1 		chrome.bookmarks.remove(id, function() {
   54    -1 			updateCount(function() {
   55    -1 				callback(items[0]);
   56    -1 			});
   57    -1 		});
   58    -1 	});
   -1    44 var popBookmark = async function(id) {
   -1    45 	var items = await chrome.bookmarks.get(id);
   -1    46 	await chrome.bookmarks.remove(id);
   -1    47 	await updateCount();
   -1    48 	return items[0];
   59    49 };
   60    50 
   61    -1 var pushBookmark = function(tab, callback) {
   62    -1 	ensureFolder(function(folder) {
   63    -1 		var url = tab.url;
   64    -1 		if (tab.isInReaderMode) {
   65    -1 			var _url = new URL(url);
   66    -1 			var _search = new URLSearchParams(_url.search);
   67    -1 			url = _search.get('url');
   68    -1 		}
   69    -1 		chrome.bookmarks.create({
   70    -1 			parentId: folder.id,
   71    -1 			title: tab.title,
   72    -1 			url: url,
   73    -1 		}, function() {
   74    -1 			updateCount(callback);
   75    -1 		});
   -1    51 var pushBookmark = async function(tab) {
   -1    52 	var folder = await ensureFolder();
   -1    53 	var url = tab.url;
   -1    54 	if (tab.isInReaderMode) {
   -1    55 		var _url = new URL(url);
   -1    56 		var _search = new URLSearchParams(_url.search);
   -1    57 		url = _search.get('url');
   -1    58 	}
   -1    59 	await chrome.bookmarks.create({
   -1    60 		parentId: folder.id,
   -1    61 		title: tab.title,
   -1    62 		url: url,
   76    63 	});
   -1    64 	await updateCount();
   77    65 };

diff --git a/stack.js b/stack.js

@@ -3,7 +3,7 @@ var render = function(element, items) {
    3     3 		element.outerHTML = '<p>No links stored yet.</p>'
    4     4 	} else {
    5     5 		element.innerHTML = '';
    6    -1 		items.forEach(function(item) {
   -1     6 		items.forEach(item => {
    7     7 			var icon = document.createElement('img');
    8     8 			icon.className = 'icon';
    9     9 
@@ -31,14 +31,14 @@ var render = function(element, items) {
   31    31 	}
   32    32 };
   33    33 
   34    -1 getBookmarks(function(bookmarks) {
   -1    34 getBookmarks().then(bookmarks => {
   35    35 	render(document.querySelector('#bookmarks'), bookmarks);
   36    36 });
   37    37 
   38    -1 document.addEventListener('click', function(event) {
   -1    38 document.addEventListener('click', event => {
   39    39 	if (event.target.tagName === 'A') {
   40    40 		event.preventDefault();
   41    -1 		popBookmark(event.target.id, function(bookmark) {
   -1    41 		popBookmark(event.target.id).then(bookmark => {
   42    42 			chrome.tabs.create({url: bookmark.url});
   43    43 		});
   44    44 	}