diff --git a/.npmrc b/.npmrc index 95bd5da9108..ba2a102998a 100644 --- a/.npmrc +++ b/.npmrc @@ -1,7 +1,7 @@ runtime = electron target_arch = x64 -brave_electron_version = 8.0.9 +brave_electron_version = 8.0.10 chromedriver_version = 2.38 -target = v8.0.9 +target = v8.0.10 disturl=https://brave-laptop-binaries.s3.amazonaws.com/atom-shell/dist/ build_from_source = true diff --git a/app/browser/reducers/aboutNewTabReducer.js b/app/browser/reducers/aboutNewTabReducer.js index fa5fa549881..0981b109c09 100644 --- a/app/browser/reducers/aboutNewTabReducer.js +++ b/app/browser/reducers/aboutNewTabReducer.js @@ -13,11 +13,17 @@ const { calculateTopSites } = require('../api/topSites') const aboutNewTabReducer = (state, action) => { switch (action.actionType) { case appConstants.APP_SET_STATE: + // only show private search engine override options if needed + // (ex: not shown if a region specific default is provided) const useAlternativePrivateSearchEngine = getSetting(settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, state.get('settings')) - state = aboutNewTabState.mergeDetails(state, { - newTabPageDetail: { + let newTabPageDetail = {} + if (getSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, state.get('settings'))) { + newTabPageDetail = { useAlternativePrivateSearchEngine } + } + state = aboutNewTabState.mergeDetails(state, { + newTabPageDetail: newTabPageDetail }) break case appConstants.APP_TOP_SITE_DATA_AVAILABLE: @@ -30,11 +36,25 @@ const aboutNewTabReducer = (state, action) => { } break case appConstants.APP_CHANGE_SETTING: - if (action.key === settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) { - state = aboutNewTabState.mergeDetails(state, { - newTabPageDetail: { - useAlternativePrivateSearchEngine: action.value + if (action.key === settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE || + action.key === settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) { + const showAlternativePrivateSearchEngines = action.key === settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE + ? action.value + : getSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, state.get('settings')) + + const useAlternativePrivateSearchEngine = action.key === settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE + ? action.value + : getSetting(settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, state.get('settings')) + + let newTabPageDetail = {} + if (showAlternativePrivateSearchEngines) { + newTabPageDetail = { + useAlternativePrivateSearchEngine } + } + + state = aboutNewTabState.mergeDetails(state, { + newTabPageDetail: newTabPageDetail }) } } diff --git a/app/renderer/reducers/urlBarReducer.js b/app/renderer/reducers/urlBarReducer.js index 4017b88b613..2382983685d 100644 --- a/app/renderer/reducers/urlBarReducer.js +++ b/app/renderer/reducers/urlBarReducer.js @@ -43,7 +43,11 @@ const updateSearchEngineInfoFromInput = (state, frameProps) => { if (frameProps.get('isPrivate')) { // handle private tab search with default search provider const useAlternateDefaultPrivateSearchProvider = - getSetting(isTor(frameProps) ? settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE_TOR : settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) + getSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) + ? getSetting(isTor(frameProps) + ? settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE_TOR + : settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) + : false if (useAlternateDefaultPrivateSearchProvider === true) { // DuckDuckGo hard-coded as Private Tab default provider // if asked to use a privacy-centric 'alternative' diff --git a/app/sessionStore.js b/app/sessionStore.js index 83fd5695b4b..0ced30fa2a3 100644 --- a/app/sessionStore.js +++ b/app/sessionStore.js @@ -1016,15 +1016,40 @@ module.exports.runImportDefaultSettings = (data) => { return data } -module.exports.setDefaultSearchEngine = (immutableData) => { - const defaultLocale = locale.getDefaultLocale(true) - let defaultSearchEngine = config.defaultSearchEngineByLocale.default +const getCanonicalCountryName = () => { + const countryName = (app.getCountryName() || '').replace(/\0/g, '') + switch (countryName) { + case 'US': + case 'Vereinigte Staaten': + case 'en_US.UTF-8': + case 'es_US.UTF-8': + return 'USA' + + case 'France': + case 'Frankreich': + case 'FR': + case 'fr_FR.UTF-8': + return 'France' + + case 'Germany': + case 'Deutschland': + case 'Allemagne': + case 'DE': + case 'de_DE.UTF-8': + return 'Germany' + } + return countryName +} - for (let entry in config.defaultSearchEngineByLocale) { - if (entry === defaultLocale) { - defaultSearchEngine = config.defaultSearchEngineByLocale[entry] - break - } +module.exports.setDefaultSearchEngine = (immutableData) => { + let defaultSearchEngine = config.defaultSearchEngineByCountry.default + const countryName = getCanonicalCountryName() + const countrySpecificEntry = countryName && config.defaultSearchEngineByCountry[countryName] + + if (countrySpecificEntry) { + defaultSearchEngine = countrySpecificEntry + // don't promote private tab engine override if region specific default search engine is set + immutableData = immutableData.setIn(['settings', settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE], false) } return defaultSearchEngine @@ -1098,13 +1123,13 @@ module.exports.loadAppState = () => { locale.init(immutableData.getIn(['settings', settings.LANGUAGE])).then((lang) => { immutableData = setVersionInformation(immutableData) - app.setLocale(lang) // Set default search engine for locale (if not already set) if (immutableData.getIn(['settings', settings.DEFAULT_SEARCH_ENGINE]) == null) { immutableData = module.exports.setDefaultSearchEngine(immutableData) } + app.setLocale(lang) resolve(immutableData) }) }) diff --git a/js/about/newprivatetab.js b/js/about/newprivatetab.js index 8ef505c5f31..21ed2b021c8 100644 --- a/js/about/newprivatetab.js +++ b/js/about/newprivatetab.js @@ -82,6 +82,7 @@ class NewPrivateTab extends React.Component { } { isTor && + this.props.newTabData.hasIn(useAlternativePrivateSearchEngineDataKeys) &&

