gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (1b059638 -> 5e7be586)


From: gnunet
Subject: [taler-wallet-core] branch master updated (1b059638 -> 5e7be586)
Date: Fri, 29 Apr 2022 20:49:29 +0200

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a change to branch master
in repository wallet-core.

    from 1b059638 bump manifest version (really this time)
     new a1ad9727 alert icon
     new 038dcbc9 fix #5845 added run-gc on webex
     new 5e7be586 fix: 6964

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 packages/taler-wallet-core/src/db.ts               |  26 +--
 .../taler-wallet-webextension/manifest-v2.json     |   8 +-
 .../taler-wallet-webextension/manifest-v3.json     |   3 +-
 .../src/platform/chrome.ts                         | 244 +++++++++++++++++----
 .../src/wallet/DeveloperPage.tsx                   |  17 +-
 packages/taler-wallet-webextension/src/wxApi.ts    |   8 +
 .../taler-wallet-webextension/src/wxBackend.ts     |  14 ++
 .../static/img/taler-alert-128.png                 | Bin 0 -> 8944 bytes
 .../static/img/taler-alert-16.png                  | Bin 0 -> 772 bytes
 .../static/img/taler-alert-19.png                  | Bin 0 -> 963 bytes
 .../static/img/taler-alert-256.png                 | Bin 0 -> 18874 bytes
 .../static/img/taler-alert-32.png                  | Bin 0 -> 1796 bytes
 .../static/img/taler-alert-38.png                  | Bin 0 -> 2148 bytes
 .../static/img/taler-alert-48.png                  | Bin 0 -> 2811 bytes
 .../static/img/taler-alert-512.png                 | Bin 0 -> 40380 bytes
 .../static/img/taler-alert-64.png                  | Bin 0 -> 4137 bytes
 16 files changed, 257 insertions(+), 63 deletions(-)
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-128.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-16.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-19.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-256.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-32.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-38.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-48.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-512.png
 create mode 100644 
packages/taler-wallet-webextension/static/img/taler-alert-64.png

diff --git a/packages/taler-wallet-core/src/db.ts 
b/packages/taler-wallet-core/src/db.ts
index 0a1b40d2..e8c46c7e 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -1303,9 +1303,9 @@ export const WALLET_BACKUP_STATE_KEY = 
"walletBackupState";
  */
 export type ConfigRecord =
   | {
-      key: typeof WALLET_BACKUP_STATE_KEY;
-      value: WalletBackupConfState;
-    }
+    key: typeof WALLET_BACKUP_STATE_KEY;
+    value: WalletBackupConfState;
+  }
   | { key: "currencyDefaultsApplied"; value: boolean };
 
 export interface WalletBackupConfState {
@@ -1491,17 +1491,17 @@ export enum BackupProviderStateTag {
 
 export type BackupProviderState =
   | {
-      tag: BackupProviderStateTag.Provisional;
-    }
+    tag: BackupProviderStateTag.Provisional;
+  }
   | {
-      tag: BackupProviderStateTag.Ready;
-      nextBackupTimestamp: TalerProtocolTimestamp;
-    }
+    tag: BackupProviderStateTag.Ready;
+    nextBackupTimestamp: TalerProtocolTimestamp;
+  }
   | {
-      tag: BackupProviderStateTag.Retrying;
-      retryInfo: RetryInfo;
-      lastError?: TalerErrorDetail;
-    };
+    tag: BackupProviderStateTag.Retrying;
+    retryInfo: RetryInfo;
+    lastError?: TalerErrorDetail;
+  };
 
 export interface BackupProviderTerms {
   supportedProtocolVersion: string;
@@ -1895,7 +1895,6 @@ export function importDb(db: IDBDatabase, dump: 
DatabaseDump): Promise<any> {
   return new Promise((resolve, reject) => {
     const tx = db.transaction(Array.from(db.objectStoreNames), "readwrite");
     tx.addEventListener("complete", () => {
-      tx.commit();
       resolve(db);
     });
     for (let i = 0; i < db.objectStoreNames.length; i++) {
@@ -1908,5 +1907,6 @@ export function importDb(db: IDBDatabase, dump: 
DatabaseDump): Promise<any> {
         tx.objectStore(name).put(value);
       });
     }
+    tx.commit();
   });
 }
