From ab241e5ca2cb95db3acf628bbac55d8c0e94c667 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 9 Sep 2016 14:07:54 +0200 Subject: [PATCH] Make JSless payments work. --- content_scripts/notify.ts | 35 +++++++++++++---------------------- lib/wallet/wxMessaging.ts | 10 ++++++---- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/content_scripts/notify.ts b/content_scripts/notify.ts index ad77a1e37..63754af16 100644 --- a/content_scripts/notify.ts +++ b/content_scripts/notify.ts @@ -46,7 +46,7 @@ namespace TalerNotify { } var contract_request = new XMLHttpRequest(); - console.log("downloading contract from '" + url + "'") + console.log("downloading contract from '" + url + "'"); contract_request.open("GET", url, true); contract_request.onload = function (e) { if (contract_request.readyState == 4) { @@ -76,6 +76,9 @@ namespace TalerNotify { /** * Wallet-internal version of executeContract, used for 402 payments. + * + * Even though we're inside a content script, we send events to the dom + * to avoid code duplication. */ function internalExecuteContract(contractHash: string, payUrl: string, offerUrl: string) { @@ -86,25 +89,13 @@ namespace TalerNotify { * synchronous error message (such as an alert) or leave the page. */ function handleFailedPayment(status) { - let timeoutHandle = null; - function err() { - alert("Payment failed: Unexpected status code for $pay_url: " + status); - } - function onResp() { - if (timeoutHandle != null) { - clearTimeout(timeoutHandle); - timeoutHandle = null; - } - err(); - } - function onTimeout() { - timeoutHandle = null; - err(); - } - let eve = new CustomEvent('taler-payment-failed', {detail: {}}); - document.dispatchEvent(eve); - document.addEventListener("taler-payment-failed-ok", onResp, false); - timeoutHandle = setTimeout(onTimeout, 200); + const msg = { + type: "payment-failed", + detail: {}, + }; + chrome.runtime.sendMessage(msg, (resp) => { + alert("payment failed"); + }); } @@ -157,7 +148,7 @@ namespace TalerNotify { }; document.addEventListener("taler-notify-payment", handleResponse, false); - let eve = new CustomEvent('taler-fetch-payment', {detail: detail}); + let eve = new CustomEvent('taler-execute-contract', {detail: detail}); document.dispatchEvent(eve); } @@ -333,7 +324,7 @@ namespace TalerNotify { console.log("got resp"); console.dir(resp); if (!resp.success) { - console.log("got event detial:"); + console.log("got event detail:"); console.dir(e.detail); if (e.detail.offering_url) { console.log("offering url", e.detail.offering_url); diff --git a/lib/wallet/wxMessaging.ts b/lib/wallet/wxMessaging.ts index 95dcb929a..3ab56af71 100644 --- a/lib/wallet/wxMessaging.ts +++ b/lib/wallet/wxMessaging.ts @@ -54,7 +54,9 @@ function makeHandlers(db: IDBDatabase, return exportDb(db); }, ["ping"]: function(detail, sender) { - return Promise.resolve(paymentRequestCache[sender.tab.id]); + let info = paymentRequestCookies[sender.tab.id]; + delete paymentRequestCookies[sender.tab.id]; + return Promise.resolve(info); }, ["reset"]: function(detail, sender) { if (db) { @@ -240,7 +242,7 @@ class ChromeNotifier implements Notifier { /** * Mapping from tab ID to payment information (if any). */ -let paymentRequestCache = {}; +let paymentRequestCookies = {}; function handleHttpPayment(headerList: chrome.webRequest.HttpHeader[], url: string, tabId: number): any { @@ -251,7 +253,7 @@ function handleHttpPayment(headerList: chrome.webRequest.HttpHeader[], const contractUrl = headers["x-taler-contract-url"]; if (contractUrl !== undefined) { - paymentRequestCache[tabId] = {type: "fetch", contractUrl}; + paymentRequestCookies[tabId] = {type: "fetch", contractUrl}; return; } @@ -266,7 +268,7 @@ function handleHttpPayment(headerList: chrome.webRequest.HttpHeader[], // Offer URL is optional const offerUrl = headers["x-taler-offer-url"]; - paymentRequestCache[tabId] = { + paymentRequestCookies[tabId] = { type: "execute", offerUrl, payUrl,