From 75f9109cf4ab4c4daa0692a84a8a2f53e2eaae46 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 3 Apr 2020 13:06:25 +0200 Subject: [PATCH] Remove extensionizer indirection (#309) * Remove extensionizer indirection * Slight duplication * Chrome mock * Update package.json * chrome types, chrome import --- __mocks__/{extensionizer.ts => chrome.ts} | 3 +++ jest.config.js | 5 +++-- packages/extension-base/package.json | 3 +-- .../src/background/handlers/Extension.test.ts | 2 ++ .../src/background/handlers/Extension.ts | 6 +++--- .../src/background/handlers/State.ts | 12 ++++++------ .../MetadataStore.ts => stores/Metadata.ts} | 16 ++++++++-------- .../src/background/stores/index.ts | 5 +++++ packages/extension-base/src/chrome.ts | 11 +++++++++++ .../src/Popup/Accounts/Account.test.tsx | 2 ++ .../src/Popup/Authorize/Authorize.test.tsx | 2 ++ .../Popup/CreateAccount/CreateAccount.test.tsx | 2 ++ packages/extension-ui/src/Popup/Export.test.tsx | 2 ++ .../src/Popup/Signing/Signing.test.tsx | 2 ++ packages/extension-ui/src/messaging.test.ts | 6 ++++-- packages/extension-ui/src/messaging.ts | 4 ++-- .../extension-ui/src/partials/Header.test.tsx | 2 ++ packages/extension/src/background.ts | 7 +++---- packages/extension/src/content.ts | 6 +++--- packages/extension/src/extensionizer.d.ts | 11 ----------- yarn.lock | 1 - 21 files changed, 66 insertions(+), 44 deletions(-) rename __mocks__/{extensionizer.ts => chrome.ts} (88%) rename packages/extension-base/src/background/{handlers/MetadataStore.ts => stores/Metadata.ts} (70%) create mode 100644 packages/extension-base/src/background/stores/index.ts create mode 100644 packages/extension-base/src/chrome.ts delete mode 100644 packages/extension/src/extensionizer.d.ts diff --git a/__mocks__/extensionizer.ts b/__mocks__/chrome.ts similarity index 88% rename from __mocks__/extensionizer.ts rename to __mocks__/chrome.ts index e4fe59c4..72846f52 100644 --- a/__mocks__/extensionizer.ts +++ b/__mocks__/chrome.ts @@ -29,4 +29,7 @@ const messagingFake = new MessagingFake(); chrome.runtime.connect.returns(messagingFake); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).chrome = chrome; + export default chrome; diff --git a/jest.config.js b/jest.config.js index 5ea51329..aa772402 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,9 +12,10 @@ module.exports = Object.assign({}, config, { }, modulePathIgnorePatterns: [ '/packages/extension/build', - '/packages/extension-ui/build', + '/packages/extension-base/build', '/packages/extension-chains/build', + '/packages/extension-dapp/build', '/packages/extension-inject/build', - '/packages/extension-dapp/build' + '/packages/extension-ui/build' ] }); diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index f622cbfe..258ff459 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -8,7 +8,6 @@ "@babel/runtime": "^7.9.2", "@polkadot/api": "^1.9.1", "@polkadot/keyring": "^2.7.1", - "@polkadot/ui-keyring": "^0.52.0-beta.22", - "extensionizer": "^1.0.1" + "@polkadot/ui-keyring": "^0.52.0-beta.22" } } diff --git a/packages/extension-base/src/background/handlers/Extension.test.ts b/packages/extension-base/src/background/handlers/Extension.test.ts index 6c67ec58..b78ff0aa 100644 --- a/packages/extension-base/src/background/handlers/Extension.test.ts +++ b/packages/extension-base/src/background/handlers/Extension.test.ts @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../../__mocks__/chrome'; + import keyring from '@polkadot/ui-keyring'; import ExtensionStore from '@polkadot/ui-keyring/stores/Extension'; import { cryptoWaitReady } from '@polkadot/util-crypto'; diff --git a/packages/extension-base/src/background/handlers/Extension.ts b/packages/extension-base/src/background/handlers/Extension.ts index 46859127..03e12c22 100644 --- a/packages/extension-base/src/background/handlers/Extension.ts +++ b/packages/extension-base/src/background/handlers/Extension.ts @@ -6,7 +6,6 @@ import { MetadataDef } from '@polkadot/extension-inject/types'; import { SubjectInfo } from '@polkadot/ui-keyring/observable/types'; import { AccountJson, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountCreateExternal, RequestAccountCreateSuri, RequestAccountEdit, RequestAccountExport, RequestAccountValidate, RequestAuthorizeApprove, RequestAuthorizeReject, RequestDeriveCreate, ResponseDeriveValidate, RequestMetadataApprove, RequestMetadataReject, RequestSigningApprovePassword, RequestSigningApproveSignature, RequestSigningCancel, RequestSeedCreate, RequestTypes, ResponseAccountExport, RequestAccountForget, ResponseSeedCreate, RequestSeedValidate, RequestDeriveValidate, ResponseSeedValidate, ResponseType, SigningRequest } from '../types'; -import extension from 'extensionizer'; import keyring from '@polkadot/ui-keyring'; import accountsObservable from '@polkadot/ui-keyring/observable/accounts'; import { TypeRegistry } from '@polkadot/types'; @@ -14,6 +13,7 @@ import { KeyringPair, KeyringPair$Meta } from '@polkadot/keyring/types'; import { assert, isHex } from '@polkadot/util'; import { keyExtractSuri, mnemonicGenerate, mnemonicValidate } from '@polkadot/util-crypto'; +import chrome from '../../chrome'; import State from './State'; import { createSubscription, unsubscribe } from './subscriptions'; @@ -270,8 +270,8 @@ export default class Extension { } private windowOpen (): boolean { - extension.tabs.create({ - url: extension.extension.getURL('index.html') + chrome.tabs.create({ + url: chrome.extension.getURL('index.html') }); return true; diff --git a/packages/extension-base/src/background/handlers/State.ts b/packages/extension-base/src/background/handlers/State.ts index 120af6a8..4af8b6e6 100644 --- a/packages/extension-base/src/background/handlers/State.ts +++ b/packages/extension-base/src/background/handlers/State.ts @@ -7,11 +7,11 @@ import { ProviderMeta, MetadataDef } from '@polkadot/extension-inject/types'; import { JsonRpcResponse, ProviderInterface, ProviderInterfaceCallback } from '@polkadot/rpc-provider/types'; import { AccountJson, AuthorizeRequest, MetadataRequest, RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestSign, ResponseRpcListProviders, ResponseSigning, SigningRequest, RequestRpcUnsubscribe } from '../types'; -import extension from 'extensionizer'; import { BehaviorSubject } from 'rxjs'; import { assert } from '@polkadot/util'; -import MetadataStore from './MetadataStore'; +import chrome from '../../chrome'; +import { MetadataStore } from '../stores'; interface AuthRequest { id: string; @@ -65,7 +65,7 @@ const WINDOW_OPTS = { left: 150, top: 150, type: 'popup', - url: extension.extension.getURL('index.html'), + url: chrome.extension.getURL('index.html'), width: 480 }; @@ -144,13 +144,13 @@ export default class State { private popupClose (): void { this.#windows.forEach((id: number): void => - extension.windows.remove(id) + chrome.windows.remove(id) ); this.#windows = []; } private popupOpen (): void { - extension.windows.create({ ...WINDOW_OPTS }, (window?: chrome.windows.Window): void => { + chrome.windows.create({ ...WINDOW_OPTS }, (window?: chrome.windows.Window): void => { if (window) { this.#windows.push(window.id); } @@ -215,7 +215,7 @@ export default class State { : (signCount ? `${signCount}` : '') ); - extension.browserAction.setBadgeText({ text }); + chrome.browserAction.setBadgeText({ text }); if (shouldClose && text === '') { this.popupClose(); diff --git a/packages/extension-base/src/background/handlers/MetadataStore.ts b/packages/extension-base/src/background/stores/Metadata.ts similarity index 70% rename from packages/extension-base/src/background/handlers/MetadataStore.ts rename to packages/extension-base/src/background/stores/Metadata.ts index 408c4a6b..e3c23451 100644 --- a/packages/extension-base/src/background/handlers/MetadataStore.ts +++ b/packages/extension-base/src/background/stores/Metadata.ts @@ -4,23 +4,23 @@ import { MetadataDef } from '@polkadot/extension-inject/types'; -import extension from 'extensionizer'; +import chrome from '@polkadot/extension-base/chrome'; // eslint-disable-next-line @typescript-eslint/no-explicit-any type StoreValue = Record; const lastError = (type: string): void => { - const error = extension.runtime.lastError; + const error = chrome.runtime.lastError; if (error) { - console.error(`ChainStore.${type}:: runtime.lastError:`, error); + console.error(`MetadataStore.${type}:: runtime.lastError:`, error); } }; -export default class Store { +export default class MetadataStore { public all (cb: (key: string, value: MetadataDef) => void): void { // eslint-disable-next-line @typescript-eslint/no-explicit-any - extension.storage.local.get(null, (result: StoreValue): void => { + chrome.storage.local.get(null, (result: StoreValue): void => { lastError('all'); Object.entries(result).forEach(([key, value]): void => { @@ -30,7 +30,7 @@ export default class Store { } public get (key: string, cb: (value: MetadataDef) => void): void { - extension.storage.local.get([key], (result: StoreValue): void => { + chrome.storage.local.get([key], (result: StoreValue): void => { lastError('get'); cb(result[key]); @@ -38,7 +38,7 @@ export default class Store { } public remove (key: string, cb?: () => void): void { - extension.storage.local.remove(key, (): void => { + chrome.storage.local.remove(key, (): void => { lastError('remove'); cb && cb(); @@ -46,7 +46,7 @@ export default class Store { } public set (key: string, value: MetadataDef, cb?: () => void): void { - extension.storage.local.set({ [key]: value }, (): void => { + chrome.storage.local.set({ [key]: value }, (): void => { lastError('set'); cb && cb(); diff --git a/packages/extension-base/src/background/stores/index.ts b/packages/extension-base/src/background/stores/index.ts new file mode 100644 index 00000000..6b78dc90 --- /dev/null +++ b/packages/extension-base/src/background/stores/index.ts @@ -0,0 +1,5 @@ +// Copyright 2019 @polkadot/extension-chains authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +export { default as MetadataStore } from './Metadata'; diff --git a/packages/extension-base/src/chrome.ts b/packages/extension-base/src/chrome.ts new file mode 100644 index 00000000..2ef0773c --- /dev/null +++ b/packages/extension-base/src/chrome.ts @@ -0,0 +1,11 @@ +// Copyright 2019 @polkadot/extension-chains authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +const extension = typeof chrome !== 'undefined' + ? chrome + : typeof browser !== 'undefined' + ? browser + : null; + +export default extension as typeof chrome; diff --git a/packages/extension-ui/src/Popup/Accounts/Account.test.tsx b/packages/extension-ui/src/Popup/Accounts/Account.test.tsx index b56fa9a5..9777609a 100644 --- a/packages/extension-ui/src/Popup/Accounts/Account.test.tsx +++ b/packages/extension-ui/src/Popup/Accounts/Account.test.tsx @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../../__mocks__/chrome'; + import Adapter from 'enzyme-adapter-react-16'; import { configure, mount, ReactWrapper } from 'enzyme'; import { themes, Theme } from '@polkadot/extension-ui/components'; diff --git a/packages/extension-ui/src/Popup/Authorize/Authorize.test.tsx b/packages/extension-ui/src/Popup/Authorize/Authorize.test.tsx index 1f021e14..536e7536 100644 --- a/packages/extension-ui/src/Popup/Authorize/Authorize.test.tsx +++ b/packages/extension-ui/src/Popup/Authorize/Authorize.test.tsx @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../../__mocks__/chrome'; + import { AuthorizeRequest } from '@polkadot/extension-base/background/types'; import { configure, mount, ReactWrapper } from 'enzyme'; diff --git a/packages/extension-ui/src/Popup/CreateAccount/CreateAccount.test.tsx b/packages/extension-ui/src/Popup/CreateAccount/CreateAccount.test.tsx index 25a38094..8863378c 100644 --- a/packages/extension-ui/src/Popup/CreateAccount/CreateAccount.test.tsx +++ b/packages/extension-ui/src/Popup/CreateAccount/CreateAccount.test.tsx @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../../__mocks__/chrome'; + import { configure, mount, ReactWrapper } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import React from 'react'; diff --git a/packages/extension-ui/src/Popup/Export.test.tsx b/packages/extension-ui/src/Popup/Export.test.tsx index 3a37d723..2411e1a9 100644 --- a/packages/extension-ui/src/Popup/Export.test.tsx +++ b/packages/extension-ui/src/Popup/Export.test.tsx @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../__mocks__/chrome'; + import { act } from 'react-dom/test-utils'; import Adapter from 'enzyme-adapter-react-16'; import { configure, mount, ReactWrapper } from 'enzyme'; diff --git a/packages/extension-ui/src/Popup/Signing/Signing.test.tsx b/packages/extension-ui/src/Popup/Signing/Signing.test.tsx index 3d5028c2..98bb62a2 100644 --- a/packages/extension-ui/src/Popup/Signing/Signing.test.tsx +++ b/packages/extension-ui/src/Popup/Signing/Signing.test.tsx @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../../__mocks__/chrome'; + import React, { useState } from 'react'; import Adapter from 'enzyme-adapter-react-16'; diff --git a/packages/extension-ui/src/messaging.test.ts b/packages/extension-ui/src/messaging.test.ts index 1102fc34..5eedfa29 100644 --- a/packages/extension-ui/src/messaging.test.ts +++ b/packages/extension-ui/src/messaging.test.ts @@ -2,9 +2,11 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../__mocks__/chrome'; + import Adapter from 'enzyme-adapter-react-16'; import { configure } from 'enzyme'; -import extensionizer from 'extensionizer'; +import chrome from '@polkadot/extension-base/chrome'; import { exportAccount } from './messaging'; @@ -14,7 +16,7 @@ describe('messaging sends message to background via extension port for', () => { test('exportAccount', () => { const callback = jest.fn(); - extensionizer.runtime.connect().onMessage.addListener(callback); + chrome.runtime.connect().onMessage.addListener(callback); exportAccount('HjoBp62cvsWDA3vtNMWxz6c9q13ReEHi9UGHK7JbZweH5g5', 'passw0rd'); expect(callback).toHaveBeenCalledWith( diff --git a/packages/extension-ui/src/messaging.ts b/packages/extension-ui/src/messaging.ts index 8e36d239..eb81a83d 100644 --- a/packages/extension-ui/src/messaging.ts +++ b/packages/extension-ui/src/messaging.ts @@ -6,8 +6,8 @@ import { AccountJson, AuthorizeRequest, SigningRequest, RequestTypes, MessageTyp import { Chain } from '@polkadot/extension-chains/types'; import { KeypairType } from '@polkadot/util-crypto/types'; -import extension from 'extensionizer'; import { PORT_EXTENSION } from '@polkadot/extension-base/defaults'; +import chrome from '@polkadot/extension-base/chrome'; import { findChain } from '@polkadot/extension-chains'; interface Handler { @@ -20,7 +20,7 @@ interface Handler { type Handlers = Record; -const port = extension.runtime.connect({ name: PORT_EXTENSION }); +const port = chrome.runtime.connect({ name: PORT_EXTENSION }); const handlers: Handlers = {}; let idCounter = 0; diff --git a/packages/extension-ui/src/partials/Header.test.tsx b/packages/extension-ui/src/partials/Header.test.tsx index 0e4952c0..9954c6f1 100644 --- a/packages/extension-ui/src/partials/Header.test.tsx +++ b/packages/extension-ui/src/partials/Header.test.tsx @@ -2,6 +2,8 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +import '../../../../__mocks__/chrome'; + import Adapter from 'enzyme-adapter-react-16'; import { configure, mount, ReactWrapper } from 'enzyme'; import React from 'react'; diff --git a/packages/extension/src/background.ts b/packages/extension/src/background.ts index e803e232..5faeae38 100644 --- a/packages/extension/src/background.ts +++ b/packages/extension/src/background.ts @@ -2,11 +2,10 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import extension from 'extensionizer'; - // Runs in the extension background, handling all keyring access import handlers from '@polkadot/extension-base/background/handlers'; +import chrome from '@polkadot/extension-base/chrome'; import { PORT_CONTENT, PORT_EXTENSION } from '@polkadot/extension-base/defaults'; import keyring from '@polkadot/ui-keyring'; import ExtensionStore from '@polkadot/ui-keyring/stores/Extension'; @@ -14,10 +13,10 @@ import { assert } from '@polkadot/util'; import { cryptoWaitReady } from '@polkadot/util-crypto'; // setup the notification (same a FF default background, white text) -extension.browserAction.setBadgeBackgroundColor({ color: '#d90000' }); +chrome.browserAction.setBadgeBackgroundColor({ color: '#d90000' }); // listen to all messages and handle appropriately -extension.runtime.onConnect.addListener((port): void => { +chrome.runtime.onConnect.addListener((port): void => { // shouldn't happen, however... only listen to what we know about assert([PORT_CONTENT, PORT_EXTENSION].includes(port.name), `Unknown connection from ${port.name}`); diff --git a/packages/extension/src/content.ts b/packages/extension/src/content.ts index d2918892..0058ae6c 100644 --- a/packages/extension/src/content.ts +++ b/packages/extension/src/content.ts @@ -2,11 +2,11 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import extension from 'extensionizer'; +import chrome from '@polkadot/extension-base/chrome'; import { PORT_CONTENT } from '@polkadot/extension-base/defaults'; // connect to the extension -const port = extension.runtime.connect({ name: PORT_CONTENT }); +const port = chrome.runtime.connect({ name: PORT_CONTENT }); // send any messages from the extension back to the page port.onMessage.addListener((data): void => { @@ -26,7 +26,7 @@ window.addEventListener('message', ({ data, source }): void => { // inject our data injector const script = document.createElement('script'); -script.src = extension.extension.getURL('page.js'); +script.src = chrome.extension.getURL('page.js'); script.onload = (): void => { // remove the injecting tag when loaded diff --git a/packages/extension/src/extensionizer.d.ts b/packages/extension/src/extensionizer.d.ts deleted file mode 100644 index e981108c..00000000 --- a/packages/extension/src/extensionizer.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019-2020 @polkadot/extension authors & contributors -// This software may be modified and distributed under the terms -// of the Apache-2.0 license. See the LICENSE file for details. - -/// - -declare module 'extensionizer' { - const extensionizer: typeof chrome; - - export default extensionizer; -} diff --git a/yarn.lock b/yarn.lock index 362a71e4..15d555b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2869,7 +2869,6 @@ __metadata: "@polkadot/api": ^1.9.1 "@polkadot/keyring": ^2.7.1 "@polkadot/ui-keyring": ^0.52.0-beta.22 - extensionizer: ^1.0.1 languageName: unknown linkType: soft