EIP-1102: Update publicConfig store concurrently with approval

feature/default_network_editable
Paul Bouchon 6 years ago committed by Dan Finlay
parent 782c2c14d4
commit c317624854
  1. 8
      app/scripts/contentscript.js
  2. 10
      app/scripts/controllers/provider-approval.js
  3. 36
      app/scripts/inpage.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) { switch (action) {
case 'approve-provider-request': case 'approve-provider-request':
isEnabled = true 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 break
case 'reject-provider-request': case 'reject-provider-request':
window.postMessage({ type: 'ethereumprovider', error: 'User rejected provider access' }, '*') window.postMessage({ type: 'ethereumprovider', error: 'User rejected provider access' }, '*')

@ -88,7 +88,10 @@ class ProviderApprovalController {
_handlePrivacyRequest () { _handlePrivacyRequest () {
const privacyMode = this.preferencesController.getFeatureFlags().privacyMode const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
if (!privacyMode) { if (!privacyMode) {
this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) this.platform && this.platform.sendMessage({
action: 'approve-legacy-provider-request',
selectedAddress: this.publicConfigStore.getState().selectedAddress,
}, { active: true })
this.publicConfigStore.emit('update', this.publicConfigStore.getState()) this.publicConfigStore.emit('update', this.publicConfigStore.getState())
} }
} }
@ -101,7 +104,10 @@ class ProviderApprovalController {
approveProviderRequest (origin) { approveProviderRequest (origin) {
this.closePopup && this.closePopup() this.closePopup && this.closePopup()
const requests = this.store.getState().providerRequests || [] const requests = this.store.getState().providerRequests || []
this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) this.platform && this.platform.sendMessage({
action: 'approve-provider-request',
selectedAddress: this.publicConfigStore.getState().selectedAddress,
}, { active: true })
this.publicConfigStore.emit('update', this.publicConfigStore.getState()) this.publicConfigStore.emit('update', this.publicConfigStore.getState())
const providerRequests = requests.filter(request => request.origin !== origin) const providerRequests = requests.filter(request => request.origin !== origin)
this.store.updateState({ providerRequests }) this.store.updateState({ providerRequests })

@ -56,45 +56,31 @@ inpageProvider.setMaxListeners(100)
// set up a listener for when MetaMask is locked // set up a listener for when MetaMask is locked
onMessage('metamasksetlocked', () => { isEnabled = false }) onMessage('metamasksetlocked', () => { isEnabled = false })
// set up a listener for privacy mode responses
onMessage('ethereumproviderlegacy', ({ data: { selectedAddress } }) => {
isEnabled = true
inpageProvider.publicConfigStore.updateState({ selectedAddress })
}, true)
// augment the provider with its enable method // augment the provider with its enable method
inpageProvider.enable = function ({ force } = {}) { inpageProvider.enable = function ({ force } = {}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
providerHandle = ({ data: { error } }) => { providerHandle = ({ data: { error, selectedAddress } }) => {
if (typeof error !== 'undefined') { if (typeof error !== 'undefined') {
reject(error) reject(error)
} else { } else {
window.removeEventListener('message', providerHandle) window.removeEventListener('message', providerHandle)
// wait for the publicConfig store to populate with an account inpageProvider.publicConfigStore.updateState({ selectedAddress })
const publicConfig = new Promise((resolve) => {
const { selectedAddress } = inpageProvider.publicConfigStore.getState()
inpageProvider._metamask.isUnlocked().then(unlocked => {
if (!unlocked || selectedAddress) {
resolve()
} else {
inpageProvider.publicConfigStore.on('update', ({ selectedAddress }) => {
selectedAddress && resolve()
})
}
})
})
// wait for the background to update with an account // wait for the background to update with an account
const ethAccounts = new Promise((resolveAccounts, rejectAccounts) => {
inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => { inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
if (error) { if (error) {
rejectAccounts(error) reject(error)
} else { } else {
resolveAccounts(response.result)
}
})
})
Promise.all([ethAccounts, publicConfig])
.then(([selectedAddress]) => {
isEnabled = true isEnabled = true
resolve(selectedAddress) resolve(response.result)
}
}) })
.catch(reject)
} }
} }
onMessage('ethereumprovider', providerHandle, true) onMessage('ethereumprovider', providerHandle, true)

Loading…
Cancel
Save