From 289f91ba01b59e909bfdccc94ade6f77b7fd086a Mon Sep 17 00:00:00 2001 From: Snuupy Date: Wed, 12 Jun 2019 02:40:33 -0700 Subject: [PATCH 1/4] test cases --- .../events/cosmeticFilterEvents_test.ts | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts diff --git a/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts b/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts new file mode 100644 index 000000000000..4236ae817627 --- /dev/null +++ b/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts @@ -0,0 +1,192 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this file, +* You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import * as sinon from 'sinon' +// import actions from '../../../../brave_extension/extension/brave_extension/background/actions/cosmeticFilterActions' +import { ChromeEvent } from '../../../testData' +// import '../../../../brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents' +// import { rule, onSelectorReturned } from '../../../../brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents' +import cosmeticFilterActions from '../../../../brave_extension/extension/brave_extension/background/actions/cosmeticFilterActions' +import * as cosmeticFilterEvents from '../../../../brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents' +interface ContextMenuClickedEvent extends chrome.events.Event<(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void> { + emit: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void +} + +// let msg = { baseURI: 'brave.com' } +// interface ContextMenuClickedEvent extends chrome.events.Event<(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void> { +// emit: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void +// } + +let lastInputText: string +let lastPromptText: string +let selectorToReturn: string + +global.prompt = (inputText: string, promptText: string) => { + lastInputText = inputText + lastPromptText = promptText + return selectorToReturn +} + +describe('cosmeticFilterEvents events', () => { + describe('when runtime.onMessage is received', () => { + describe('contextMenuOpened', () => { + it('assigns the base URI', () => { + chrome.runtime.sendMessage({ type: 'contextMenuOpened', baseURI: 'brave.com' }, + () => { + expect(cosmeticFilterEvents.rule.host).toBe('brave.com') + }) + }) + }) + }) + + describe('chrome.contextMenus.onClicked listener', () => { + let contextMenuOnClickedSpy: jest.SpyInstance + let chromeTabsQuerySpy: jest.SpyInstance + let resetSiteFilterSettingsSpy: jest.SpyInstance + let resetAllFilterSettingsSpy: jest.SpyInstance + let chromeTabsSendMessageSpy: jest.SpyInstance + beforeEach(() => { + contextMenuOnClickedSpy = jest.spyOn(chrome.tabs, 'create') + chromeTabsQuerySpy = jest.spyOn(chrome.tabs, 'query') + resetSiteFilterSettingsSpy = jest.spyOn(cosmeticFilterActions, 'siteCosmeticFilterRemoved') + resetAllFilterSettingsSpy = jest.spyOn(cosmeticFilterActions, 'allCosmeticFiltersRemoved') + chromeTabsSendMessageSpy = jest.spyOn(chrome.tabs, 'sendMessage') + // const chromeTabsSendMessageCallback = chromeTabsSendMessageSpy.mock.calls[0][2] + // chromeTabsSendMessageCallback() + }) + afterEach(() => { + contextMenuOnClickedSpy.mockRestore() + chromeTabsSendMessageSpy.mockRestore() + }) + + describe('addBlockElement', function () { + it('triggers addBlockElement action (query call)', function () { + const info: chrome.contextMenus.OnClickData = { menuItemId: 'addBlockElement', editable: false, pageUrl: 'brave.com' } + // calls query + const tab: chrome.tabs.Tab = { + id: 3, + index: 0, + pinned: false, + highlighted: false, + windowId: 1, + active: true, + incognito: false, + selected: true, + discarded: false, + autoDiscardable: false + } + cosmeticFilterEvents.onContextMenuClicked(info, tab) + expect(chromeTabsQuerySpy).toBeCalled() + }) + it('calls tabsCallback', function () { + const myTab: chrome.tabs.Tab = { + id: 3, + index: 0, + pinned: false, + highlighted: false, + windowId: 1, + active: true, + incognito: false, + selected: true, + discarded: false, + autoDiscardable: false + } + cosmeticFilterEvents.tabsCallback([myTab]) + expect(1).toBe(1) + // expect(chromeTabsSendMessageSpy).toBeCalledWith({ type: 'getTargetSelector' }, cosmeticFilterEvents.onSelectorReturned) + chrome.tabs.sendMessage(myTab.id, { type: 'getTargetSelector' }, cosmeticFilterEvents.onSelectorReturned) + }) + }) + describe('resetSiteFilterSettings', function () { + it('triggers `siteCosmeticFilterRemoved` action', function () { + // mock the prompt since JSDOM doesn't implement it + // window.prompt = jest.fn() + // mock parameters + const info: chrome.contextMenus.OnClickData = { menuItemId: 'resetSiteFilterSettings', editable: false, pageUrl: 'brave.com' } + const tab: chrome.tabs.Tab = { + id: 3, + index: 0, + pinned: false, + highlighted: false, + windowId: 1, + active: true, + incognito: false, + selected: true, + discarded: false, + autoDiscardable: false + } + cosmeticFilterEvents.onContextMenuClicked(info, tab) + expect(resetSiteFilterSettingsSpy).toBeCalled() + }) + }) + describe('resetAllFilterSettings', function () { + it('triggers `allCosmeticFiltersRemoved` action', function () { + const info: chrome.contextMenus.OnClickData = { menuItemId: 'resetAllFilterSettings', editable: false, pageUrl: 'brave.com' } + const tab: chrome.tabs.Tab = { + id: 3, + index: 0, + pinned: false, + highlighted: false, + windowId: 1, + active: true, + incognito: false, + selected: true, + discarded: false, + autoDiscardable: false + } + cosmeticFilterEvents.onContextMenuClicked(info, tab) + expect(resetAllFilterSettingsSpy).toBeCalled() + }) + }) + describe('onSelectorReturned', function () { + describe('when prompting user with selector', function () { + describe('when a selector is returned', function () { + it('calls window.prompt with selector as input', function () { + cosmeticFilterEvents.onSelectorReturned('abc') + expect(lastInputText).toBe('CSS selector:') + expect(lastPromptText).toBe('abc') + }) + }) + describe('when a selector is not returned', function () { + it('calls window.prompt with `not found` message', function () { + cosmeticFilterEvents.onSelectorReturned(null) + expect(lastInputText.indexOf('We were unable to automatically populat') > -1).toBe(true) + }) + }) + }) + describe('after selector prompt is shown', function () { + let insertCssSpy: jest.SpyInstance + beforeEach(() => { + insertCssSpy = jest.spyOn(chrome.tabs, 'insertCSS') + }) + afterEach(() => { + insertCssSpy.mockRestore() + }) + it('calls `chrome.tabs.insertCSS` when selector is NOT null/undefined', function () { + selectorToReturn = '#test_selector' + cosmeticFilterEvents.onSelectorReturned(selectorToReturn) + let returnObj = { + 'code': '#test_selector {display: none;}' + } + expect(insertCssSpy).toBeCalledWith(returnObj) + }) + it('does NOT call `chrome.tabs.insertCSS` when selector is undefined', function () { + selectorToReturn = undefined + cosmeticFilterEvents.onSelectorReturned(undefined) + expect(insertCssSpy).not.toBeCalled() + }) + it('does NOT call `chrome.tabs.insertCSS` when selector is null', function () { + selectorToReturn = null + cosmeticFilterEvents.onSelectorReturned(null) + expect(insertCssSpy).not.toBeCalled() + }) + // it('does NOT call `chrome.tabs.insertCSS` when selector is not a string', function () { + // selectorToReturn = true // NO LINT + // cosmeticFilterEvents.onSelectorReturned(selectorToReturn) + // expect(insertCssSpy).not.toBeCalled() + // }) + }) + }) + }) +}) From c82169b76ac58bd33dfdfcc8ea5ebb7f45b1b85c Mon Sep 17 00:00:00 2001 From: Snuupy Date: Wed, 12 Jun 2019 02:41:04 -0700 Subject: [PATCH 2/4] refactor cosmeticFilterEvents to spy on functions --- .../background/events/cosmeticFilterEvents.ts | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts b/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts index 5e7e8da31f6a..2b1fe026cffb 100644 --- a/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts +++ b/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts @@ -1,6 +1,6 @@ import cosmeticFilterActions from '../actions/cosmeticFilterActions' -let rule = { +export let rule = { host: '', selector: '' } @@ -30,24 +30,28 @@ chrome.contextMenus.create({ parentId: 'brave', contexts: ['all'] }) +// context menu listener emit event -> query -> tabsCallback -> onSelectorReturned -// contextMenu listener - when triggered, grab latest selector -chrome.contextMenus.onClicked.addListener(function (info, tab) { - switch (info.menuItemId) { - case 'addBlockElement': { - chrome.tabs.query({ active: true, currentWindow: true }, function (tabs: any) { - chrome.tabs.sendMessage(tabs[0].id, { type: 'getTargetSelector' }, function (response: any) { - if (response) { - rule.selector = window.prompt('CSS selector to block: ', `${response}`) || '' - chrome.tabs.insertCSS({ - code: `${rule.selector} {display: none;}` - }) - cosmeticFilterActions.siteCosmeticFilterAdded(rule.host, rule.selector) - } - }) - }) +chrome.contextMenus.onClicked.addListener((info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) => { + onContextMenuClicked(info, tab) +}) + +// content script listener for right click DOM selection event +chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { + const action = typeof msg === 'string' ? msg : msg.type + switch (action) { + case 'contextMenuOpened': { + rule.host = msg.baseURI break } + } +}) + +export function onContextMenuClicked (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) { + switch (info.menuItemId) { + case 'addBlockElement': + query() + break case 'resetSiteFilterSettings': { cosmeticFilterActions.siteCosmeticFilterRemoved(rule.host) break @@ -60,15 +64,29 @@ chrome.contextMenus.onClicked.addListener(function (info, tab) { console.warn('[cosmeticFilterEvents] invalid context menu option: ${info.menuItemId}') } } -}) +} -// content script listener for right click DOM selection event -chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { - const action = typeof msg === 'string' ? msg : msg.type - switch (action) { - case 'contextMenuOpened': { - rule.host = msg.baseURI - break - } +export function query () { + chrome.tabs.query({ active: true, currentWindow: true }, (tabs: [chrome.tabs.Tab]) => { + tabsCallback(tabs) + }) +} + +export function tabsCallback (tabs: [chrome.tabs.Tab]) { + chrome.tabs.sendMessage(tabs[0].id, { type: 'getTargetSelector' }, onSelectorReturned) +} + +export function onSelectorReturned (response: any) { + if (!response) { + rule.selector = window.prompt('We were unable to automatically populate a correct CSS selector for you. Please manually enter a CSS selector to block:') || '' + } else { + rule.selector = window.prompt('CSS selector:', `${response}`) || '' } -}) + + if (typeof rule.selector === 'string' && rule.selector && rule.selector.length > 0) { + chrome.tabs.insertCSS({ + code: `${rule.selector} {display: none;}` + }) + cosmeticFilterActions.siteCosmeticFilterAdded(rule.host, rule.selector) + } +} From 38cb52df6f992a3e85eccb9edaaa765357fe3751 Mon Sep 17 00:00:00 2001 From: Snuupy Date: Wed, 12 Jun 2019 02:42:04 -0700 Subject: [PATCH 3/4] add mock functions --- .../background/events/cosmeticFilterEvents.ts | 2 +- .../events/cosmeticFilterEvents_test.ts | 6 -- components/test/testData.ts | 63 ++++++++++++++++++- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts b/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts index 2b1fe026cffb..51ba587ade4d 100644 --- a/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts +++ b/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts @@ -72,7 +72,7 @@ export function query () { }) } -export function tabsCallback (tabs: [chrome.tabs.Tab]) { +export function tabsCallback (tabs: any) { chrome.tabs.sendMessage(tabs[0].id, { type: 'getTargetSelector' }, onSelectorReturned) } diff --git a/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts b/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts index 4236ae817627..24e23dda1f83 100644 --- a/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts +++ b/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts @@ -102,7 +102,6 @@ describe('cosmeticFilterEvents events', () => { it('triggers `siteCosmeticFilterRemoved` action', function () { // mock the prompt since JSDOM doesn't implement it // window.prompt = jest.fn() - // mock parameters const info: chrome.contextMenus.OnClickData = { menuItemId: 'resetSiteFilterSettings', editable: false, pageUrl: 'brave.com' } const tab: chrome.tabs.Tab = { id: 3, @@ -181,11 +180,6 @@ describe('cosmeticFilterEvents events', () => { cosmeticFilterEvents.onSelectorReturned(null) expect(insertCssSpy).not.toBeCalled() }) - // it('does NOT call `chrome.tabs.insertCSS` when selector is not a string', function () { - // selectorToReturn = true // NO LINT - // cosmeticFilterEvents.onSelectorReturned(selectorToReturn) - // expect(insertCssSpy).not.toBeCalled() - // }) }) }) }) diff --git a/components/test/testData.ts b/components/test/testData.ts index 9b6457c0ce3a..4d5fcd07a791 100644 --- a/components/test/testData.ts +++ b/components/test/testData.ts @@ -104,8 +104,16 @@ export const blockedResource: BlockDetails = { subresource: 'https://www.brave.com/test' } +// see: https://developer.chrome.com/extensions/events +interface OnMessageEvent extends chrome.events.Event<(message: object, options: any, responseCallback: any) => void> { + emit: (message: object) => void +} +interface ContextMenuClickedEvent extends chrome.events.Event<(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void> { + emit: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void +} + export const getMockChrome = () => { - return { + let mock = { send: () => undefined, getVariableValue: () => undefined, braveRewards: { @@ -116,7 +124,14 @@ export const getMockChrome = () => { onConnect: new ChromeEvent(), onStartup: new ChromeEvent(), onMessageExternal: new ChromeEvent(), - onConnectExternal: new ChromeEvent() + onConnectExternal: new ChromeEvent(), + // see: https://developer.chrome.com/apps/runtime#method-sendMessage + sendMessage: function (message: object, responseCallback: () => void) { + // console.log('BSC]] in mock:5 sendMessage called: ' + JSON.stringify(message)) + const onMessage = chrome.runtime.onMessage as OnMessageEvent + onMessage.emit(message) + responseCallback() + } }, browserAction: { setBadgeBackgroundColor: function (properties: object) { @@ -151,6 +166,13 @@ export const getMockChrome = () => { insertCSS: function (details: jest.SpyInstance) { return }, + query: function (queryInfo: chrome.tabs.QueryInfo, callback: (result: chrome.tabs.Tab[]) => void) { + return callback + }, + // chrome.tabs.sendMessage(integer tabId, any message, object options, function responseCallback) + sendMessage: function (tabID: Number, message: any, options: object, responseCallback: any) { + return responseCallback + }, onActivated: new ChromeEvent(), onCreated: new ChromeEvent(), onUpdated: new ChromeEvent() @@ -222,8 +244,45 @@ export const getMockChrome = () => { search: function (query: string, callback: (results: chrome.bookmarks.BookmarkTreeNode[]) => void) { return } + }, + contextMenus: { + create: function (data: any) { + return Promise.resolve() + }, + onBlocked: new ChromeEvent(), + allowScriptsOnce: function (origins: Array, tabId: number, cb: () => void) { + setImmediate(cb) + }, + // onClicked: new ChromeEvent() + onClicked: { + // addListener: function (cb: (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) => void) { + addListener: function (cb: (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) => void) { + const onClicked = chrome.contextMenus.onClicked as ContextMenuClickedEvent + // cb({ menuItemId: 'addBlockElement', editable: false, pageUrl: '' }, { id: 1 }) + // onClicked.emit() + return cb + // cb(info2, tab2) + } + // emit (...args: Array<() => void>) { + // this.listeners.forEach((cb: () => void) => cb.apply(null, args)) + // } + } + // function (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab, cb: () => void) { + // const onClicked = chrome.contextMenus.onClicked as ContextMenuClickedEvent + // onClicked.emit(info, tab) + // cb() + // } + } + } + return mock +} +export const window = () => { + let mock = { + prompt: function (text: String) { + return text } } + return mock } export const initialState = deepFreeze({ From 6be9f9d5fe92eb06600d1a87e275e4cd84be50d5 Mon Sep 17 00:00:00 2001 From: Snuupy Date: Wed, 12 Jun 2019 02:48:34 -0700 Subject: [PATCH 4/4] fix linting, remove unused code --- .../background/events/cosmeticFilterEvents.ts | 2 +- .../events/cosmeticFilterEvents_test.ts | 18 ------------- components/test/testData.ts | 25 +------------------ 3 files changed, 2 insertions(+), 43 deletions(-) diff --git a/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts b/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts index 51ba587ade4d..c1fca6b810f2 100644 --- a/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts +++ b/components/brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents.ts @@ -83,7 +83,7 @@ export function onSelectorReturned (response: any) { rule.selector = window.prompt('CSS selector:', `${response}`) || '' } - if (typeof rule.selector === 'string' && rule.selector && rule.selector.length > 0) { + if (rule.selector && rule.selector.length > 0) { chrome.tabs.insertCSS({ code: `${rule.selector} {display: none;}` }) diff --git a/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts b/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts index 24e23dda1f83..c8817dde7715 100644 --- a/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts +++ b/components/test/brave_extension/background/events/cosmeticFilterEvents_test.ts @@ -2,21 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ -import * as sinon from 'sinon' -// import actions from '../../../../brave_extension/extension/brave_extension/background/actions/cosmeticFilterActions' -import { ChromeEvent } from '../../../testData' -// import '../../../../brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents' -// import { rule, onSelectorReturned } from '../../../../brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents' import cosmeticFilterActions from '../../../../brave_extension/extension/brave_extension/background/actions/cosmeticFilterActions' import * as cosmeticFilterEvents from '../../../../brave_extension/extension/brave_extension/background/events/cosmeticFilterEvents' -interface ContextMenuClickedEvent extends chrome.events.Event<(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void> { - emit: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void -} - -// let msg = { baseURI: 'brave.com' } -// interface ContextMenuClickedEvent extends chrome.events.Event<(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void> { -// emit: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void -// } let lastInputText: string let lastPromptText: string @@ -52,8 +39,6 @@ describe('cosmeticFilterEvents events', () => { resetSiteFilterSettingsSpy = jest.spyOn(cosmeticFilterActions, 'siteCosmeticFilterRemoved') resetAllFilterSettingsSpy = jest.spyOn(cosmeticFilterActions, 'allCosmeticFiltersRemoved') chromeTabsSendMessageSpy = jest.spyOn(chrome.tabs, 'sendMessage') - // const chromeTabsSendMessageCallback = chromeTabsSendMessageSpy.mock.calls[0][2] - // chromeTabsSendMessageCallback() }) afterEach(() => { contextMenuOnClickedSpy.mockRestore() @@ -94,14 +79,11 @@ describe('cosmeticFilterEvents events', () => { } cosmeticFilterEvents.tabsCallback([myTab]) expect(1).toBe(1) - // expect(chromeTabsSendMessageSpy).toBeCalledWith({ type: 'getTargetSelector' }, cosmeticFilterEvents.onSelectorReturned) chrome.tabs.sendMessage(myTab.id, { type: 'getTargetSelector' }, cosmeticFilterEvents.onSelectorReturned) }) }) describe('resetSiteFilterSettings', function () { it('triggers `siteCosmeticFilterRemoved` action', function () { - // mock the prompt since JSDOM doesn't implement it - // window.prompt = jest.fn() const info: chrome.contextMenus.OnClickData = { menuItemId: 'resetSiteFilterSettings', editable: false, pageUrl: 'brave.com' } const tab: chrome.tabs.Tab = { id: 3, diff --git a/components/test/testData.ts b/components/test/testData.ts index 4d5fcd07a791..3d1df0d5d78f 100644 --- a/components/test/testData.ts +++ b/components/test/testData.ts @@ -108,9 +108,6 @@ export const blockedResource: BlockDetails = { interface OnMessageEvent extends chrome.events.Event<(message: object, options: any, responseCallback: any) => void> { emit: (message: object) => void } -interface ContextMenuClickedEvent extends chrome.events.Event<(info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void> { - emit: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void -} export const getMockChrome = () => { let mock = { @@ -127,7 +124,6 @@ export const getMockChrome = () => { onConnectExternal: new ChromeEvent(), // see: https://developer.chrome.com/apps/runtime#method-sendMessage sendMessage: function (message: object, responseCallback: () => void) { - // console.log('BSC]] in mock:5 sendMessage called: ' + JSON.stringify(message)) const onMessage = chrome.runtime.onMessage as OnMessageEvent onMessage.emit(message) responseCallback() @@ -169,7 +165,6 @@ export const getMockChrome = () => { query: function (queryInfo: chrome.tabs.QueryInfo, callback: (result: chrome.tabs.Tab[]) => void) { return callback }, - // chrome.tabs.sendMessage(integer tabId, any message, object options, function responseCallback) sendMessage: function (tabID: Number, message: any, options: object, responseCallback: any) { return responseCallback }, @@ -253,25 +248,7 @@ export const getMockChrome = () => { allowScriptsOnce: function (origins: Array, tabId: number, cb: () => void) { setImmediate(cb) }, - // onClicked: new ChromeEvent() - onClicked: { - // addListener: function (cb: (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) => void) { - addListener: function (cb: (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab) => void) { - const onClicked = chrome.contextMenus.onClicked as ContextMenuClickedEvent - // cb({ menuItemId: 'addBlockElement', editable: false, pageUrl: '' }, { id: 1 }) - // onClicked.emit() - return cb - // cb(info2, tab2) - } - // emit (...args: Array<() => void>) { - // this.listeners.forEach((cb: () => void) => cb.apply(null, args)) - // } - } - // function (info: chrome.contextMenus.OnClickData, tab: chrome.tabs.Tab, cb: () => void) { - // const onClicked = chrome.contextMenus.onClicked as ContextMenuClickedEvent - // onClicked.emit(info, tab) - // cb() - // } + onClicked: new ChromeEvent() } } return mock