diff --git a/packages/taler-wallet-webextension/manifest-v2.json 
b/packages/taler-wallet-webextension/manifest-v2.json
index da00d6d8..d3c346a0 100644
--- a/packages/taler-wallet-webextension/manifest-v2.json
+++ b/packages/taler-wallet-webextension/manifest-v2.json
@@ -33,12 +33,12 @@
   },
   "permissions": [
     "unlimitedStorage",
+    "http://*/*";,
+    "https://*/*";,
     "activeTab"
   ],
   "optional_permissions": [
-    "webRequest",
-    "http://*/*";,
-    "https://*/*";
+    "webRequest"
   ],
   "browser_action": {
     "default_icon": {
@@ -59,4 +59,4 @@
     "page": "static/background.html",
     "persistent": true
   }
-}
+}
\ No newline at end of file
diff --git a/packages/taler-wallet-webextension/manifest-v3.json 
b/packages/taler-wallet-webextension/manifest-v3.json
index 6d32f157..21c6b337 100644
--- a/packages/taler-wallet-webextension/manifest-v3.json
+++ b/packages/taler-wallet-webextension/manifest-v3.json
@@ -21,6 +21,7 @@
     "unlimitedStorage",
     "activeTab",
     "scripting",
+    "declarativeContent",
     "alarms"
   ],
   "commands": {
@@ -55,4 +56,4 @@
   "background": {
     "service_worker": "dist/background.js"
   }
-}
+}
\ No newline at end of file
diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts 
b/packages/taler-wallet-webextension/src/platform/chrome.ts
index be7dd40f..ef8904b7 100644
--- a/packages/taler-wallet-webextension/src/platform/chrome.ts
+++ b/packages/taler-wallet-webextension/src/platform/chrome.ts
@@ -46,7 +46,7 @@ export default api;
 const logger = new Logger("chrome.ts");
 
 function keepAlive(callback: any): void {
-  if (chrome.runtime && chrome.runtime.getManifest().manifest_version === 3) {
+  if (extensionIsManifestV3()) {
     chrome.alarms.create("wallet-worker", { periodInMinutes: 1 })
 
     chrome.alarms.onAlarm.addListener((a) => {
@@ -122,7 +122,7 @@ export async function removeHostPermissions(): 
Promise<boolean> {
     });
   }
 
-  if (chrome.runtime && chrome.runtime.getManifest().manifest_version === 3) {
+  if (extensionIsManifestV3()) {
     // Trying to remove host permissions with manifest >= v3 throws an error
     return true;
   }
@@ -156,7 +156,7 @@ function getPermissionsApi(): CrossBrowserPermissionsApi {
  * @param callback function to be called
  */
 function notifyWhenAppIsReady(callback: () => void): void {
-  if (chrome.runtime && chrome.runtime.getManifest().manifest_version === 3) {
+  if (extensionIsManifestV3()) {
     callback()
   } else {
     window.addEventListener("load", callback);
@@ -356,21 +356,165 @@ function registerTalerHeaderListener(callback: (tabId: 
number, url: string) => v
   });
 }
 
+const alertIcons = {
+  "16": "/static/img/taler-alert-16.png",
+  "19": "/static/img/taler-alert-19.png",
+  "32": "/static/img/taler-alert-32.png",
+  "38": "/static/img/taler-alert-38.png",
+  "48": "/static/img/taler-alert-48.png",
+  "64": "/static/img/taler-alert-64.png",
+  "128": "/static/img/taler-alert-128.png",
+  "256": "/static/img/taler-alert-256.png",
+  "512": "/static/img/taler-alert-512.png"
+}
+const normalIcons = {
+  "16": "/static/img/taler-logo-16.png",
+  "19": "/static/img/taler-logo-19.png",
+  "32": "/static/img/taler-logo-32.png",
+  "38": "/static/img/taler-logo-38.png",
+  "48": "/static/img/taler-logo-48.png",
+  "64": "/static/img/taler-logo-64.png",
+  "128": "/static/img/taler-logo-128.png",
+  "256": "/static/img/taler-logo-256.png",
+  "512": "/static/img/taler-logo-512.png"
+}
+function setNormalIcon(): void {
+  if (extensionIsManifestV3()) {
+    chrome.action.setIcon({ path: normalIcons })
+  } else {
+    chrome.browserAction.setIcon({ path: normalIcons })
+  }
+}
+
+function setAlertedIcon(): void {
+  if (extensionIsManifestV3()) {
+    chrome.action.setIcon({ path: alertIcons })
+  } else {
+    chrome.browserAction.setIcon({ path: alertIcons })
+  }
+}
+
+
+interface OffscreenCanvasRenderingContext2D extends CanvasState, 
CanvasTransform, CanvasCompositing, CanvasImageSmoothing, 
CanvasFillStrokeStyles, CanvasShadowStyles, CanvasFilters, CanvasRect, 
CanvasDrawPath, CanvasUserInterface, CanvasText, CanvasDrawImage, 
CanvasImageData, CanvasPathDrawingStyles, CanvasTextDrawingStyles, CanvasPath {
+  readonly canvas: OffscreenCanvas;
+}
+declare const OffscreenCanvasRenderingContext2D: {
+  prototype: OffscreenCanvasRenderingContext2D;
+  new(): OffscreenCanvasRenderingContext2D;
+}
+
+interface OffscreenCanvas extends EventTarget {
+  width: number;
+  height: number;
+  getContext(contextId: "2d", contextAttributes?: 
CanvasRenderingContext2DSettings): OffscreenCanvasRenderingContext2D | null;
+}
+declare const OffscreenCanvas: {
+  prototype: OffscreenCanvas;
+  new(width: number, height: number): OffscreenCanvas;
+}
+
+function createCanvas(size: number): OffscreenCanvas {
+  if (extensionIsManifestV3()) {
+    return new OffscreenCanvas(size, size)
+  } else {
+    const c = document.createElement("canvas")
+    c.height = size;
+    c.width = size;
+    return c;
+  }
+}
+
+
+async function createImage(size: number, file: string): Promise<ImageData> {
+  const r = await fetch(file)
+  const b = await r.blob()
+  const image = await createImageBitmap(b)
+  const canvas = createCanvas(size);
+  const canvasContext = canvas.getContext('2d')!;
+  canvasContext.clearRect(0, 0, canvas.width, canvas.height);
+  canvasContext.drawImage(image, 0, 0, canvas.width, canvas.height);
+  const imageData = canvasContext.getImageData(0, 0, canvas.width, 
canvas.height);
+  return imageData;
+}
+
+async function registerIconChangeOnTalerContent(): Promise<void> {
+  const imgs = await Promise.all(Object.entries(alertIcons).map(([key, value]) 
=> createImage(parseInt(key, 10), value)))
+  const imageData = imgs.reduce((prev, cur) => ({ ...prev, [cur.width]: cur 
}), {} as { [size: string]: ImageData })
+
+  if (chrome.declarativeContent) {
+    // using declarative content does not need host permission
+    // and is faster
+    const secureTalerUrlLookup = {
+      conditions: [
+        new chrome.declarativeContent.PageStateMatcher({
+          css: ["a[href^='taler://'"]
+        })
+      ],
+      actions: [new chrome.declarativeContent.SetIcon({ imageData })]
+    };
+    const inSecureTalerUrlLookup = {
+      conditions: [
+        new chrome.declarativeContent.PageStateMatcher({
+          css: ["a[href^='taler+http://'"]
+        })
+      ],
+      actions: [new chrome.declarativeContent.SetIcon({ imageData })]
+    };
+    chrome.declarativeContent.onPageChanged.removeRules(undefined, function () 
{
+      chrome.declarativeContent.onPageChanged.addRules([secureTalerUrlLookup, 
inSecureTalerUrlLookup]);
+    });
+    return;
+  }
+
+  //this browser doesn't have declarativeContent
+  //we need host_permission and we will check the content for changing the icon
+  chrome.tabs.onUpdated.addListener(async (tabId, info: 
chrome.tabs.TabChangeInfo) => {
+    if (tabId < 0) return;
+    logger.info("tab updated", tabId, info);
+    if (info.status !== "complete") return;
+    const uri = await findTalerUriInTab(tabId);
+    console.log("urio", uri)
+    if (uri) {
+      setAlertedIcon()
+    } else {
+      setNormalIcon()
+    }
+
+  });
+  chrome.tabs.onActivated.addListener(async ({ tabId }: 
chrome.tabs.TabActiveInfo) => {
+    if (tabId < 0) return;
+    logger.info("tab activated", tabId);
+    const uri = await findTalerUriInTab(tabId);
+    console.log("urio", uri)
+    if (uri) {
+      setAlertedIcon()
+    } else {
+      setNormalIcon()
+    }
+  })
+
+}
+
 function registerOnInstalled(callback: () => void): void {
   // This needs to be outside of main, as Firefox won't fire the event if
   // the listener isn't created synchronously on loading the backend.
-  chrome.runtime.onInstalled.addListener((details) => {
-    console.log(`onInstalled with reason: "${details.reason}"`);
+  chrome.runtime.onInstalled.addListener(async (details) => {
+    logger.info(`onInstalled with reason: "${details.reason}"`);
     if (details.reason === chrome.runtime.OnInstalledReason.INSTALL) {
       callback()
     }
+    registerIconChangeOnTalerContent()
   });
 }
 
-function useServiceWorkerAsBackgroundProcess(): boolean {
+function extensionIsManifestV3(): boolean {
   return chrome.runtime.getManifest().manifest_version === 3
 }
 
+function useServiceWorkerAsBackgroundProcess(): boolean {
+  return extensionIsManifestV3()
+}
+
 function searchForTalerLinks(): string | undefined {
   let found;
   found = document.querySelector("a[href^='taler://'")
@@ -382,45 +526,59 @@ function searchForTalerLinks(): string | undefined {
 
 async function getCurrentTab(): Promise<chrome.tabs.Tab> {
   const queryOptions = { active: true, currentWindow: true };
-  const [tab] = await chrome.tabs.query(queryOptions);
-  return tab;
+  return new Promise<chrome.tabs.Tab>((resolve, reject) => {
+    chrome.tabs.query(queryOptions, (tabs) => {
+      if (chrome.runtime.lastError) {
+        reject(chrome.runtime.lastError)
+        return;
+      }
+      resolve(tabs[0])
+    });
+  })
 }
 
-
-async function findTalerUriInActiveTab(): Promise<string | undefined> {
-  if (chrome.runtime.getManifest().manifest_version === 3) {
+async function findTalerUriInTab(tabId: number): Promise<string | undefined> {
+  if (extensionIsManifestV3()) {
     // manifest v3
-    const tab = await getCurrentTab();
-    const res = await chrome.scripting.executeScript({
-      target: {
-        tabId: tab.id!,
-        allFrames: true,
-      } as any,
-      func: searchForTalerLinks,
-      args: []
-    })
-    return res[0].result
+    try {
+      const res = await chrome.scripting.executeScript({
+        target: { tabId, allFrames: true },
+        func: searchForTalerLinks,
+        args: []
+      })
+      return res[0].result
+    } catch (e) {
+      return;
+    }
+  } else {
+    return new Promise((resolve, reject) => {
+      //manifest v2
+      chrome.tabs.executeScript(tabId,
+        {
+          code: `
+            (() => {
+              let x = document.querySelector("a[href^='taler://'") || 
document.querySelector("a[href^='taler+http://'");
+              return x ? x.href.toString() : null;
+            })();
+            `,
+          allFrames: false,
+        },
+        (result) => {
+          if (chrome.runtime.lastError) {
+            console.error(JSON.stringify(chrome.runtime.lastError));
+            resolve(undefined);
+            return;
+          }
+          resolve(result[0]);
+        },
+      );
+    });
   }
-  return new Promise((resolve, reject) => {
-    //manifest v2
-    chrome.tabs.executeScript(
-      {
-        code: `
-        (() => {
-          let x = document.querySelector("a[href^='taler://'") || 
document.querySelector("a[href^='taler+http://'");
-          return x ? x.href.toString() : null;
-        })();
-        `,
-        allFrames: false,
-      },
-      (result) => {
-        if (chrome.runtime.lastError) {
-          console.error(JSON.stringify(chrome.runtime.lastError));
-          resolve(undefined);
-          return;
-        }
-        resolve(result[0]);
-      },
-    );
-  });
 }
+
+async function findTalerUriInActiveTab(): Promise<string | undefined> {
+  const tab = await getCurrentTab();
+  if (!tab || tab.id === undefined) return;
+  return findTalerUriInTab(tab.id)
+}
+
diff --git a/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx 
b/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx
index e371775f..829e60b4 100644
--- a/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx
@@ -36,7 +36,8 @@ export function DeveloperPage(): VNode {
   const [status, timedOut] = useDiagnostics();
 
   const listenAllEvents = Array.from<NotificationType>({ length: 1 });
-  listenAllEvents.includes = () => true; // includes every event
+  //FIXME: waiting for retry notification make a always increasing loop of 
notifications
+  listenAllEvents.includes = (e) => e !== "waiting-for-retry"; // includes 
every event
 
   const response = useAsyncAsHook(async () => {
     const op = await wxApi.getPendingOperations();
@@ -160,11 +161,22 @@ export function View({
         onClick={() =>
           confirmReset(
             i18n.str`Do you want to IRREVOCABLY DESTROY everything inside your 
wallet and LOSE ALL YOUR COINS?`,
+            wxApi.resetDb,
           )
         }
       >
         <i18n.Translate>reset</i18n.Translate>
       </button>
+      <button
+        onClick={() =>
+          confirmReset(
+            i18n.str`TESTING: This may delete all your coin, proceed with 
caution`,
+            wxApi.runGarbageCollector,
+          )
+        }
+      >
+        <i18n.Translate>run gc</i18n.Translate>
+      </button>
       <br />
       <button onClick={() => fileRef?.current?.click()}>
         <i18n.Translate>import database</i18n.Translate>
@@ -385,9 +397,10 @@ function toBase64(str: string): string {
 
 export async function confirmReset(
   confirmTheResetMessage: string,
+  cb: () => Promise<void>,
 ): Promise<void> {
   if (confirm(confirmTheResetMessage)) {
-    await wxApi.resetDb();
+    await cb();
     window.close();
   }
 }
diff --git a/packages/taler-wallet-webextension/src/wxApi.ts 
b/packages/taler-wallet-webextension/src/wxApi.ts
index da80e9bd..3079392b 100644
--- a/packages/taler-wallet-webextension/src/wxApi.ts
+++ b/packages/taler-wallet-webextension/src/wxApi.ts
@@ -140,6 +140,14 @@ export function resetDb(): Promise<void> {
   return callBackend("reset-db", {});
 }
 
+/**
+ * Reset database
+ */
+export function runGarbageCollector(): Promise<void> {
+  return callBackend("run-gc", {});
+}
+
+
 export function getFeeForDeposit(
   depositPaytoUri: string,
   amount: AmountString,
diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts 
b/packages/taler-wallet-webextension/src/wxBackend.ts
index 2ac8f634..f5483e80 100644
--- a/packages/taler-wallet-webextension/src/wxBackend.ts
+++ b/packages/taler-wallet-webextension/src/wxBackend.ts
@@ -33,6 +33,8 @@ import {
 import {
   DbAccess,
   deleteTalerDatabase,
+  exportDb,
+  importDb,
   makeErrorDetail,
   OpenedPromise,
   openPromise,
@@ -129,6 +131,18 @@ async function dispatch(
       r = wrapResponse(await reinitWallet());
       break;
     }
+    case "run-gc": {
+      logger.info("gc")
+      const dump = await exportDb(currentDatabase!.idbHandle());
+      await deleteTalerDatabase(indexedDB as any);
+      logger.info("cleaned")
+      await reinitWallet();
+      logger.info("init")
+      await importDb(currentDatabase!.idbHandle(), dump)
+      logger.info("imported")
+      r = wrapResponse({ result: true });
+      break;
+    }
     case "containsHeaderListener": {
       const res = await platform.containsTalerHeaderListener();
       r = wrapResponse({ newValue: res });
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-128.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-128.png
new file mode 100644
index 00000000..b4934793
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-128.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-16.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-16.png
new file mode 100644
index 00000000..3772174f
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-16.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-19.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-19.png
new file mode 100644
index 00000000..9998e003
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-19.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-256.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-256.png
new file mode 100644
index 00000000..e20b8ccb
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-256.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-32.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-32.png
new file mode 100644
index 00000000..b02ad9a7
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-32.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-38.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-38.png
new file mode 100644
index 00000000..aa71dded
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-38.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-48.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-48.png
new file mode 100644
index 00000000..67516b58
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-48.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-512.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-512.png
new file mode 100644
index 00000000..ac2bef53
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-512.png differ
diff --git a/packages/taler-wallet-webextension/static/img/taler-alert-64.png 
b/packages/taler-wallet-webextension/static/img/taler-alert-64.png
new file mode 100644
index 00000000..316cdaee
Binary files /dev/null and 
b/packages/taler-wallet-webextension/static/img/taler-alert-64.png differ

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]