From b2511ea2aad9bbfee319614386ff86a8e766c53f Mon Sep 17 00:00:00 2001 From: petemill Date: Sat, 25 Aug 2018 13:54:50 -0700 Subject: [PATCH] Initialize the Browser Action and set some settings: - Badge color - Higher resolution (vector) icon (Fix https://github.com/brave/brave-browser/issues/844) - Badge displays '99+' when block count is > 99 - Shields are disabled for non-http(s) sites (Fix https://github.com/brave/brave-browser/issues/503) - Default icon before a tab loads is the shields-on icon - Set shields badge count for active tab only (Fix https://github.com/brave/brave-browser/issues/743) Address some features of https://github.com/brave/brave-browser/issues/668 --- BUILD.gn | 8 +++- app/actions/runtimeActions.ts | 11 +++++ app/assets/img/icon-128.png | Bin 16508 -> 7664 bytes app/assets/img/icon-16-disabled.png | Bin 872 -> 0 bytes app/assets/img/icon-16.png | Bin 2026 -> 698 bytes app/assets/img/icon-256.png | Bin 0 -> 16000 bytes app/assets/img/icon-32.png | Bin 0 -> 1665 bytes app/assets/img/icon-48.png | Bin 5579 -> 2662 bytes app/assets/img/icon-64.png | Bin 0 -> 3673 bytes app/assets/img/icon-off.svg | 7 +++ app/assets/img/icon.svg | 7 +++ app/background/actions/runtimeActions.ts | 8 ++++ app/background/api/browserActionAPI.ts | 38 +++++++++++++-- app/background/events/runtimeEvents.ts | 2 + app/background/reducers.ts | 4 +- app/background/reducers/runtimeReducer.ts | 15 ++++++ .../reducers/shieldsPanelReducer.ts | 2 +- app/constants/runtimeActionTypes.ts | 1 + app/manifest.dev.json | 5 +- app/manifest.prod.json | 5 +- app/types/actions/index.ts | 4 +- app/types/actions/runtimeActions.ts | 11 +++++ .../background/api/browserActionAPITest.ts | 45 +++++++++--------- .../reducers/shieldsPanelReducerTest.ts | 2 +- test/testData.ts | 8 +++- 25 files changed, 145 insertions(+), 38 deletions(-) create mode 100644 app/actions/runtimeActions.ts delete mode 100644 app/assets/img/icon-16-disabled.png create mode 100644 app/assets/img/icon-256.png create mode 100644 app/assets/img/icon-32.png create mode 100644 app/assets/img/icon-64.png create mode 100644 app/assets/img/icon-off.svg create mode 100644 app/assets/img/icon.svg create mode 100644 app/background/actions/runtimeActions.ts create mode 100644 app/background/reducers/runtimeReducer.ts create mode 100644 app/constants/runtimeActionTypes.ts create mode 100644 app/types/actions/runtimeActions.ts diff --git a/BUILD.gn b/BUILD.gn index 1fbb6c3..082aea2 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -17,10 +17,14 @@ action("brave-extension") { "$target_gen_dir/brave_extension/build/js/braveShieldsPanel.bundle.js", "$target_gen_dir/brave_extension/build/braveShieldsPanel.html", "$target_gen_dir/brave_extension/build/bravelizer.css", - "$target_gen_dir/brave_extension/build/img/icon-128.png", "$target_gen_dir/brave_extension/build/img/icon-16.png", - "$target_gen_dir/brave_extension/build/img/icon-16-disabled.png", + "$target_gen_dir/brave_extension/build/img/icon-32.png", "$target_gen_dir/brave_extension/build/img/icon-48.png", + "$target_gen_dir/brave_extension/build/img/icon-64.png", + "$target_gen_dir/brave_extension/build/img/icon-128.png", + "$target_gen_dir/brave_extension/build/img/icon-256.png", + "$target_gen_dir/brave_extension/build/img/icon.svg", + "$target_gen_dir/brave_extension/build/img/icon-off.svg", "$target_gen_dir/brave_extension/build/_locales/en_US/messages.json", ] diff --git a/app/actions/runtimeActions.ts b/app/actions/runtimeActions.ts new file mode 100644 index 0000000..8c32575 --- /dev/null +++ b/app/actions/runtimeActions.ts @@ -0,0 +1,11 @@ +/* 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 types from '../constants/runtimeActionTypes' + +export function runtimeDidStartup () { + return { + type: types.RUNTIME_DID_STARTUP + } +} diff --git a/app/assets/img/icon-128.png b/app/assets/img/icon-128.png index 10fe418aa5818f37fa7c350f55169de8a071841b..67cc0aa2c077e73aa33239ad2cc3e4892c46617a 100644 GIT binary patch literal 7664 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 A;{X5v diff --git a/app/assets/img/icon-16-disabled.png b/app/assets/img/icon-16-disabled.png deleted file mode 100644 index 414158d178a16bfeeeabd9f7d95f3efc73e4fa23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 872 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

x1Yn2j=S3D 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 LNkvXXu0mjf1E>nG literal 0 HcmV?d00001 diff --git a/app/assets/img/icon-48.png b/app/assets/img/icon-48.png index 643e14bbecd44b6d31f7960bc29f59de22c62c6c..f9d29f75235516a8de54c720d861881e4b82ff01 100644 GIT binary patch delta 2641 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 bpA$S^CJ=r0?aqVCKdd?$hVYuJ_ILgV-P_0c diff --git a/app/assets/img/icon-64.png b/app/assets/img/icon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..ce14c2304e83255793a793221b4c662fc89a202e GIT binary patch literal 3673 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 r!YF#rRoTxt{+A#Rf2< + + + + + + \ No newline at end of file diff --git a/app/assets/img/icon.svg b/app/assets/img/icon.svg new file mode 100644 index 0000000..503f594 --- /dev/null +++ b/app/assets/img/icon.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/background/actions/runtimeActions.ts b/app/background/actions/runtimeActions.ts new file mode 100644 index 0000000..f3852f2 --- /dev/null +++ b/app/background/actions/runtimeActions.ts @@ -0,0 +1,8 @@ +/* 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 { bindActionCreators } from 'redux' +import store from '../store' +import * as runtimeActions from '../../actions/runtimeActions' +export default bindActionCreators(runtimeActions, store.dispatch) diff --git a/app/background/api/browserActionAPI.ts b/app/background/api/browserActionAPI.ts index 4d05937..97032d6 100644 --- a/app/background/api/browserActionAPI.ts +++ b/app/background/api/browserActionAPI.ts @@ -4,13 +4,37 @@ import { isHttpOrHttps } from '../../helpers/urlUtils' +export const shieldsOnIcon = 'img/icon.svg' +export const shieldsOffIcon = 'img/icon-off.svg' + +/** + * Initializes the browser action UI + */ +export function init () { + // Setup badge color + chrome.browserAction.setBadgeBackgroundColor({ + color: [66, 66, 66, 100] + }) + // Initial / default icon + chrome.browserAction.setIcon({ + path: shieldsOnIcon + }) + // By default, icon is disabled, + // so that we do not enable the icon in a new tab and then disable it + // when the context is not http(s). + chrome.browserAction.disable() +} + /** * Sets the badge text * @param {string} text - The text to put on the badge */ -export const setBadgeText = (text: string) => { +export const setBadgeText = (tabId: number, text: string) => { if (chrome.browserAction) { - chrome.browserAction.setBadgeText({ text: String(text) }) + chrome.browserAction.setBadgeText({ + tabId, + text: String(text) + }) } } @@ -18,13 +42,17 @@ export const setBadgeText = (text: string) => { * Updates the shields icon based on shields state */ export const setIcon = (url: string, tabId: number, shieldsOn: boolean) => { - const shieldsEnabledIcon = 'img/icon-16.png' - const shieldsDisabledIcon = 'img/icon-16-disabled.png' + const actionIsDisabled = !isHttpOrHttps(url) if (chrome.browserAction) { chrome.browserAction.setIcon({ - path: shieldsOn && isHttpOrHttps(url) ? shieldsEnabledIcon : shieldsDisabledIcon, + path: shieldsOn ? shieldsOnIcon : shieldsOffIcon, tabId }) + if (actionIsDisabled) { + chrome.browserAction.disable(tabId) + } else { + chrome.browserAction.enable(tabId) + } } } diff --git a/app/background/events/runtimeEvents.ts b/app/background/events/runtimeEvents.ts index ff124da..459164c 100644 --- a/app/background/events/runtimeEvents.ts +++ b/app/background/events/runtimeEvents.ts @@ -4,8 +4,10 @@ import windowActions from '../actions/windowActions' import tabActions from '../actions/tabActions' +import runtimeActions from '../actions/runtimeActions' chrome.runtime.onStartup.addListener(() => { + runtimeActions.runtimeDidStartup() chrome.windows.getAllAsync({ populate: true }).then((windows: chrome.windows.Window[]) => { windows.forEach((win: chrome.windows.Window) => { windowActions.windowCreated(win) diff --git a/app/background/reducers.ts b/app/background/reducers.ts index 26afa33..2e80973 100644 --- a/app/background/reducers.ts +++ b/app/background/reducers.ts @@ -6,8 +6,10 @@ import { combineReducers } from 'redux' import shieldsPanelReducer from './reducers/shieldsPanelReducer' import cosmeticFilterReducer from './reducers/cosmeticFilterReducer' +import runtimeReducer from './reducers/runtimeReducer' export default combineReducers({ shieldsPanel: shieldsPanelReducer, - cosmeticFilter: cosmeticFilterReducer + cosmeticFilter: cosmeticFilterReducer, + runtime: runtimeReducer }) diff --git a/app/background/reducers/runtimeReducer.ts b/app/background/reducers/runtimeReducer.ts new file mode 100644 index 0000000..f343436 --- /dev/null +++ b/app/background/reducers/runtimeReducer.ts @@ -0,0 +1,15 @@ +import { Actions } from '../../types/actions' +import * as runtimeActions from '../../constants/runtimeActionTypes' +import * as browserActionAPI from '../api/browserActionAPI' + +type State = { } + +export default function runtimeReducer (state: State = { }, action: Actions): State { + switch (action.type) { + case runtimeActions.RUNTIME_DID_STARTUP: { + browserActionAPI.init() + break + } + } + return state +} diff --git a/app/background/reducers/shieldsPanelReducer.ts b/app/background/reducers/shieldsPanelReducer.ts index 361e911..829976f 100644 --- a/app/background/reducers/shieldsPanelReducer.ts +++ b/app/background/reducers/shieldsPanelReducer.ts @@ -30,7 +30,7 @@ const updateBadgeText = (state: State) => { if (tab) { const total = tab.adsBlocked + tab.trackersBlocked + tab.javascriptBlocked + tab.fingerprintingBlocked + tab.httpsRedirected // do not show any badge if there are no blocked items - setBadgeText(total > 0 ? total.toString() : '') + setBadgeText(tabId, total > 99 ? '99+' : total > 0 ? total.toString() : '') } } diff --git a/app/constants/runtimeActionTypes.ts b/app/constants/runtimeActionTypes.ts new file mode 100644 index 0000000..94d7311 --- /dev/null +++ b/app/constants/runtimeActionTypes.ts @@ -0,0 +1 @@ +export const RUNTIME_DID_STARTUP = 'RUNTIME_DID_STARTUP' diff --git a/app/manifest.dev.json b/app/manifest.dev.json index e336bc8..898c89c 100644 --- a/app/manifest.dev.json +++ b/app/manifest.dev.json @@ -10,8 +10,11 @@ }, "icons": { "16": "img/icon-16.png", + "32": "img/icon-32.png", "48": "img/icon-48.png", - "128": "img/icon-128.png" + "64": "img/icon-64.png", + "128": "img/icon-128.png", + "256": "img/icon-256.png" }, "web_accessible_resources": [ ], diff --git a/app/manifest.prod.json b/app/manifest.prod.json index 7bf7a38..01fc547 100644 --- a/app/manifest.prod.json +++ b/app/manifest.prod.json @@ -10,8 +10,11 @@ }, "icons": { "16": "img/icon-16.png", + "32": "img/icon-32.png", "48": "img/icon-48.png", - "128": "img/icon-128.png" + "64": "img/icon-64.png", + "128": "img/icon-128.png", + "256": "img/icon-256.png" }, "web_accessible_resources": [ ], diff --git a/app/types/actions/index.ts b/app/types/actions/index.ts index 62d952e..c7ac38f 100644 --- a/app/types/actions/index.ts +++ b/app/types/actions/index.ts @@ -3,10 +3,12 @@ import { tabActions } from './tabActions' import { webNavigationActions } from './webNavigationActions' import { windowActions } from './windowActions' import { cosmeticFilterActions } from './cosmeticFilterActions' +import { runtimeActions } from './runtimeActions' export type Actions = shieldPanelActions | tabActions | webNavigationActions | windowActions | - cosmeticFilterActions + cosmeticFilterActions | + runtimeActions diff --git a/app/types/actions/runtimeActions.ts b/app/types/actions/runtimeActions.ts new file mode 100644 index 0000000..a0856ee --- /dev/null +++ b/app/types/actions/runtimeActions.ts @@ -0,0 +1,11 @@ +import * as types from '../../constants/runtimeActionTypes' + +interface RuntimeDidStartupReturn { + type: typeof types.RUNTIME_DID_STARTUP +} + +export interface RuntimeDidStartup { + (): RuntimeDidStartupReturn +} + +export type runtimeActions = RuntimeDidStartupReturn diff --git a/test/app/background/api/browserActionAPITest.ts b/test/app/background/api/browserActionAPITest.ts index 3547b8a..aaf6757 100644 --- a/test/app/background/api/browserActionAPITest.ts +++ b/test/app/background/api/browserActionAPITest.ts @@ -13,7 +13,8 @@ describe('BrowserAction API', () => { before(function () { this.spy = sinon.spy(chrome.browserAction, 'setBadgeText') this.text = '42' - browserActionAPI.setBadgeText(this.text) + this.tabId = 1337 + browserActionAPI.setBadgeText(this.tabId, this.text) }) after(function () { this.spy.restore() @@ -21,55 +22,52 @@ describe('BrowserAction API', () => { it('calls chrome.browserAction.setBadgeText with the text', function () { assert(this.spy.calledOnce) assert.deepEqual(this.spy.getCall(0).args[0], { + tabId: this.tabId, text: this.text }) }) }) describe('setIcon', function () { - const enabledIconPath = 'img/icon-16.png' - const disabledIconPath = 'img/icon-16-disabled.png' before(function () { - this.spy = sinon.spy(chrome.browserAction, 'setIcon') + this.setIconSpy = sinon.spy(chrome.browserAction, 'setIcon') + this.disableSpy = sinon.spy(chrome.browserAction, 'disable') + this.enableSpy = sinon.spy(chrome.browserAction, 'enable') this.url = 'https://brave.com' this.tabId = 1 this.shieldsEnabled = true }) after(function () { - this.spy.restore() + this.setIconSpy.restore() + this.disableSpy.restore() + this.enableSpy.restore() }) afterEach(function () { - this.spy.reset() + this.setIconSpy.reset() + this.disableSpy.reset() + this.enableSpy.reset() }) - it('sets the enabled icon when protocol is http', function () { + it('sets enabled when protocol is http', function () { this.url = 'http://not-very-awesome-http-page.com' browserActionAPI.setIcon(this.url, this.tabId, this.shieldsEnabled) - assert.deepEqual(this.spy.getCall(0).args[0], { - path: enabledIconPath, - tabId: this.tabId - }) + assert.deepEqual(this.enableSpy.getCall(0).args[0], this.tabId) }) it('sets the enabled icon when protocol is https', function () { this.url = 'https://very-awesome-https-page.com' browserActionAPI.setIcon(this.url, this.tabId, this.shieldsEnabled) - assert.deepEqual(this.spy.getCall(0).args[0], { - path: enabledIconPath, - tabId: this.tabId - }) + assert.deepEqual(this.enableSpy.getCall(0).args[0], this.tabId) }) it('sets the disabled icon when the protocol is neither https nor http', function () { this.url = 'brave://welcome' browserActionAPI.setIcon(this.url, this.tabId, this.shieldsEnabled) - assert.deepEqual(this.spy.getCall(0).args[0], { - path: disabledIconPath, - tabId: this.tabId - }) + assert.deepEqual(this.disableSpy.getCall(0).args[0], this.tabId) }) it('sets the disabled icon when the protocol is http and shield is off', function () { this.url = 'http://not-very-awesome-http-page.com' this.shieldsEnabled = false browserActionAPI.setIcon(this.url, this.tabId, this.shieldsEnabled) - assert.deepEqual(this.spy.getCall(0).args[0], { - path: disabledIconPath, + assert.deepEqual(this.enableSpy.getCall(0).args[0], this.tabId) + assert.deepEqual(this.setIconSpy.getCall(0).args[0], { + path: browserActionAPI.shieldsOffIcon, tabId: this.tabId }) }) @@ -77,8 +75,9 @@ describe('BrowserAction API', () => { this.url = 'https://very-awesome-https-page.com' this.shieldsEnabled = false browserActionAPI.setIcon(this.url, this.tabId, this.shieldsEnabled) - assert.deepEqual(this.spy.getCall(0).args[0], { - path: disabledIconPath, + assert.deepEqual(this.enableSpy.getCall(0).args[0], this.tabId) + assert.deepEqual(this.setIconSpy.getCall(0).args[0], { + path: browserActionAPI.shieldsOffIcon, tabId: this.tabId }) }) diff --git a/test/app/background/reducers/shieldsPanelReducerTest.ts b/test/app/background/reducers/shieldsPanelReducerTest.ts index e0653f8..7db9ad0 100644 --- a/test/app/background/reducers/shieldsPanelReducerTest.ts +++ b/test/app/background/reducers/shieldsPanelReducerTest.ts @@ -490,7 +490,7 @@ describe('braveShieldsPanelReducer', () => { } }) assert.equal(this.spy.calledOnce, true) - assert.equal(this.spy.getCall(0).args[0], '12') + assert.equal(this.spy.getCall(0).args[1], '12') }) it('increments for JS blocking', function () { let nextState = shieldsPanelReducer(state, { diff --git a/test/testData.ts b/test/testData.ts index 1857f3d..ac0ad40 100644 --- a/test/testData.ts +++ b/test/testData.ts @@ -74,8 +74,11 @@ export const getMockChrome = () => { onStartup: new ChromeEvent() }, browserAction: { - setBadgeText: function (text: string) {}, - setIcon: function (icon: string, tabId: number) {} + setBadgeBackgroundColor: function (properties: object) {}, + setBadgeText: function (textProperties: object) {}, + setIcon: function (iconProperties: object) {}, + enable: function (tabId?: number) {}, + disable: function (tabId?: number) {} }, tabs: { queryAsync: function () { @@ -149,6 +152,7 @@ export const initialState = deepFreeze({ tabs: {}, windows: {} }, + runtime: {}, shieldsPanel: { currentWindowId: -1, tabs: {},