aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-02-20 15:12:45 +0100
committerFlorian Dold <florian.dold@gmail.com>2018-02-20 15:12:45 +0100
commit6aa929f2a7dfb4264bbcb05e77e91984d3441cae (patch)
tree65d7c71c19d1491688e51399520ae4094a5166f4 /src
parentaa4757355a29dff097a7c56937f28f7c632767f7 (diff)
Fix redirect for Firefox on Android
Diffstat (limited to 'src')
-rw-r--r--src/webex/compat.ts22
-rw-r--r--src/webex/wxBackend.ts36
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