diff --git a/js/about/preferences.js b/js/about/preferences.js index 2cde5a14653..227fd1fe6ef 100644 --- a/js/about/preferences.js +++ b/js/about/preferences.js @@ -277,6 +277,9 @@ class SearchTab extends ImmutableComponent { } hoverCallback (rows) { + if (!getSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, this.props.settings)) { + this.props.onChangeSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, true) + } this.props.onChangeSetting(settings.DEFAULT_SEARCH_ENGINE, rows[1].value) } @@ -289,11 +292,15 @@ class SearchTab extends ImmutableComponent { onClick={this.hoverCallback.bind(this)} tableClassNames={css(styles.sortableTable_searchTab)} /> - - - - - + { + getSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE, this.props.settings) + ? + + + + + : null + } diff --git a/js/constants/appConfig.js b/js/constants/appConfig.js index 3bf67ec2a52..b4f657020c4 100644 --- a/js/constants/appConfig.js +++ b/js/constants/appConfig.js @@ -155,6 +155,7 @@ module.exports = { 'general.spellcheck-languages': Immutable.fromJS(['en-US']), 'search.default-search-engine': null, 'search.offer-search-suggestions': false, // false by default for privacy reasons + 'search.show-alternate-private-search-engine': true, 'search.use-alternate-private-search-engine': false, 'search.use-alternate-private-search-engine-tor': true, 'tabs.switch-to-new-tabs': false, diff --git a/js/constants/config.js b/js/constants/config.js index 859b6a8f33d..2d764c815eb 100644 --- a/js/constants/config.js +++ b/js/constants/config.js @@ -42,12 +42,12 @@ module.exports = { defaultSearchSuggestions: false, maxHistorySites: 10 }, - // NOTE: names here correspond to `name` field in: + // NOTE: values here correspond to `name` field in: // js/data/searchProviders.js - defaultSearchEngineByLocale: { + defaultSearchEngineByCountry: { // Example entries look like this: - // 'en-US': 'GitHub', - // 'es-MX': 'YouTube', + // 'Germany': 'YouTube', + // 'France': 'GitHub', 'default': 'Google' }, defaultOpenSearchPath: 'content/search/google.xml', diff --git a/js/constants/settings.js b/js/constants/settings.js index 589e764be78..c8abfb5cc38 100644 --- a/js/constants/settings.js +++ b/js/constants/settings.js @@ -22,6 +22,7 @@ const settings = { SPELLCHECK_LANGUAGES: 'general.spellcheck-languages', // Search tab DEFAULT_SEARCH_ENGINE: 'search.default-search-engine', + SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE: 'search.show-alternate-private-search-engine', USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE: 'search.use-alternate-private-search-engine', USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE_TOR: 'search.use-alternate-private-search-engine-tor', OFFER_SEARCH_SUGGESTIONS: 'search.offer-search-suggestions', diff --git a/js/contextMenus.js b/js/contextMenus.js index de5d969e9d4..e9f2b6d78b2 100644 --- a/js/contextMenus.js +++ b/js/contextMenus.js @@ -51,8 +51,11 @@ const isLinux = platformUtil.isLinux() */ const getSearchUrl = (activeFrame, searchTerms) => { const searchUrl = ( - (getSetting(settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE_TOR) && frameStateUtil.isTor(activeFrame)) || - (getSetting(settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) && activeFrame.get('isPrivate')) + getSetting(settings.SHOW_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) && + ( + (getSetting(settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE_TOR) && frameStateUtil.isTor(activeFrame)) || + (getSetting(settings.USE_ALTERNATIVE_PRIVATE_SEARCH_ENGINE) && activeFrame.get('isPrivate')) + ) ) ? 'https://duckduckgo.com/?q={searchTerms}' : appStoreRenderer.state.getIn(['searchDetail', 'searchURL']) diff --git a/js/settings.js b/js/settings.js index f0c468d5d71..bbe96862038 100644 --- a/js/settings.js +++ b/js/settings.js @@ -62,7 +62,7 @@ const getDefaultSetting = (settingKey, settingsCollection) => { return contributionDefaultAmount(settingKey, settingsCollection) // >> locale is intialized (which determines default search engine) case settings.DEFAULT_SEARCH_ENGINE: - return config.defaultSearchEngineByLocale.default + return config.defaultSearchEngineByCountry.default } return undefined } diff --git a/test/unit/app/browser/reducers/aboutNewTabsReducerTest.js b/test/unit/app/browser/reducers/aboutNewTabsReducerTest.js index 6a370672637..bb130be9685 100644 --- a/test/unit/app/browser/reducers/aboutNewTabsReducerTest.js +++ b/test/unit/app/browser/reducers/aboutNewTabsReducerTest.js @@ -47,7 +47,7 @@ describe('aboutNewTabReducerTest', function () { }) describe('useAlternativePrivateSearchEngine', function () { - const initialState = Immutable.fromJS({ + let initialState = Immutable.fromJS({ settings: { }, about: { newtab: { pinnedTopSites: [] } diff --git a/test/unit/app/sessionStoreTest.js b/test/unit/app/sessionStoreTest.js index 192f8dd921f..f98988b6a18 100644 --- a/test/unit/app/sessionStoreTest.js +++ b/test/unit/app/sessionStoreTest.js @@ -69,7 +69,7 @@ describe('sessionStore unit tests', function () { } } const fakeConfig = { - defaultSearchEngineByLocale: { + defaultSearchEngineByCountry: { default: 'MetaCrawler' } } @@ -1987,26 +1987,26 @@ describe('sessionStore unit tests', function () { }) describe('setDefaultSearchEngine', function () { - let getDefaultLocaleSpy + let getCountryNameSpy beforeEach(function () { - getDefaultLocaleSpy = sinon.spy(fakeLocale, 'getDefaultLocale') + getCountryNameSpy = sinon.spy(fakeElectron.app, 'getCountryName') }) afterEach(function () { - getDefaultLocaleSpy.restore() - if (fakeConfig.defaultSearchEngineByLocale['en-US']) { - delete fakeConfig.defaultSearchEngineByLocale['en-US'] + getCountryNameSpy.restore() + if (fakeConfig.defaultSearchEngineByCountry['USA']) { + delete fakeConfig.defaultSearchEngineByCountry['USA'] } - if (!fakeConfig.defaultSearchEngineByLocale.default) { - fakeConfig.defaultSearchEngineByLocale.default = 'MetaCrawler' + if (!fakeConfig.defaultSearchEngineByCountry.default) { + fakeConfig.defaultSearchEngineByCountry.default = 'MetaCrawler' } }) - it('calls getDefaultLocale with true', function () { + it('calls app.getCountryName', function () { const input = Immutable.fromJS({settings: {}}) sessionStore.setDefaultSearchEngine(input) - assert(getDefaultLocaleSpy.calledOnce) + assert(getCountryNameSpy.calledOnce) }) it('defaults to `default` entry', function () { @@ -2016,14 +2016,14 @@ describe('sessionStore unit tests', function () { }) it('matches a locale specific entry (if present)', function () { - fakeConfig.defaultSearchEngineByLocale['en-US'] = 'Yahoo' + fakeConfig.defaultSearchEngineByCountry['USA'] = 'Yahoo' const input = Immutable.fromJS({settings: {}}) const output = sessionStore.setDefaultSearchEngine(input) assert.equal(output.getIn(['settings', settings.DEFAULT_SEARCH_ENGINE]), 'Yahoo') }) it('does not change input if there is no default in config', function () { - delete fakeConfig.defaultSearchEngineByLocale.default + delete fakeConfig.defaultSearchEngineByCountry.default const input = Immutable.fromJS({settings: {}}) const output = sessionStore.setDefaultSearchEngine(input) assert.deepEqual(input, output) diff --git a/test/unit/lib/fakeElectron.js b/test/unit/lib/fakeElectron.js index e7af97252c6..c10c7e87a2d 100644 --- a/test/unit/lib/fakeElectron.js +++ b/test/unit/lib/fakeElectron.js @@ -45,6 +45,7 @@ const fakeElectron = { getPath: (param) => `${process.cwd()}/${param}`, getVersion: () => '0.14.0', setLocale: (locale) => {}, + getCountryName: () => { return 'US' }, quit: () => {}, exit: () => {} }), diff --git a/tools/cibuild.py b/tools/cibuild.py index 62ceaa9674e..9cc3f270694 100755 --- a/tools/cibuild.py +++ b/tools/cibuild.py @@ -4,7 +4,7 @@ import subprocess import sys import os.path -MUON_VERSION = '8.0.9' +MUON_VERSION = '8.0.10' CHROMEDRIVER_VERSION = '2.38' SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) TARGET_ARCH= os.environ['TARGET_ARCH'] if os.environ.has_key('TARGET_ARCH') else 'x64'