diff --git a/CHANGELOG.md b/CHANGELOG.md index b830881..0da8bf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [unreleased] +## [v1.11.0] + +- **IMPROVED**: Firefox build is now using the browser extension Manifest v3, like Chrome or Edge. +- **REMOVED**: Removed special build for Firefox, using Manifest v2. +- **REMOVED**: Removed special build for Opera (they did not apply updates to the extension in their store anyway). + ## [v1.10.4] - **IMPROVED**: Performance of initial load diff --git a/README.md b/README.md index 03b1bcb..19c3cee 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ ## Installation via Store - [Chrome Extension](https://chrome.google.com/webstore/detail/tabs-bookmark-and-history/cofpegcepiccpobikjoddpmmocficdjj?hl=en-GB&authuser=0) -- [Firefox Addon](https://addons.mozilla.org/en-US/firefox/addon/search-tabs-bookmarks-history/) - [Microsoft Edge Addon](https://microsoftedge.microsoft.com/addons/detail/search-tabs-bookmarks-an/ldmbegkendnchhjppahaadhhakgfbfpo) -- [Opera Addon](https://addons.opera.com/en/extensions/details/search-bookmarks-history-and-tabs/) +- [Firefox Addon](https://addons.mozilla.org/en-US/firefox/addon/search-tabs-bookmarks-history/) +- [Opera Addon](https://addons.opera.com/en/extensions/details/search-bookmarks-history-and-tabs/) (only an old version) ## Features @@ -175,7 +175,7 @@ This extension is built to respect your privacy: ### Install and Build -Prerequisite: [Node.js](https://nodejs.org/en/) +Prerequisite: [Node.js](https://nodejs.org/en/) and use of bash shell. ```sh # install dependencies @@ -187,11 +187,7 @@ npm run build The source code for the extension can be found in [popup/](popup/) (HTML, CSS, JS and libs). -The built extensions can be found - -- [dist/chrome/](dist/chrome/) for Google Chrome and Microsoft Edge -- [dist/firefox/](dist/firefox/) for Firefox -- [dist/opera/](dist/firefox/) for Opera +The built extensions can be found in [dist/chrome/](dist/chrome/). ### Developer Installation diff --git a/bin/createDist.sh b/bin/createDist.sh index 40a753e..2cf1743 100644 --- a/bin/createDist.sh +++ b/bin/createDist.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash # This shell script compiles, minifies and copies the necessary files # to the dist/chrome/ folder for publishing purposes. @@ -20,28 +21,11 @@ cp -r popup/ dist/chrome/popup/ # Remove mock data rm -rf dist/chrome/popup/mockData -## FIREFOX ################### - -cp -r dist/chrome dist/firefox -cp manifest.firefox.json dist/firefox/manifest.json -cp README.md dist/firefox/README.md - -## FIREFOX ################### - -cp -r dist/firefox dist/opera -sed -i -e 's/Period/K/g' dist/opera/manifest.json - # Zip dist files for upload to browser stores if hash 7z 2>/dev/null; then cd ./dist/chrome/ 7z a ../chrome.zip ./* -r - - cd ../firefox - 7z a ../firefox.zip ./* -r - - cd ../opera - 7z a ../opera.zip ./* -r else echo "7z could not be found" fi diff --git a/bin/updateLibs.sh b/bin/updateLibs.sh index 2a42431..83e3487 100644 --- a/bin/updateLibs.sh +++ b/bin/updateLibs.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash rm -rf popup/lib mkdir popup/lib diff --git a/bin/updateManifests.js b/bin/updateManifests.js index b6fc437..f8d61a5 100644 --- a/bin/updateManifests.js +++ b/bin/updateManifests.js @@ -3,12 +3,9 @@ import fs from 'fs' const packageJson = JSON.parse(fs.readFileSync('package.json').toString()) const manifestJson = JSON.parse(fs.readFileSync('manifest.json').toString()) -const manifestFirefoxJson = JSON.parse(fs.readFileSync('manifest.firefox.json').toString()) console.log('Updating Manifests with version v' + packageJson.version) manifestJson.version = packageJson.version -manifestFirefoxJson.version = packageJson.version fs.writeFileSync('manifest.json', JSON.stringify(manifestJson, null, 2)) -fs.writeFileSync('manifest.firefox.json', JSON.stringify(manifestFirefoxJson, null, 2)) diff --git a/manifest.firefox.json b/manifest.firefox.json deleted file mode 100644 index c9b0221..0000000 --- a/manifest.firefox.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Search Bookmarks, History and Tabs", - "description": "Browser extension to (fuzzy) search and navigate bookmarks, history and open tabs.", - "homepage_url": "https://github.com/Fannon/search-bookmarks-history-and-tabs", - "author": "Simon Heimler", - "version": "1.10.4", - "manifest_version": 2, - "applications": { - "gecko": { - "id": "{bd5cec91-8853-40d9-aa80-8388a4544bd3}", - "strict_min_version": "75.0" - } - }, - "permissions": [ - "tabs", - "bookmarks", - "history", - "storage" - ], - "browser_action": { - "default_icon": { - "16": "/images/logo-16.png", - "32": "/images/logo-32.png", - "48": "/images/logo-48.png", - "128": "/images/logo-128.png" - }, - "default_popup": "/popup/index.html" - }, - "commands": { - "_execute_browser_action": { - "suggested_key": { - "default": "Ctrl+Shift+Period", - "mac": "Command+Shift+Period" - }, - "description": "Open search popup" - } - }, - "icons": { - "16": "/images/logo-16.png", - "32": "/images/logo-32.png", - "48": "/images/logo-48.png", - "128": "/images/logo-128.png" - } -} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 051b19d..f2fec12 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { + "manifest_version": 3, "name": "Search Bookmarks, History and Tabs", "description": "Browser extension to (fuzzy) search and navigate bookmarks, history and open tabs.", "homepage_url": "https://github.com/Fannon/search-bookmarks-history-and-tabs", "author": "Simon Heimler", - "version": "1.10.4", - "manifest_version": 3, + "version": "1.11.0", "permissions": [ "tabs", "bookmarks", @@ -34,5 +34,11 @@ "32": "/images/logo-32.png", "48": "/images/logo-48.png", "128": "/images/logo-128.png" + }, + "browser_specific_settings": { + "gecko": { + "id": "{9aa67c59-afc3-41c2-9879-545397b91786}", + "strict_min_version": "126.0" + } } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c4140d2..dff52e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "search-bookmarks-history-and-tabs", - "version": "1.10.4", + "version": "1.10.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "search-bookmarks-history-and-tabs", - "version": "1.10.4", + "version": "1.10.5", "license": "MIT", "dependencies": { "@leeoniya/ufuzzy": "^1.0.18", @@ -15,11 +15,11 @@ "mark.js": "^8.11.1" }, "devDependencies": { - "cypress": "^13.17.0", + "cypress": "^14.0.0", "cypress-fail-on-console-error": "^5.1.1", "eslint": "^9.18.0", "eslint-plugin-cypress": "^4.1.0", - "fs-extra": "^11.2.0", + "fs-extra": "^11.3.0", "live-server": "^1.2.2" } }, @@ -1318,9 +1318,9 @@ } }, "node_modules/cypress": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz", - "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.0.0.tgz", + "integrity": "sha512-kEGqQr23so5IpKeg/dp6GVi7RlHx1NmW66o2a2Q4wk9gRaAblLZQSiZJuDI8UMC4LlG5OJ7Q6joAiqTrfRNbTw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1373,7 +1373,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" } }, "node_modules/cypress-fail-on-console-error": { @@ -2347,10 +2347,11 @@ "dev": true }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6793,9 +6794,9 @@ } }, "cypress": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz", - "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.0.0.tgz", + "integrity": "sha512-kEGqQr23so5IpKeg/dp6GVi7RlHx1NmW66o2a2Q4wk9gRaAblLZQSiZJuDI8UMC4LlG5OJ7Q6joAiqTrfRNbTw==", "dev": true, "requires": { "@cypress/request": "^3.0.6", @@ -7582,9 +7583,9 @@ "dev": true }, "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "requires": { "graceful-fs": "^4.2.0", diff --git a/package.json b/package.json index 1f9833c..08b9d09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "search-bookmarks-history-and-tabs", - "version": "1.10.4", + "version": "1.11.0", "description": "Browser extension to (fuzzy) search and navigate bookmarks, history and open tabs.", "main": "index.js", "type": "module", @@ -11,18 +11,18 @@ "mark.js": "^8.11.1" }, "devDependencies": { - "cypress": "^13.17.0", + "cypress": "^14.0.0", "cypress-fail-on-console-error": "^5.1.1", "eslint": "^9.18.0", "eslint-plugin-cypress": "^4.1.0", - "fs-extra": "^11.2.0", + "fs-extra": "^11.3.0", "live-server": "^1.2.2" }, "scripts": { "clean": "node bin/clean.js", "build": "npm run clean && npm run update-libs && npm run update-manifests && npm run create-dist && npm run size", - "update-libs": "sh bin/updateLibs.sh", - "create-dist": "sh bin/createDist.sh", + "update-libs": "bash bin/updateLibs.sh", + "create-dist": "bash bin/createDist.sh", "update-manifests": "node bin/updateManifests.js", "test": "npm run e2e", "e2e": "cypress run --config-file=cypress.config.mjs --spec 'cypress/e2e/**/*'", diff --git a/popup/css/style.css b/popup/css/style.css index 71da8da..8cc35ad 100644 --- a/popup/css/style.css +++ b/popup/css/style.css @@ -326,7 +326,7 @@ li.error { } #edit-bookmark { padding: 0; - overflow: none; + overflow: hidden; position: fixed; top: 0; left: 0; diff --git a/popup/js/helper/browserApi.js b/popup/js/helper/browserApi.js index 3f6eb19..fc108b2 100644 --- a/popup/js/helper/browserApi.js +++ b/popup/js/helper/browserApi.js @@ -1,26 +1,17 @@ import { cleanUpUrl } from './utils.js' -// Location of browser API. This is `browser` for firefox, and `chrome` for Chrome, Edge and Opera. -export const browserApi = window.browser || window.chrome || {} +export const browserApi = window.chrome || window.browser || {} -export async function getBrowserTabs(queryOptions) { - queryOptions = queryOptions || {} +export async function getBrowserTabs(queryOptions = {}) { if (ext.opts.tabsOnlyCurrentWindow) { queryOptions.currentWindow = true } - return new Promise((resolve, reject) => { - if (browserApi.tabs) { - browserApi.tabs.query(queryOptions, (tabs, err) => { - if (err) { - return reject(err) - } - return resolve(tabs) - }) - } else { - console.warn(`No browser tab API found. Returning no results.`) - return resolve([]) - } - }) + if (browserApi.tabs) { + return await browserApi.tabs.query(queryOptions) + } else { + console.warn(`No browser tab API found. Returning no results.`) + return [] + } } export function convertBrowserTabs(chromeTabs) { @@ -41,19 +32,12 @@ export function convertBrowserTabs(chromeTabs) { } export async function getBrowserBookmarks() { - return new Promise((resolve, reject) => { - if (browserApi.bookmarks && browserApi.bookmarks.getTree) { - browserApi.bookmarks.getTree((bookmarks, err) => { - if (err) { - return reject(err) - } - return resolve(bookmarks) - }) - } else { - console.warn(`No browser bookmark API found. Returning no results.`) - return resolve([]) - } - }) + if (browserApi.bookmarks && browserApi.bookmarks.getTree) { + return browserApi.bookmarks.getTree() + } else { + console.warn(`No browser bookmark API found. Returning no results.`) + return [] + } } /** @@ -164,27 +148,16 @@ export function convertBrowserBookmarks(bookmarks, folderTrail, depth) { * Warning: This chrome API call tends to be rather slow */ export async function getBrowserHistory(startTime, maxResults) { - return new Promise((resolve, reject) => { - if (browserApi.history) { - browserApi.history.search( - { - text: '', - maxResults: maxResults, - startTime: startTime, - endTime: Date.now(), - }, - (history, err) => { - if (err) { - return reject(err) - } - return resolve(history) - }, - ) - } else { - console.warn(`No browser history API found. Returning no results.`) - return [] - } - }) + if (browserApi.history) { + return await browserApi.history.search({ + text: '', + startTime: startTime, + maxResults: maxResults, + }) + } else { + console.warn(`No browser history API found. Returning no results.`) + return [] + } } /** diff --git a/popup/js/model/searchData.js b/popup/js/model/searchData.js index 347495a..c3c522a 100644 --- a/popup/js/model/searchData.js +++ b/popup/js/model/searchData.js @@ -83,9 +83,11 @@ export async function getSearchData() { const browserHistory = [] const idMap = {} for (const item of historyFromApi.concat(historyC)) { - if (item && item.id & !idMap[item.id]) { + if (item && item.url && !idMap[item.url]) { browserHistory.push(item) - idMap[item.id] = true + idMap[item.url] = true + } else { + console.warn('Invalid history item', item) } }