diff --git a/extension/src/background.ts b/extension/src/background.ts index 29b0aace..99036a35 100644 --- a/extension/src/background.ts +++ b/extension/src/background.ts @@ -1,6 +1,6 @@ // import * as browser from "webextension-polyfill" import browser from "webextension-polyfill" -import type {BrowserAction, Menus, PageAction, Runtime, Tabs, WebNavigation} from "webextension-polyfill" +import type {Action, BrowserAction, Menus, PageAction, Runtime, Tabs, WebNavigation} from "webextension-polyfill" import type {Url, SearchPageParams} from './common' import {Visit, Visits, Blacklisted, Methods, assert, uuid} from './common' @@ -17,15 +17,16 @@ const UUID = uuid() console.info('[promnesia]: running background page with UUID %s', UUID) -type Action = BrowserAction.Static | PageAction.Static +type Action = Action.Static | BrowserAction.Static | PageAction.Static function actions(): Array { // eh, on mobile neither pageAction nor browserAction have setIcon // but we can use pageAction to show at least some (default) icon in some circumstances - // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Differences_between_desktop_and_Android#User_interface - const res: Array = [browser.browserAction] + + // manifest v2 doesn't have browser.action + const res: Array = [browser.action ? browser.action : browser.browserAction] // need to be defensive, it's only for mobile firefox if (browser.pageAction) { @@ -518,7 +519,7 @@ browser.webNavigation.onCompleted.addListener(defensify(async (detail: WebNaviga } throw error } -}, 'webNavigation.onCompleteed')) +}, 'webNavigation.onCompleted')) export async function getActiveTab(): Promise { @@ -851,7 +852,6 @@ ${surl} -const DEFAULT_CONTEXTS: Array = ['page', 'browser_action'] type MenuEntry = { id: string, title: string, @@ -942,6 +942,11 @@ function initContextMenus(): void { return } + const DEFAULT_CONTEXTS: Array = [ + 'page', + browser.action ? 'action' : 'browser_action', // support both mv2 and mv3 + ] + /* Normally, you'd create context menu in chrome.runtime.onInstalled, since browser remembers context menu items in between installs. see https://stackoverflow.com/a/19578984/706389 @@ -1032,6 +1037,9 @@ function initBackground(): void { browser.runtime.onMessage.addListener((info: any, _: Runtime.MessageSender) => { // see selenium_bridge.js + if (info === 'selenium-bridge-_execute_action') { + handleToggleSidebar() + } if (info === 'selenium-bridge-_execute_browser_action') { handleToggleSidebar() } diff --git a/extension/src/selenium_bridge.js b/extension/src/selenium_bridge.js index d9f78871..99c4846c 100644 --- a/extension/src/selenium_bridge.js +++ b/extension/src/selenium_bridge.js @@ -2,6 +2,7 @@ // hack to hook into the extension... https://stackoverflow.com/a/38554438/706389 for (const x of [ + 'selenium-bridge-_execute_action', 'selenium-bridge-_execute_browser_action', 'selenium-bridge-mark_visited', 'selenium-bridge-search', diff --git a/extension/src/showvisited.js b/extension/src/showvisited.js index 44c97fea..5e8966ef 100644 --- a/extension/src/showvisited.js +++ b/extension/src/showvisited.js @@ -121,7 +121,7 @@ function showMark(element) { const url = element.href // 'visited' passed in backgroud.js // eslint-disable-next-line no-undef - const v = visited.get(url) + const v = window.visited.get(url) if (!v) { return // no visits or was excluded (add some data attribute maybe?) } diff --git a/tests/addon.py b/tests/addon.py index 33a5bc3c..89b21216 100644 --- a/tests/addon.py +++ b/tests/addon.py @@ -51,6 +51,7 @@ def get_addon_source(kind: str) -> Path: class Command: # TODO assert these against manifest? ACTIVATE = '_execute_browser_action' + ACTIVATE_V3 = '_execute_action' MARK_VISITED = 'mark_visited' SEARCH = 'search' @@ -290,11 +291,29 @@ def open_search_page(self, query: str = "") -> None: @property def sidebar(self) -> Sidebar: + driver = self.helper.driver + if driver.name == 'chrome': + browser_version = tuple(map(int, driver.capabilities['browserVersion'].split('.'))) + driver_version = tuple(map(int, driver.capabilities['chrome']['chromedriverVersion'].split(' ')[0].split('.'))) + last_working = (113, 0, 5623, 0) + if browser_version > last_working or driver_version > last_working: + # NOTE: feel free to comment this out if necessary, it's just to avoid hours of debugging + raise RuntimeError( + f""" +NOTE: you're using chrome {browser_version} with chromedriver {driver_version}. +Some tests aren't working with recent Chrome versions (later than {last_working}) due to regressions in chromedriver. +See https://bugs.chromium.org/p/chromedriver/issues/detail?id=4440 +""" + ) return Sidebar(addon=self) def activate(self) -> None: # TODO the activate command could be extracted from manifest too? - self.helper.trigger_command(Command.ACTIVATE) + cmd = { + 2: Command.ACTIVATE, + 3: Command.ACTIVATE_V3, # meh + }[self.helper.manifest_version] + self.helper.trigger_command(cmd) def mark_visited(self) -> None: self.helper.trigger_command(Command.MARK_VISITED) diff --git a/tests/webdriver_utils.py b/tests/webdriver_utils.py index 08af3040..44ece3cf 100644 --- a/tests/webdriver_utils.py +++ b/tests/webdriver_utils.py @@ -141,20 +141,6 @@ def get_webdriver( version_data['chromedriverVersion'] = driver.capabilities['chrome']['chromedriverVersion'] version_data['userDataDir'] = driver.capabilities['chrome']['userDataDir'] version_data['driver_path'] = getattr(driver.service, '_path') - - browser_version = tuple(map(int, version_data['browserVersion'].split('.'))) - driver_version = tuple(map(int, version_data['chromedriverVersion'].split(' ')[0].split('.'))) - last_working = (113, 0, 5623, 0) - if browser_version > last_working or driver_version > last_working: - # NOTE: feel free to comment this out if necessary, it's just to avoid hours of debugging - raise RuntimeError( - f""" -NOTE: you're using chrome {version_data}. -Some tests aren't working with recent Chrome versions (later than {last_working}) due to regressions in chromedriver. -See https://bugs.chromium.org/p/chromedriver/issues/detail?id=4440 -""" - ) - else: raise RuntimeError(f'Unexpected browser {browser}') version_string = ' '.join(f'{k}={v}' for k, v in version_data.items())