From 13a8f36cad4d5d2ffec788ff6b4d5b61ed4ddff9 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 2 Mar 2016 15:33:23 +0100 Subject: [PATCH] re-inject extension on load --- content_scripts/notify.js | 37 +++++++++++++++++++++++---------- content_scripts/notify.ts | 43 +++++++++++++++++++++++++++------------ lib/wallet/wxMessaging.ts | 13 ++++++++++++ manifest.json | 3 ++- 4 files changed, 71 insertions(+), 25 deletions(-) diff --git a/content_scripts/notify.js b/content_scripts/notify.js index aa7dee730..2df089719 100644 --- a/content_scripts/notify.js +++ b/content_scripts/notify.js @@ -34,14 +34,29 @@ var TalerNotify; url = url.replace("${$}", "$"); return url; } - var $ = function (x) { return document.getElementById(x); }; - document.addEventListener("DOMContentLoaded", function (e) { - if (document.documentElement.getAttribute("data-taler-requested")) { - console.log("taler requested in html element"); - document.documentElement.setAttribute("data-taler-extension-id", chrome.runtime.id); + var handlers = []; + var port = chrome.runtime.connect(); + port.onDisconnect.addListener(function () { + console.log("chrome runtime disconnected"); + for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) { + var handler = handlers_1[_i]; + document.removeEventListener(handler.type, handler.listener); } }); - document.addEventListener("taler-probe", function (e) { + var $ = function (x) { return document.getElementById(x); }; + function addHandler(type, listener) { + document.addEventListener(type, listener); + handlers.push({ type: type, listener: listener }); + } + addHandler("taler-query-id", function (e) { + var evt = new CustomEvent("taler-id", { + detail: { + id: chrome.runtime.id + } + }); + document.dispatchEvent(evt); + }); + addHandler("taler-probe", function (e) { var evt = new CustomEvent("taler-wallet-present", { detail: { walletProtocolVersion: PROTOCOL_VERSION @@ -50,7 +65,7 @@ var TalerNotify; document.dispatchEvent(evt); console.log("handshake done"); }); - document.addEventListener("taler-create-reserve", function (e) { + addHandler("taler-create-reserve", function (e) { console.log("taler-create-reserve with " + JSON.stringify(e.detail)); var params = { amount: JSON.stringify(e.detail.amount), @@ -61,7 +76,7 @@ var TalerNotify; var uri = URI(chrome.extension.getURL("pages/confirm-create-reserve.html")); document.location.href = uri.query(params).href(); }); - document.addEventListener("taler-confirm-reserve", function (e) { + addHandler("taler-confirm-reserve", function (e) { console.log("taler-confirm-reserve with " + JSON.stringify(e.detail)); var msg = { type: "confirm-reserve", @@ -74,7 +89,7 @@ var TalerNotify; }); }); // XXX: remove in a bit, just here for compatibility ... - document.addEventListener("taler-contract", function (e) { + addHandler("taler-contract", function (e) { // XXX: the merchant should just give us the parsed data ... var offer = JSON.parse(e.detail); if (!offer.contract) { @@ -108,7 +123,7 @@ var TalerNotify; } }); }); - document.addEventListener("taler-confirm-contract", function (e) { + addHandler("taler-confirm-contract", function (e) { if (!e.detail.contract_wrapper) { console.error("contract wrapper missing"); return; @@ -151,7 +166,7 @@ var TalerNotify; } }); }); - document.addEventListener('taler-execute-payment', function (e) { + addHandler('taler-execute-payment', function (e) { console.log("got taler-execute-payment in content page"); if (!e.detail.pay_url) { console.log("field 'pay_url' missing in taler-execute-payment event"); diff --git a/content_scripts/notify.ts b/content_scripts/notify.ts index c87c9450e..92c9eee1e 100644 --- a/content_scripts/notify.ts +++ b/content_scripts/notify.ts @@ -43,17 +43,34 @@ namespace TalerNotify { return url; } - let $ = (x) => document.getElementById(x); + let handlers = []; - document.addEventListener("DOMContentLoaded", function(e) { - if (document.documentElement.getAttribute("data-taler-requested")) { - console.log("taler requested in html element"); - document.documentElement.setAttribute("data-taler-extension-id", - chrome.runtime.id); + let port = chrome.runtime.connect(); + port.onDisconnect.addListener(() => { + console.log("chrome runtime disconnected"); + for (let handler of handlers) { + document.removeEventListener(handler.type, handler.listener); } }); - document.addEventListener("taler-probe", function(e) { + let $ = (x) => document.getElementById(x); + + function addHandler(type, listener) { + document.addEventListener(type, listener); + handlers.push({type, listener}); + } + + + addHandler("taler-query-id", function(e) { + let evt = new CustomEvent("taler-id", { + detail: { + id: chrome.runtime.id + } + }); + document.dispatchEvent(evt); + }); + + addHandler("taler-probe", function(e) { let evt = new CustomEvent("taler-wallet-present", { detail: { walletProtocolVersion: PROTOCOL_VERSION @@ -63,7 +80,7 @@ namespace TalerNotify { console.log("handshake done"); }); - document.addEventListener("taler-create-reserve", function(e: CustomEvent) { + addHandler("taler-create-reserve", function(e: CustomEvent) { console.log("taler-create-reserve with " + JSON.stringify(e.detail)); let params = { amount: JSON.stringify(e.detail.amount), @@ -75,7 +92,7 @@ namespace TalerNotify { document.location.href = uri.query(params).href(); }); - document.addEventListener("taler-confirm-reserve", function(e: CustomEvent) { + addHandler("taler-confirm-reserve", function(e: CustomEvent) { console.log("taler-confirm-reserve with " + JSON.stringify(e.detail)); let msg = { type: "confirm-reserve", @@ -90,7 +107,7 @@ namespace TalerNotify { // XXX: remove in a bit, just here for compatibility ... - document.addEventListener("taler-contract", function(e: CustomEvent) { + addHandler("taler-contract", function(e: CustomEvent) { // XXX: the merchant should just give us the parsed data ... let offer = JSON.parse(e.detail); @@ -130,7 +147,7 @@ namespace TalerNotify { }); - document.addEventListener("taler-confirm-contract", function(e: CustomEvent) { + addHandler("taler-confirm-contract", function(e: CustomEvent) { if (!e.detail.contract_wrapper) { console.error("contract wrapper missing"); return; @@ -179,7 +196,7 @@ namespace TalerNotify { }); - document.addEventListener('taler-execute-payment', function(e: CustomEvent) { + addHandler('taler-execute-payment', function(e: CustomEvent) { console.log("got taler-execute-payment in content page"); if (!e.detail.pay_url) { console.log("field 'pay_url' missing in taler-execute-payment event"); @@ -232,4 +249,4 @@ namespace TalerNotify { }; }); }); -} +} \ No newline at end of file diff --git a/lib/wallet/wxMessaging.ts b/lib/wallet/wxMessaging.ts index 4f496861d..daa9ec197 100644 --- a/lib/wallet/wxMessaging.ts +++ b/lib/wallet/wxMessaging.ts @@ -195,6 +195,19 @@ class ChromeNotifier implements Notifier { export function wxMain() { chrome.browserAction.setBadgeText({text: ""}); + chrome.tabs.query({}, function(tabs) { + for (let tab of tabs) { + if (!tab.url) { + return; + } + let uri = URI(tab.url); + if (uri.protocol() == "http" || uri.protocol() == "https") { + console.log("injecting into existing tab", tab.id); + chrome.tabs.executeScript(tab.id, {file: "content_scripts/notify.js"}); + } + } + }); + Promise.resolve() .then(() => { return openTalerDb(); diff --git a/manifest.json b/manifest.json index 54a5585ef..b83a68533 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "description": "Privacy preserving and transparent payments", "manifest_version": 2, "name": "GNU Taler Wallet (git)", - "version": "0.5.14", + "version": "0.5.15", "applications": { "gecko": { @@ -12,6 +12,7 @@ "permissions": [ "storage", + "tabs", "http://*/*", "https://*/*" ],