From c76c9ca2c86317f902f443db2c5704d4bf6311c0 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Thu, 27 Sep 2018 14:19:09 -0400 Subject: EIP-1102: updated implementation --- app/scripts/contentscript.js | 61 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 10 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 33523eb46..060343031 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -11,6 +11,7 @@ const PortStream = require('extension-port-stream') const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString() const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n' const inpageBundle = inpageContent + inpageSuffix +let originApproved = false // Eventually this streaming injection could be replaced with: // https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.exportFunction @@ -20,24 +21,24 @@ const inpageBundle = inpageContent + inpageSuffix // MetaMask will be much faster loading and performant on Firefox. if (shouldInjectWeb3()) { - setupInjection() + injectScript(inpageBundle) setupStreams() + listenForProviderRequest() } /** - * Creates a script tag that injects inpage.js + * Injects a script tag into the current document + * + * @param {string} content - Code to be executed in the current document */ -function setupInjection () { +function injectScript (content) { try { - // inject in-page script - var scriptTag = document.createElement('script') - scriptTag.textContent = inpageBundle - scriptTag.onload = function () { this.parentNode.removeChild(this) } - var container = document.head || document.documentElement - // append as first child + const container = document.head || document.documentElement + const scriptTag = document.createElement('script') + scriptTag.textContent = content container.insertBefore(scriptTag, container.children[0]) } catch (e) { - console.error('Metamask injection failed.', e) + console.error('Metamask script injection failed.', e) } } @@ -54,6 +55,16 @@ function setupStreams () { const pluginPort = extension.runtime.connect({ name: 'contentscript' }) const pluginStream = new PortStream(pluginPort) + // Until this origin is approved, cut-off publicConfig stream writes at the content + // script level so malicious sites can't snoop on the currently-selected address + pageStream._write = function (data, encoding, cb) { + if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !originApproved) { + cb() + return + } + LocalMessageDuplexStream.prototype._write.apply(pageStream, arguments) + } + // forward communication plugin->inpage pump( pageStream, @@ -97,6 +108,36 @@ function setupStreams () { mux.ignoreStream('publicConfig') } +/** + * Establishes listeners for requests to fully-enable the provider from the dapp context + * and for full-provider approvals and rejections from the background script context. Dapps + * should not post messages directly and should instead call provider.enable(), which + * handles posting these messages automatically. + */ +function listenForProviderRequest () { + window.addEventListener('message', (event) => { + if (event.source !== window) { return } + if (!event.data || !event.data.type || event.data.type !== 'ETHEREUM_ENABLE_PROVIDER') { return } + extension.runtime.sendMessage({ + action: 'init-provider-request', + origin: event.source.location.hostname, + }) + }) + + extension.runtime.onMessage.addListener(({ action }) => { + if (!action) { return } + switch (action) { + case 'approve-provider-request': + originApproved = true + injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: {}}))`) + break + case 'reject-provider-request': + injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) + break + } + }) +} + /** * Error handler for page to plugin stream disconnections -- cgit v1.2.3 From 89b4aa5d62237f36fac9dcce9c546005ec18968b Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 1 Oct 2018 20:52:31 -0400 Subject: EIP-1102: Add option to force-enable provider --- app/scripts/contentscript.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 060343031..1788cfc36 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -24,6 +24,7 @@ if (shouldInjectWeb3()) { injectScript(inpageBundle) setupStreams() listenForProviderRequest() + checkForcedInjection() } /** @@ -134,10 +135,28 @@ function listenForProviderRequest () { case 'reject-provider-request': injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) break + case 'force-injection': + extension.storage.local.get(['forcedOrigins'], ({ forcedOrigins = [] }) => { + extension.storage.local.set({ forcedOrigins: [ ...forcedOrigins, window.location.hostname ] }, () => { + injectScript(`window.location.reload()`) + }) + }) + break } }) } +/** + * Checks the current origin to see if it exists in the extension's locally-stored list + * off user-whitelisted dapp origins. If it is, this origin will be marked as approved, + * meaning the publicConfig stream will be enabled. This is only meant to ease the transition + * to 1102 and will be removed in the future. + */ +function checkForcedInjection () { + extension.storage.local.get(['forcedOrigins'], ({ forcedOrigins = [] }) => { + originApproved = forcedOrigins.indexOf(window.location.hostname) > -1 + }) +} /** * Error handler for page to plugin stream disconnections -- cgit v1.2.3 From bfcb73ad533b7c2acea012a586c2a391811faf03 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Thu, 4 Oct 2018 11:05:32 -0400 Subject: EIP-1102: add isEnabled convenience method to provider --- app/scripts/contentscript.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 1788cfc36..b1c1e9a0d 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -116,16 +116,25 @@ function setupStreams () { * handles posting these messages automatically. */ function listenForProviderRequest () { - window.addEventListener('message', (event) => { - if (event.source !== window) { return } - if (!event.data || !event.data.type || event.data.type !== 'ETHEREUM_ENABLE_PROVIDER') { return } - extension.runtime.sendMessage({ - action: 'init-provider-request', - origin: event.source.location.hostname, - }) + window.addEventListener('message', ({ source, data }) => { + if (source !== window || !data || !data.type) { return } + switch (data.type) { + case 'ETHEREUM_ENABLE_PROVIDER': + extension.runtime.sendMessage({ + action: 'init-provider-request', + origin: source.location.hostname, + }) + break + case 'ETHEREUM_PROVIDER_STATUS': + extension.runtime.sendMessage({ + action: 'provider-status-request', + origin: source.location.hostname, + }) + break + } }) - extension.runtime.onMessage.addListener(({ action }) => { + extension.runtime.onMessage.addListener(({ action, isEnabled }) => { if (!action) { return } switch (action) { case 'approve-provider-request': @@ -142,6 +151,9 @@ function listenForProviderRequest () { }) }) break + case 'provider-status': + injectScript(`window.dispatchEvent(new CustomEvent('ethereumproviderstatus', { detail: { isEnabled: ${isEnabled}}}))`) + break } }) } -- cgit v1.2.3 From 226601a956594d00817cdb1fa5214242aae7936c Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 10 Oct 2018 14:52:26 -0400 Subject: EIP-1102: add user privacy option --- app/scripts/contentscript.js | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index b1c1e9a0d..29fa3f5c7 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -24,7 +24,7 @@ if (shouldInjectWeb3()) { injectScript(inpageBundle) setupStreams() listenForProviderRequest() - checkForcedInjection() + checkPrivacyMode() } /** @@ -125,9 +125,9 @@ function listenForProviderRequest () { origin: source.location.hostname, }) break - case 'ETHEREUM_PROVIDER_STATUS': + case 'ETHEREUM_QUERY_STATUS': extension.runtime.sendMessage({ - action: 'provider-status-request', + action: 'init-status-request', origin: source.location.hostname, }) break @@ -144,14 +144,7 @@ function listenForProviderRequest () { case 'reject-provider-request': injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) break - case 'force-injection': - extension.storage.local.get(['forcedOrigins'], ({ forcedOrigins = [] }) => { - extension.storage.local.set({ forcedOrigins: [ ...forcedOrigins, window.location.hostname ] }, () => { - injectScript(`window.location.reload()`) - }) - }) - break - case 'provider-status': + case 'answer-status-request': injectScript(`window.dispatchEvent(new CustomEvent('ethereumproviderstatus', { detail: { isEnabled: ${isEnabled}}}))`) break } @@ -159,15 +152,11 @@ function listenForProviderRequest () { } /** - * Checks the current origin to see if it exists in the extension's locally-stored list - * off user-whitelisted dapp origins. If it is, this origin will be marked as approved, - * meaning the publicConfig stream will be enabled. This is only meant to ease the transition - * to 1102 and will be removed in the future. + * Checks if MetaMask is currently operating in "privacy mode", meaning + * dapps must call ethereum.enable in order to access user accounts */ -function checkForcedInjection () { - extension.storage.local.get(['forcedOrigins'], ({ forcedOrigins = [] }) => { - originApproved = forcedOrigins.indexOf(window.location.hostname) > -1 - }) +function checkPrivacyMode () { + extension.runtime.sendMessage({ action: 'init-privacy-request' }) } /** -- cgit v1.2.3 From 84874a639d217da36926869fa3cb235c05725cf5 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 17 Oct 2018 18:38:31 -0400 Subject: Add isUnlocked provider hook --- app/scripts/contentscript.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 29fa3f5c7..bb79e1d4a 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -131,10 +131,15 @@ function listenForProviderRequest () { origin: source.location.hostname, }) break + case 'METAMASK_UNLOCK_STATUS': + extension.runtime.sendMessage({ + action: 'init-unlock-request', + }) + break } }) - extension.runtime.onMessage.addListener(({ action, isEnabled }) => { + extension.runtime.onMessage.addListener(({ action, isEnabled, isUnlocked }) => { if (!action) { return } switch (action) { case 'approve-provider-request': @@ -147,6 +152,9 @@ function listenForProviderRequest () { case 'answer-status-request': injectScript(`window.dispatchEvent(new CustomEvent('ethereumproviderstatus', { detail: { isEnabled: ${isEnabled}}}))`) break + case 'answer-unlock-request': + injectScript(`window.dispatchEvent(new CustomEvent('metamaskunlockstatus', { detail: { isUnlocked: ${isUnlocked}}}))`) + break } }) } -- cgit v1.2.3 From ace7cfa065d701b49fb07c4e6f169e7cce545c56 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 19:31:06 +0100 Subject: Only filter selectedAddress from publicConfig store --- app/scripts/contentscript.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index bb79e1d4a..aa06068c0 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -7,6 +7,7 @@ const PongStream = require('ping-pong-stream/pong') const ObjectMultiplex = require('obj-multiplex') const extension = require('extensionizer') const PortStream = require('extension-port-stream') +const TransformStream = require('stream').Transform const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString() const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n' @@ -58,18 +59,21 @@ function setupStreams () { // Until this origin is approved, cut-off publicConfig stream writes at the content // script level so malicious sites can't snoop on the currently-selected address - pageStream._write = function (data, encoding, cb) { - if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !originApproved) { - cb() - return + const approvalTransform = new TransformStream({ + objectMode: true, + transform: (data, _, done) => { + if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !originApproved) { + data.data.selectedAddress = undefined + } + done(null, { ...data }) } - LocalMessageDuplexStream.prototype._write.apply(pageStream, arguments) - } + }) // forward communication plugin->inpage pump( pageStream, pluginStream, + approvalTransform, pageStream, (err) => logStreamDisconnectWarning('MetaMask Contentscript Forwarding', err) ) -- cgit v1.2.3 From f02e18dd80672a0b7440256cb7946feabf907ee1 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 19:38:45 +0100 Subject: Fix lint issues --- app/scripts/contentscript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index aa06068c0..fdc04ba1b 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -66,7 +66,7 @@ function setupStreams () { data.data.selectedAddress = undefined } done(null, { ...data }) - } + }, }) // forward communication plugin->inpage -- cgit v1.2.3 From ba40fcbcb43c5adcb3a961afd4050cdb2025b7a6 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 21:55:13 +0100 Subject: Handle logout gracefully --- app/scripts/contentscript.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index fdc04ba1b..0244f6fa0 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -129,21 +129,21 @@ function listenForProviderRequest () { origin: source.location.hostname, }) break - case 'ETHEREUM_QUERY_STATUS': + case 'ETHEREUM_IS_APPROVED': extension.runtime.sendMessage({ - action: 'init-status-request', + action: 'init-is-approved', origin: source.location.hostname, }) break - case 'METAMASK_UNLOCK_STATUS': + case 'METAMASK_IS_UNLOCKED': extension.runtime.sendMessage({ - action: 'init-unlock-request', + action: 'init-is-unlocked', }) break } }) - extension.runtime.onMessage.addListener(({ action, isEnabled, isUnlocked }) => { + extension.runtime.onMessage.addListener(({ action, isEnabled, isApproved, isUnlocked }) => { if (!action) { return } switch (action) { case 'approve-provider-request': @@ -153,11 +153,14 @@ function listenForProviderRequest () { case 'reject-provider-request': injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) break - case 'answer-status-request': - injectScript(`window.dispatchEvent(new CustomEvent('ethereumproviderstatus', { detail: { isEnabled: ${isEnabled}}}))`) + case 'answer-is-approved': + injectScript(`window.dispatchEvent(new CustomEvent('ethereumisapproved', { detail: { isApproved: ${isApproved}}}))`) break - case 'answer-unlock-request': - injectScript(`window.dispatchEvent(new CustomEvent('metamaskunlockstatus', { detail: { isUnlocked: ${isUnlocked}}}))`) + case 'answer-is-unlocked': + injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`) + break + case 'metamask-set-locked': + injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`) break } }) -- cgit v1.2.3 From d7618bd5c6cffe02d8737fe6925a31484a1fc0b0 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 22:28:59 +0100 Subject: Code bath --- app/scripts/contentscript.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 0244f6fa0..0723c03f7 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -12,7 +12,7 @@ const TransformStream = require('stream').Transform const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString() const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n' const inpageBundle = inpageContent + inpageSuffix -let originApproved = false +let isEnabled = false // Eventually this streaming injection could be replaced with: // https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.exportFunction @@ -40,7 +40,7 @@ function injectScript (content) { scriptTag.textContent = content container.insertBefore(scriptTag, container.children[0]) } catch (e) { - console.error('Metamask script injection failed.', e) + console.error('MetaMask script injection failed', e) } } @@ -57,12 +57,11 @@ function setupStreams () { const pluginPort = extension.runtime.connect({ name: 'contentscript' }) const pluginStream = new PortStream(pluginPort) - // Until this origin is approved, cut-off publicConfig stream writes at the content - // script level so malicious sites can't snoop on the currently-selected address + // Filter out selectedAddress until this origin is enabled const approvalTransform = new TransformStream({ objectMode: true, transform: (data, _, done) => { - if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !originApproved) { + if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !isEnabled) { data.data.selectedAddress = undefined } done(null, { ...data }) @@ -117,7 +116,7 @@ function setupStreams () { * Establishes listeners for requests to fully-enable the provider from the dapp context * and for full-provider approvals and rejections from the background script context. Dapps * should not post messages directly and should instead call provider.enable(), which - * handles posting these messages automatically. + * handles posting these messages internally. */ function listenForProviderRequest () { window.addEventListener('message', ({ source, data }) => { @@ -143,11 +142,10 @@ function listenForProviderRequest () { } }) - extension.runtime.onMessage.addListener(({ action, isEnabled, isApproved, isUnlocked }) => { - if (!action) { return } + extension.runtime.onMessage.addListener(({ action = '', isApproved, isUnlocked }) => { switch (action) { case 'approve-provider-request': - originApproved = true + isEnabled = true injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: {}}))`) break case 'reject-provider-request': @@ -160,6 +158,7 @@ function listenForProviderRequest () { injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`) break case 'metamask-set-locked': + isEnabled = false injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`) break } -- cgit v1.2.3 From cc1bab6ebbef8d8219f83039fdc3baca6de718fd Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 22:54:39 +0100 Subject: Differentiate locked and enabled --- app/scripts/contentscript.js | 4 ---- 1 file changed, 4 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 0723c03f7..2c2efda1c 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -157,10 +157,6 @@ function listenForProviderRequest () { case 'answer-is-unlocked': injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`) break - case 'metamask-set-locked': - isEnabled = false - injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`) - break } }) } -- cgit v1.2.3 From d4171ccea51db04aa40320de8770e22203d4d6c2 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 23:44:04 +0100 Subject: Disable approval caching --- app/scripts/contentscript.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 2c2efda1c..fa8b3207f 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -142,7 +142,7 @@ function listenForProviderRequest () { } }) - extension.runtime.onMessage.addListener(({ action = '', isApproved, isUnlocked }) => { + extension.runtime.onMessage.addListener(({ action = '', isApproved, caching, isUnlocked }) => { switch (action) { case 'approve-provider-request': isEnabled = true @@ -152,11 +152,15 @@ function listenForProviderRequest () { injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) break case 'answer-is-approved': - injectScript(`window.dispatchEvent(new CustomEvent('ethereumisapproved', { detail: { isApproved: ${isApproved}}}))`) + injectScript(`window.dispatchEvent(new CustomEvent('ethereumisapproved', { detail: { isApproved: ${isApproved}, caching: ${caching}}}))`) break case 'answer-is-unlocked': injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`) break + case 'metamask-set-locked': + isEnabled = false + injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`) + break } }) } -- cgit v1.2.3 From 26ada8a828ab684c310080a18115a8ef3234aaee Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Mon, 5 Nov 2018 09:37:56 -0330 Subject: Update Connect Request screen design (#5644) * Parameterize NetworkDisplay background colour * Update design for login request screen * Pass siteTitle, siteImage through for calls to ethereum.enable() * Bring the site images closer together --- app/scripts/contentscript.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index fa8b3207f..1cdc85945 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -126,6 +126,8 @@ function listenForProviderRequest () { extension.runtime.sendMessage({ action: 'init-provider-request', origin: source.location.hostname, + siteImage: getSiteIcon(source), + siteTitle: getSiteName(source), }) break case 'ETHEREUM_IS_APPROVED': @@ -285,3 +287,31 @@ function redirectToPhishingWarning () { href: window.location.href, })}` } + +function getSiteName (window) { + const document = window.document + const siteName = document.querySelector('head > meta[property="og:site_name"]') + if (siteName) { + return siteName.content + } + + return document.title +} + +function getSiteIcon (window) { + const document = window.document + + // Use the site's favicon if it exists + const shortcutIcon = document.querySelector('head > link[rel="shortcut icon"]') + if (shortcutIcon) { + return shortcutIcon.href + } + + // Search through available icons in no particular order + const icon = Array.from(document.querySelectorAll('head > link[rel="icon"]')).find((icon) => Boolean(icon.href)) + if (icon) { + return icon.href + } + + return null +} -- cgit v1.2.3 From 879997af517b36cf701ec74c08ec4293a2206baa Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 5 Nov 2018 09:03:30 -0500 Subject: Add experimental RPC method support --- app/scripts/contentscript.js | 1 + 1 file changed, 1 insertion(+) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 1cdc85945..2327dc4ac 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -125,6 +125,7 @@ function listenForProviderRequest () { case 'ETHEREUM_ENABLE_PROVIDER': extension.runtime.sendMessage({ action: 'init-provider-request', + force: data.force, origin: source.location.hostname, siteImage: getSiteIcon(source), siteTitle: getSiteName(source), -- cgit v1.2.3 From d7b1cacabca6abe55ddea54369e5dcac0dc0963b Mon Sep 17 00:00:00 2001 From: bitpshr Date: Tue, 6 Nov 2018 14:26:02 -0500 Subject: Remove injected script tags after use --- app/scripts/contentscript.js | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 2327dc4ac..1a10cdb34 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -37,8 +37,10 @@ function injectScript (content) { try { const container = document.head || document.documentElement const scriptTag = document.createElement('script') + scriptTag.setAttribute('async', false) scriptTag.textContent = content container.insertBefore(scriptTag, container.children[0]) + container.removeChild(scriptTag) } catch (e) { console.error('MetaMask script injection failed', e) } -- cgit v1.2.3 From 1ce3591c8ea844eab2dbd9b585e7f5dd3cf18ce8 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 7 Nov 2018 11:11:08 -0500 Subject: wip --- app/scripts/contentscript.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 1a10cdb34..efb14233d 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -151,20 +151,20 @@ function listenForProviderRequest () { switch (action) { case 'approve-provider-request': isEnabled = true - injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: {}}))`) + window.postMessage({ type: 'ethereumprovider' }, '*') break case 'reject-provider-request': - injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) + window.postMessage({ type: 'ethereumprovider', error: 'User rejected provider access' }, '*') break case 'answer-is-approved': - injectScript(`window.dispatchEvent(new CustomEvent('ethereumisapproved', { detail: { isApproved: ${isApproved}, caching: ${caching}}}))`) + window.postMessage({ type: 'ethereumisapproved', isApproved, caching }, '*') break case 'answer-is-unlocked': - injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`) + window.postMessage({ type: 'metamaskisunlocked', isUnlocked }, '*') break case 'metamask-set-locked': isEnabled = false - injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`) + window.postMessage({ type: 'metamasksetlocked' }, '*') break } }) -- cgit v1.2.3 From c3176248544e3e0019389b1f177cac68087bfe8f Mon Sep 17 00:00:00 2001 From: Paul Bouchon Date: Fri, 9 Nov 2018 20:40:32 -0500 Subject: EIP-1102: Update publicConfig store concurrently with approval --- app/scripts/contentscript.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index efb14233d..ee38ee3ab 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -147,11 +147,15 @@ function listenForProviderRequest () { } }) - extension.runtime.onMessage.addListener(({ action = '', isApproved, caching, isUnlocked }) => { + extension.runtime.onMessage.addListener(({ action = '', isApproved, caching, isUnlocked, selectedAddress }) => { switch (action) { case 'approve-provider-request': isEnabled = true - window.postMessage({ type: 'ethereumprovider' }, '*') + window.postMessage({ type: 'ethereumprovider', selectedAddress }, '*') + break + case 'approve-legacy-provider-request': + isEnabled = true + window.postMessage({ type: 'ethereumproviderlegacy', selectedAddress }, '*') break case 'reject-provider-request': window.postMessage({ type: 'ethereumprovider', error: 'User rejected provider access' }, '*') -- cgit v1.2.3 From f6e042b7b12fec755b0a91ff24a1e812f65b638d Mon Sep 17 00:00:00 2001 From: Paul Bouchon Date: Wed, 14 Nov 2018 13:12:19 -0500 Subject: 1102: use meta title if it exists before title --- app/scripts/contentscript.js | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app/scripts/contentscript.js') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index ee38ee3ab..92e382ea5 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -302,6 +302,11 @@ function getSiteName (window) { return siteName.content } + const metaTitle = document.querySelector('head > meta[name="title"]') + if (metaTitle) { + return metaTitle.content + } + return document.title } -- cgit v1.2.3