diff --git a/packages/extension-base/src/background/handlers/Extension.ts b/packages/extension-base/src/background/handlers/Extension.ts index f198daea..febe0e72 100644 --- a/packages/extension-base/src/background/handlers/Extension.ts +++ b/packages/extension-base/src/background/handlers/Extension.ts @@ -9,13 +9,13 @@ import type { KeypairType } from '@polkadot/util-crypto/types'; import type { AccountJson, AllowedPath, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountBatchExport, RequestAccountChangePassword, RequestAccountCreateExternal, RequestAccountCreateHardware, RequestAccountCreateSuri, RequestAccountEdit, RequestAccountExport, RequestAccountForget, RequestAccountShow, RequestAccountTie, RequestAccountValidate, RequestAuthorizeApprove, RequestAuthorizeReject, RequestBatchRestore, RequestDeriveCreate, RequestDeriveValidate, RequestJsonRestore, RequestMetadataApprove, RequestMetadataReject, RequestSeedCreate, RequestSeedValidate, RequestSigningApprovePassword, RequestSigningApproveSignature, RequestSigningCancel, RequestSigningIsLocked, RequestTypes, ResponseAccountExport, ResponseAccountsExport, ResponseAuthorizeList, ResponseDeriveValidate, ResponseJsonGetAccountInfo, ResponseSeedCreate, ResponseSeedValidate, ResponseSigningIsLocked, ResponseType, SigningRequest } from '../types'; import { ALLOWED_PATH, PASSWORD_EXPIRY_MS } from '@polkadot/extension-base/defaults'; -import chrome from '@polkadot/extension-inject/chrome'; import { TypeRegistry } from '@polkadot/types'; import keyring from '@polkadot/ui-keyring'; import { accounts as accountsObservable } from '@polkadot/ui-keyring/observable/accounts'; import { assert, isHex } from '@polkadot/util'; import { keyExtractSuri, mnemonicGenerate, mnemonicValidate } from '@polkadot/util-crypto'; +import { withErrorLog } from './helpers'; import State from './State'; import { createSubscription, unsubscribe } from './subscriptions'; @@ -457,10 +457,7 @@ export default class Extension { return false; } - console.log('open', url); - - // eslint-disable-next-line no-void - void chrome.tabs.create({ url }); + withErrorLog(() => chrome.tabs.create({ url })); return true; } diff --git a/packages/extension-base/src/background/handlers/State.ts b/packages/extension-base/src/background/handlers/State.ts index 721ea817..7d982e1a 100644 --- a/packages/extension-base/src/background/handlers/State.ts +++ b/packages/extension-base/src/background/handlers/State.ts @@ -9,11 +9,11 @@ import { BehaviorSubject } from 'rxjs'; import { getId } from '@polkadot/extension-base/utils/getId'; import { addMetadata, knownMetadata } from '@polkadot/extension-chains'; -import chrome from '@polkadot/extension-inject/chrome'; import settings from '@polkadot/ui-settings'; import { assert } from '@polkadot/util'; import { MetadataStore } from '../../stores'; +import { withErrorLog } from './helpers'; interface Resolver { reject: (error: Error) => void; @@ -165,9 +165,8 @@ export default class State { } private popupClose (): void { - this.#windows.forEach((id: number): void => - // eslint-disable-next-line no-void - void chrome.windows.remove(id) + this.#windows.forEach((id: number) => + withErrorLog(() => chrome.windows.remove(id)) ); this.#windows = []; } @@ -275,8 +274,7 @@ export default class State { : (signCount ? `${signCount}` : '') ); - // eslint-disable-next-line no-void - void chrome.browserAction.setBadgeText({ text }); + withErrorLog(() => chrome.browserAction.setBadgeText({ text })); if (shouldClose && text === '') { this.popupClose(); @@ -411,7 +409,7 @@ export default class State { const provider = this.#injectedProviders.get(port); if (provider) { - provider.disconnect().catch(console.error); + withErrorLog(() => provider.disconnect()); } this.#injectedProviders.delete(port); diff --git a/packages/extension-base/src/background/handlers/Tabs.ts b/packages/extension-base/src/background/handlers/Tabs.ts index 8e51e8a5..a1666228 100644 --- a/packages/extension-base/src/background/handlers/Tabs.ts +++ b/packages/extension-base/src/background/handlers/Tabs.ts @@ -17,6 +17,7 @@ import { assert, isNumber } from '@polkadot/util'; import RequestBytesSign from '../RequestBytesSign'; import RequestExtrinsicSign from '../RequestExtrinsicSign'; +import { withErrorLog } from './helpers'; import State from './State'; import { createSubscription, unsubscribe } from './subscriptions'; @@ -118,7 +119,7 @@ export default class Tabs { port.onDisconnect.addListener((): void => { unsubscribe(id); - this.rpcUnsubscribe({ ...request, subscriptionId }, port).catch(console.error); + withErrorLog(() => this.rpcUnsubscribe({ ...request, subscriptionId }, port)); }); return true; @@ -151,8 +152,7 @@ export default class Tabs { .map(({ id }) => id) .filter((id): id is number => isNumber(id)) .forEach((id) => - // eslint-disable-next-line no-void - void chrome.tabs.update(id, { url }) + withErrorLog(() => chrome.tabs.update(id, { url })) ); }); } diff --git a/packages/extension-base/src/background/handlers/helpers.ts b/packages/extension-base/src/background/handlers/helpers.ts new file mode 100644 index 00000000..7e230294 --- /dev/null +++ b/packages/extension-base/src/background/handlers/helpers.ts @@ -0,0 +1,14 @@ +// Copyright 2019-2021 @polkadot/extension authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export function withErrorLog (fn: () => unknown): void { + try { + const p = fn(); + + if (p && typeof p === 'object' && typeof (p as Promise).catch === 'function') { + (p as Promise).catch(console.error); + } + } catch (e) { + console.error(e); + } +} diff --git a/packages/extension-base/src/stores/Base.ts b/packages/extension-base/src/stores/Base.ts index 835b8225..47b52f5a 100644 --- a/packages/extension-base/src/stores/Base.ts +++ b/packages/extension-base/src/stores/Base.ts @@ -1,8 +1,6 @@ // Copyright 2019-2021 @polkadot/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 -import chrome from '@polkadot/extension-inject/chrome'; - type StoreValue = Record; const lastError = (type: string): void => { diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index a1663e61..a7e8eabf 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -12,7 +12,7 @@ "type": "git", "url": "https://github.com/polkadot-js/extension.git" }, - "sideEffects": false, + "sideEffects": true, "type": "module", "version": "0.41.3-7", "main": "index.js", diff --git a/packages/extension-inject/src/chrome.ts b/packages/extension-inject/src/chrome.ts deleted file mode 100644 index bae320fe..00000000 --- a/packages/extension-inject/src/chrome.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019-2021 @polkadot/extension-inject authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -const extension = typeof chrome !== 'undefined' - ? chrome - : typeof browser !== 'undefined' - ? browser - : null; - -export default extension as typeof chrome; diff --git a/packages/extension-inject/src/crossenv.ts b/packages/extension-inject/src/crossenv.ts new file mode 100644 index 00000000..101e33b0 --- /dev/null +++ b/packages/extension-inject/src/crossenv.ts @@ -0,0 +1,6 @@ +// Copyright 2019-2021 @polkadot/extension-inject authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +if (typeof chrome === 'undefined') { + self.chrome = self.browser as unknown as typeof chrome; +} diff --git a/packages/extension-ui/src/components/Address.tsx b/packages/extension-ui/src/components/Address.tsx index 88752caf..25512e40 100644 --- a/packages/extension-ui/src/components/Address.tsx +++ b/packages/extension-ui/src/components/Address.tsx @@ -111,32 +111,20 @@ function Address ({ actions, address, children, className, genesisHash, isExtern useEffect((): void => { if (!address) { - setRecoded(defaultRecoded); - - return; + return setRecoded(defaultRecoded); } - const accountByAddress = findAccountByAddress(accounts, address); - - console.log( - address, - ( - chain?.definition.chainType === 'ethereum' || - accountByAddress?.type === 'ethereum' || - (!accountByAddress && givenType === 'ethereum') - ) - ? { account: accountByAddress, formatted: address, type: 'ethereum' } - : recodeAddress(address, accounts, chain, settings) - ); + const account = findAccountByAddress(accounts, address); setRecoded( ( chain?.definition.chainType === 'ethereum' || - accountByAddress?.type === 'ethereum' || - (!accountByAddress && givenType === 'ethereum') + account?.type === 'ethereum' || + (!account && givenType === 'ethereum') ) - ? { account: accountByAddress, formatted: address, type: 'ethereum' } - : recodeAddress(address, accounts, chain, settings)); + ? { account, formatted: address, type: 'ethereum' } + : recodeAddress(address, accounts, chain, settings) + ); }, [accounts, address, chain, givenType, settings]); useEffect(() => { diff --git a/packages/extension-ui/src/messaging.test.ts b/packages/extension-ui/src/messaging.test.ts index fa9e99da..32a660dc 100644 --- a/packages/extension-ui/src/messaging.test.ts +++ b/packages/extension-ui/src/messaging.test.ts @@ -6,8 +6,6 @@ import '../../../__mocks__/chrome'; import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; import { configure } from 'enzyme'; -import chrome from '@polkadot/extension-inject/chrome'; - import { exportAccount } from './messaging'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call diff --git a/packages/extension-ui/src/messaging.ts b/packages/extension-ui/src/messaging.ts index a41b808f..e2ce1000 100644 --- a/packages/extension-ui/src/messaging.ts +++ b/packages/extension-ui/src/messaging.ts @@ -12,7 +12,6 @@ import type { KeypairType } from '@polkadot/util-crypto/types'; import { PORT_EXTENSION } from '@polkadot/extension-base/defaults'; import { getId } from '@polkadot/extension-base/utils/getId'; import { metadataExpand } from '@polkadot/extension-chains'; -import chrome from '@polkadot/extension-inject/chrome'; import { MetadataDef } from '@polkadot/extension-inject/types'; import allChains from './util/chains'; diff --git a/packages/extension/src/background.ts b/packages/extension/src/background.ts index c45688ef..111364ea 100644 --- a/packages/extension/src/background.ts +++ b/packages/extension/src/background.ts @@ -3,19 +3,20 @@ // Runs in the extension background, handling all keyring access +import '@polkadot/extension-inject/crossenv'; + import type { RequestSignatures, TransportRequestMessage } from '@polkadot/extension-base/background/types'; import handlers from '@polkadot/extension-base/background/handlers'; +import { withErrorLog } from '@polkadot/extension-base/background/handlers/helpers'; import { PORT_CONTENT, PORT_EXTENSION } from '@polkadot/extension-base/defaults'; import { AccountsStore } from '@polkadot/extension-base/stores'; -import chrome from '@polkadot/extension-inject/chrome'; import keyring from '@polkadot/ui-keyring'; import { assert } from '@polkadot/util'; import { cryptoWaitReady } from '@polkadot/util-crypto'; // setup the notification (same a FF default background, white text) -// eslint-disable-next-line no-void -void chrome.browserAction.setBadgeBackgroundColor({ color: '#d90000' }); +withErrorLog(() => chrome.browserAction.setBadgeBackgroundColor({ color: '#d90000' })); // listen to all messages and handle appropriately chrome.runtime.onConnect.addListener((port): void => { diff --git a/packages/extension/src/content.ts b/packages/extension/src/content.ts index 3f16d5bb..5efdad3a 100644 --- a/packages/extension/src/content.ts +++ b/packages/extension/src/content.ts @@ -1,10 +1,11 @@ // Copyright 2019-2021 @polkadot/extension authors & contributors // SPDX-License-Identifier: Apache-2.0 +import '@polkadot/extension-inject/crossenv'; + import type { Message } from '@polkadot/extension-base/types'; import { MESSAGE_ORIGIN_CONTENT, MESSAGE_ORIGIN_PAGE, PORT_CONTENT } from '@polkadot/extension-base/defaults'; -import chrome from '@polkadot/extension-inject/chrome'; // connect to the extension const port = chrome.runtime.connect({ name: PORT_CONTENT }); diff --git a/packages/extension/src/extension.ts b/packages/extension/src/extension.ts index 99b8d1a9..72e288f4 100644 --- a/packages/extension/src/extension.ts +++ b/packages/extension/src/extension.ts @@ -1,6 +1,8 @@ // Copyright 2019-2021 @polkadot/extension authors & contributors // SPDX-License-Identifier: Apache-2.0 +import '@polkadot/extension-inject/crossenv'; + import { createView, Popup } from '@polkadot/extension-ui'; createView(Popup); diff --git a/packages/extension/src/page.ts b/packages/extension/src/page.ts index c1817488..72673f81 100644 --- a/packages/extension/src/page.ts +++ b/packages/extension/src/page.ts @@ -1,6 +1,8 @@ // Copyright 2019-2021 @polkadot/extension authors & contributors // SPDX-License-Identifier: Apache-2.0 +import '@polkadot/extension-inject/crossenv'; + import type { RequestSignatures, TransportRequestMessage } from '@polkadot/extension-base/background/types'; import type { Message } from '@polkadot/extension-base/types';