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/webex | |
| parent | aa4757355a29dff097a7c56937f28f7c632767f7 (diff) | |
Fix redirect for Firefox on Android
Diffstat (limited to 'src/webex')
| -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  | 
