Skip to content

Commit

Permalink
extension: more compatilibity towards v3 manifest
Browse files Browse the repository at this point in the history
  • Loading branch information
karlicoss committed May 29, 2024
1 parent ad4c3b5 commit 3dcd74d
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 22 deletions.
20 changes: 14 additions & 6 deletions extension/src/background.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -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<Action> {
// 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<Action> = [browser.browserAction]

// manifest v2 doesn't have browser.action
const res: Array<Action> = [browser.action ? browser.action : browser.browserAction]

// need to be defensive, it's only for mobile firefox
if (browser.pageAction) {
Expand Down Expand Up @@ -518,7 +519,7 @@ browser.webNavigation.onCompleted.addListener(defensify(async (detail: WebNaviga
}
throw error
}
}, 'webNavigation.onCompleteed'))
}, 'webNavigation.onCompleted'))


export async function getActiveTab(): Promise<TabUrl | null> {
Expand Down Expand Up @@ -851,7 +852,6 @@ ${surl}



const DEFAULT_CONTEXTS: Array<Menus.ContextType> = ['page', 'browser_action']
type MenuEntry = {
id: string,
title: string,
Expand Down Expand Up @@ -942,6 +942,11 @@ function initContextMenus(): void {
return
}

const DEFAULT_CONTEXTS: Array<Menus.ContextType> = [
'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
Expand Down Expand Up @@ -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()
}
Expand Down
1 change: 1 addition & 0 deletions extension/src/selenium_bridge.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
2 changes: 1 addition & 1 deletion extension/src/showvisited.js
Original file line number Diff line number Diff line change
Expand Up @@ -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?)
}
Expand Down
21 changes: 20 additions & 1 deletion tests/addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down Expand Up @@ -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)
Expand Down
14 changes: 0 additions & 14 deletions tests/webdriver_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down

0 comments on commit 3dcd74d

Please sign in to comment.