diff options
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform')
5 files changed, 148 insertions, 357 deletions
diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts index a2b26441b..3c116fab2 100644 --- a/packages/taler-wallet-webextension/src/platform/api.ts +++ b/packages/taler-wallet-webextension/src/platform/api.ts @@ -17,12 +17,10 @@ import { CoreApiResponse, TalerUri, - WalletNotification + WalletNotification, + WalletRunConfig, } from "@gnu-taler/taler-util"; -import { - WalletConfig, - WalletOperations -} from "@gnu-taler/taler-wallet-core"; +import { WalletOperations } from "@gnu-taler/taler-wallet-core"; import { ExtensionOperations, MessageFromExtension, @@ -46,30 +44,48 @@ export interface Permissions { * Compatibility API that works on multiple browsers. */ export interface CrossBrowserPermissionsApi { - containsHostPermissions(): Promise<boolean>; - requestHostPermissions(): Promise<boolean>; - removeHostPermissions(): Promise<boolean>; - containsClipboardPermissions(): Promise<boolean>; requestClipboardPermissions(): Promise<boolean>; removeClipboardPermissions(): Promise<boolean>; +} - addPermissionsListener( - callback: (p: Permissions, lastError?: string) => void, - ): void; +export enum ExtensionNotificationType { + SettingsChange = "settings-change", + ClearNotifications = "clear-notifications", } -export type MessageFromBackend = WalletNotification; +export interface SettingsChangeNotification { + type: ExtensionNotificationType.SettingsChange; + + currentValue: Settings; +} +export interface ClearNotificaitonNotification { + type: ExtensionNotificationType.ClearNotifications; +} + +export type ExtensionNotification = + | SettingsChangeNotification + | ClearNotificaitonNotification; + +export type MessageFromBackend = + | { + type: "wallet"; + notification: WalletNotification; + } + | { + type: "web-extension"; + notification: ExtensionNotification; + }; export type MessageFromFrontend< Op extends BackgroundOperations | WalletOperations | ExtensionOperations, > = Op extends BackgroundOperations ? MessageFromFrontendBackground<keyof BackgroundOperations> : Op extends ExtensionOperations - ? MessageFromExtension<keyof ExtensionOperations> - : Op extends WalletOperations - ? MessageFromFrontendWallet<keyof WalletOperations> - : never; + ? MessageFromExtension<keyof ExtensionOperations> + : Op extends WalletOperations + ? MessageFromFrontendWallet<keyof WalletOperations> + : never; export type MessageFromFrontendBackground< Op extends keyof BackgroundOperations, @@ -92,8 +108,7 @@ export interface WalletWebExVersion { version: string; } -type F = WalletConfig["features"]; -type kf = keyof F; +type F = WalletRunConfig["features"]; type WebexWalletConfig = { [P in keyof F as `wallet${Capitalize<P>}`]: F[P]; }; @@ -101,24 +116,32 @@ type WebexWalletConfig = { export interface Settings extends WebexWalletConfig { injectTalerSupport: boolean; autoOpen: boolean; - advanceMode: boolean; + advancedMode: boolean; backup: boolean; langSelector: boolean; showJsonOnError: boolean; extendedAccountTypes: boolean; + showRefeshTransactions: boolean; suspendIndividualTransaction: boolean; + showExchangeManagement: boolean; + selectTosFormat: boolean; + showWalletActivity: boolean; } export const defaultSettings: Settings = { injectTalerSupport: true, autoOpen: true, - advanceMode: false, + advancedMode: false, backup: false, langSelector: false, + showRefeshTransactions: false, suspendIndividualTransaction: false, showJsonOnError: false, extendedAccountTypes: false, + showExchangeManagement: false, walletAllowHttp: false, + selectTosFormat: false, + showWalletActivity: false, }; /** @@ -208,15 +231,19 @@ export interface BackgroundPlatformAPI { ): void; /** - * Use by the wallet backend to activate the listener of HTTP request + * Change web extension Icon */ - registerTalerHeaderListener(): void; - - containsTalerHeaderListener(): boolean; - + setAlertedIcon(): void; + setNormalIcon(): void; } + export interface ForegroundPlatformAPI { /** + * Check if the extension is running under + * chrome incognito or firefox private mode. + */ + runningOnPrivateMode(): boolean; + /** * FIXME: should not be needed * * check if the platform is firefox @@ -248,7 +275,7 @@ export interface ForegroundPlatformAPI { /** * Open a page and close the popup - * @param url + * @param url */ openNewURLFromPopup(url: URL): void; /** @@ -287,6 +314,12 @@ export interface ForegroundPlatformAPI { ): Promise<MessageResponse>; /** + * Used by the wallet frontend to send notification about new information + * @param message + */ + triggerWalletEvent(message: MessageFromBackend): void; + + /** * Used from the frontend to receive notifications about new information * @param listener * @return function to unsubscribe the listener diff --git a/packages/taler-wallet-webextension/src/platform/background.ts b/packages/taler-wallet-webextension/src/platform/background.ts index 9f3764c25..13808af2b 100644 --- a/packages/taler-wallet-webextension/src/platform/background.ts +++ b/packages/taler-wallet-webextension/src/platform/background.ts @@ -16,7 +16,8 @@ import { BackgroundPlatformAPI } from "./api.js"; -export let platform: BackgroundPlatformAPI = undefined as any; +// it should never be undefined :) +export let platform: BackgroundPlatformAPI = undefined!; export function setupPlatform(impl: BackgroundPlatformAPI): void { platform = impl; } diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts b/packages/taler-wallet-webextension/src/platform/chrome.ts index 20cf54035..e63040f5c 100644 --- a/packages/taler-wallet-webextension/src/platform/chrome.ts +++ b/packages/taler-wallet-webextension/src/platform/chrome.ts @@ -16,11 +16,10 @@ import { Logger, - TalerErrorCode, - TalerUriAction, TalerError, - parseTalerUri, + TalerErrorCode, TalerUri, + TalerUriAction, stringifyTalerUri, } from "@gnu-taler/taler-util"; import { WalletOperations } from "@gnu-taler/taler-wallet-core"; @@ -28,11 +27,11 @@ import { BackgroundOperations } from "../wxApi.js"; import { BackgroundPlatformAPI, CrossBrowserPermissionsApi, + ExtensionNotificationType, ForegroundPlatformAPI, MessageFromBackend, MessageFromFrontend, MessageResponse, - Permissions, Settings, defaultSettings, } from "./api.js"; @@ -43,7 +42,9 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { findTalerUriInActiveTab, findTalerUriInClipboard, getPermissionsApi, + runningOnPrivateMode, getWalletWebExVersion, + triggerWalletEvent, listenToWalletBackground, notifyWhenAppIsReady, openWalletPage, @@ -52,7 +53,7 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { redirectTabToWalletPage, registerAllIncomingConnections, registerOnInstalled, - listenToAllChannels: listenToAllChannels as any, + listenToAllChannels , registerReloadOnNewVersion, sendMessageToAllChannels, openNewURLFromPopup, @@ -60,28 +61,33 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { useServiceWorkerAsBackgroundProcess, keepAlive, listenNetworkConnectionState, - registerTalerHeaderListener, - containsTalerHeaderListener, + setAlertedIcon, + setNormalIcon, }; export default api; const logger = new Logger("chrome.ts"); -async function getSettingsFromStorage(): Promise<Settings> { - const data = await chrome.storage.local.get("wallet-settings"); - if (!data) return defaultSettings; - const settings = data["wallet-settings"]; - if (!settings) return defaultSettings; +const WALLET_STORAGE_KEY = "wallet-settings"; + +function jsonParseOrDefault(unparsed: string, def: unknown) { + if (!unparsed) return def; try { - const parsed = JSON.parse(settings); - return parsed; + return JSON.parse(unparsed); } catch (e) { - return defaultSettings; + return def; } } -function keepAlive(callback: any): void { +async function getSettingsFromStorage(): Promise<Settings> { + const data = await chrome.storage.local.get(WALLET_STORAGE_KEY); + if (!data) return defaultSettings; + const settings = data[WALLET_STORAGE_KEY]; + return jsonParseOrDefault(settings, defaultSettings); +} + +function keepAlive(callback: () => void): void { if (extensionIsManifestV3()) { chrome.alarms.create("wallet-worker", { periodInMinutes: 1 }); @@ -98,9 +104,8 @@ function isFirefox(): boolean { return false; } - export function containsClipboardPermissions(): Promise<boolean> { - return new Promise((res, rej) => { + return new Promise((res) => { res(false); // chrome.permissions.contains({ permissions: ["clipboardRead"] }, (resp) => { // const le = chrome.runtime.lastError?.message; @@ -113,7 +118,7 @@ export function containsClipboardPermissions(): Promise<boolean> { } export async function requestClipboardPermissions(): Promise<boolean> { - return new Promise((res, rej) => { + return new Promise((res) => { res(false); // chrome.permissions.request({ permissions: ["clipboardRead"] }, (resp) => { // const le = chrome.runtime.lastError?.message; @@ -125,10 +130,8 @@ export async function requestClipboardPermissions(): Promise<boolean> { }); } - - export function removeClipboardPermissions(): Promise<boolean> { - return new Promise((res, rej) => { + return new Promise((res) => { res(true); // chrome.permissions.remove({ permissions: ["clipboardRead"] }, (resp) => { // const le = chrome.runtime.lastError?.message; @@ -140,21 +143,8 @@ export function removeClipboardPermissions(): Promise<boolean> { }); } -function addPermissionsListener( - callback: (p: Permissions, lastError?: string) => void, -): void { - chrome.permissions.onAdded.addListener((perm: Permissions) => { - const lastError = chrome.runtime.lastError?.message; - callback(perm, lastError); - }); -} - function getPermissionsApi(): CrossBrowserPermissionsApi { return { - containsHostPermissions, - requestHostPermissions, - removeHostPermissions, - addPermissionsListener, requestClipboardPermissions, removeClipboardPermissions, containsClipboardPermissions, @@ -166,7 +156,7 @@ function getPermissionsApi(): CrossBrowserPermissionsApi { * @param callback function to be called */ function notifyWhenAppIsReady(): Promise<void> { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { if (extensionIsManifestV3()) { resolve(); } else { @@ -205,11 +195,6 @@ function openWalletURIFromPopup(uri: TalerUri): void { `static/wallet.html#/cta/pay?talerUri=${encodeURIComponent(talerUri)}`, ); break; - case TalerUriAction.Reward: - url = chrome.runtime.getURL( - `static/wallet.html#/cta/tip?talerUri=${encodeURIComponent(talerUri)}`, - ); - break; case TalerUriAction.Refund: url = chrome.runtime.getURL( `static/wallet.html#/cta/refund?talerUri=${encodeURIComponent( @@ -238,15 +223,16 @@ function openWalletURIFromPopup(uri: TalerUri): void { )}`, ); break; + case TalerUriAction.AddExchange: + url = chrome.runtime.getURL( + `static/wallet.html#/cta/add/exchange?talerUri=${encodeURIComponent( + talerUri, + )}`, + ); + break; case TalerUriAction.DevExperiment: logger.warn(`taler://dev-experiment URIs are not allowed in headers`); return; - case TalerUriAction.Exchange: - logger.warn(`taler://exchange not yet supported`); - return; - case TalerUriAction.Auditor: - logger.warn(`taler://auditor not yet supported`); - return; default: { const error: never = uri; logger.warn( @@ -271,7 +257,6 @@ function openWalletPageFromPopup(page: string): void { chrome.tabs.create({ active: true, url }, () => { window.close(); }); - } function openNewURLFromPopup(url: URL): void { // const url = chrome.runtime.getURL(`/static/wallet.html#${page}`); @@ -290,14 +275,19 @@ let nextMessageIndex = 0; async function sendMessageToBackground< Op extends WalletOperations | BackgroundOperations, >(message: MessageFromFrontend<Op>): Promise<MessageResponse> { - const messageWithId = { ...message, id: `id_${nextMessageIndex++ % 1000}` }; + nextMessageIndex = (nextMessageIndex + 1) % (Number.MAX_SAFE_INTEGER - 100); + const messageWithId = { ...message, id: `id_${nextMessageIndex}` }; - return new Promise<any>((resolve, reject) => { + return new Promise<MessageResponse>((resolve, reject) => { logger.trace("send operation to the wallet background", message); let timedout = false; const timerId = setTimeout(() => { timedout = true; - reject(TalerError.fromDetail(TalerErrorCode.GENERIC_TIMEOUT, {})); + reject(TalerError.fromDetail(TalerErrorCode.GENERIC_TIMEOUT, { + requestMethod: "wallet", + requestUrl: message.operation, + timeoutMs: 20 * 1000, + })); }, 20 * 1000); chrome.runtime.sendMessage(messageWithId, (backgroundResponse) => { if (timedout) { @@ -319,7 +309,7 @@ async function sendMessageToBackground< * To be used by the foreground */ let notificationPort: chrome.runtime.Port | undefined; -function listenToWalletBackground(listener: (m: any) => void): () => void { +function listenToWalletBackground(listener: (message: MessageFromBackend) => void): () => void { if (notificationPort === undefined) { notificationPort = chrome.runtime.connect({ name: "notifications" }); } @@ -334,6 +324,17 @@ function listenToWalletBackground(listener: (m: any) => void): () => void { const allPorts: chrome.runtime.Port[] = []; +function triggerWalletEvent(message: MessageFromBackend): void { + for (const notif of allPorts) { + // const message: MessageFromBackend = { type: msg.type }; + try { + notif.postMessage(message); + } catch (e) { + logger.error("error posting a message", e); + } + } +} + function sendMessageToAllChannels(message: MessageFromBackend): void { for (const notif of allPorts) { // const message: MessageFromBackend = { type: msg.type }; @@ -363,6 +364,20 @@ function registerAllIncomingConnections(): void { logger.error("error trying to save incoming connection", e); } }); + chrome.storage.onChanged.addListener((event) => { + if (event[WALLET_STORAGE_KEY]) { + sendMessageToAllChannels({ + type: "web-extension", + notification: { + type: ExtensionNotificationType.SettingsChange, + currentValue: jsonParseOrDefault( + event[WALLET_STORAGE_KEY].newValue, + defaultSettings, + ), + }, + }); + } + }); } function listenToAllChannels( @@ -402,14 +417,17 @@ function registerReloadOnNewVersion(): void { }); } -async function redirectCurrentTabToWalletPage(page: string): Promise<void> { - let queryOptions = { active: true, lastFocusedWindow: true }; - let [tab] = await chrome.tabs.query(queryOptions); +// async function redirectCurrentTabToWalletPage(page: string): Promise<void> { +// let queryOptions = { active: true, lastFocusedWindow: true }; +// let [tab] = await chrome.tabs.query(queryOptions); - return redirectTabToWalletPage(tab.id!, page); -} +// return redirectTabToWalletPage(tab.id!, page); +// } -async function redirectTabToWalletPage(tabId: number, page: string): Promise<void> { +async function redirectTabToWalletPage( + tabId: number, + page: string, +): Promise<void> { const url = chrome.runtime.getURL(`/static/wallet.html#${page}`); logger.trace("redirecting tabId: ", tabId, " to: ", url); await chrome.tabs.update(tabId, { url }); @@ -650,7 +668,7 @@ async function findTalerUriInTab(tabId: number): Promise<string | undefined> { return; } } else { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { //manifest v2 chrome.tabs.executeScript( tabId, @@ -676,9 +694,9 @@ async function findTalerUriInTab(tabId: number): Promise<string | undefined> { } } -async function timeout(ms: number): Promise<void> { - return new Promise((resolve) => setTimeout(resolve, ms)); -} +// async function timeout(ms: number): Promise<void> { +// return new Promise((resolve) => setTimeout(resolve, ms)); +// } async function findTalerUriInClipboard(): Promise<string | undefined> { //FIXME: add clipboard feature // try { @@ -723,253 +741,6 @@ function listenNetworkConnectionState( }; } -type HeaderListenerFunc = ( - details: chrome.webRequest.WebResponseHeadersDetails, -) => void; -let currentHeaderListener: HeaderListenerFunc | undefined = undefined; - -// type TabListenerFunc = (tabId: number, info: chrome.tabs.TabChangeInfo) => void; -// let currentTabListener: TabListenerFunc | undefined = undefined; - - -function containsTalerHeaderListener(): boolean { - return ( - currentHeaderListener !== undefined - // || currentTabListener !== undefined - ); +function runningOnPrivateMode(): boolean { + return chrome.extension.inIncognitoContext; } - -function headerListener( - details: chrome.webRequest.WebResponseHeadersDetails, -): chrome.webRequest.BlockingResponse | undefined { - logger.info("header listener run", details.statusCode, chrome.runtime.lastError) - if (chrome.runtime.lastError) { - logger.error(JSON.stringify(chrome.runtime.lastError)); - return; - } - - if ( - details.statusCode === 402 || - details.statusCode === 202 || - details.statusCode === 200 - ) { - const values = (details.responseHeaders || []) - .filter((h) => h.name.toLowerCase() === "taler") - .map((h) => h.value) - .filter((value): value is string => !!value); - - const talerUri = values.length > 0 ? values[0] : undefined - if (talerUri) { - logger.info( - `Found a Taler URI in a response header for the request ${details.url} from tab ${details.tabId}: ${talerUri}`, - ); - parseTalerUriAndRedirect(details.tabId, talerUri); - return; - } - } - return details; -} -function parseTalerUriAndRedirect(tabId: number, maybeTalerUri: string): void { - const talerUri = maybeTalerUri.startsWith("ext+") - ? maybeTalerUri.substring(4) - : maybeTalerUri; - const uri = parseTalerUri(talerUri); - if (!uri) { - logger.warn( - `Response with HTTP 402 the Taler header but could not classify ${talerUri}`, - ); - return; - } - redirectTabToWalletPage( - tabId, - `/taler-uri/${encodeURIComponent(talerUri)}`, - ); -} - -/** - * Not needed anymore since SPA use taler support - */ - -// async function tabListener( -// tabId: number, -// info: chrome.tabs.TabChangeInfo, -// ): Promise<void> { -// if (tabId < 0) return; -// const tabLocationHasBeenUpdated = info.status === "complete"; -// const tabTitleHasBeenUpdated = info.title !== undefined; -// if (tabLocationHasBeenUpdated || tabTitleHasBeenUpdated) { -// const uri = await findTalerUriInTab(tabId); -// if (!uri) return; -// logger.info(`Found a Taler URI in the tab ${tabId}`); -// parseTalerUriAndRedirect(tabId, uri); -// } -// } - -/** - * unused, declarative redirect is not good enough - * - */ -// async function registerDeclarativeRedirect() { -// await chrome.declarativeNetRequest.updateDynamicRules({ -// removeRuleIds: [1], -// addRules: [ -// { -// id: 1, -// priority: 1, -// condition: { -// urlFilter: "https://developer.chrome.com/docs/extensions/mv2/", -// regexFilter: ".*taler_uri=([^&]*).*", -// // isUrlFilterCaseSensitive: false, -// // requestMethods: [chrome.declarativeNetRequest.RequestMethod.GET] -// // resourceTypes: [chrome.declarativeNetRequest.ResourceType.MAIN_FRAME], -// }, -// action: { -// type: chrome.declarativeNetRequest.RuleActionType.REDIRECT, -// redirect: { -// regexSubstitution: `chrome-extension://${chrome.runtime.id}/static/wallet.html?action=\\1`, -// }, -// }, -// }, -// ], -// }); -// } - -function registerTalerHeaderListener(): void { - logger.info("setting up header listener"); - - const prevHeaderListener = currentHeaderListener; - // const prevTabListener = currentTabListener; - - if ( - prevHeaderListener && - chrome?.webRequest?.onHeadersReceived?.hasListener(prevHeaderListener) - ) { - return; - // console.log("removming on header listener") - // chrome.webRequest.onHeadersReceived.removeListener(prevHeaderListener); - // chrome.webRequest.onCompleted.removeListener(prevHeaderListener); - // chrome.webRequest.onResponseStarted.removeListener(prevHeaderListener); - // chrome.webRequest.onErrorOccurred.removeListener(prevHeaderListener); - } - - // if ( - // prevTabListener && - // chrome?.tabs?.onUpdated?.hasListener(prevTabListener) - // ) { - // console.log("removming on tab listener") - // chrome.tabs.onUpdated.removeListener(prevTabListener); - // } - - console.log("headers on, disabled:", chrome?.webRequest?.onHeadersReceived === undefined) - if (chrome?.webRequest) { - if (extensionIsManifestV3()) { - chrome.webRequest.onHeadersReceived.addListener(headerListener, - { urls: ["<all_urls>"] }, - ["responseHeaders"] - ); - } else { - chrome.webRequest.onHeadersReceived.addListener(headerListener, - { urls: ["<all_urls>"] }, - ["responseHeaders"] - ); - } - // chrome.webRequest.onCompleted.addListener(headerListener, - // { urls: ["<all_urls>"] }, - // ["responseHeaders", "extraHeaders"] - // ); - // chrome.webRequest.onResponseStarted.addListener(headerListener, - // { urls: ["<all_urls>"] }, - // ["responseHeaders", "extraHeaders"] - // ); - // chrome.webRequest.onErrorOccurred.addListener(headerListener, - // { urls: ["<all_urls>"] }, - // ["extraHeaders"] - // ); - currentHeaderListener = headerListener; - } - - // const tabsEvent: chrome.tabs.TabUpdatedEvent | undefined = - // chrome?.tabs?.onUpdated; - // if (tabsEvent) { - // tabsEvent.addListener(tabListener); - // currentTabListener = tabListener; - // } - - //notify the browser about this change, this operation is expensive - chrome?.webRequest?.handlerBehaviorChanged(() => { - if (chrome.runtime.lastError) { - logger.error(JSON.stringify(chrome.runtime.lastError)); - } - }); -} - -const hostPermissions = { - permissions: ["webRequest"], - origins: ["http://*/*", "https://*/*"], -}; - -export function containsHostPermissions(): Promise<boolean> { - return new Promise((res, rej) => { - chrome.permissions.contains(hostPermissions, (resp) => { - const le = chrome.runtime.lastError?.message; - if (le) { - rej(le); - } - res(resp); - }); - }); -} - -export async function requestHostPermissions(): Promise<boolean> { - return new Promise((res, rej) => { - chrome.permissions.request(hostPermissions, (resp) => { - const le = chrome.runtime.lastError?.message; - if (le) { - rej(le); - } - res(resp); - }); - }); -} - -export async function removeHostPermissions(): Promise<boolean> { - //if there is a handler already, remove it - if ( - currentHeaderListener && - chrome?.webRequest?.onHeadersReceived?.hasListener(currentHeaderListener) - ) { - chrome.webRequest.onHeadersReceived.removeListener(currentHeaderListener); - } - // if ( - // currentTabListener && - // chrome?.tabs?.onUpdated?.hasListener(currentTabListener) - // ) { - // chrome.tabs.onUpdated.removeListener(currentTabListener); - // } - - currentHeaderListener = undefined; - // currentTabListener = undefined; - - //notify the browser about this change, this operation is expensive - if ("webRequest" in chrome) { - chrome.webRequest.handlerBehaviorChanged(() => { - if (chrome.runtime.lastError) { - logger.error(JSON.stringify(chrome.runtime.lastError)); - } - }); - } - - if (extensionIsManifestV3()) { - // Trying to remove host permissions with manifest >= v3 throws an error - return true; - } - return new Promise((res, rej) => { - chrome.permissions.remove(hostPermissions, (resp) => { - const le = chrome.runtime.lastError?.message; - if (le) { - rej(le); - } - res(resp); - }); - }); -}
\ No newline at end of file diff --git a/packages/taler-wallet-webextension/src/platform/dev.ts b/packages/taler-wallet-webextension/src/platform/dev.ts index 51744e318..d6e743147 100644 --- a/packages/taler-wallet-webextension/src/platform/dev.ts +++ b/packages/taler-wallet-webextension/src/platform/dev.ts @@ -29,6 +29,7 @@ import { const logger = new Logger("dev.ts"); const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { + runningOnPrivateMode: () => false, isFirefox: () => false, getSettingsFromStorage: () => Promise.resolve(defaultSettings), keepAlive: (cb: VoidFunction) => cb(), @@ -36,19 +37,15 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { findTalerUriInClipboard: async () => undefined, listenNetworkConnectionState, openNewURLFromPopup: () => undefined, + triggerWalletEvent: () => undefined, + setAlertedIcon: () => undefined, + setNormalIcon : () => undefined, getPermissionsApi: () => ({ - addPermissionsListener: () => undefined, - containsHostPermissions: async () => true, - removeHostPermissions: async () => false, - requestHostPermissions: async () => false, containsClipboardPermissions: async () => true, removeClipboardPermissions: async () => false, requestClipboardPermissions: async () => false, }), - // registerDeclarativeRedirect: () => false, - registerTalerHeaderListener: () => false, - containsTalerHeaderListener: () => false, getWalletWebExVersion: () => ({ version: "none", }), diff --git a/packages/taler-wallet-webextension/src/platform/firefox.ts b/packages/taler-wallet-webextension/src/platform/firefox.ts index 0bbe805cf..3d67423fd 100644 --- a/packages/taler-wallet-webextension/src/platform/firefox.ts +++ b/packages/taler-wallet-webextension/src/platform/firefox.ts @@ -26,9 +26,6 @@ import chromePlatform, { containsClipboardPermissions as chromeClipContains, removeClipboardPermissions as chromeClipRemove, requestClipboardPermissions as chromeClipRequest, - containsHostPermissions as chromeHostContains, - requestHostPermissions as chromeHostRequest, - removeHostPermissions as chromeHostRemove, } from "./chrome.js"; const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { @@ -47,16 +44,8 @@ function isFirefox(): boolean { return true; } -function addPermissionsListener(callback: (p: Permissions) => void): void { - // throw Error("addPermissionListener is not supported for Firefox"); -} - function getPermissionsApi(): CrossBrowserPermissionsApi { return { - addPermissionsListener, - containsHostPermissions: chromeHostContains, - requestHostPermissions: chromeHostRequest, - removeHostPermissions: chromeHostRemove, containsClipboardPermissions: chromeClipContains, removeClipboardPermissions: chromeClipRemove, requestClipboardPermissions: chromeClipRequest, |