diff options
author | Florian Dold <florian.dold@gmail.com> | 2018-02-20 15:12:45 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2018-02-20 15:12:45 +0100 |
commit | 6aa929f2a7dfb4264bbcb05e77e91984d3441cae (patch) | |
tree | 65d7c71c19d1491688e51399520ae4094a5166f4 /src | |
parent | aa4757355a29dff097a7c56937f28f7c632767f7 (diff) |
Fix redirect for Firefox on Android
Diffstat (limited to 'src')
-rw-r--r-- | src/webex/compat.ts | 22 | ||||
-rw-r--r-- | src/webex/wxBackend.ts | 36 |
2 files changed, 43 insertions, 15 deletions
diff --git a/src/webex/compat.ts b/src/webex/compat.ts index f532c43bc..30ffd4a81 100644 --- a/src/webex/compat.ts +++ b/src/webex/compat.ts @@ -14,15 +14,15 @@ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ - /** - * Compatibility helpers needed for browsers that don't implement - * WebExtension APIs consistently. - */ +/** +* Compatibility helpers needed for browsers that don't implement +* WebExtension APIs consistently. +*/ - export function isFirefox(): boolean { - const rt = chrome.runtime as any; - if (typeof rt.getBrowserInfo === "function") { - return true; - } - return false; - } +export function isFirefox(): boolean { + const rt = chrome.runtime as any; + if (typeof rt.getBrowserInfo === "function") { + return true; + } + return false; +} diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts index f1116637d..d7c43225d 100644 --- a/src/webex/wxBackend.ts +++ b/src/webex/wxBackend.ts @@ -44,6 +44,8 @@ import { Wallet, } from "../wallet"; +import { isFirefox } from "./compat"; + import { PurchaseRecord, Stores, @@ -449,7 +451,21 @@ async function talerPay(fields: any, url: string, tabId: number): Promise<string } -function makeSyncWalletRedirect(url: string, params?: {[name: string]: string | undefined}): object { +function getTab(tabId: number): Promise<chrome.tabs.Tab> { + return new Promise((resolve, reject) => { + chrome.tabs.get(tabId, (tab: chrome.tabs.Tab) => resolve(tab)); + }); +} + + +function waitMs(timeoutMs: number): Promise<void> { + return new Promise((resolve, reject) => { + chrome.extension.getBackgroundPage().setTimeout(() => resolve(), timeoutMs); + }); +} + + +function makeSyncWalletRedirect(url: string, tabId: number, oldUrl: string, params?: {[name: string]: string | undefined}): object { const innerUrl = new URI(chrome.extension.getURL("/src/webex/pages/" + url)); if (params) { for (const key in params) { @@ -460,6 +476,18 @@ function makeSyncWalletRedirect(url: string, params?: {[name: string]: string | } const outerUrl = new URI(chrome.extension.getURL("/src/webex/pages/redirect.html")); outerUrl.addSearch("url", innerUrl); + if (isFirefox()) { + // Some platforms don't support the sync redirect (yet), so fall back to + // async redirect after a timeout. + const doit = async() => { + await waitMs(150); + const tab = await getTab(tabId); + if (tab.url === oldUrl) { + chrome.tabs.update(tabId, { url: outerUrl.href() }); + } + }; + doit(); + } return { redirectUrl: outerUrl.href() }; } @@ -512,7 +540,7 @@ function handleHttpPayment(headerList: chrome.webRequest.HttpHeader[], url: stri } // Synchronous fast path for new contract if (fields.contract_url) { - return makeSyncWalletRedirect("confirm-contract.html", { + return makeSyncWalletRedirect("confirm-contract.html", tabId, url, { contractUrl: fields.contract_url, sessionId: fields.session_id, resourceUrl: fields.resource_url, @@ -521,13 +549,13 @@ function handleHttpPayment(headerList: chrome.webRequest.HttpHeader[], url: stri // Synchronous fast path for tip if (fields.tip) { - return makeSyncWalletRedirect("tip.html", { tip_token: fields.tip }); + return makeSyncWalletRedirect("tip.html", tabId, url, { tip_token: fields.tip }); } // Synchronous fast path for refund if (fields.refund_url) { console.log("processing refund"); - return makeSyncWalletRedirect("refund.html", { refundUrl: fields.refund_url }); + return makeSyncWalletRedirect("refund.html", tabId, url, { refundUrl: fields.refund_url }); } // We need to do some asynchronous operation, we can't directly redirect |