diff --git a/patches/BRM017_Disable-signin-and-data-saver-preferences.patch b/patches/BRM017_Disable-signin-and-data-saver-preferences.patch new file mode 100644 index 00000000..8b8ef053 --- /dev/null +++ b/patches/BRM017_Disable-signin-and-data-saver-preferences.patch @@ -0,0 +1,220 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Tue, 12 Jun 2018 14:23:07 +0200 +Subject: Disable signin and data saver preferences + +Never show the data saver promo snackbar +--- + chrome/android/java/res/xml/main_preferences.xml | 8 +++--- + .../chromium/chrome/browser/ChromeActivity.java | 6 ++-- + .../browser/preferences/MainPreferences.java | 32 ++++++++++++---------- + 3 files changed, 26 insertions(+), 20 deletions(-) + +diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml +--- a/chrome/android/java/res/xml/main_preferences.xml ++++ b/chrome/android/java/res/xml/main_preferences.xml +@@ -6,10 +6,10 @@ + + +- ++ android:title="@string/sign_in_to_chrome"/--> + + +- ++ android:title="@string/data_reduction_title"/--> + mAllPreferences = new HashMap<>(); +- private SignInPreference mSignInPreference; ++ //private SignInPreference mSignInPreference; + + public MainPreferences() { + setHasOptionsMenu(true); +@@ -64,25 +64,29 @@ public class MainPreferences extends PreferenceFragment + @Override + public void onDestroy() { + super.onDestroy(); +- mSignInPreference.onPreferenceFragmentDestroyed(); ++ //mSignInPreference.onPreferenceFragmentDestroyed(); + } + + @Override + public void onStart() { + super.onStart(); ++/* + if (SigninManager.get().isSigninSupported()) { + SigninManager.get().addSignInStateObserver(this); + mSignInPreference.registerForUpdates(); + } ++*/ + } + + @Override + public void onStop() { + super.onStop(); ++/* + if (SigninManager.get().isSigninSupported()) { + SigninManager.get().removeSignInStateObserver(this); + mSignInPreference.unregisterForUpdates(); + } ++*/ + } + + @Override +@@ -98,7 +102,7 @@ public class MainPreferences extends PreferenceFragment + setManagedPreferenceDelegateForPreference(PREF_SEARCH_ENGINE); + setManagedPreferenceDelegateForPreference(PREF_AUTOFILL_SETTINGS); + setManagedPreferenceDelegateForPreference(PREF_SAVED_PASSWORDS); +- setManagedPreferenceDelegateForPreference(PREF_DATA_REDUCTION); ++ //setManagedPreferenceDelegateForPreference(PREF_DATA_REDUCTION); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // If we are on Android O+ the Notifications preference should lead to the Android +@@ -154,7 +158,7 @@ public class MainPreferences extends PreferenceFragment + Preference preference = getPreferenceScreen().getPreference(index); + mAllPreferences.put(preference.getKey(), preference); + } +- mSignInPreference = (SignInPreference) mAllPreferences.get(PREF_SIGN_IN); ++ //mSignInPreference = (SignInPreference) mAllPreferences.get(PREF_SIGN_IN); + } + + private void setManagedPreferenceDelegateForPreference(String key) { +@@ -163,12 +167,6 @@ public class MainPreferences extends PreferenceFragment + } + + private void updatePreferences() { +- if (SigninManager.get().isSigninSupported()) { +- addPreferenceIfAbsent(PREF_SIGN_IN); +- } else { +- removePreferenceIfPresent(PREF_SIGN_IN); +- } +- + updateSearchEnginePreference(); + + if (HomepageManager.shouldShowHomepageSetting()) { +@@ -187,9 +185,11 @@ public class MainPreferences extends PreferenceFragment + removePreferenceIfPresent(PREF_CONTEXTUAL_SUGGESTIONS); + } + ++/* + ChromeBasePreference dataReduction = + (ChromeBasePreference) findPreference(PREF_DATA_REDUCTION); + dataReduction.setSummary(DataReductionPreferences.generateSummary(getResources())); ++*/ + } + + private Preference addPreferenceIfAbsent(String key) { +@@ -260,9 +260,11 @@ public class MainPreferences extends PreferenceFragment + if (PREF_SAVED_PASSWORDS.equals(preference.getKey())) { + return PrefServiceBridge.getInstance().isRememberPasswordsManaged(); + } ++/* + if (PREF_DATA_REDUCTION.equals(preference.getKey())) { + return DataReductionProxySettings.getInstance().isDataReductionProxyManaged(); + } ++*/ + if (PREF_SEARCH_ENGINE.equals(preference.getKey())) { + return TemplateUrlService.getInstance().isDefaultSearchManaged(); + } +@@ -280,11 +282,13 @@ public class MainPreferences extends PreferenceFragment + return prefs.isRememberPasswordsManaged() + && !prefs.isRememberPasswordsEnabled(); + } ++/* + if (PREF_DATA_REDUCTION.equals(preference.getKey())) { + DataReductionProxySettings settings = DataReductionProxySettings.getInstance(); + return settings.isDataReductionProxyManaged() + && !settings.isDataReductionProxyEnabled(); + } ++*/ + if (PREF_SEARCH_ENGINE.equals(preference.getKey())) { + return TemplateUrlService.getInstance().isDefaultSearchManaged(); + } +-- +2.7.4 + diff --git a/patches/BRM018_Disable-signin-data-reduction-promos.patch b/patches/BRM018_Disable-signin-data-reduction-promos.patch new file mode 100644 index 00000000..f437d44e --- /dev/null +++ b/patches/BRM018_Disable-signin-data-reduction-promos.patch @@ -0,0 +1,32 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Tue, 12 Jun 2018 15:09:26 +0200 +Subject: Disable signin/data reduction promos + +--- + .../java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +@@ -562,7 +562,7 @@ public class ChromeTabbedActivity + // TODO(tedchoc): Unify promo dialog logic as the search engine promo dialog checks + // might not have completed at this point and we could show multiple + // promos. +- boolean isShowingPromo = mLocaleManager.hasShownSearchEnginePromoThisSession(); ++ /*boolean isShowingPromo = mLocaleManager.hasShownSearchEnginePromoThisSession(); + // Promo dialogs in multiwindow mode are broken on some devices: http://crbug.com/354696 + boolean isLegacyMultiWindow = MultiWindowUtils.getInstance().isLegacyMultiWindow(this); + if (!isShowingPromo && !mIntentWithEffect && FirstRunStatus.getFirstRunFlowComplete() +@@ -581,7 +581,7 @@ public class ChromeTabbedActivity + preferenceManager.setPromosSkippedOnFirstStart(true); + } + +- if (!isShowingPromo) { ++ if (!isShowingPromo) */ { + final Tracker tracker = + TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile()); + tracker.addOnInitializedCallback( +-- +2.7.4 + diff --git a/patches/BRM019_Removed-Sync-and-Translate-menu.patch b/patches/BRM019_Removed-Sync-and-Translate-menu.patch new file mode 100644 index 00000000..9d162000 --- /dev/null +++ b/patches/BRM019_Removed-Sync-and-Translate-menu.patch @@ -0,0 +1,248 @@ +From: Serg +Date: Wed, 22 Mar 2017 19:10:30 -0400 +Subject: Removed Sync and Translate menu + +--- + .../java/res/drawable-hdpi/settings_translate.png | Bin 399 -> 0 bytes + .../java/res/drawable-mdpi/settings_translate.png | Bin 284 -> 0 bytes + .../java/res/drawable-xhdpi/settings_translate.png | Bin 547 -> 0 bytes + .../res/drawable-xxhdpi/settings_translate.png | Bin 793 -> 0 bytes + .../res/drawable-xxxhdpi/settings_translate.png | Bin 1038 -> 0 bytes + .../java/res/xml/site_settings_preferences.xml | 8 +++---- + .../website/SiteSettingsPreferences.java | 26 ++++++++++----------- + 7 files changed, 17 insertions(+), 17 deletions(-) + delete mode 100644 chrome/android/java/res/drawable-hdpi/settings_translate.png + delete mode 100644 chrome/android/java/res/drawable-mdpi/settings_translate.png + delete mode 100644 chrome/android/java/res/drawable-xhdpi/settings_translate.png + delete mode 100644 chrome/android/java/res/drawable-xxhdpi/settings_translate.png + delete mode 100644 chrome/android/java/res/drawable-xxxhdpi/settings_translate.png + +diff --git a/chrome/android/java/res/drawable-hdpi/settings_translate.png b/chrome/android/java/res/drawable-hdpi/settings_translate.png +deleted file mode 100644 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 399 +zcmV;A0dW3_P)hP^9KR_C@$!FaVIla45F@WCMg$)o)DW3mQKSdON+{NY%D^rw +zQ6|u}ti|NX7$R7iF@)z*9c+qa0?AUm<7d7%a4MD+^aKw>u^zc5))3o43mLu5G; +z8!SRo0o`C5w_HXQp+hq2?!?{u8c0%8C3Jue>()aulqxVESiz93aydblXyA)AxSXIZ +z^u+3MIY49igeSZ=wug@XJ`tWQp%m)~(480Xl-fZ9?!ILEyg9Ig+E_v&p@gTlA*4tf +tij`2N2SrL~qywpbE;5V|EcpMCd%u4DGPZTzo=E@z002ovPDHLkV1m$asKNjM + +diff --git a/chrome/android/java/res/drawable-mdpi/settings_translate.png b/chrome/android/java/res/drawable-mdpi/settings_translate.png +deleted file mode 100644 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 284 +zcmV+%0ptFOP)YqeTIHw=KscAEhFY_CKhZ7#j@Qh~#`t~HT1AWt&iOFYBic(;rl@5Y9UG&&#fH`9r +zbqhPT0Nhc-8hg~aB!JnVj0zT9La;<0Ijq#SJr@m*036I22Uj!E;6TtuAD4*o-y97Z +ziWuYbs-FagXn-mvsLH_>O?Hzl1RVtIfGq+yWZ%bGZULC0h?xp|DgiD=uf=xl!2Uvo +icHkLEh=B&e`~;qlBW{m=6s{@&0000C|l + +diff --git a/chrome/android/java/res/drawable-xhdpi/settings_translate.png b/chrome/android/java/res/drawable-xhdpi/settings_translate.png +deleted file mode 100644 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 547 +zcmV+;0^I$HP)vK2=pT?4!CJ8B5V|`lSO?MdsRak2|3E2+I}uBO%C0%8~2 +zqX2{ZjJTXFC*U;?c-ddi5s!R<4~S{LXX_djTCRX~3-JV7yh7Y2cms!wTkrY83}bwB +z2dpi`B^D8n3HSqaSVYzpI`{+pWDRAl*>VMX>`+5Y@YI?>wsz=YK)L(kPe6xV>d0E+ +zF#Fw0h$>%W?u)^|9b`@O%&0zU>qXpsF&Oy9RW@l8a&@DCvt;Ei +z!kb9ohzhbQ9F+l#U_I(XZ6fPFVyg@=tm03vA!hhtr^YXT;4QKq66}a~{=i*iH3)XZ +zJ#V1R7-E(l!Okq>w0(hXWNlGi +l0_C5%UG`c2pI-Xsz;EN&!BMZ3jZy#r002ovPDHLkV1l>+@2da+ + +diff --git a/chrome/android/java/res/drawable-xxhdpi/settings_translate.png b/chrome/android/java/res/drawable-xxhdpi/settings_translate.png +deleted file mode 100644 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 793 +zcmV+!1LpjRP)*(&T0P^f5;ixxw==!FDzQOmLj +zW)TU|$~Iz9Aez>~5MeSGNzOdU;V@i=JI&0U$NLB~{9rb}%fp9z&%hk!M$92gIe;pl +z3Wyj9l9(csBteWw5h(;j9dXi_fJqal&Mqj9DKT-2AY!CT2BnGF10^sPlCTEKJIX71 +z)JmT5wgxg*K&DJUmwnQupf11mfI$K*D&+>^c2@3Wkf|A8$jyfS$PkZE!?L6P{+3Y9btC#|6l6Q$SJA +zJsJ|?2*wTQCyfHQr_G#j>iOXcWOyKi8a`n7&M5)i$G8LSaX}DgSmV5K&hghJ$naGk +zn|yMVCHFr+W;};YV_bu_81R4w*m4VcMRV41&CGcb!S=Xdpk;b9jBZ}iok8`oEP#^s +zxZ*(HxIwJ~nwTJkA;knuN_trO9#=T%BSV6b(8Ic?TcZbSdt70l>n4JR)6DpO>*nq3 +zafN}FIj#?Cl$~5NU8I~g9RU77~AeL>qaNZ%d;C_u^s +zlss&pgcZ=5Jy6WbGCgY#WaDr39a`*x^u>dcIQ=590n!A0HN&vZEG?C{V=ABuDD3 +zK}Zx)90u@NR77ZDqzI8+I%LtIBq1>CB9(`rB#V~#N{sTXQQ#UFR4mj+L_yL)FVdw5 +zWziyt2t7o(5K@$fpoFMU*4D8)xU9Pq43Ec~9k(6b`LAza_%8CfJov%x+j;ZfQFNEb +z12`KG-~l{<2LKCHgb{}Zy~t>YBMcRaBe4w#ApzaNBoHbkpa(iZdP)TdK_^P66aW56u{HU0Q*gCKWkg% +zzZ!iHpXGBfgAJ^klo-HsmH{^5htXtkfHkMxaUPh*CPp}jjBvX|#jNB2o*};A4dL$x +zZaR^jWPl1(GQd%H9Vr*E#k6n`zua~vj+y|s+;yl=;Uat{fDf0DatmMzyH{Mi0aNk= +z7SV+=VZjqPArQ*Yg+(*KsriBvfHVeB1BIss!$v=x(+(m{a9cQ39AFtk*a}5R2a=qY +zM2G2rH)-YzYX!{XHtL`Vsl}LuIEGp%Af7L*1<;Mkoc-n;k}EEs#5wq==L@R`yh6DE +zXe@BOIf?tU^9B0=>sf0D9wH09K(eHO_}X@%^EiwcGSJsOT46u}y38pI7u{wR6Q0;bXZ0hXla52{6vu7MTGve7a+uW@Zs&Q??m-0eu3rC-3h{ugD5mMnC|3 +zumCw+*PktbBkdCkD`$Cjm}~$_Loa0g=4O2nTGJ +z4KN`LLB8h&d>4i%6LJCCIpB!UT62U0+GPT0sN#Uwe*rNLsDdUBpr7+<3XGr9!nmqm +z9zX*J^g=I?UJhtjCjd!2fcP)UbW5mEs8p!*B_)Bwsy8PjNj +zLJc5zn3UxUnxN1F9DJOYCxvN5;D?e6@Sf=Q03N^tcmNOZ5BbKcjE%x^TL1t607*qo +IM6N<$g2Gw1A^-pY + +diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/android/java/res/xml/site_settings_preferences.xml +--- a/chrome/android/java/res/xml/site_settings_preferences.xml ++++ b/chrome/android/java/res/xml/site_settings_preferences.xml +@@ -44,9 +44,9 @@ + android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences" + android:key="ads" /> + +- ++ android:key="background_sync" />--> + + + +- ++ android:icon="@drawable/settings_translate" />--> + + + websitePrefs = new ArrayList(); +@@ -183,7 +183,7 @@ public class SiteSettingsPreferences extends PreferenceFragment + // When showing the main menu, if Protected Content is not available, only Autoplay + // will be visible. + if (!mProtectedContentMenuAvailable) websitePrefs.add(AUTOPLAY_KEY); +- websitePrefs.add(BACKGROUND_SYNC_KEY); ++ //websitePrefs.add(BACKGROUND_SYNC_KEY); + websitePrefs.add(CAMERA_KEY); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CLIPBOARD_CONTENT_SETTING)) { + websitePrefs.add(CLIPBOARD_KEY); +@@ -208,8 +208,8 @@ public class SiteSettingsPreferences extends PreferenceFragment + checked = PrefServiceBridge.getInstance().adsEnabled(); + } else if (AUTOPLAY_KEY.equals(prefName)) { + checked = PrefServiceBridge.getInstance().isAutoplayEnabled(); +- } else if (BACKGROUND_SYNC_KEY.equals(prefName)) { +- checked = PrefServiceBridge.getInstance().isBackgroundSyncAllowed(); ++ /*} else if (BACKGROUND_SYNC_KEY.equals(prefName)) { ++ checked = PrefServiceBridge.getInstance().isBackgroundSyncAllowed();*/ + } else if (CAMERA_KEY.equals(prefName)) { + checked = PrefServiceBridge.getInstance().isCameraEnabled(); + } else if (CLIPBOARD_KEY.equals(prefName)) { +-- +2.7.4 + diff --git a/patches/BRM020_Disable-Omaha-update-checks.patch b/patches/BRM020_Disable-Omaha-update-checks.patch new file mode 100644 index 00000000..4c2d5feb --- /dev/null +++ b/patches/BRM020_Disable-Omaha-update-checks.patch @@ -0,0 +1,23 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sun, 26 Nov 2017 23:11:56 +0100 +Subject: Disable Omaha update checks + +--- + .../android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java +@@ -132,7 +132,7 @@ public class OmahaBase { + + /** See {@link #sIsDisabled}. */ + static boolean isDisabled() { +- return sIsDisabled; ++ return true; + } + + /** +-- +2.7.4 + diff --git a/patches/BRM021_Add-DuckDuckGo-search-engine.patch b/patches/BRM021_Add-DuckDuckGo-search-engine.patch new file mode 100644 index 00000000..10d3e3fd --- /dev/null +++ b/patches/BRM021_Add-DuckDuckGo-search-engine.patch @@ -0,0 +1,715 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Thu, 12 Oct 2017 11:06:18 +0200 +Subject: Add DuckDuckGo search engine + +--- + .../search_engines/prepopulated_engines.json | 19 ++ + components/search_engines/search_engine_type.h | 2 + + .../template_url_prepopulate_data.cc | 218 ++++++++++----------- + 3 files changed, 130 insertions(+), 109 deletions(-) + +diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json +--- a/components/search_engines/prepopulated_engines.json ++++ b/components/search_engines/prepopulated_engines.json +@@ -38,6 +38,25 @@ + // The following engines are included in country lists and are added to the + // list of search engines on the first run depending on user's country. + "elements": { ++ "duckduckgo": { ++ "name": "DuckDuckGo", ++ "keyword": "duckduckgo.com", ++ "favicon_url": "https://duckduckgo.com/favicon.ico", ++ "search_url": "https://duckduckgo.com/?q={searchTerms}", ++ "suggest_url": "https://ac.duckduckgo.com/ac/?q={searchTerms}&type=list", ++ "type": "SEARCH_ENGINE_DUCKDUCKGO", ++ "id": 11 ++ }, ++ ++ "duckduckgo_light": { ++ "name": "DuckDuckGo Light", ++ "keyword": "duckduckgo.com/lite", ++ "favicon_url": "https://duckduckgo.com/favicon.ico", ++ "search_url": "https://duckduckgo.com/lite/?q={searchTerms}", ++ "type": "SEARCH_ENGINE_DUCKDUCKGOLIGHT", ++ "id": 12 ++ }, ++ + "aol": { + "name": "AOL", + "keyword": "aol.com", +diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h +--- a/components/search_engines/search_engine_type.h ++++ b/components/search_engines/search_engine_type.h +@@ -63,6 +63,8 @@ enum SearchEngineType { + SEARCH_ENGINE_YANDEX, + SEARCH_ENGINE_ZOZNAM, + SEARCH_ENGINE_360, ++ SEARCH_ENGINE_DUCKDUCKGO, ++ SEARCH_ENGINE_DUCKDUCKGOLIGHT, + SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro. + }; + +diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc +--- a/components/search_engines/template_url_prepopulate_data.cc ++++ b/components/search_engines/template_url_prepopulate_data.cc +@@ -51,548 +51,548 @@ namespace { + + // Default (for countries with no better engine set) + const PrepopulatedEngine* const engines_default[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // United Arab Emirates + const PrepopulatedEngine* const engines_AE[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Albania + const PrepopulatedEngine* const engines_AL[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Argentina + const PrepopulatedEngine* const engines_AR[] = { +- &google, &bing, &yahoo_ar, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, + }; + + // Austria + const PrepopulatedEngine* const engines_AT[] = { +- &google, &bing, &yahoo_at, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, + }; + + // Australia + const PrepopulatedEngine* const engines_AU[] = { +- &google, &bing, &yahoo_au, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, + }; + + // Bosnia and Herzegovina + const PrepopulatedEngine* const engines_BA[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Belgium + const PrepopulatedEngine* const engines_BE[] = { +- &google, &bing, &yahoo, &yahoo_fr, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, + }; + + // Bulgaria + const PrepopulatedEngine* const engines_BG[] = { +- &google, &bing, &ask, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Bahrain + const PrepopulatedEngine* const engines_BH[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Burundi + const PrepopulatedEngine* const engines_BI[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Brunei + const PrepopulatedEngine* const engines_BN[] = { +- &google, &yahoo_my, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Bolivia + const PrepopulatedEngine* const engines_BO[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Brazil + const PrepopulatedEngine* const engines_BR[] = { +- &google, &ask_br, &bing, &yahoo_br, ++ &google, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, + }; + + // Belarus + const PrepopulatedEngine* const engines_BY[] = { +- &google, &yandex_by, &mail_ru, ++ &google, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, + }; + + // Belize + const PrepopulatedEngine* const engines_BZ[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Canada + const PrepopulatedEngine* const engines_CA[] = { +- &google, &bing, &ask, &yahoo_ca, &yahoo_qc, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, + }; + + // Switzerland + const PrepopulatedEngine* const engines_CH[] = { +- &google, &bing, &yahoo_ch, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, + }; + + // Chile + const PrepopulatedEngine* const engines_CL[] = { +- &google, &bing, &yahoo_cl, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, + }; + + // China + const PrepopulatedEngine* const engines_CN[] = { +- &google, &baidu, &sogou, &so_360, ++ &google, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, + }; + + // Colombia + const PrepopulatedEngine* const engines_CO[] = { +- &google, &bing, &yahoo_co, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, + }; + + // Costa Rica + const PrepopulatedEngine* const engines_CR[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Czech Republic + const PrepopulatedEngine* const engines_CZ[] = { +- &google, &seznam, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &seznam, &bing, + }; + + // Germany + const PrepopulatedEngine* const engines_DE[] = { +- &google, &bing, &yahoo_de, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Denmark + const PrepopulatedEngine* const engines_DK[] = { +- &google, &bing, &yahoo_dk, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, + }; + + // Dominican Republic + const PrepopulatedEngine* const engines_DO[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Algeria + const PrepopulatedEngine* const engines_DZ[] = { +- &google, &bing, &yahoo_maktoob, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Ecuador + const PrepopulatedEngine* const engines_EC[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Estonia + const PrepopulatedEngine* const engines_EE[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Egypt + const PrepopulatedEngine* const engines_EG[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Spain + const PrepopulatedEngine* const engines_ES[] = { +- &google, &bing, &yahoo_es, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, + }; + + // Faroe Islands + const PrepopulatedEngine* const engines_FO[] = { +- &google, &bing, &ask, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Finland + const PrepopulatedEngine* const engines_FI[] = { +- &google, &bing, &yahoo_fi, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, + }; + + // France + const PrepopulatedEngine* const engines_FR[] = { +- &google, &bing, &yahoo_fr, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // United Kingdom + const PrepopulatedEngine* const engines_GB[] = { +- &google, &bing, &yahoo_uk, &ask_uk, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, + }; + + // Greece + const PrepopulatedEngine* const engines_GR[] = { +- &google, &bing, &yahoo_gr, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, + }; + + // Guatemala + const PrepopulatedEngine* const engines_GT[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Hong Kong + const PrepopulatedEngine* const engines_HK[] = { +- &google, &yahoo_hk, &baidu, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, + }; + + // Honduras + const PrepopulatedEngine* const engines_HN[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Croatia + const PrepopulatedEngine* const engines_HR[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Hungary + const PrepopulatedEngine* const engines_HU[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Indonesia + const PrepopulatedEngine* const engines_ID[] = { +- &google, &yahoo_id, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, + }; + + // Ireland + const PrepopulatedEngine* const engines_IE[] = { +- &google, &bing, &yahoo_uk, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, + }; + + // Israel + const PrepopulatedEngine* const engines_IL[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // India + const PrepopulatedEngine* const engines_IN[] = { +- &google, &bing, &yahoo_in, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, + }; + + // Iraq + const PrepopulatedEngine* const engines_IQ[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Iran + const PrepopulatedEngine* const engines_IR[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Iceland + const PrepopulatedEngine* const engines_IS[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Italy + const PrepopulatedEngine* const engines_IT[] = { +- &google, &virgilio, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &virgilio, &bing, + }; + + // Jamaica + const PrepopulatedEngine* const engines_JM[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Jordan + const PrepopulatedEngine* const engines_JO[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Japan + const PrepopulatedEngine* const engines_JP[] = { +- &google, &yahoo_jp, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, + }; + + // Kenya + const PrepopulatedEngine* const engines_KE[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Kuwait + const PrepopulatedEngine* const engines_KW[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // South Korea + const PrepopulatedEngine* const engines_KR[] = { +- &google, &naver, &daum, ++ &google, &duckduckgo, &duckduckgo_light, &naver, &daum, + }; + + // Kazakhstan + const PrepopulatedEngine* const engines_KZ[] = { +- &google, &mail_ru, &yandex_kz, ++ &google, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, + }; + + // Lebanon + const PrepopulatedEngine* const engines_LB[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Liechtenstein + const PrepopulatedEngine* const engines_LI[] = { +- &google, &bing, &yahoo_de, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Lithuania + const PrepopulatedEngine* const engines_LT[] = { +- &google, &bing, &yandex_ru, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, + }; + + // Luxembourg + const PrepopulatedEngine* const engines_LU[] = { +- &google, &bing, &yahoo_fr, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // Latvia + const PrepopulatedEngine* const engines_LV[] = { +- &google, &yandex_ru, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, + }; + + // Libya + const PrepopulatedEngine* const engines_LY[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Morocco + const PrepopulatedEngine* const engines_MA[] = { +- &google, &bing, &yahoo_maktoob, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Monaco + const PrepopulatedEngine* const engines_MC[] = { +- &google, &yahoo_fr, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, + }; + + // Moldova + const PrepopulatedEngine* const engines_MD[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Montenegro + const PrepopulatedEngine* const engines_ME[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Macedonia + const PrepopulatedEngine* const engines_MK[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Mexico + const PrepopulatedEngine* const engines_MX[] = { +- &google, &bing, &yahoo_mx, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, + }; + + // Malaysia + const PrepopulatedEngine* const engines_MY[] = { +- &google, &yahoo_my, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Nicaragua + const PrepopulatedEngine* const engines_NI[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Netherlands + const PrepopulatedEngine* const engines_NL[] = { +- &google, &yahoo_nl, &vinden, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, + }; + + // Norway + const PrepopulatedEngine* const engines_NO[] = { +- &google, &bing, &kvasir, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &kvasir, + }; + + // New Zealand + const PrepopulatedEngine* const engines_NZ[] = { +- &google, &bing, &yahoo_nz, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, + }; + + // Oman + const PrepopulatedEngine* const engines_OM[] = { +- &google, &bing, &yahoo_maktoob, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Panama + const PrepopulatedEngine* const engines_PA[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Peru + const PrepopulatedEngine* const engines_PE[] = { +- &google, &bing, &yahoo_pe, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, + }; + + // Philippines + const PrepopulatedEngine* const engines_PH[] = { +- &google, &yahoo_ph, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, + }; + + // Pakistan + const PrepopulatedEngine* const engines_PK[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Puerto Rico + const PrepopulatedEngine* const engines_PR[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Poland + const PrepopulatedEngine* const engines_PL[] = { +- &google, &onet, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &onet, &bing, + }; + + // Portugal + const PrepopulatedEngine* const engines_PT[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Paraguay + const PrepopulatedEngine* const engines_PY[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Qatar + const PrepopulatedEngine* const engines_QA[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Romania + const PrepopulatedEngine* const engines_RO[] = { +- &google, &yahoo_ro, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, + }; + + // Serbia + const PrepopulatedEngine* const engines_RS[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Russia + const PrepopulatedEngine* const engines_RU[] = { +- &google, &yandex_ru, &mail_ru, ++ &google, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, + }; + + // Rwanda + const PrepopulatedEngine* const engines_RW[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Saudi Arabia + const PrepopulatedEngine* const engines_SA[] = { +- &google, &yahoo_maktoob, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Sweden + const PrepopulatedEngine* const engines_SE[] = { +- &google, &bing, &yahoo_se, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, + }; + + // Singapore + const PrepopulatedEngine* const engines_SG[] = { +- &google, &yahoo_sg, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, + }; + + // Slovenia + const PrepopulatedEngine* const engines_SI[] = { +- &google, &najdi, &ask, ++ &google, &duckduckgo, &duckduckgo_light, &najdi, &ask, + }; + + // Slovakia + const PrepopulatedEngine* const engines_SK[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // El Salvador + const PrepopulatedEngine* const engines_SV[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Syria + const PrepopulatedEngine* const engines_SY[] = { +- &google, &bing, &yahoo_maktoob, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Thailand + const PrepopulatedEngine* const engines_TH[] = { +- &google, &yahoo_th, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, + }; + + // Tunisia + const PrepopulatedEngine* const engines_TN[] = { +- &google, &bing, &yahoo_maktoob, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Turkey + const PrepopulatedEngine* const engines_TR[] = { +- &google, &bing, &yahoo_tr, &yandex_tr, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, + }; + + // Trinidad and Tobago + const PrepopulatedEngine* const engines_TT[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Taiwan + const PrepopulatedEngine* const engines_TW[] = { +- &google, &yahoo_tw, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, + }; + + // Tanzania + const PrepopulatedEngine* const engines_TZ[] = { +- &google, &yahoo, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Ukraine + const PrepopulatedEngine* const engines_UA[] = { +- &google, &yandex_ua, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, + }; + + // United States + const PrepopulatedEngine* const engines_US[] = { +- &google, &bing, &yahoo, &aol, &ask, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, + }; + + // Uruguay + const PrepopulatedEngine* const engines_UY[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Venezuela + const PrepopulatedEngine* const engines_VE[] = { +- &google, &bing, &yahoo_ve, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, + }; + + // Vietnam + const PrepopulatedEngine* const engines_VN[] = { +- &google, &yahoo_vn, &bing, ++ &google, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, + }; + + // Yemen + const PrepopulatedEngine* const engines_YE[] = { +- &google, &bing, &yahoo_maktoob, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // South Africa + const PrepopulatedEngine* const engines_ZA[] = { +- &google, &bing, &yahoo, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Zimbabwe + const PrepopulatedEngine* const engines_ZW[] = { +- &google, &bing, &yahoo, &ask, ++ &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, + }; + + // A list of all the engines that we know about. + const PrepopulatedEngine* const kAllEngines[] = { + // Prepopulated engines: +- &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &google, &kvasir, ++ &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &google, &duckduckgo, &duckduckgo_light, &kvasir, + &mail_ru, &najdi, &naver, &onet, &seznam, &sogou, &vinden, &virgilio, + &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au, &yahoo_br, &yahoo_ca, &yahoo_ch, + &yahoo_cl, &yahoo_co, &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, +-- +2.7.4 + diff --git a/patches/BRM022_Add-StartPage-search-engine.patch b/patches/BRM022_Add-StartPage-search-engine.patch new file mode 100644 index 00000000..4c5f53b4 --- /dev/null +++ b/patches/BRM022_Add-StartPage-search-engine.patch @@ -0,0 +1,714 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 18 Oct 2017 21:24:05 +0200 +Subject: Add StartPage search engine + +--- + .../search_engines/prepopulated_engines.json | 12 +- + components/search_engines/search_engine_type.h | 1 + + .../template_url_prepopulate_data.cc | 218 ++++++++++----------- + 3 files changed, 121 insertions(+), 110 deletions(-) + +diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json +--- a/components/search_engines/prepopulated_engines.json ++++ b/components/search_engines/prepopulated_engines.json +@@ -32,7 +32,7 @@ + + // Increment this if you change the data in ways that mean users with + // existing data should get a new version. +- "kCurrentDataVersion": 100 ++ "kCurrentDataVersion": 101 + }, + + // The following engines are included in country lists and are added to the +@@ -232,6 +232,16 @@ + "id": 56 + }, + ++ "startpage": { ++ "name": "StartPage", ++ "keyword": "startpage.com", ++ "favicon_url": "https://www.startpage.com/graphics/favicon/sp-favicon-16x16.png", ++ "search_url": "https://www.startpage.com/do/dsearch?query={searchTerms}&cat=web&pl=opensearch", ++ "suggest_url": "https://www.startpage.com/cgi-bin/csuggest?query={searchTerms}&limit=10&format=json", ++ "type": "SEARCH_ENGINE_STARTPAGE", ++ "id": 33 ++ }, ++ + "vinden": { + "name": "Vinden.nl", + "keyword": "vinden.nl", +diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h +--- a/components/search_engines/search_engine_type.h ++++ b/components/search_engines/search_engine_type.h +@@ -65,6 +65,7 @@ enum SearchEngineType { + SEARCH_ENGINE_360, + SEARCH_ENGINE_DUCKDUCKGO, + SEARCH_ENGINE_DUCKDUCKGOLIGHT, ++ SEARCH_ENGINE_STARTPAGE, + SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro. + }; + +diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc +--- a/components/search_engines/template_url_prepopulate_data.cc ++++ b/components/search_engines/template_url_prepopulate_data.cc +@@ -51,548 +51,548 @@ namespace { + + // Default (for countries with no better engine set) + const PrepopulatedEngine* const engines_default[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // United Arab Emirates + const PrepopulatedEngine* const engines_AE[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Albania + const PrepopulatedEngine* const engines_AL[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Argentina + const PrepopulatedEngine* const engines_AR[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, + }; + + // Austria + const PrepopulatedEngine* const engines_AT[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, + }; + + // Australia + const PrepopulatedEngine* const engines_AU[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, + }; + + // Bosnia and Herzegovina + const PrepopulatedEngine* const engines_BA[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Belgium + const PrepopulatedEngine* const engines_BE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, + }; + + // Bulgaria + const PrepopulatedEngine* const engines_BG[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &ask, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Bahrain + const PrepopulatedEngine* const engines_BH[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Burundi + const PrepopulatedEngine* const engines_BI[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Brunei + const PrepopulatedEngine* const engines_BN[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Bolivia + const PrepopulatedEngine* const engines_BO[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Brazil + const PrepopulatedEngine* const engines_BR[] = { +- &google, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, + }; + + // Belarus + const PrepopulatedEngine* const engines_BY[] = { +- &google, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, + }; + + // Belize + const PrepopulatedEngine* const engines_BZ[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Canada + const PrepopulatedEngine* const engines_CA[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, + }; + + // Switzerland + const PrepopulatedEngine* const engines_CH[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, + }; + + // Chile + const PrepopulatedEngine* const engines_CL[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, + }; + + // China + const PrepopulatedEngine* const engines_CN[] = { +- &google, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, + }; + + // Colombia + const PrepopulatedEngine* const engines_CO[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, + }; + + // Costa Rica + const PrepopulatedEngine* const engines_CR[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Czech Republic + const PrepopulatedEngine* const engines_CZ[] = { +- &google, &duckduckgo, &duckduckgo_light, &seznam, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &seznam, &bing, + }; + + // Germany + const PrepopulatedEngine* const engines_DE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Denmark + const PrepopulatedEngine* const engines_DK[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, + }; + + // Dominican Republic + const PrepopulatedEngine* const engines_DO[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Algeria + const PrepopulatedEngine* const engines_DZ[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Ecuador + const PrepopulatedEngine* const engines_EC[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Estonia + const PrepopulatedEngine* const engines_EE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Egypt + const PrepopulatedEngine* const engines_EG[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Spain + const PrepopulatedEngine* const engines_ES[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, + }; + + // Faroe Islands + const PrepopulatedEngine* const engines_FO[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &ask, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Finland + const PrepopulatedEngine* const engines_FI[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, + }; + + // France + const PrepopulatedEngine* const engines_FR[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // United Kingdom + const PrepopulatedEngine* const engines_GB[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, + }; + + // Greece + const PrepopulatedEngine* const engines_GR[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, + }; + + // Guatemala + const PrepopulatedEngine* const engines_GT[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Hong Kong + const PrepopulatedEngine* const engines_HK[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, + }; + + // Honduras + const PrepopulatedEngine* const engines_HN[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Croatia + const PrepopulatedEngine* const engines_HR[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Hungary + const PrepopulatedEngine* const engines_HU[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Indonesia + const PrepopulatedEngine* const engines_ID[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, + }; + + // Ireland + const PrepopulatedEngine* const engines_IE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, + }; + + // Israel + const PrepopulatedEngine* const engines_IL[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // India + const PrepopulatedEngine* const engines_IN[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, + }; + + // Iraq + const PrepopulatedEngine* const engines_IQ[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Iran + const PrepopulatedEngine* const engines_IR[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Iceland + const PrepopulatedEngine* const engines_IS[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Italy + const PrepopulatedEngine* const engines_IT[] = { +- &google, &duckduckgo, &duckduckgo_light, &virgilio, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &virgilio, &bing, + }; + + // Jamaica + const PrepopulatedEngine* const engines_JM[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Jordan + const PrepopulatedEngine* const engines_JO[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Japan + const PrepopulatedEngine* const engines_JP[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, + }; + + // Kenya + const PrepopulatedEngine* const engines_KE[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Kuwait + const PrepopulatedEngine* const engines_KW[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // South Korea + const PrepopulatedEngine* const engines_KR[] = { +- &google, &duckduckgo, &duckduckgo_light, &naver, &daum, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &naver, &daum, + }; + + // Kazakhstan + const PrepopulatedEngine* const engines_KZ[] = { +- &google, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, + }; + + // Lebanon + const PrepopulatedEngine* const engines_LB[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Liechtenstein + const PrepopulatedEngine* const engines_LI[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Lithuania + const PrepopulatedEngine* const engines_LT[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, + }; + + // Luxembourg + const PrepopulatedEngine* const engines_LU[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // Latvia + const PrepopulatedEngine* const engines_LV[] = { +- &google, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, + }; + + // Libya + const PrepopulatedEngine* const engines_LY[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Morocco + const PrepopulatedEngine* const engines_MA[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Monaco + const PrepopulatedEngine* const engines_MC[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, + }; + + // Moldova + const PrepopulatedEngine* const engines_MD[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Montenegro + const PrepopulatedEngine* const engines_ME[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Macedonia + const PrepopulatedEngine* const engines_MK[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Mexico + const PrepopulatedEngine* const engines_MX[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, + }; + + // Malaysia + const PrepopulatedEngine* const engines_MY[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Nicaragua + const PrepopulatedEngine* const engines_NI[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Netherlands + const PrepopulatedEngine* const engines_NL[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, + }; + + // Norway + const PrepopulatedEngine* const engines_NO[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &kvasir, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &kvasir, + }; + + // New Zealand + const PrepopulatedEngine* const engines_NZ[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, + }; + + // Oman + const PrepopulatedEngine* const engines_OM[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Panama + const PrepopulatedEngine* const engines_PA[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Peru + const PrepopulatedEngine* const engines_PE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, + }; + + // Philippines + const PrepopulatedEngine* const engines_PH[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, + }; + + // Pakistan + const PrepopulatedEngine* const engines_PK[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Puerto Rico + const PrepopulatedEngine* const engines_PR[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Poland + const PrepopulatedEngine* const engines_PL[] = { +- &google, &duckduckgo, &duckduckgo_light, &onet, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &onet, &bing, + }; + + // Portugal + const PrepopulatedEngine* const engines_PT[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Paraguay + const PrepopulatedEngine* const engines_PY[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Qatar + const PrepopulatedEngine* const engines_QA[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Romania + const PrepopulatedEngine* const engines_RO[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, + }; + + // Serbia + const PrepopulatedEngine* const engines_RS[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Russia + const PrepopulatedEngine* const engines_RU[] = { +- &google, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, + }; + + // Rwanda + const PrepopulatedEngine* const engines_RW[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Saudi Arabia + const PrepopulatedEngine* const engines_SA[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Sweden + const PrepopulatedEngine* const engines_SE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, + }; + + // Singapore + const PrepopulatedEngine* const engines_SG[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, + }; + + // Slovenia + const PrepopulatedEngine* const engines_SI[] = { +- &google, &duckduckgo, &duckduckgo_light, &najdi, &ask, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &najdi, &ask, + }; + + // Slovakia + const PrepopulatedEngine* const engines_SK[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // El Salvador + const PrepopulatedEngine* const engines_SV[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Syria + const PrepopulatedEngine* const engines_SY[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Thailand + const PrepopulatedEngine* const engines_TH[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, + }; + + // Tunisia + const PrepopulatedEngine* const engines_TN[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Turkey + const PrepopulatedEngine* const engines_TR[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, + }; + + // Trinidad and Tobago + const PrepopulatedEngine* const engines_TT[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Taiwan + const PrepopulatedEngine* const engines_TW[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, + }; + + // Tanzania + const PrepopulatedEngine* const engines_TZ[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Ukraine + const PrepopulatedEngine* const engines_UA[] = { +- &google, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, + }; + + // United States + const PrepopulatedEngine* const engines_US[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, + }; + + // Uruguay + const PrepopulatedEngine* const engines_UY[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Venezuela + const PrepopulatedEngine* const engines_VE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, + }; + + // Vietnam + const PrepopulatedEngine* const engines_VN[] = { +- &google, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, + }; + + // Yemen + const PrepopulatedEngine* const engines_YE[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // South Africa + const PrepopulatedEngine* const engines_ZA[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Zimbabwe + const PrepopulatedEngine* const engines_ZW[] = { +- &google, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, ++ &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, + }; + + // A list of all the engines that we know about. + const PrepopulatedEngine* const kAllEngines[] = { + // Prepopulated engines: +- &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &google, &duckduckgo, &duckduckgo_light, &kvasir, ++ &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &google, &startpage, &duckduckgo, &duckduckgo_light, &kvasir, + &mail_ru, &najdi, &naver, &onet, &seznam, &sogou, &vinden, &virgilio, + &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au, &yahoo_br, &yahoo_ca, &yahoo_ch, + &yahoo_cl, &yahoo_co, &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, +-- +2.7.4 + diff --git a/patches/BRM023_Added-Google-English-only-engine.patch b/patches/BRM023_Added-Google-English-only-engine.patch new file mode 100644 index 00000000..cd983ce3 --- /dev/null +++ b/patches/BRM023_Added-Google-English-only-engine.patch @@ -0,0 +1,727 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 11 Dec 2017 22:42:11 +0100 +Subject: Added Google English-only engine + +Add a Google search engine that forces languages to English, +disable from all its searches RLZ and field experiments querystring parameters. +--- + .../search_engines/prepopulated_engines.json | 23 ++- + components/search_engines/search_engine_type.h | 1 + + .../template_url_prepopulate_data.cc | 218 ++++++++++----------- + 3 files changed, 132 insertions(+), 110 deletions(-) + +diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json +--- a/components/search_engines/prepopulated_engines.json ++++ b/components/search_engines/prepopulated_engines.json +@@ -32,7 +32,7 @@ + + // Increment this if you change the data in ways that mean users with + // existing data should get a new version. +- "kCurrentDataVersion": 101 ++ "kCurrentDataVersion": 102 + }, + + // The following engines are included in country lists and are added to the +@@ -154,6 +154,27 @@ + "id": 1 + }, + ++ "googleen": { ++ "name": "Google in English", ++ "keyword": "googleen", ++ "favicon_url": "https://www.google.com/favicon.ico", ++ "search_url": "{google:baseURL}search?q={searchTerms}&{google:originalQueryForSuggestion}{google:iOSSearchLanguage}{google:searchClient}{google:contextualSearchVersion}ie={inputEncoding}&hl=en", ++ "suggest_url": "{google:baseSuggestURL}search?client={google:suggestClient}&gs_ri={google:suggestRid}&xssi=t&q={searchTerms}&{google:inputType}{google:pageClassification}{google:searchVersion}{google:prefetchQuery}sugkey={google:suggestAPIKeyParameter}&hl=en", ++ "image_url": "{google:baseURL}searchbyimage/upload?hl=en", ++ "new_tab_url": "{google:baseURL}_/chrome/newtab?hl=en&ie={inputEncoding}", ++ "contextual_search_url": "{google:baseURL}_/contextualsearch?{google:contextualSearchVersion}{google:contextualSearchContextData}&hl=en", ++ "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", ++ "alternate_urls": [ ++ "{google:baseURL}?hl=en#q={searchTerms}", ++ "{google:baseURL}search?hl=en#q={searchTerms}", ++ "{google:baseURL}webhp?hl=en#q={searchTerms}", ++ "{google:baseURL}s?hl=en#q={searchTerms}", ++ "{google:baseURL}s?hl=en&q={searchTerms}" ++ ], ++ "type": "SEARCH_ENGINE_GOOGLE_EN", ++ "id": 13 ++ }, ++ + "kvasir": { + "name": "Kvasir", + "keyword": "kvasir.no", +diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h +--- a/components/search_engines/search_engine_type.h ++++ b/components/search_engines/search_engine_type.h +@@ -66,6 +66,7 @@ enum SearchEngineType { + SEARCH_ENGINE_DUCKDUCKGO, + SEARCH_ENGINE_DUCKDUCKGOLIGHT, + SEARCH_ENGINE_STARTPAGE, ++ SEARCH_ENGINE_GOOGLE_EN, + SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro. + }; + +diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc +--- a/components/search_engines/template_url_prepopulate_data.cc ++++ b/components/search_engines/template_url_prepopulate_data.cc +@@ -51,548 +51,548 @@ namespace { + + // Default (for countries with no better engine set) + const PrepopulatedEngine* const engines_default[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // United Arab Emirates + const PrepopulatedEngine* const engines_AE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Albania + const PrepopulatedEngine* const engines_AL[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Argentina + const PrepopulatedEngine* const engines_AR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, + }; + + // Austria + const PrepopulatedEngine* const engines_AT[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, + }; + + // Australia + const PrepopulatedEngine* const engines_AU[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, + }; + + // Bosnia and Herzegovina + const PrepopulatedEngine* const engines_BA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Belgium + const PrepopulatedEngine* const engines_BE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, + }; + + // Bulgaria + const PrepopulatedEngine* const engines_BG[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Bahrain + const PrepopulatedEngine* const engines_BH[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Burundi + const PrepopulatedEngine* const engines_BI[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Brunei + const PrepopulatedEngine* const engines_BN[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Bolivia + const PrepopulatedEngine* const engines_BO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Brazil + const PrepopulatedEngine* const engines_BR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, + }; + + // Belarus + const PrepopulatedEngine* const engines_BY[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, + }; + + // Belize + const PrepopulatedEngine* const engines_BZ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Canada + const PrepopulatedEngine* const engines_CA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, + }; + + // Switzerland + const PrepopulatedEngine* const engines_CH[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, + }; + + // Chile + const PrepopulatedEngine* const engines_CL[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, + }; + + // China + const PrepopulatedEngine* const engines_CN[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, + }; + + // Colombia + const PrepopulatedEngine* const engines_CO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, + }; + + // Costa Rica + const PrepopulatedEngine* const engines_CR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Czech Republic + const PrepopulatedEngine* const engines_CZ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &seznam, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &seznam, &bing, + }; + + // Germany + const PrepopulatedEngine* const engines_DE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Denmark + const PrepopulatedEngine* const engines_DK[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, + }; + + // Dominican Republic + const PrepopulatedEngine* const engines_DO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Algeria + const PrepopulatedEngine* const engines_DZ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Ecuador + const PrepopulatedEngine* const engines_EC[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Estonia + const PrepopulatedEngine* const engines_EE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Egypt + const PrepopulatedEngine* const engines_EG[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Spain + const PrepopulatedEngine* const engines_ES[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, + }; + + // Faroe Islands + const PrepopulatedEngine* const engines_FO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Finland + const PrepopulatedEngine* const engines_FI[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, + }; + + // France + const PrepopulatedEngine* const engines_FR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // United Kingdom + const PrepopulatedEngine* const engines_GB[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, + }; + + // Greece + const PrepopulatedEngine* const engines_GR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, + }; + + // Guatemala + const PrepopulatedEngine* const engines_GT[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Hong Kong + const PrepopulatedEngine* const engines_HK[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, + }; + + // Honduras + const PrepopulatedEngine* const engines_HN[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Croatia + const PrepopulatedEngine* const engines_HR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Hungary + const PrepopulatedEngine* const engines_HU[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Indonesia + const PrepopulatedEngine* const engines_ID[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, + }; + + // Ireland + const PrepopulatedEngine* const engines_IE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, + }; + + // Israel + const PrepopulatedEngine* const engines_IL[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // India + const PrepopulatedEngine* const engines_IN[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, + }; + + // Iraq + const PrepopulatedEngine* const engines_IQ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Iran + const PrepopulatedEngine* const engines_IR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Iceland + const PrepopulatedEngine* const engines_IS[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Italy + const PrepopulatedEngine* const engines_IT[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &virgilio, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &virgilio, &bing, + }; + + // Jamaica + const PrepopulatedEngine* const engines_JM[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Jordan + const PrepopulatedEngine* const engines_JO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Japan + const PrepopulatedEngine* const engines_JP[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, + }; + + // Kenya + const PrepopulatedEngine* const engines_KE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Kuwait + const PrepopulatedEngine* const engines_KW[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // South Korea + const PrepopulatedEngine* const engines_KR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &naver, &daum, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &naver, &daum, + }; + + // Kazakhstan + const PrepopulatedEngine* const engines_KZ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, + }; + + // Lebanon + const PrepopulatedEngine* const engines_LB[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Liechtenstein + const PrepopulatedEngine* const engines_LI[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Lithuania + const PrepopulatedEngine* const engines_LT[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, + }; + + // Luxembourg + const PrepopulatedEngine* const engines_LU[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // Latvia + const PrepopulatedEngine* const engines_LV[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, + }; + + // Libya + const PrepopulatedEngine* const engines_LY[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Morocco + const PrepopulatedEngine* const engines_MA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Monaco + const PrepopulatedEngine* const engines_MC[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, + }; + + // Moldova + const PrepopulatedEngine* const engines_MD[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Montenegro + const PrepopulatedEngine* const engines_ME[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Macedonia + const PrepopulatedEngine* const engines_MK[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Mexico + const PrepopulatedEngine* const engines_MX[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, + }; + + // Malaysia + const PrepopulatedEngine* const engines_MY[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Nicaragua + const PrepopulatedEngine* const engines_NI[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Netherlands + const PrepopulatedEngine* const engines_NL[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, + }; + + // Norway + const PrepopulatedEngine* const engines_NO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &kvasir, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &kvasir, + }; + + // New Zealand + const PrepopulatedEngine* const engines_NZ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, + }; + + // Oman + const PrepopulatedEngine* const engines_OM[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Panama + const PrepopulatedEngine* const engines_PA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Peru + const PrepopulatedEngine* const engines_PE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, + }; + + // Philippines + const PrepopulatedEngine* const engines_PH[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, + }; + + // Pakistan + const PrepopulatedEngine* const engines_PK[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Puerto Rico + const PrepopulatedEngine* const engines_PR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Poland + const PrepopulatedEngine* const engines_PL[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &onet, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &onet, &bing, + }; + + // Portugal + const PrepopulatedEngine* const engines_PT[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Paraguay + const PrepopulatedEngine* const engines_PY[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Qatar + const PrepopulatedEngine* const engines_QA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Romania + const PrepopulatedEngine* const engines_RO[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, + }; + + // Serbia + const PrepopulatedEngine* const engines_RS[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Russia + const PrepopulatedEngine* const engines_RU[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, + }; + + // Rwanda + const PrepopulatedEngine* const engines_RW[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Saudi Arabia + const PrepopulatedEngine* const engines_SA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Sweden + const PrepopulatedEngine* const engines_SE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, + }; + + // Singapore + const PrepopulatedEngine* const engines_SG[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, + }; + + // Slovenia + const PrepopulatedEngine* const engines_SI[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &najdi, &ask, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &najdi, &ask, + }; + + // Slovakia + const PrepopulatedEngine* const engines_SK[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // El Salvador + const PrepopulatedEngine* const engines_SV[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Syria + const PrepopulatedEngine* const engines_SY[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Thailand + const PrepopulatedEngine* const engines_TH[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, + }; + + // Tunisia + const PrepopulatedEngine* const engines_TN[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Turkey + const PrepopulatedEngine* const engines_TR[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, + }; + + // Trinidad and Tobago + const PrepopulatedEngine* const engines_TT[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Taiwan + const PrepopulatedEngine* const engines_TW[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, + }; + + // Tanzania + const PrepopulatedEngine* const engines_TZ[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Ukraine + const PrepopulatedEngine* const engines_UA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, + }; + + // United States + const PrepopulatedEngine* const engines_US[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, + }; + + // Uruguay + const PrepopulatedEngine* const engines_UY[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Venezuela + const PrepopulatedEngine* const engines_VE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, + }; + + // Vietnam + const PrepopulatedEngine* const engines_VN[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, + }; + + // Yemen + const PrepopulatedEngine* const engines_YE[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // South Africa + const PrepopulatedEngine* const engines_ZA[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Zimbabwe + const PrepopulatedEngine* const engines_ZW[] = { +- &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, ++ &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, + }; + + // A list of all the engines that we know about. + const PrepopulatedEngine* const kAllEngines[] = { + // Prepopulated engines: +- &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &google, &startpage, &duckduckgo, &duckduckgo_light, &kvasir, ++ &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &kvasir, + &mail_ru, &najdi, &naver, &onet, &seznam, &sogou, &vinden, &virgilio, + &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au, &yahoo_br, &yahoo_ca, &yahoo_ch, + &yahoo_cl, &yahoo_co, &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, +-- +2.7.4 + diff --git a/patches/BRM024_Add-Qwant-search-engine.patch b/patches/BRM024_Add-Qwant-search-engine.patch new file mode 100644 index 00000000..f77a8286 --- /dev/null +++ b/patches/BRM024_Add-Qwant-search-engine.patch @@ -0,0 +1,715 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Mar 2018 20:31:44 +0100 +Subject: Add Qwant search engine + +--- + .../search_engines/prepopulated_engines.json | 13 +- + components/search_engines/search_engine_type.h | 1 + + .../template_url_prepopulate_data.cc | 218 ++++++++++----------- + 3 files changed, 122 insertions(+), 110 deletions(-) + +diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json +--- a/components/search_engines/prepopulated_engines.json ++++ b/components/search_engines/prepopulated_engines.json +@@ -32,7 +32,7 @@ + + // Increment this if you change the data in ways that mean users with + // existing data should get a new version. +- "kCurrentDataVersion": 102 ++ "kCurrentDataVersion": 103 + }, + + // The following engines are included in country lists and are added to the +@@ -939,6 +939,17 @@ + "id": 6 + }, + ++ "qwant": { ++ "name": "Qwant", ++ "keyword": "qwant.com", ++ "favicon_url": "https://www.qwant.com/favicon.ico", ++ "search_url": "https://www.qwant.com/?client=opensearch&q={searchTerms}", ++ "suggest_url": "https://api.qwant.com/api/suggest/?client=opensearch&q={searchTerms}", ++ "image_url": "https://www.qwant.com/?t=images&q={searchTerms}", ++ "type": "SEARCH_ENGINE_QWANT", ++ "id": 14 ++ }, ++ + "rambler": { + "name": "\u0420\u0430\u043c\u0431\u043b\u0435\u0440", + "keyword": "rambler.ru", +diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h +--- a/components/search_engines/search_engine_type.h ++++ b/components/search_engines/search_engine_type.h +@@ -67,6 +67,7 @@ enum SearchEngineType { + SEARCH_ENGINE_DUCKDUCKGOLIGHT, + SEARCH_ENGINE_STARTPAGE, + SEARCH_ENGINE_GOOGLE_EN, ++ SEARCH_ENGINE_QWANT, + SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro. + }; + +diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc +--- a/components/search_engines/template_url_prepopulate_data.cc ++++ b/components/search_engines/template_url_prepopulate_data.cc +@@ -51,548 +51,548 @@ namespace { + + // Default (for countries with no better engine set) + const PrepopulatedEngine* const engines_default[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // United Arab Emirates + const PrepopulatedEngine* const engines_AE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Albania + const PrepopulatedEngine* const engines_AL[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Argentina + const PrepopulatedEngine* const engines_AR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ar, + }; + + // Austria + const PrepopulatedEngine* const engines_AT[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_at, + }; + + // Australia + const PrepopulatedEngine* const engines_AU[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_au, + }; + + // Bosnia and Herzegovina + const PrepopulatedEngine* const engines_BA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Belgium + const PrepopulatedEngine* const engines_BE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &yahoo_fr, + }; + + // Bulgaria + const PrepopulatedEngine* const engines_BG[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Bahrain + const PrepopulatedEngine* const engines_BH[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Burundi + const PrepopulatedEngine* const engines_BI[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Brunei + const PrepopulatedEngine* const engines_BN[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Bolivia + const PrepopulatedEngine* const engines_BO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Brazil + const PrepopulatedEngine* const engines_BR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &ask_br, &bing, &yahoo_br, + }; + + // Belarus + const PrepopulatedEngine* const engines_BY[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yandex_by, &mail_ru, + }; + + // Belize + const PrepopulatedEngine* const engines_BZ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Canada + const PrepopulatedEngine* const engines_CA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &ask, &yahoo_ca, &yahoo_qc, + }; + + // Switzerland + const PrepopulatedEngine* const engines_CH[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ch, + }; + + // Chile + const PrepopulatedEngine* const engines_CL[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_cl, + }; + + // China + const PrepopulatedEngine* const engines_CN[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &baidu, &sogou, &so_360, + }; + + // Colombia + const PrepopulatedEngine* const engines_CO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_co, + }; + + // Costa Rica + const PrepopulatedEngine* const engines_CR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Czech Republic + const PrepopulatedEngine* const engines_CZ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &seznam, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &seznam, &bing, + }; + + // Germany + const PrepopulatedEngine* const engines_DE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Denmark + const PrepopulatedEngine* const engines_DK[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_dk, + }; + + // Dominican Republic + const PrepopulatedEngine* const engines_DO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Algeria + const PrepopulatedEngine* const engines_DZ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Ecuador + const PrepopulatedEngine* const engines_EC[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Estonia + const PrepopulatedEngine* const engines_EE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Egypt + const PrepopulatedEngine* const engines_EG[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Spain + const PrepopulatedEngine* const engines_ES[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_es, + }; + + // Faroe Islands + const PrepopulatedEngine* const engines_FO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &ask, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &ask, + }; + + // Finland + const PrepopulatedEngine* const engines_FI[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fi, + }; + + // France + const PrepopulatedEngine* const engines_FR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // United Kingdom + const PrepopulatedEngine* const engines_GB[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, &ask_uk, + }; + + // Greece + const PrepopulatedEngine* const engines_GR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_gr, + }; + + // Guatemala + const PrepopulatedEngine* const engines_GT[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Hong Kong + const PrepopulatedEngine* const engines_HK[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_hk, &baidu, &bing, + }; + + // Honduras + const PrepopulatedEngine* const engines_HN[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Croatia + const PrepopulatedEngine* const engines_HR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Hungary + const PrepopulatedEngine* const engines_HU[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Indonesia + const PrepopulatedEngine* const engines_ID[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_id, &bing, + }; + + // Ireland + const PrepopulatedEngine* const engines_IE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_uk, + }; + + // Israel + const PrepopulatedEngine* const engines_IL[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // India + const PrepopulatedEngine* const engines_IN[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_in, + }; + + // Iraq + const PrepopulatedEngine* const engines_IQ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Iran + const PrepopulatedEngine* const engines_IR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Iceland + const PrepopulatedEngine* const engines_IS[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Italy + const PrepopulatedEngine* const engines_IT[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &virgilio, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &virgilio, &bing, + }; + + // Jamaica + const PrepopulatedEngine* const engines_JM[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Jordan + const PrepopulatedEngine* const engines_JO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Japan + const PrepopulatedEngine* const engines_JP[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_jp, &bing, + }; + + // Kenya + const PrepopulatedEngine* const engines_KE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Kuwait + const PrepopulatedEngine* const engines_KW[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // South Korea + const PrepopulatedEngine* const engines_KR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &naver, &daum, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &naver, &daum, + }; + + // Kazakhstan + const PrepopulatedEngine* const engines_KZ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &mail_ru, &yandex_kz, + }; + + // Lebanon + const PrepopulatedEngine* const engines_LB[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Liechtenstein + const PrepopulatedEngine* const engines_LI[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_de, + }; + + // Lithuania + const PrepopulatedEngine* const engines_LT[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yandex_ru, + }; + + // Luxembourg + const PrepopulatedEngine* const engines_LU[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_fr, + }; + + // Latvia + const PrepopulatedEngine* const engines_LV[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yandex_ru, &bing, + }; + + // Libya + const PrepopulatedEngine* const engines_LY[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Morocco + const PrepopulatedEngine* const engines_MA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Monaco + const PrepopulatedEngine* const engines_MC[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_fr, &bing, + }; + + // Moldova + const PrepopulatedEngine* const engines_MD[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Montenegro + const PrepopulatedEngine* const engines_ME[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Macedonia + const PrepopulatedEngine* const engines_MK[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Mexico + const PrepopulatedEngine* const engines_MX[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_mx, + }; + + // Malaysia + const PrepopulatedEngine* const engines_MY[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_my, &bing, + }; + + // Nicaragua + const PrepopulatedEngine* const engines_NI[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Netherlands + const PrepopulatedEngine* const engines_NL[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_nl, &vinden, + }; + + // Norway + const PrepopulatedEngine* const engines_NO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &kvasir, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &kvasir, + }; + + // New Zealand + const PrepopulatedEngine* const engines_NZ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_nz, + }; + + // Oman + const PrepopulatedEngine* const engines_OM[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Panama + const PrepopulatedEngine* const engines_PA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Peru + const PrepopulatedEngine* const engines_PE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_pe, + }; + + // Philippines + const PrepopulatedEngine* const engines_PH[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_ph, &bing, + }; + + // Pakistan + const PrepopulatedEngine* const engines_PK[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Puerto Rico + const PrepopulatedEngine* const engines_PR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Poland + const PrepopulatedEngine* const engines_PL[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &onet, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &onet, &bing, + }; + + // Portugal + const PrepopulatedEngine* const engines_PT[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Paraguay + const PrepopulatedEngine* const engines_PY[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Qatar + const PrepopulatedEngine* const engines_QA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Romania + const PrepopulatedEngine* const engines_RO[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_ro, &bing, + }; + + // Serbia + const PrepopulatedEngine* const engines_RS[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Russia + const PrepopulatedEngine* const engines_RU[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yandex_ru, &mail_ru, + }; + + // Rwanda + const PrepopulatedEngine* const engines_RW[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Saudi Arabia + const PrepopulatedEngine* const engines_SA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_maktoob, &bing, + }; + + // Sweden + const PrepopulatedEngine* const engines_SE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_se, + }; + + // Singapore + const PrepopulatedEngine* const engines_SG[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_sg, &bing, + }; + + // Slovenia + const PrepopulatedEngine* const engines_SI[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &najdi, &ask, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &najdi, &ask, + }; + + // Slovakia + const PrepopulatedEngine* const engines_SK[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // El Salvador + const PrepopulatedEngine* const engines_SV[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Syria + const PrepopulatedEngine* const engines_SY[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Thailand + const PrepopulatedEngine* const engines_TH[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_th, &bing, + }; + + // Tunisia + const PrepopulatedEngine* const engines_TN[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // Turkey + const PrepopulatedEngine* const engines_TR[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_tr, &yandex_tr, + }; + + // Trinidad and Tobago + const PrepopulatedEngine* const engines_TT[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Taiwan + const PrepopulatedEngine* const engines_TW[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_tw, &bing, + }; + + // Tanzania + const PrepopulatedEngine* const engines_TZ[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo, &bing, + }; + + // Ukraine + const PrepopulatedEngine* const engines_UA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yandex_ua, &bing, + }; + + // United States + const PrepopulatedEngine* const engines_US[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &aol, &ask, + }; + + // Uruguay + const PrepopulatedEngine* const engines_UY[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Venezuela + const PrepopulatedEngine* const engines_VE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_ve, + }; + + // Vietnam + const PrepopulatedEngine* const engines_VN[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &yahoo_vn, &bing, + }; + + // Yemen + const PrepopulatedEngine* const engines_YE[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo_maktoob, + }; + + // South Africa + const PrepopulatedEngine* const engines_ZA[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, + }; + + // Zimbabwe + const PrepopulatedEngine* const engines_ZW[] = { +- &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, ++ &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &bing, &yahoo, &ask, + }; + + // A list of all the engines that we know about. + const PrepopulatedEngine* const kAllEngines[] = { + // Prepopulated engines: +- &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &googleen, &google, &startpage, &duckduckgo, &duckduckgo_light, &kvasir, ++ &aol, &ask, &ask_br, &ask_uk, &baidu, &bing, &daum, &googleen, &google, &startpage, &qwant, &duckduckgo, &duckduckgo_light, &kvasir, + &mail_ru, &najdi, &naver, &onet, &seznam, &sogou, &vinden, &virgilio, + &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au, &yahoo_br, &yahoo_ca, &yahoo_ch, + &yahoo_cl, &yahoo_co, &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, +-- +2.7.4 + diff --git a/patches/BRM025_Fix-crash-when-accessing-page-info-site-settings.patch b/patches/BRM025_Fix-crash-when-accessing-page-info-site-settings.patch new file mode 100644 index 00000000..65a5f9e7 --- /dev/null +++ b/patches/BRM025_Fix-crash-when-accessing-page-info-site-settings.patch @@ -0,0 +1,24 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sat, 20 Jan 2018 19:44:43 +0100 +Subject: Fix crash when accessing page info / site settings + +--- + chrome/browser/permissions/permission_manager.cc | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc +--- a/chrome/browser/permissions/permission_manager.cc ++++ b/chrome/browser/permissions/permission_manager.cc +@@ -632,6 +632,9 @@ PermissionResult PermissionManager::GetPermissionStatusHelper( + GURL canonical_requesting_origin = + GetCanonicalOrigin(requesting_origin, embedding_origin); + PermissionContextBase* context = GetPermissionContext(permission); ++ if (context == nullptr) { ++ return PermissionResult(CONTENT_SETTING_BLOCK, PermissionStatusSource::UNSPECIFIED); ++ } + PermissionResult result = context->GetPermissionStatus( + render_frame_host, canonical_requesting_origin.GetOrigin(), + embedding_origin.GetOrigin()); +-- +2.7.4 + diff --git a/patches/BRM026_openH264-enable-ARM-ARM64-optimizations.patch b/patches/BRM026_openH264-enable-ARM-ARM64-optimizations.patch new file mode 100644 index 00000000..b7341c30 --- /dev/null +++ b/patches/BRM026_openH264-enable-ARM-ARM64-optimizations.patch @@ -0,0 +1,109 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sat, 20 Jan 2018 21:17:27 +0100 +Subject: openH264: enable ARM/ARM64 optimizations + +Enable the optimizations not only for ChromeOS but for all compatbile ARM/ARM64 architectures +Limit threads auto-detect only for iOS +--- + content/renderer/media_recorder/h264_encoder.cc | 6 ++-- + third_party/openh264/BUILD.gn | 39 +++++++++++++++++++++++++ + 2 files changed, 42 insertions(+), 3 deletions(-) + +diff --git a/content/renderer/media_recorder/h264_encoder.cc b/content/renderer/media_recorder/h264_encoder.cc +--- a/content/renderer/media_recorder/h264_encoder.cc ++++ b/content/renderer/media_recorder/h264_encoder.cc +@@ -149,11 +149,11 @@ void H264Encoder::ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) { + init_params.iRCMode = RC_OFF_MODE; + } + +-#if defined(OS_CHROMEOS) +- init_params.iMultipleThreadIdc = 0; +-#else ++#if defined(OS_MACOSX) + // Threading model: Set to 1 due to https://crbug.com/583348. + init_params.iMultipleThreadIdc = 1; ++#else ++ init_params.iMultipleThreadIdc = 0; + #endif + + // TODO(mcasas): consider reducing complexity if there are few CPUs available. +diff --git a/third_party/openh264/BUILD.gn b/third_party/openh264/BUILD.gn +--- a/third_party/openh264/BUILD.gn ++++ b/third_party/openh264/BUILD.gn +@@ -10,6 +10,7 @@ import("//third_party/yasm/yasm_assemble.gni") + # Config shared by all openh264 targets. + config("config") { + cflags = [] ++ defines = [] + + if (is_chromeos && target_cpu == "arm") { + # HAVE_NEON and __chromeos__ are needed for enabling NEON on ChromeOS +@@ -20,6 +21,20 @@ config("config") { + ] + } + ++ # HAVE_NEON and __chromeos__ are needed for enabling NEON on ChromeOS ++ # devices. ++ if (is_chromeos && target_cpu == "arm") { ++ defines += [ ++ "__chromeos__", ++ ] ++ } ++ ++ if (target_cpu == "arm" || target_cpu == "arm64") { ++ defines += [ ++ "HAVE_NEON", ++ ] ++ } ++ + # GCC and clang flags. MSVS (is_win && !is_clang) does not use cflags. + if (!is_win || is_clang) { + cflags += [ +@@ -128,6 +143,14 @@ source_set("common") { + } + include_dirs = openh264_common_include_dirs + ++ # enable ARM optimizations ++ if (target_cpu == "arm") { ++ sources += openh264_common_sources_asm_arm ++ } ++ if (target_cpu == "arm64") { ++ sources += openh264_common_sources_asm_arm64 ++ } ++ + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":config" ] +@@ -154,6 +177,14 @@ source_set("processing") { + } + include_dirs = openh264_processing_include_dirs + ++ # enable ARM optimizations ++ if (target_cpu == "arm") { ++ sources += openh264_common_sources_asm_arm ++ } ++ if (target_cpu == "arm64") { ++ sources += openh264_common_sources_asm_arm64 ++ } ++ + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":config" ] +@@ -173,6 +204,14 @@ source_set("encoder") { + } + include_dirs = openh264_encoder_include_dirs + ++ # enable ARM optimizations ++ if (target_cpu == "arm") { ++ sources += openh264_common_sources_asm_arm ++ } ++ if (target_cpu == "arm64") { ++ sources += openh264_common_sources_asm_arm64 ++ } ++ + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":config" ] +-- +2.7.4 + diff --git a/patches/BRM027_Cure-AMP-and-tracking-from-search-results.patch b/patches/BRM027_Cure-AMP-and-tracking-from-search-results.patch new file mode 100644 index 00000000..301ef34f --- /dev/null +++ b/patches/BRM027_Cure-AMP-and-tracking-from-search-results.patch @@ -0,0 +1,74 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sat, 28 Oct 2017 10:09:41 +0200 +Subject: Cure AMP and tracking from search results + +--- + third_party/blink/renderer/core/dom/BUILD.gn | 1 + + third_party/blink/renderer/core/dom/document.cc | 20 +++++++++++++++++++- + .../renderer/core/dom/extensions/anti_amp_cure.h | 6 ++++++ + 3 files changed, 26 insertions(+), 1 deletion(-) + create mode 100644 third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h + +diff --git a/third_party/blink/renderer/core/dom/BUILD.gn b/third_party/blink/renderer/core/dom/BUILD.gn +--- a/third_party/blink/renderer/core/dom/BUILD.gn ++++ b/third_party/blink/renderer/core/dom/BUILD.gn +@@ -147,6 +147,7 @@ blink_core_sources("dom") { + "events/tree_scope_event_context.h", + "events/window_event_context.cc", + "events/window_event_context.h", ++ "extensions/dont-track-me.h", + "exception_code.h", + "first_letter_pseudo_element.cc", + "first_letter_pseudo_element.h", +diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc +--- a/third_party/blink/renderer/core/dom/document.cc ++++ b/third_party/blink/renderer/core/dom/document.cc +@@ -276,6 +276,8 @@ + #include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h" + #include "third_party/blink/renderer/platform/wtf/time.h" + ++#include "extensions/anti_amp_cure.h" ++ + #ifndef NDEBUG + using WeakDocumentSet = + blink::PersistentHeapHashSet>; +@@ -5839,8 +5841,24 @@ void Document::FinishedParsing() { + fetcher_->ClearResourcesFromPreviousFetcher(); + } + +- if (IsPrefetchOnly()) ++ if (IsPrefetchOnly()) { + WebPrerenderingSupport::Current()->PrefetchFinished(); ++ return; ++ } ++ ++ // determine whether this is a Google search results page ++ const SecurityOrigin *origin = GetSecurityOrigin(); ++ if (origin) { ++ WTF::String domain = origin->Domain(); ++ size_t pos = domain.Find(".google."); ++ auto* bodyElement = body(); ++ if (bodyElement && (pos != WTF::kNotFound) && (domain.length() - pos - 8 < 4)) { ++ LOG(INFO) << "injecting anti-AMP-cure Javascript payload"; ++ HTMLScriptElement* e = HTMLScriptElement::Create(*this, CreateElementFlags()); ++ e->setText(ANTI_AMP_CURE_JS); ++ bodyElement->AppendChild(e); ++ } ++ } + } + + void Document::ElementDataCacheClearTimerFired(TimerBase*) { +diff --git a/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h b/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h +@@ -0,0 +1,6 @@ ++#ifndef anti_amp_cure_h ++#define anti_amp_cure_h ++ ++#define ANTI_AMP_CURE_JS "/* Bromite click-tracking and AMP removal v0.3.5 */\n\nfunction recreateHyperlink(a) {\n // skip already-sanitized hyperlinks\n if (a.sane) return false;\n\n // create new A element - old one has event listeners attached\n var newA = document.createElement('a');\n newA.referrerPolicy = 'origin';\n // property set when hyperlink has been created by this script\n newA.sane = 1;\n\n // remove AMP class, get actual page URL\n var ampCur = a.getAttribute('data-amp-cur');\n if (ampCur) {\n newA.href = ampCur;\n a.classList.remove('amp_r');\n } else {\n var realLink = getRealLinkFromGoogleUrl(a);\n if (realLink) {\n newA.href = realLink;\n } else {\n // might not be an actual hyperlink, ignore it\n if (!a.href) {\n return false;\n }\n // leave original href unchanged\n newA.href = a.href;\n }\n }\n // copy CSS classes\n newA.className = a.className;\n\n // copy nodes inside the hyperlink\n while (a.firstChild) {\n newA.appendChild(a.lastChild);\n }\n // replace hyperlink\n a.parentNode.replaceChild(newA, a);\n return true;\n}\n\nfunction isResult(a) {\n if (a.getAttribute('data-amp-cur'))\n return true;\n var inlineMousedown = a.getAttribute('onmousedown');\n if (!inlineMousedown)\n\treturn false;\n // return rwt(....); // E.g Google search results.\n // return google.rwt(...); // E.g. sponsored search results\n // return google.arwt(this); // E.g. sponsored search results (dec 2016).\n return /\\ba?rwt\\(/.test(inlineMousedown) || /\\bctpacw\\b/.test(inlineMousedown);\n}\n\n/**\n * @returns {String} the real URL if the given link is a Google redirect URL.\n */\nfunction getRealLinkFromGoogleUrl(a) {\n if ((a.hostname === location.hostname || a.hostname.indexOf('www.google.') == 0) &&\n /^\\/(local_)?url$/.test(a.pathname)) {\n // Google Maps / Dito (/local_url?q=)\n // Mobile (/url?q=)\n var url = /[?&](?:q|url)=((?:https?|ftp)[%:][^&]+)/.exec(a.search);\n if (url) {\n return decodeURIComponent(url[1]);\n }\n // Help pages, e.g. safe browsing (/url?...&q=%2Fsupport%2Fanswer...)\n url = /[?&](?:q|url)=((?:%2[Ff]|\\/)[^&]+)/.exec(a.search);\n if (url) {\n return a.origin + decodeURIComponent(url[1]);\n }\n }\n}\n\nfunction sanitizeAds() {\n // scan all divs\n var div = document.getElementById('tads');\n if (div) {\n div.style.display = 'none';\n\treturn true;\n }\n return false;\n}\n\nfunction sanitizeAll() {\n console.log(\"ads removed: \", sanitizeAds());\n console.log(\"hyperlinks sanitized: \", sanitizeAllHyperlinks(document));\n}\n\nfunction hookMoreResults() {\n var extrares = document.getElementById('extrares');\n if (!extrares) {\n console.log(\"could not hook more results\");\n return;\n }\n // mutation observers are great but they don't work\n extrares.addEventListener(\"DOMNodeInserted\", function(e) {\n var node = e.target;\n if (node.id && node.id.startsWith(\"arc-srp\"))\n console.log(\"hyperlinks sanitized on new result node: \", sanitizeAllHyperlinks(node));\n });\n}\n\nfunction setMlogoClick() {\n var mlogo = document.getElementById('qslc');\n if (mlogo && mlogo.children[0]) {\n mlogo = mlogo.children[0];\n mlogo.removeAttribute(\"href\");\n mlogo.setAttribute(\"onclick\", \"sanitizeAll()\");\n console.log(\"logo link replaced\");\n } else {\n console.log(\"could not replace logo link\");\n }\n}\n\nfunction sanitizeAllHyperlinks(rootNode) {\n var saned = 0, total = 0;\n rootNode.querySelectorAll('div[data-hveid]:not([data-hveid=\"\"]) a').forEach(function(a) {\n\ttotal++;\n\tvar res = recreateHyperlink(a);\n\tif (res) saned++;\n });\n console.log(\"sanitized \", saned, \"/\", total, \" hyperlinks\");\n\n return saned;\n}\n\n// avoid running cleanup on non-search pages\nif ((document.location.host.indexOf(\"images.google.\") == -1) && (document.location.host.indexOf(\"news.google.\") == -1)) {\n sanitizeAll();\n}\nsetMlogoClick();\n\nhookMoreResults();\n" ++ ++#endif // anti_amp_cure_h +-- +2.7.4 + diff --git a/patches/BRM028_Never-send-any-crash-upload-data.patch b/patches/BRM028_Never-send-any-crash-upload-data.patch new file mode 100644 index 00000000..be8dda2b --- /dev/null +++ b/patches/BRM028_Never-send-any-crash-upload-data.patch @@ -0,0 +1,24 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:43:35 +0100 +Subject: Never send any crash upload data + +--- + chrome/browser/tracing/crash_service_uploader.cc | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/chrome/browser/tracing/crash_service_uploader.cc b/chrome/browser/tracing/crash_service_uploader.cc +--- a/chrome/browser/tracing/crash_service_uploader.cc ++++ b/chrome/browser/tracing/crash_service_uploader.cc +@@ -122,6 +122,9 @@ void TraceCrashServiceUploader::DoUpload( + std::unique_ptr metadata, + const UploadProgressCallback& progress_callback, + const UploadDoneCallback& done_callback) { ++ ++ return; ++ + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + progress_callback_ = progress_callback; +-- +2.7.4 + diff --git a/patches/BRM029_Hide-Send-reports-to-Google.patch b/patches/BRM029_Hide-Send-reports-to-Google.patch new file mode 100644 index 00000000..55648ba4 --- /dev/null +++ b/patches/BRM029_Hide-Send-reports-to-Google.patch @@ -0,0 +1,23 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Tue, 12 Jun 2018 15:03:29 +0200 +Subject: Hide "Send reports to Google" + +--- + chrome/android/java/res/layout/fre_tosanduma.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/chrome/android/java/res/layout/fre_tosanduma.xml b/chrome/android/java/res/layout/fre_tosanduma.xml +--- a/chrome/android/java/res/layout/fre_tosanduma.xml ++++ b/chrome/android/java/res/layout/fre_tosanduma.xml +@@ -70,7 +70,7 @@ + android:layout_height="wrap_content" + android:lineSpacingMultiplier="1.4" + android:text="@string/fre_send_report_check" +- android:textAppearance="@style/BlackBodyDefault" /> ++ android:textAppearance="@style/BlackBodyDefault" android:visibility = "gone" /> + + + +-- +2.7.4 + diff --git a/patches/BRM030_Never-fetch-popular-sites.patch b/patches/BRM030_Never-fetch-popular-sites.patch new file mode 100644 index 00000000..b4f93be1 --- /dev/null +++ b/patches/BRM030_Never-fetch-popular-sites.patch @@ -0,0 +1,27 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 14 Feb 2018 12:56:01 +0100 +Subject: Never fetch popular sites + +--- + components/ntp_tiles/popular_sites_impl.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/components/ntp_tiles/popular_sites_impl.cc b/components/ntp_tiles/popular_sites_impl.cc +--- a/components/ntp_tiles/popular_sites_impl.cc ++++ b/components/ntp_tiles/popular_sites_impl.cc +@@ -289,6 +289,12 @@ bool PopularSitesImpl::MaybeStartFetch(bool force_download, + DCHECK(!callback_); + callback_ = callback; + ++ if (force_download) { ++ callback_.Run(true); ++ return true; ++ } ++ return false; ++ + const base::Time last_download_time = base::Time::FromInternalValue( + prefs_->GetInt64(prefs::kPopularSitesLastDownloadPref)); + const base::TimeDelta time_since_last_download = +-- +2.7.4 + diff --git a/patches/BRM031_ungoogled-chromium-Disable-signin.patch b/patches/BRM031_ungoogled-chromium-Disable-signin.patch new file mode 100644 index 00000000..ab19c3e9 --- /dev/null +++ b/patches/BRM031_ungoogled-chromium-Disable-signin.patch @@ -0,0 +1,56 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:14:39 +0100 +Subject: ungoogled-chromium: Disable signin + +--- + chrome/browser/ui/chrome_pages.cc | 8 ++------ + components/signin/core/browser/signin_manager_base.cc | 2 +- + 2 files changed, 3 insertions(+), 7 deletions(-) + +diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc +--- a/chrome/browser/ui/chrome_pages.cc ++++ b/chrome/browser/ui/chrome_pages.cc +@@ -77,12 +77,6 @@ void OpenBookmarkManagerForNode(Browser* browser, int64_t node_id) { + ShowSingletonTabOverwritingNTP(browser, params); + } + +-void NavigateToSingletonTab(Browser* browser, const GURL& url) { +- NavigateParams params(GetSingletonTabNavigateParams(browser, url)); +- params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE; +- ShowSingletonTabOverwritingNTP(browser, params); +-} +- + // Shows either the help app or the appropriate help page for |source|. If + // |browser| is NULL and the help page is used (vs the app), the help page is + // shown in the last active browser. If there is no such browser, a new browser +@@ -397,6 +391,7 @@ void ShowSearchEngineSettings(Browser* browser) { + #if !defined(OS_ANDROID) + void ShowBrowserSignin(Browser* browser, + signin_metrics::AccessPoint access_point) { ++#if 0 + Profile* original_profile = browser->profile()->GetOriginalProfile(); + SigninManagerBase* manager = + SigninManagerFactory::GetForProfile(original_profile); +@@ -442,6 +437,7 @@ void ShowBrowserSignin(Browser* browser, + BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, + signin::ManageAccountsParams(), access_point, false); + } ++#endif + } + + void ShowBrowserSigninOrSettings(Browser* browser, +diff --git a/components/signin/core/browser/signin_manager_base.cc b/components/signin/core/browser/signin_manager_base.cc +--- a/components/signin/core/browser/signin_manager_base.cc ++++ b/components/signin/core/browser/signin_manager_base.cc +@@ -158,7 +158,7 @@ void SigninManagerBase::Initialize(PrefService* local_state) { + bool SigninManagerBase::IsInitialized() const { return initialized_; } + + bool SigninManagerBase::IsSigninAllowed() const { +- return client_->GetPrefs()->GetBoolean(prefs::kSigninAllowed); ++ return false; + } + + AccountInfo SigninManagerBase::GetAuthenticatedAccountInfo() const { +-- +2.7.4 + diff --git a/patches/BRM032_ungoogled-chromium-Disable-webRTC-log-uploader.patch b/patches/BRM032_ungoogled-chromium-Disable-webRTC-log-uploader.patch new file mode 100644 index 00000000..e0199643 --- /dev/null +++ b/patches/BRM032_ungoogled-chromium-Disable-webRTC-log-uploader.patch @@ -0,0 +1,56 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:21:36 +0100 +Subject: ungoogled-chromium: Disable webRTC log uploader + +--- + chrome/browser/media/webrtc/webrtc_log_uploader.cc | 28 ++++------------------ + 1 file changed, 4 insertions(+), 24 deletions(-) + +diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc +--- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc ++++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc +@@ -115,30 +115,7 @@ void WebRtcLogUploader::LoggingStoppedDoUpload( + DCHECK(meta_data.get()); + DCHECK(!upload_done_data.log_path.empty()); + +- std::string compressed_log; +- CompressLog(&compressed_log, log_buffer.get()); +- +- std::string local_log_id; +- +- if (base::PathExists(upload_done_data.log_path)) { +- webrtc_logging::DeleteOldWebRtcLogFiles(upload_done_data.log_path); +- +- local_log_id = base::NumberToString(base::Time::Now().ToDoubleT()); +- base::FilePath log_file_path = +- upload_done_data.log_path.AppendASCII(local_log_id) +- .AddExtension(FILE_PATH_LITERAL(".gz")); +- WriteCompressedLogToFile(compressed_log, log_file_path); +- +- base::FilePath log_list_path = +- webrtc_logging::LogList::GetWebRtcLogListFileForDirectory( +- upload_done_data.log_path); +- AddLocallyStoredLogInfoToUploadListFile(log_list_path, local_log_id); +- } +- +- WebRtcLogUploadDoneData upload_done_data_with_log_id = upload_done_data; +- upload_done_data_with_log_id.local_log_id = local_log_id; +- PrepareMultipartPostData(compressed_log, std::move(meta_data), +- upload_done_data_with_log_id); ++ NotifyUploadDone(net::HTTP_OK, "", upload_done_data); + } + + void WebRtcLogUploader::PrepareMultipartPostData( +@@ -149,6 +126,9 @@ void WebRtcLogUploader::PrepareMultipartPostData( + DCHECK(!compressed_log.empty()); + DCHECK(meta_data.get()); + ++ NotifyUploadDone(net::HTTP_OK, "", upload_done_data); ++ return; ++ + std::unique_ptr post_data(new std::string()); + SetupMultipart(post_data.get(), + compressed_log, +-- +2.7.4 + diff --git a/patches/BRM033_ungoogled-chromium-Disable-untraceable-URLs.patch b/patches/BRM033_ungoogled-chromium-Disable-untraceable-URLs.patch new file mode 100644 index 00000000..115cedf9 --- /dev/null +++ b/patches/BRM033_ungoogled-chromium-Disable-untraceable-URLs.patch @@ -0,0 +1,136 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:28:11 +0100 +Subject: ungoogled-chromium: Disable untraceable URLs + +Disable additional URLs that are not caught by the "trk" scheme +--- + chrome/browser/android/rlz/rlz_ping_handler.cc | 2 +- + chrome/browser/plugins/plugins_resource_service.cc | 5 +---- + chrome/browser/safe_browsing/client_side_model_loader.cc | 6 ++---- + chrome/browser/safe_browsing/client_side_model_loader.h | 1 - + rlz/lib/financial_ping.cc | 4 ++-- + rlz/lib/lib_values.cc | 1 - + rlz/lib/lib_values.h | 1 - + 7 files changed, 6 insertions(+), 14 deletions(-) + +diff --git a/chrome/browser/android/rlz/rlz_ping_handler.cc b/chrome/browser/android/rlz/rlz_ping_handler.cc +--- a/chrome/browser/android/rlz/rlz_ping_handler.cc ++++ b/chrome/browser/android/rlz/rlz_ping_handler.cc +@@ -66,7 +66,7 @@ void RlzPingHandler::Ping( + DCHECK_EQ(id.length(), 50u); + + GURL request_url(base::StringPrintf( +- "https://%s%s?", rlz_lib::kFinancialServer, rlz_lib::kFinancialPingPath)); ++ "about:blank")); + request_url = net::AppendQueryParameter( + request_url, rlz_lib::kProductSignatureCgiVariable, "chrome"); + request_url = +diff --git a/chrome/browser/plugins/plugins_resource_service.cc b/chrome/browser/plugins/plugins_resource_service.cc +--- a/chrome/browser/plugins/plugins_resource_service.cc ++++ b/chrome/browser/plugins/plugins_resource_service.cc +@@ -51,9 +51,6 @@ const int kStartResourceFetchDelayMs = 60 * 1000; + // Delay between calls to update the cache 1 day and 2 minutes in testing mode. + const int kCacheUpdateDelayMs = 24 * 60 * 60 * 1000; + +-const char kPluginsServerUrl[] = +- "https://www.gstatic.com/chrome/config/plugins_3/"; +- + GURL GetPluginsServerURL() { + std::string filename; + #if defined(OS_WIN) +@@ -68,7 +65,7 @@ GURL GetPluginsServerURL() { + #error Unknown platform + #endif + +- return GURL(kPluginsServerUrl + filename); ++ return GURL("about:blank"); + } + + } // namespace +diff --git a/chrome/browser/safe_browsing/client_side_model_loader.cc b/chrome/browser/safe_browsing/client_side_model_loader.cc +--- a/chrome/browser/safe_browsing/client_side_model_loader.cc ++++ b/chrome/browser/safe_browsing/client_side_model_loader.cc +@@ -35,8 +35,6 @@ namespace safe_browsing { + // Model Loader strings + const size_t ModelLoader::kMaxModelSizeBytes = 150 * 1024; + const int ModelLoader::kClientModelFetchIntervalMs = 3600 * 1000; +-const char ModelLoader::kClientModelUrlPrefix[] = +- "https://ssl.gstatic.com/safebrowsing/csd/"; + const char ModelLoader::kClientModelNamePattern[] = + "client_model_v5%s_variation_%d.pb"; + const char ModelLoader::kClientModelFinchExperiment[] = +@@ -90,7 +88,7 @@ ModelLoader::ModelLoader( + scoped_refptr url_loader_factory, + bool is_extended_reporting) + : name_(FillInModelName(is_extended_reporting, GetModelNumber())), +- url_(kClientModelUrlPrefix + name_), ++ url_("about:blank"), + update_renderers_callback_(update_renderers_callback), + url_loader_factory_(url_loader_factory), + weak_factory_(this) { +@@ -103,7 +101,7 @@ ModelLoader::ModelLoader( + scoped_refptr url_loader_factory, + const std::string& model_name) + : name_(model_name), +- url_(kClientModelUrlPrefix + name_), ++ url_("about:blank"), + update_renderers_callback_(update_renderers_callback), + url_loader_factory_(url_loader_factory), + weak_factory_(this) { +diff --git a/chrome/browser/safe_browsing/client_side_model_loader.h b/chrome/browser/safe_browsing/client_side_model_loader.h +--- a/chrome/browser/safe_browsing/client_side_model_loader.h ++++ b/chrome/browser/safe_browsing/client_side_model_loader.h +@@ -42,7 +42,6 @@ class ModelLoader { + static const int kClientModelFetchIntervalMs; + static const char kClientModelFinchExperiment[]; + static const char kClientModelFinchParam[]; +- static const char kClientModelUrlPrefix[]; + static const char kClientModelNamePattern[]; + + // Constructs a model loader to fetch a model using |url_loader_factory|. +diff --git a/rlz/lib/financial_ping.cc b/rlz/lib/financial_ping.cc +--- a/rlz/lib/financial_ping.cc ++++ b/rlz/lib/financial_ping.cc +@@ -351,7 +351,7 @@ FinancialPing::PingResponse FinancialPing::PingServer(const char* request, + + // Open network connection. + InternetHandle connection_handle = InternetConnectA(inet_handle, +- kFinancialServer, kFinancialPort, "", "", INTERNET_SERVICE_HTTP, ++ "about:blank", kFinancialPort, "", "", INTERNET_SERVICE_HTTP, + INTERNET_FLAG_NO_CACHE_WRITE, 0); + if (!connection_handle) + return PING_FAILURE; +@@ -395,7 +395,7 @@ FinancialPing::PingResponse FinancialPing::PingServer(const char* request, + return PING_SUCCESSFUL; + #else + std::string url = +- base::StringPrintf("https://%s%s", kFinancialServer, request); ++ base::StringPrintf("about:blank"); + + // Use a waitable event to cause this function to block, to match the + // wininet implementation. +diff --git a/rlz/lib/lib_values.cc b/rlz/lib/lib_values.cc +--- a/rlz/lib/lib_values.cc ++++ b/rlz/lib/lib_values.cc +@@ -41,7 +41,6 @@ const char kSetDccResponseVariable[] = "set_dcc"; + // + + const char kFinancialPingPath[] = "/tools/pso/ping"; +-const char kFinancialServer[] = "clients1.google.com"; + const int kFinancialPort = 443; + + // Ping times in 100-nanosecond intervals. +diff --git a/rlz/lib/lib_values.h b/rlz/lib/lib_values.h +--- a/rlz/lib/lib_values.h ++++ b/rlz/lib/lib_values.h +@@ -72,7 +72,6 @@ extern const char kSetDccResponseVariable[]; + // + + extern const char kFinancialPingPath[]; +-extern const char kFinancialServer[]; + + extern const int kFinancialPort; + +-- +2.7.4 + diff --git a/patches/BRM034_ungoogled-chromium-Disable-translate-integration.patch b/patches/BRM034_ungoogled-chromium-Disable-translate-integration.patch new file mode 100644 index 00000000..7afec597 --- /dev/null +++ b/patches/BRM034_ungoogled-chromium-Disable-translate-integration.patch @@ -0,0 +1,53 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:28:53 +0100 +Subject: ungoogled-chromium: Disable translate integration + +--- + components/translate/content/renderer/translate_helper.cc | 4 +++- + components/translate/core/browser/translate_manager.cc | 2 +- + components/translate/core/browser/translate_script.cc | 3 +-- + 3 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/components/translate/content/renderer/translate_helper.cc b/components/translate/content/renderer/translate_helper.cc +--- a/components/translate/content/renderer/translate_helper.cc ++++ b/components/translate/content/renderer/translate_helper.cc +@@ -74,7 +74,9 @@ TranslateHelper::TranslateHelper(content::RenderFrame* render_frame, + world_id_(world_id), + extension_scheme_(extension_scheme), + binding_(this), +- weak_method_factory_(this) {} ++ weak_method_factory_(this) { ++ CancelPendingTranslation(); ++} + + TranslateHelper::~TranslateHelper() { + } +diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc +--- a/components/translate/core/browser/translate_manager.cc ++++ b/components/translate/core/browser/translate_manager.cc +@@ -102,7 +102,7 @@ void TranslateManager::InitiateTranslation(const std::string& page_lang) { + if (net::NetworkChangeNotifier::IsOffline()) + return; + +- if (!ignore_missing_key_for_testing_ && !::google_apis::HasKeysConfigured()) { ++ if (true) { + // Without an API key, translate won't work, so don't offer to translate in + // the first place. Leave prefs::kOfferTranslateEnabled on, though, because + // that settings syncs and we don't want to turn off translate everywhere +diff --git a/components/translate/core/browser/translate_script.cc b/components/translate/core/browser/translate_script.cc +--- a/components/translate/core/browser/translate_script.cc ++++ b/components/translate/core/browser/translate_script.cc +@@ -149,9 +149,8 @@ void TranslateScript::OnScriptFetchComplete( + base::StringAppendF(&data_, "var serverParams = '%s';\n", + server_params.c_str()); + +- GURL security_origin = translate::GetTranslateSecurityOrigin(); + base::StringAppendF( +- &data_, "var securityOrigin = '%s';", security_origin.spec().c_str()); ++ &data_, "var securityOrigin = '';"); + + // Append embedded translate.js and a remote element library. + base::StringPiece str = +-- +2.7.4 + diff --git a/patches/BRM035_ungoogled-chromium-Disable-profile-avatar-downloading.patch b/patches/BRM035_ungoogled-chromium-Disable-profile-avatar-downloading.patch new file mode 100644 index 00000000..b73a3530 --- /dev/null +++ b/patches/BRM035_ungoogled-chromium-Disable-profile-avatar-downloading.patch @@ -0,0 +1,35 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:29:30 +0100 +Subject: ungoogled-chromium: Disable profile avatar downloading + +--- + chrome/browser/profiles/profile_avatar_downloader.cc | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +diff --git a/chrome/browser/profiles/profile_avatar_downloader.cc b/chrome/browser/profiles/profile_avatar_downloader.cc +--- a/chrome/browser/profiles/profile_avatar_downloader.cc ++++ b/chrome/browser/profiles/profile_avatar_downloader.cc +@@ -16,19 +16,13 @@ + #include "net/traffic_annotation/network_traffic_annotation.h" + #include "ui/gfx/image/image.h" + +-namespace { +-const char kHighResAvatarDownloadUrlPrefix[] = +- "https://www.gstatic.com/chrome/profile_avatars/"; +-} +- + ProfileAvatarDownloader::ProfileAvatarDownloader( + size_t icon_index, + const FetchCompleteCallback& callback) + : icon_index_(icon_index), + callback_(callback) { + DCHECK(!callback_.is_null()); +- GURL url(std::string(kHighResAvatarDownloadUrlPrefix) + +- profiles::GetDefaultAvatarIconFileNameAtIndex(icon_index)); ++ GURL url(std::string("about:blank")); + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("profile_avatar", R"( + semantics { +-- +2.7.4 + diff --git a/patches/BRM036_ungoogled-chromium-Disable-intranet-redirect-detector.patch b/patches/BRM036_ungoogled-chromium-Disable-intranet-redirect-detector.patch new file mode 100644 index 00000000..64547d0a --- /dev/null +++ b/patches/BRM036_ungoogled-chromium-Disable-intranet-redirect-detector.patch @@ -0,0 +1,28 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:30:30 +0100 +Subject: ungoogled-chromium: Disable intranet redirect detector + +Disables the intranet redirect detector. It generates extra DNS requests and the functionality using this is disabled. + +See this page for more information: https://mikewest.org/2012/02/chrome-connects-to-three-random-domains-at-startup +--- + chrome/browser/intranet_redirect_detector.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/chrome/browser/intranet_redirect_detector.cc b/chrome/browser/intranet_redirect_detector.cc +--- a/chrome/browser/intranet_redirect_detector.cc ++++ b/chrome/browser/intranet_redirect_detector.cc +@@ -75,9 +75,7 @@ void IntranetRedirectDetector::FinishSleep() { + simple_loaders_.clear(); + resulting_origins_.clear(); + +- const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); +- if (cmd_line->HasSwitch(switches::kDisableBackgroundNetworking)) +- return; ++ return; + + DCHECK(simple_loaders_.empty() && resulting_origins_.empty()); + +-- +2.7.4 + diff --git a/patches/BRM037_ungoogled-chromium-Disable-Google-host-detection.patch b/patches/BRM037_ungoogled-chromium-Disable-Google-host-detection.patch new file mode 100644 index 00000000..97aa39d9 --- /dev/null +++ b/patches/BRM037_ungoogled-chromium-Disable-Google-host-detection.patch @@ -0,0 +1,374 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:36:33 +0100 +Subject: ungoogled-chromium: Disable Google host detection + +Disables various detections of Google hosts and functionality specific to them +--- + .../page_load_metrics/page_load_metrics_util.cc | 4 +- + .../page_load_metrics/page_load_metrics_util.cc | 33 +--- + components/google/core/browser/google_util.cc | 193 ++------------------- + components/search_engines/template_url.cc | 6 +- + net/base/url_util.cc | 22 --- + 5 files changed, 14 insertions(+), 244 deletions(-) + +diff --git a/chrome/browser/page_load_metrics/page_load_metrics_util.cc b/chrome/browser/page_load_metrics/page_load_metrics_util.cc +--- a/chrome/browser/page_load_metrics/page_load_metrics_util.cc ++++ b/chrome/browser/page_load_metrics/page_load_metrics_util.cc +@@ -169,9 +169,7 @@ bool DidObserveLoadingBehaviorInAnyFrame( + } + + bool IsGoogleSearchHostname(const GURL& url) { +- base::Optional result = +- page_load_metrics::GetGoogleHostnamePrefix(url); +- return result && result.value() == "www"; ++ return false; + } + + bool IsGoogleSearchResultUrl(const GURL& url) { +diff --git a/chrome/common/page_load_metrics/page_load_metrics_util.cc b/chrome/common/page_load_metrics/page_load_metrics_util.cc +--- a/chrome/common/page_load_metrics/page_load_metrics_util.cc ++++ b/chrome/common/page_load_metrics/page_load_metrics_util.cc +@@ -12,38 +12,7 @@ + namespace page_load_metrics { + + base::Optional GetGoogleHostnamePrefix(const GURL& url) { +- const size_t registry_length = +- net::registry_controlled_domains::GetRegistryLength( +- url, +- +- // Do not include unknown registries (registries that don't have any +- // matches in effective TLD names). +- net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, +- +- // Do not include private registries, such as appspot.com. We don't +- // want to match URLs like www.google.appspot.com. +- net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); +- +- const base::StringPiece hostname = url.host_piece(); +- if (registry_length == 0 || registry_length == std::string::npos || +- registry_length >= hostname.length()) { +- return base::Optional(); +- } +- +- // Removes the tld and the preceding dot. +- const base::StringPiece hostname_minus_registry = +- hostname.substr(0, hostname.length() - (registry_length + 1)); +- +- if (hostname_minus_registry == "google") +- return std::string(""); +- +- if (!base::EndsWith(hostname_minus_registry, ".google", +- base::CompareCase::INSENSITIVE_ASCII)) { +- return base::Optional(); +- } +- +- return std::string(hostname_minus_registry.substr( +- 0, hostname_minus_registry.length() - strlen(".google"))); ++ return base::Optional(); + } + + bool IsGoogleHostname(const GURL& url) { +diff --git a/components/google/core/browser/google_util.cc b/components/google/core/browser/google_util.cc +--- a/components/google/core/browser/google_util.cc ++++ b/components/google/core/browser/google_util.cc +@@ -41,118 +41,16 @@ namespace { + + bool gUseMockLinkDoctorBaseURLForTesting = false; + +-bool IsPathHomePageBase(base::StringPiece path) { +- return (path == "/") || (path == "/webhp"); +-} +- +-// Removes a single trailing dot if present in |host|. +-void StripTrailingDot(base::StringPiece* host) { +- if (host->ends_with(".")) +- host->remove_suffix(1); +-} +- +-// True if the given canonical |host| is "[www.]." +-// with a valid TLD. If |subdomain_permission| is ALLOW_SUBDOMAIN, we check +-// against host "*.." instead. Will return the TLD +-// string in |tld|, if specified and the |host| can be parsed. +-bool IsValidHostName(base::StringPiece host, +- base::StringPiece domain_in_lower_case, +- SubdomainPermission subdomain_permission, +- base::StringPiece* tld) { +- // Fast path to avoid searching the registry set. +- if (host.find(domain_in_lower_case) == base::StringPiece::npos) +- return false; +- +- size_t tld_length = +- net::registry_controlled_domains::GetCanonicalHostRegistryLength( +- host, net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, +- net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); +- if ((tld_length == 0) || (tld_length == std::string::npos)) +- return false; +- +- // Removes the tld and the preceding dot. +- base::StringPiece host_minus_tld = +- host.substr(0, host.length() - tld_length - 1); +- +- if (tld) +- *tld = host.substr(host.length() - tld_length); +- +- if (base::LowerCaseEqualsASCII(host_minus_tld, domain_in_lower_case)) +- return true; +- +- if (subdomain_permission == ALLOW_SUBDOMAIN) { +- std::string dot_domain("."); +- domain_in_lower_case.AppendToString(&dot_domain); +- return base::EndsWith(host_minus_tld, dot_domain, +- base::CompareCase::INSENSITIVE_ASCII); +- } +- +- std::string www_domain("www."); +- domain_in_lower_case.AppendToString(&www_domain); +- return base::LowerCaseEqualsASCII(host_minus_tld, www_domain); +-} +- +-// True if |url| is a valid URL with HTTP or HTTPS scheme. If |port_permission| +-// is DISALLOW_NON_STANDARD_PORTS, this also requires |url| to use the standard +-// port for its scheme (80 for HTTP, 443 for HTTPS). +-bool IsValidURL(const GURL& url, PortPermission port_permission) { +- return url.is_valid() && url.SchemeIsHTTPOrHTTPS() && +- (url.port().empty() || (port_permission == ALLOW_NON_STANDARD_PORTS)); +-} +- +-bool IsCanonicalHostGoogleHostname(base::StringPiece canonical_host, +- SubdomainPermission subdomain_permission) { +- const GURL& base_url(CommandLineGoogleBaseURL()); +- if (base_url.is_valid() && (canonical_host == base_url.host_piece())) +- return true; +- +- base::StringPiece tld; +- if (!IsValidHostName(canonical_host, "google", subdomain_permission, &tld)) +- return false; +- +- // Remove the trailing dot from tld if present, as for google domain it's the +- // same page. +- StripTrailingDot(&tld); +- +- CR_DEFINE_STATIC_LOCAL(std::set, google_tlds, +- ({GOOGLE_TLD_LIST})); +- return base::ContainsKey(google_tlds, tld.as_string()); +-} +- +-// True if |url| is a valid URL with a host that is in the static list of +-// Google subdomains for google search, and an HTTP or HTTPS scheme. Requires +-// |url| to use the standard port for its scheme (80 for HTTP, 443 for HTTPS). +-bool IsGoogleSearchSubdomainUrl(const GURL& url) { +- if (!IsValidURL(url, PortPermission::DISALLOW_NON_STANDARD_PORTS)) +- return false; +- +- base::StringPiece host(url.host_piece()); +- StripTrailingDot(&host); +- +- CR_DEFINE_STATIC_LOCAL(std::set, google_subdomains, +- ({"ipv4.google.com", "ipv6.google.com"})); +- +- return base::ContainsKey(google_subdomains, host.as_string()); +-} +- + } // namespace + + // Global functions ----------------------------------------------------------- + + bool HasGoogleSearchQueryParam(base::StringPiece str) { +- url::Component query(0, static_cast(str.length())), key, value; +- while (url::ExtractQueryKeyValue(str.data(), &query, &key, &value)) { +- base::StringPiece key_str = str.substr(key.begin, key.len); +- if (key_str == "q" || key_str == "as_q") +- return true; +- } + return false; + } + + GURL LinkDoctorBaseURL() { +- if (gUseMockLinkDoctorBaseURLForTesting) +- return GURL("http://mock.linkdoctor.url/for?testing"); +- return GURL(LINKDOCTOR_SERVER_REQUEST_URL); ++ return GURL(); + } + + void SetMockLinkDoctorBaseURLForTesting() { +@@ -166,119 +64,50 @@ std::string GetGoogleLocale(const std::string& application_locale) { + + GURL AppendGoogleLocaleParam(const GURL& url, + const std::string& application_locale) { +- return net::AppendQueryParameter( +- url, "hl", GetGoogleLocale(application_locale)); ++ return url; + } + + std::string GetGoogleCountryCode(const GURL& google_homepage_url) { +- base::StringPiece google_hostname = google_homepage_url.host_piece(); +- // TODO(igorcov): This needs a fix for case when the host has a trailing dot, +- // like "google.com./". https://crbug.com/720295. +- const size_t last_dot = google_hostname.find_last_of('.'); +- DCHECK_NE(std::string::npos, last_dot); +- base::StringPiece country_code = google_hostname.substr(last_dot + 1); +- // Assume the com TLD implies the US. +- if (country_code == "com") +- return "us"; +- // Google uses the Unicode Common Locale Data Repository (CLDR), and the CLDR +- // code for the UK is "gb". +- if (country_code == "uk") +- return "gb"; +- // Catalonia does not have a CLDR country code, since it's a region in Spain, +- // so use Spain instead. +- if (country_code == "cat") +- return "es"; +- return country_code.as_string(); ++ return "nolocale"; + } + + GURL GetGoogleSearchURL(const GURL& google_homepage_url) { +- // To transform the homepage URL into the corresponding search URL, add the +- // "search" and the "q=" query string. +- GURL::Replacements replacements; +- replacements.SetPathStr("search"); +- replacements.SetQueryStr("q="); +- return google_homepage_url.ReplaceComponents(replacements); ++ return google_homepage_url; + } + + const GURL& CommandLineGoogleBaseURL() { +- // Unit tests may add command-line flags after the first call to this +- // function, so we don't simply initialize a static |base_url| directly and +- // then unconditionally return it. +- CR_DEFINE_STATIC_LOCAL(std::string, switch_value, ()); + CR_DEFINE_STATIC_LOCAL(GURL, base_url, ()); +- std::string current_switch_value( +- base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( +- switches::kGoogleBaseURL)); +- if (current_switch_value != switch_value) { +- switch_value = current_switch_value; +- base_url = url_formatter::FixupURL(switch_value, std::string()); +- if (!base_url.is_valid() || base_url.has_query() || base_url.has_ref()) +- base_url = GURL(); +- } ++ base_url = GURL(); + return base_url; + } + + bool StartsWithCommandLineGoogleBaseURL(const GURL& url) { +- const GURL& base_url(CommandLineGoogleBaseURL()); +- return base_url.is_valid() && +- base::StartsWith(url.possibly_invalid_spec(), base_url.spec(), +- base::CompareCase::SENSITIVE); ++ return false; + } + + bool IsGoogleHostname(base::StringPiece host, + SubdomainPermission subdomain_permission) { +- url::CanonHostInfo host_info; +- return IsCanonicalHostGoogleHostname(net::CanonicalizeHost(host, &host_info), +- subdomain_permission); ++ return false; + } + + bool IsGoogleDomainUrl(const GURL& url, + SubdomainPermission subdomain_permission, + PortPermission port_permission) { +- return IsValidURL(url, port_permission) && +- IsCanonicalHostGoogleHostname(url.host_piece(), subdomain_permission); ++ return false; + } + + bool IsGoogleHomePageUrl(const GURL& url) { +- // First check to see if this has a Google domain. +- if (!IsGoogleDomainUrl(url, DISALLOW_SUBDOMAIN, +- DISALLOW_NON_STANDARD_PORTS) && +- !IsGoogleSearchSubdomainUrl(url)) { +- return false; +- } +- +- // Make sure the path is a known home page path. +- base::StringPiece path(url.path_piece()); +- return IsPathHomePageBase(path) || +- base::StartsWith(path, "/ig", base::CompareCase::INSENSITIVE_ASCII); ++ return false; + } + + bool IsGoogleSearchUrl(const GURL& url) { +- // First check to see if this has a Google domain. +- if (!IsGoogleDomainUrl(url, DISALLOW_SUBDOMAIN, +- DISALLOW_NON_STANDARD_PORTS) && +- !IsGoogleSearchSubdomainUrl(url)) { +- return false; +- } +- +- // Make sure the path is a known search path. +- base::StringPiece path(url.path_piece()); +- bool is_home_page_base = IsPathHomePageBase(path); +- if (!is_home_page_base && (path != "/search")) +- return false; +- +- // Check for query parameter in URL parameter and hash fragment, depending on +- // the path type. +- return HasGoogleSearchQueryParam(url.ref_piece()) || +- (!is_home_page_base && HasGoogleSearchQueryParam(url.query_piece())); ++ return false; + } + + bool IsYoutubeDomainUrl(const GURL& url, + SubdomainPermission subdomain_permission, + PortPermission port_permission) { +- return IsValidURL(url, port_permission) && +- IsValidHostName(url.host_piece(), "youtube", subdomain_permission, +- nullptr); ++ return false; + } + + const std::vector& GetGoogleRegistrableDomains() { +diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc +--- a/components/search_engines/template_url.cc ++++ b/components/search_engines/template_url.cc +@@ -510,11 +510,7 @@ base::string16 TemplateURLRef::SearchTermToString16( + bool TemplateURLRef::HasGoogleBaseURLs( + const SearchTermsData& search_terms_data) const { + ParseIfNecessary(search_terms_data); +- return std::any_of(replacements_.begin(), replacements_.end(), +- [](const Replacement& replacement) { +- return replacement.type == GOOGLE_BASE_URL || +- replacement.type == GOOGLE_BASE_SUGGEST_URL; +- }); ++ return false; + } + + bool TemplateURLRef::ExtractSearchTermsFromURL( +diff --git a/net/base/url_util.cc b/net/base/url_util.cc +--- a/net/base/url_util.cc ++++ b/net/base/url_util.cc +@@ -383,28 +383,6 @@ void GetIdentityFromURL(const GURL& url, + } + + bool HasGoogleHost(const GURL& url) { +- static const char* kGoogleHostSuffixes[] = { +- ".google.com", +- ".youtube.com", +- ".gmail.com", +- ".doubleclick.net", +- ".gstatic.com", +- ".googlevideo.com", +- ".googleusercontent.com", +- ".googlesyndication.com", +- ".google-analytics.com", +- ".googleadservices.com", +- ".googleapis.com", +- ".ytimg.com", +- }; +- base::StringPiece host = url.host_piece(); +- for (const char* suffix : kGoogleHostSuffixes) { +- // Here it's possible to get away with faster case-sensitive comparisons +- // because the list above is all lowercase, and a GURL's host name will +- // always be canonicalized to lowercase as well. +- if (base::EndsWith(host, suffix, base::CompareCase::SENSITIVE)) +- return true; +- } + return false; + } + +-- +2.7.4 + diff --git a/patches/BRM038_ungoogled-chromium-Disable-GCM.patch b/patches/BRM038_ungoogled-chromium-Disable-GCM.patch new file mode 100644 index 00000000..401e868a --- /dev/null +++ b/patches/BRM038_ungoogled-chromium-Disable-GCM.patch @@ -0,0 +1,39 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:37:10 +0100 +Subject: ungoogled-chromium: Disable GCM + +Disable Google Cloud Messaging (GCM) client +--- + components/gcm_driver/gcm_client_impl.cc | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc +--- a/components/gcm_driver/gcm_client_impl.cc ++++ b/components/gcm_driver/gcm_client_impl.cc +@@ -502,6 +502,7 @@ void GCMClientImpl::StartGCM() { + } + + void GCMClientImpl::InitializeMCSClient() { ++ return; + std::vector endpoints; + endpoints.push_back(gservices_settings_.GetMCSMainEndpoint()); + GURL fallback_endpoint = gservices_settings_.GetMCSFallbackEndpoint(); +@@ -699,6 +700,7 @@ void GCMClientImpl::RemoveHeartbeatInterval(const std::string& scope) { + } + + void GCMClientImpl::StartCheckin() { ++ return; + // Make sure no checkin is in progress. + if (checkin_request_.get()) + return; +@@ -777,6 +779,7 @@ void GCMClientImpl::SetGServicesSettingsCallback(bool success) { + } + + void GCMClientImpl::SchedulePeriodicCheckin() { ++ return; + // Make sure no checkin is in progress. + if (checkin_request_.get() || !device_checkin_info_.accounts_set) + return; +-- +2.7.4 + diff --git a/patches/BRM039_ungoogled-chromium-Disable-Gaia.patch b/patches/BRM039_ungoogled-chromium-Disable-Gaia.patch new file mode 100644 index 00000000..8434a16f --- /dev/null +++ b/patches/BRM039_ungoogled-chromium-Disable-Gaia.patch @@ -0,0 +1,134 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:37:52 +0100 +Subject: ungoogled-chromium: Disable Gaia + +Disables Gaia code. +Somehow it is still being activated even without being signed-in. + +See also: https://github.com/Eloston/ungoogled-chromium/issues/104 +--- + chrome/browser/browser_resources.grd | 2 -- + .../component_extensions_whitelist/whitelist.cc | 1 - + .../signin/gaia_auth_extension_loader.cc | 7 ------ + .../resources/component_extension_resources.grd | 2 -- + chrome/browser/ui/webui/signin/inline_login_ui.cc | 1 - + google_apis/gaia/gaia_auth_fetcher.cc | 29 ---------------------- + 6 files changed, 42 deletions(-) + +diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd +--- a/chrome/browser/browser_resources.grd ++++ b/chrome/browser/browser_resources.grd +@@ -301,7 +301,6 @@ + + + +- + + + +@@ -436,7 +435,6 @@ + + + +- + + + +diff --git a/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc b/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc +--- a/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc ++++ b/chrome/browser/extensions/component_extensions_whitelist/whitelist.cc +@@ -68,7 +68,6 @@ bool IsComponentExtensionWhitelisted(int manifest_resource_id) { + #endif + case IDR_CRYPTOTOKEN_MANIFEST: + case IDR_FEEDBACK_MANIFEST: +- case IDR_GAIA_AUTH_MANIFEST: + #if BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) + case IDR_HANGOUT_SERVICES_MANIFEST: + #endif +diff --git a/chrome/browser/extensions/signin/gaia_auth_extension_loader.cc b/chrome/browser/extensions/signin/gaia_auth_extension_loader.cc +--- a/chrome/browser/extensions/signin/gaia_auth_extension_loader.cc ++++ b/chrome/browser/extensions/signin/gaia_auth_extension_loader.cc +@@ -42,18 +42,11 @@ extensions::ComponentLoader* GetComponentLoader(BrowserContext* context) { + void LoadGaiaAuthExtension(BrowserContext* context) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + +- extensions::ComponentLoader* component_loader = GetComponentLoader(context); + const base::CommandLine* command_line = + base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kAuthExtensionPath)) { +- base::FilePath auth_extension_path = +- command_line->GetSwitchValuePath(switches::kAuthExtensionPath); +- component_loader->Add(IDR_GAIA_AUTH_MANIFEST, auth_extension_path); + return; + } +- +- component_loader->Add(IDR_GAIA_AUTH_MANIFEST, +- base::FilePath(FILE_PATH_LITERAL("gaia_auth"))); + } + + void UnloadGaiaAuthExtension(BrowserContext* context) { +diff --git a/chrome/browser/resources/component_extension_resources.grd b/chrome/browser/resources/component_extension_resources.grd +--- a/chrome/browser/resources/component_extension_resources.grd ++++ b/chrome/browser/resources/component_extension_resources.grd +@@ -40,8 +40,6 @@ + + + +- +- + + + +diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc +--- a/chrome/browser/ui/webui/signin/inline_login_ui.cc ++++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc +@@ -44,7 +44,6 @@ content::WebUIDataSource* CreateWebUIDataSource() { + + source->AddResourcePath("inline_login.css", IDR_INLINE_LOGIN_CSS); + source->AddResourcePath("inline_login.js", IDR_INLINE_LOGIN_JS); +- source->AddResourcePath("gaia_auth_host.js", IDR_GAIA_AUTH_AUTHENTICATOR_JS); + + source->AddLocalizedString("title", IDS_CHROME_SIGNIN_TITLE); + source->AddLocalizedString( +diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc +--- a/google_apis/gaia/gaia_auth_fetcher.cc ++++ b/google_apis/gaia/gaia_auth_fetcher.cc +@@ -248,35 +248,6 @@ void GaiaAuthFetcher::CreateAndStartGaiaFetcher( + int load_flags, + const net::NetworkTrafficAnnotationTag& traffic_annotation) { + DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; +- fetcher_ = net::URLFetcher::Create( +- 0, gaia_gurl, body.empty() ? net::URLFetcher::GET : net::URLFetcher::POST, +- this, traffic_annotation); +- fetcher_->SetRequestContext(getter_); +- fetcher_->SetUploadData("application/x-www-form-urlencoded", body); +- gaia::MarkURLFetcherAsGaia(fetcher_.get()); +- +- VLOG(2) << "Gaia fetcher URL: " << gaia_gurl.spec(); +- VLOG(2) << "Gaia fetcher headers: " << headers; +- VLOG(2) << "Gaia fetcher body: " << body; +- +- // The Gaia token exchange requests do not require any cookie-based +- // identification as part of requests. We suppress sending any cookies to +- // maintain a separation between the user's browsing and Chrome's internal +- // services. Where such mixing is desired (MergeSession or OAuthLogin), it +- // will be done explicitly. +- fetcher_->SetLoadFlags(load_flags); +- +- // Fetchers are sometimes cancelled because a network change was detected, +- // especially at startup and after sign-in on ChromeOS. Retrying once should +- // be enough in those cases; let the fetcher retry up to 3 times just in case. +- // http://crbug.com/163710 +- fetcher_->SetAutomaticallyRetryOnNetworkChanges(3); +- +- if (!headers.empty()) +- fetcher_->SetExtraRequestHeaders(headers); +- +- fetch_pending_ = true; +- fetcher_->Start(); + } + + // static +-- +2.7.4 + diff --git a/patches/BRM040_ungoogled-chromium-Clear-HTTP-cache-menu-item.patch b/patches/BRM040_ungoogled-chromium-Clear-HTTP-cache-menu-item.patch new file mode 100644 index 00000000..c9eb95a4 --- /dev/null +++ b/patches/BRM040_ungoogled-chromium-Clear-HTTP-cache-menu-item.patch @@ -0,0 +1,181 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 12 Feb 2018 21:45:21 +0100 +Subject: ungoogled-chromium: Clear HTTP cache menu item + +Adds a menu item under "More tools" to clear the HTTP authentication cache on demand +--- + chrome/app/chrome_command_ids.h | 1 + + chrome/app/generated_resources.grd | 6 ++++++ + chrome/browser/ui/browser_command_controller.cc | 7 +++++++ + chrome/browser/ui/toolbar/app_menu_model.cc | 8 ++++++++ + chrome/browser/ui/toolbar/app_menu_model.h | 1 + + chrome/browser/ui/views/frame/global_menu_bar_x11.cc | 1 + + net/http/http_auth_cache.cc | 4 ++++ + net/http/http_auth_cache.h | 2 ++ + tools/metrics/histograms/enums.xml | 1 + + tools/metrics/histograms/histograms.xml | 1 + + 10 files changed, 32 insertions(+) + +diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h +--- a/chrome/app/chrome_command_ids.h ++++ b/chrome/app/chrome_command_ids.h +@@ -152,6 +152,7 @@ + #define IDC_DEV_TOOLS_INSPECT 40023 + #define IDC_UPGRADE_DIALOG 40024 + #define IDC_VIEW_INCOMPATIBILITIES 40025 ++#define IDC_CLEAR_HTTP_AUTH_CACHE 40026 + #define IDC_SHOW_KEYBOARD_OVERLAY 40027 + #define IDC_PROFILING_ENABLED 40028 + #define IDC_BOOKMARKS_MENU 40029 +diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd +--- a/chrome/app/generated_resources.grd ++++ b/chrome/app/generated_resources.grd +@@ -1053,6 +1053,9 @@ are declared in build/common.gypi. + + &Clear browsing data... + ++ ++ Clear &HTTP auth cache ++ + + &Downloads + +@@ -1091,6 +1094,9 @@ are declared in build/common.gypi. + + &Clear Browsing Data... + ++ ++ Clear &HTTP Auth Cache ++ + + &Downloads + +diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc +--- a/chrome/browser/ui/browser_command_controller.cc ++++ b/chrome/browser/ui/browser_command_controller.cc +@@ -60,6 +60,9 @@ + #include "extensions/browser/extension_system.h" + #include "printing/buildflags/buildflags.h" + #include "ui/events/keycodes/keyboard_codes.h" ++#include "net/url_request/url_request_context.h" ++#include "net/url_request/url_request_context_getter.h" ++#include "net/http/http_transaction_factory.h" + + #if defined(OS_MACOSX) + #include "chrome/browser/ui/browser_commands_mac.h" +@@ -629,6 +632,9 @@ bool BrowserCommandController::ExecuteCommandWithDisposition( + case IDC_CLEAR_BROWSING_DATA: + ShowClearBrowsingDataDialog(browser_); + break; ++ case IDC_CLEAR_HTTP_AUTH_CACHE: ++ profile()->GetRequestContext()->GetURLRequestContext()->http_transaction_factory()->GetSession()->http_auth_cache()->Clear(); ++ break; + case IDC_IMPORT_SETTINGS: + ShowImportDialog(browser_); + break; +@@ -871,6 +877,7 @@ void BrowserCommandController::InitCommandState() { + !profile()->IsOffTheRecord()); + command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, + !guest_session); ++ command_updater_.UpdateCommandEnabled(IDC_CLEAR_HTTP_AUTH_CACHE, true); + #if defined(OS_CHROMEOS) + command_updater_.UpdateCommandEnabled(IDC_TAKE_SCREENSHOT, true); + #else +diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc +--- a/chrome/browser/ui/toolbar/app_menu_model.cc ++++ b/chrome/browser/ui/toolbar/app_menu_model.cc +@@ -215,6 +215,7 @@ void ToolsMenuModel::Build(Browser* browser) { + + AddSeparator(ui::NORMAL_SEPARATOR); + AddItemWithStringId(IDC_CLEAR_BROWSING_DATA, IDS_CLEAR_BROWSING_DATA); ++ AddItemWithStringId(IDC_CLEAR_HTTP_AUTH_CACHE, IDS_CLEAR_HTTP_AUTH_CACHE); + AddItemWithStringId(IDC_MANAGE_EXTENSIONS, IDS_SHOW_EXTENSIONS); + if (chrome::CanOpenTaskManager()) + AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); +@@ -475,6 +476,13 @@ void AppMenuModel::LogMenuMetrics(int command_id) { + } + LogMenuAction(MENU_ACTION_CLEAR_BROWSING_DATA); + break; ++ case IDC_CLEAR_HTTP_AUTH_CACHE: ++ if (!uma_action_recorded_) { ++ UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ClearHttpAuthCache", ++ delta); ++ } ++ LogMenuAction(MENU_ACTION_CLEAR_HTTP_AUTH_CACHE); ++ break; + case IDC_VIEW_SOURCE: + if (!uma_action_recorded_) + UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ViewSource", delta); +diff --git a/chrome/browser/ui/toolbar/app_menu_model.h b/chrome/browser/ui/toolbar/app_menu_model.h +--- a/chrome/browser/ui/toolbar/app_menu_model.h ++++ b/chrome/browser/ui/toolbar/app_menu_model.h +@@ -76,6 +76,7 @@ enum AppMenuAction { + MENU_ACTION_OPEN_IN_CHROME = 48, + MENU_ACTION_SITE_SETTINGS = 49, + MENU_ACTION_APP_INFO = 50, ++ MENU_ACTION_CLEAR_HTTP_AUTH_CACHE = 51, + LIMIT_MENU_ACTION + }; + +diff --git a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc +--- a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc ++++ b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc +@@ -225,6 +225,7 @@ GlobalMenuBarCommand tools_menu[] = { + + {IDS_TASK_MANAGER, IDC_TASK_MANAGER}, + {IDS_CLEAR_BROWSING_DATA, IDC_CLEAR_BROWSING_DATA}, ++ {IDS_CLEAR_HTTP_AUTH_CACHE, IDC_CLEAR_HTTP_AUTH_CACHE}, + + {MENU_SEPARATOR, MENU_SEPARATOR}, + +diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc +--- a/net/http/http_auth_cache.cc ++++ b/net/http/http_auth_cache.cc +@@ -250,6 +250,10 @@ bool HttpAuthCache::Remove(const GURL& origin, + return false; + } + ++void HttpAuthCache::Clear() { ++ entries_.clear(); ++} ++ + void HttpAuthCache::ClearEntriesAddedWithin(base::TimeDelta duration) { + base::TimeTicks begin_time = base::TimeTicks::Now() - duration; + base::EraseIf(entries_, [begin_time](const Entry& entry) { +diff --git a/net/http/http_auth_cache.h b/net/http/http_auth_cache.h +--- a/net/http/http_auth_cache.h ++++ b/net/http/http_auth_cache.h +@@ -166,6 +166,8 @@ class NET_EXPORT HttpAuthCache { + HttpAuth::Scheme scheme, + const AuthCredentials& credentials); + ++ void Clear(); ++ + // Clears cache entries created within |duration| of base::TimeTicks::Now(). + void ClearEntriesAddedWithin(base::TimeDelta duration); + +diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml +--- a/tools/metrics/histograms/enums.xml ++++ b/tools/metrics/histograms/enums.xml +@@ -48315,6 +48315,7 @@ Full version information for the fingerprint enum values: + + + ++ + + + +diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml +--- a/tools/metrics/histograms/histograms.xml ++++ b/tools/metrics/histograms/histograms.xml +@@ -107947,6 +107947,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries. + ++ + +-- +2.7.4 + diff --git a/patches/BRM041_Added-exit-menu-item.patch b/patches/BRM041_Added-exit-menu-item.patch new file mode 100644 index 00000000..8e80812c --- /dev/null +++ b/patches/BRM041_Added-exit-menu-item.patch @@ -0,0 +1,50 @@ +From: Serg +Date: Tue, 31 Jan 2017 22:12:27 -0500 +Subject: Added exit menu item + +--- + chrome/android/java/res/menu/main_menu.xml | 2 ++ + .../android/java/src/org/chromium/chrome/browser/ChromeActivity.java | 2 ++ + chrome/android/java/strings/android_chrome_strings.grd | 3 +++ + 3 files changed, 7 insertions(+) + +diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml +--- a/chrome/android/java/res/menu/main_menu.xml ++++ b/chrome/android/java/res/menu/main_menu.xml +@@ -78,6 +78,8 @@ + android:title="@string/menu_help" /> + ++ + + + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +@@ -1951,6 +1951,8 @@ public abstract class ChromeActivity extends AsyncInitializationActivity + RecordUserAction.record("MobileMenuSettings"); + } else if (id == R.id.show_menu) { + showAppMenuForKeyboardEvent(); ++ } else if (id == R.id.exit_id) { ++ ApplicationLifetime.terminate(false); + } else if (id == R.id.find_in_page_id) { + if (mFindToolbarManager == null) return false; + +diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd +--- a/chrome/android/java/strings/android_chrome_strings.grd ++++ b/chrome/android/java/strings/android_chrome_strings.grd +@@ -2563,6 +2563,9 @@ Google may use your browsing activity, content on some sites you visit, and othe + + Settings + ++ ++ Exit ++ + + Close all tabs + +-- +2.7.4 + diff --git a/patches/BRM042_Play-videos-in-background.patch b/patches/BRM042_Play-videos-in-background.patch new file mode 100644 index 00000000..1ca6f89d --- /dev/null +++ b/patches/BRM042_Play-videos-in-background.patch @@ -0,0 +1,79 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sun, 18 Feb 2018 22:15:25 +0100 +Subject: Play videos in background + +Break Page Visibility API and Fullscreen API for youtube.com and vimeo.com +Original Javascript code by timdream +--- + third_party/blink/renderer/core/dom/BUILD.gn | 1 + + third_party/blink/renderer/core/dom/document.cc | 17 +++++++++++++---- + .../blink/renderer/core/dom/extensions/video_bg_play.h | 6 ++++++ + 3 files changed, 20 insertions(+), 4 deletions(-) + create mode 100644 third_party/blink/renderer/core/dom/extensions/video_bg_play.h + +diff --git a/third_party/blink/renderer/core/dom/BUILD.gn b/third_party/blink/renderer/core/dom/BUILD.gn +--- a/third_party/blink/renderer/core/dom/BUILD.gn ++++ b/third_party/blink/renderer/core/dom/BUILD.gn +@@ -148,6 +148,7 @@ blink_core_sources("dom") { + "events/window_event_context.cc", + "events/window_event_context.h", + "extensions/dont-track-me.h", ++ "extensions/video-bg-play.h", + "exception_code.h", + "first_letter_pseudo_element.cc", + "first_letter_pseudo_element.h", +diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc +--- a/third_party/blink/renderer/core/dom/document.cc ++++ b/third_party/blink/renderer/core/dom/document.cc +@@ -221,6 +221,7 @@ + #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" + #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h" + #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" ++#include "extensions/video_bg_play.h" + #include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" + #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" + #include "third_party/blink/renderer/core/policy/document_policy.h" +@@ -5848,17 +5849,25 @@ void Document::FinishedParsing() { + + // determine whether this is a Google search results page + const SecurityOrigin *origin = GetSecurityOrigin(); +- if (origin) { ++ auto* bodyElement = body(); ++ if (origin && bodyElement) { + WTF::String domain = origin->Domain(); + size_t pos = domain.Find(".google."); +- auto* bodyElement = body(); +- if (bodyElement && (pos != WTF::kNotFound) && (domain.length() - pos - 8 < 4)) { ++ if ((pos != WTF::kNotFound) && (domain.length() - pos - 8 < 4)) { + LOG(INFO) << "injecting anti-AMP-cure Javascript payload"; + HTMLScriptElement* e = HTMLScriptElement::Create(*this, CreateElementFlags()); + e->setText(ANTI_AMP_CURE_JS); + bodyElement->AppendChild(e); + } +- } ++ ++ // check for eligibility of the video bg fix ++ if ((WTF::kNotFound != domain.Find("youtube.com")) || (WTF::kNotFound != domain.Find("vimeo.com"))) { ++ LOG(INFO) << "injecting video-bg-play Javascript payload"; ++ HTMLScriptElement* e = HTMLScriptElement::Create(*this, CreateElementFlags()); ++ e->setText(VIDEO_BG_PLAY_JS); ++ bodyElement->AppendChild(e); ++ } ++ } // has origin and body element + } + + void Document::ElementDataCacheClearTimerFired(TimerBase*) { +diff --git a/third_party/blink/renderer/core/dom/extensions/video_bg_play.h b/third_party/blink/renderer/core/dom/extensions/video_bg_play.h +new file mode 100644 +--- /dev/null ++++ b/third_party/blink/renderer/core/dom/extensions/video_bg_play.h +@@ -0,0 +1,6 @@ ++#ifndef video_bg_play_h ++#define video_bg_play_h ++ ++#define VIDEO_BG_PLAY_JS "'use strict';\n\n/* video background play fix - original version by timdream */\ndocument.videoBGFix = {};\n\n// Page Visibility API\nObject.defineProperties(document.videoBGFix,\n { 'hidden': {value: false}, 'visibilityState': {value: 'visible'} });\n\nwindow.addEventListener(\n 'visibilitychange', evt => evt.stopImmediatePropagation(), true);\nwindow.addEventListener(\n 'blur', evt => evt.stopImmediatePropagation(), true);\n\n// Fullscreen API\nwindow.addEventListener('fullscreenchange', evt => {\n Object.defineProperties(document.videoBGFix,\n { 'fullscreenEnabled': {value: true},\n 'fullscreen': {value: true},\n 'fullscreenElement': {value: document.fullscreenElement.videoBGFix}});\n window.addEventListener(\n 'fullscreenchange', evt => evt.stopImmediatePropagation(), true);\n}, { capture: true, once: true });\n" ++ ++#endif // video_bg_play_h +-- +2.7.4 + diff --git a/patches/BRM043_Allow-playing-audio-in-background.patch b/patches/BRM043_Allow-playing-audio-in-background.patch new file mode 100644 index 00000000..2133ce43 --- /dev/null +++ b/patches/BRM043_Allow-playing-audio-in-background.patch @@ -0,0 +1,52 @@ +From: AlexeyBarabash +Date: Thu, 2 Nov 2017 18:21:16 +0200 +Subject: Allow playing audio in background + +--- + media/blink/webmediaplayer_impl.cc | 11 ++++++++++- + media/blink/webmediaplayer_impl.h | 2 ++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc +--- a/media/blink/webmediaplayer_impl.cc ++++ b/media/blink/webmediaplayer_impl.cc +@@ -853,6 +853,12 @@ bool WebMediaPlayerImpl::HasAudio() const { + return pipeline_metadata_.has_audio; + } + ++bool WebMediaPlayerImpl::HasVideoNonEmptySize() const { ++ DCHECK(main_task_runner_->BelongsToCurrentThread()); ++ ++ return pipeline_metadata_.has_video && pipeline_metadata_.natural_size.width() != 0 && pipeline_metadata_.natural_size.height() != 0; ++} ++ + void WebMediaPlayerImpl::EnabledAudioTracksChanged( + const blink::WebVector& enabledTrackIds) { + DCHECK(main_task_runner_->BelongsToCurrentThread()); +@@ -2877,7 +2883,10 @@ bool WebMediaPlayerImpl::ShouldPauseVideoWhenHidden() const { + // If suspending background video, pause any video that's not remoted or + // not unlocked to play in the background. + if (IsBackgroundedSuspendEnabled()) { +- if (!HasVideo()) ++ //pipeline_metadata_.has_video is true for MediaPlayerRenderer, ++ //see media/base/pipeline_metadata.h. This is a workaround to allow audio ++ //streams be played in background. ++ if (!HasVideoNonEmptySize()) + return false; + + #if defined(OS_ANDROID) +diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h +--- a/media/blink/webmediaplayer_impl.h ++++ b/media/blink/webmediaplayer_impl.h +@@ -155,6 +155,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl + // True if the loaded media has a playable video/audio track. + bool HasVideo() const override; + bool HasAudio() const override; ++ // True is has video and it's frame size is not zero ++ bool HasVideoNonEmptySize() const; + + void EnabledAudioTracksChanged( + const blink::WebVector& enabledTrackIds) +-- +2.7.4 + diff --git a/patches/BRM044_Use-Android-MediaPlayer-for-URLs.patch b/patches/BRM044_Use-Android-MediaPlayer-for-URLs.patch new file mode 100644 index 00000000..78d40713 --- /dev/null +++ b/patches/BRM044_Use-Android-MediaPlayer-for-URLs.patch @@ -0,0 +1,23 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Tue, 12 Jun 2018 15:18:19 +0200 +Subject: Use Android MediaPlayer for URLs + +--- + content/public/renderer/content_renderer_client.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc +--- a/content/public/renderer/content_renderer_client.cc ++++ b/content/public/renderer/content_renderer_client.cc +@@ -121,7 +121,7 @@ bool ContentRendererClient::HandleNavigation( + } + + bool ContentRendererClient::ShouldUseMediaPlayerForURL(const GURL& url) { +- return false; ++ return true; + } + #endif + +-- +2.7.4 + diff --git a/patches/BRM045_Open-YouTube-links-in-Bromite.patch b/patches/BRM045_Open-YouTube-links-in-Bromite.patch new file mode 100644 index 00000000..34744b3a --- /dev/null +++ b/patches/BRM045_Open-YouTube-links-in-Bromite.patch @@ -0,0 +1,28 @@ +From: AlexeyBarabash +Date: Thu, 11 Jan 2018 13:27:34 +0200 +Subject: Open YouTube links in Bromite + +--- + .../chrome/browser/externalnav/ExternalNavigationHandler.java | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java +@@ -357,6 +357,13 @@ public class ExternalNavigationHandler { + return OverrideUrlLoadingResult.NO_OVERRIDE; + } + ++ // Force to open YouTube urls in Bromite ++ String intentPackageName = intent.getPackage(); ++ if (intentPackageName != null && intentPackageName.equals("com.google.android.youtube")) { ++ if (DEBUG) Log.i(TAG, "NO_OVERRIDE: YouTube URL for YouTube app"); ++ return OverrideUrlLoadingResult.NO_OVERRIDE; ++ } ++ + // Sanitize the Intent, ensuring web pages can not bypass browser + // security (only access to BROWSABLE activities). + intent.addCategory(Intent.CATEGORY_BROWSABLE); +-- +2.7.4 + diff --git a/patches/BRM046_url_request-hooks-and-ad-url-data.patch b/patches/BRM046_url_request-hooks-and-ad-url-data.patch new file mode 100644 index 00000000..5d430d6e --- /dev/null +++ b/patches/BRM046_url_request-hooks-and-ad-url-data.patch @@ -0,0 +1,189 @@ +From: NoChromo +Date: Sun, 3 Apr 2016 12:44:50 +0800 +Subject: url_request: hooks and ad url data + +--- + net/BUILD.gn | 2 + + net/url_request/nochromo_intercept.cc | 116 ++++++++++++++++++++++++++++++++++ + net/url_request/nochromo_intercept.h | 13 ++++ + net/url_request/url_request.cc | 4 ++ + 4 files changed, 135 insertions(+) + create mode 100644 net/url_request/nochromo_intercept.cc + create mode 100644 net/url_request/nochromo_intercept.h + +diff --git a/net/BUILD.gn b/net/BUILD.gn +--- a/net/BUILD.gn ++++ b/net/BUILD.gn +@@ -1756,6 +1756,8 @@ component("net") { + "url_request/url_fetcher_response_writer.h", + "url_request/url_range_request_job.cc", + "url_request/url_range_request_job.h", ++ "url_request/nochromo_intercept.cc", ++ "url_request/nochromo_intercept.h", + "url_request/url_request.cc", + "url_request/url_request.h", + "url_request/url_request_context.cc", +diff --git a/net/url_request/nochromo_intercept.cc b/net/url_request/nochromo_intercept.cc +new file mode 100644 +--- /dev/null ++++ b/net/url_request/nochromo_intercept.cc +@@ -0,0 +1,116 @@ ++#include "url/gurl.h" ++#include "net/url_request/nochromo_entries.h" ++ ++#include ++ ++namespace net { ++ ++#define NOCHROMO_LOG 0 ++#define NOCHROMO_LOG_MORE 0 ++ ++static char* strtolower(const char* str) { ++ int len = strlen(str); ++ char* ret = (char*)malloc(len + 1); ++ ret[len] = '\0'; ++ for (int i = 0; i < len; i++) { ++ if ((65 <= str[i]) && (str[i] <= 90)) { ++ ret[i] = str[i] + 32; ++ } else { ++ ret[i] = str[i]; ++ } ++ } ++ return ret; ++} ++ ++static char* strtosep(const char* str) { ++ int len = strlen(str); ++ char* ret = (char*)malloc(len + 3); ++ ret[0] = '^'; ++ ret[len + 1] = '^'; ++ ret[len + 2] = '\0'; ++ for (int i = 0; i < len; i++) { ++ if ((str[i] == ':') || (str[i] == '/') || (str[i] == '?') || (str[i] == '&') || (str[i] == '=')) { ++ ret[i + 1] = '^'; ++ } else { ++ ret[i + 1] = str[i]; ++ } ++ } ++ return ret; ++} ++ ++int nochromo_intercept(const GURL& url) { ++ if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { ++ const char* c_url = url.spec().c_str(); ++ char* c_url_lower = strtolower(c_url); ++ char* c_url_sep = strtosep(c_url); ++ char* c_url_lower_sep = strtosep(c_url_lower); ++ ++ if (NOCHROMO_LOG) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "[%s]", c_url); ++ ++ bool intercept = false; ++ for (int i = 0; i < NOCHROMO_ENTRY_COUNT; i++) { ++ nochromo_entry* entry = &NOCHROMO_ENTRIES[i]; ++ ++ // no use checking rules when we're intercepting, or exceptions when not ++ bool check = ++ (!intercept && ((entry->flags & NOCHROMO_FLAG_EXCEPTION) == 0)) || ++ (intercept && ((entry->flags & NOCHROMO_FLAG_EXCEPTION) != 0)); ++ ++ if (check) { ++ bool match = false; ++ ++ // select comparison string based on case and separator presence (separator takes some shortcuts) ++ bool match_case = ((entry->flags & NOCHROMO_FLAG_MATCH_CASE) != 0); ++ bool match_separator = ((entry->flags & NOCHROMO_FLAG_HAS_SEPARATOR) != 0); ++ const char* match_url = match_case ? (match_separator ? c_url_sep : c_url) : (match_separator ? c_url_lower_sep : c_url_lower); ++ ++ if (NOCHROMO_LOG || NOCHROMO_LOG_MORE) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "[case:%d][sep:%d][%s]", match_case, match_separator, match_url); ++ ++ // check for all match parts at >= position of last match ++ const char* last = match_url; ++ for (int m = 0; m < entry->matchcount; m++) { ++ const char* pos = strstr(last, entry->matches[m]); ++ match = (pos != NULL); ++ ++ if (NOCHROMO_LOG || NOCHROMO_LOG_MORE) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "[%s][found:%d][match:%d]", entry->matches[m], pos == NULL ? 0 : 1, match ? 1 : 0); ++ ++ // check if the url starts with the first match part ++ if (match && (m == 0) && ((entry->flags & NOCHROMO_FLAG_MATCH_BEGIN) != 0) && (pos != match_url)) match = false; ++ ++ // check if the url ends with the last match part ++ if (match && (m == entry->matchcount - 1) && ((entry->flags & NOCHROMO_FLAG_MATCH_END) != 0) && (pos != &match_url[strlen(match_url) - strlen(entry->matches[m])])) match = false; ++ ++ // check domain match ++ if (match && (m == 0) && ((entry->flags & NOCHROMO_FLAG_MATCH_DOMAIN) != 0) && (pos != match_url) && (pos[-1] != '^') && (pos[-1] != '.') && (pos[-1] != '/')) match = false; ++ ++ // short circuit ++ if (!match) break; ++ } ++ ++ if (match) { ++ if (NOCHROMO_LOG) { ++ if (!intercept) { ++ __android_log_print(ANDROID_LOG_INFO, "NoChromo", "--> intercept (%d) (%d)", i, entry->flags); ++ } else { ++ __android_log_print(ANDROID_LOG_INFO, "NoChromo", "--> pass (%d) (%d)", i, entry->flags); ++ } ++ } ++ intercept = !intercept; ++ } ++ } ++ } ++ ++ free(c_url_sep); ++ free(c_url_lower); ++ free(c_url_lower_sep); ++ ++ if (intercept) { ++ if (NOCHROMO_LOG) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "intercepted!"); ++ return 1; ++ } ++ if (NOCHROMO_LOG) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "pass!"); ++ } ++ return 0; ++} ++ ++} // namespace net +\ No newline at end of file +diff --git a/net/url_request/nochromo_intercept.h b/net/url_request/nochromo_intercept.h +new file mode 100644 +--- /dev/null ++++ b/net/url_request/nochromo_intercept.h +@@ -0,0 +1,13 @@ ++#ifndef NET_URL_REQUEST_NOCHROMO_INTERCEPT_H_ ++#define NET_URL_REQUEST_NOCHROMO_INTERCEPT_H_ ++ ++#include "url/gurl.h" ++ ++namespace net { ++ ++GURL nochromo_intercepted = GURL("http://127.0.0.1/"); ++int nochromo_intercept(const GURL& url); ++ ++} // namespace net ++ ++#endif // NET_URL_REQUEST_NOCHROMO_INTERCEPT_H_ +diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc +--- a/net/url_request/url_request.cc ++++ b/net/url_request/url_request.cc +@@ -44,6 +44,8 @@ + #include "url/gurl.h" + #include "url/origin.h" + ++#include "net/url_request/nochromo_intercept.h" ++ + #if BUILDFLAG(ENABLE_REPORTING) + #include "net/network_error_logging/network_error_logging_service.h" + #include "net/reporting/reporting_service.h" +@@ -583,6 +585,8 @@ URLRequest::URLRequest(const GURL& url, + // Sanity check out environment. + DCHECK(base::ThreadTaskRunnerHandle::IsSet()); + ++ if (nochromo_intercept(url)) url_chain_.push_back(nochromo_intercepted); ++ + context->url_requests()->insert(this); + net_log_.BeginEvent( + NetLogEventType::REQUEST_ALIVE, +-- +2.7.4 + diff --git a/patches/BRM047_Bromite-adblock-engine.patch b/patches/BRM047_Bromite-adblock-engine.patch new file mode 100644 index 00000000..49507738 --- /dev/null +++ b/patches/BRM047_Bromite-adblock-engine.patch @@ -0,0 +1,584 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 28 Mar 2018 15:55:11 +0200 +Subject: Bromite adblock engine + +Ported from NoChromo patch +Make interception testable +Add domain support +Re-land: third-party filters support +--- + net/BUILD.gn | 9 +- + net/url_request/adblock_intercept.cc | 324 ++++++++++++++++++++++++++++++++++ + net/url_request/adblock_intercept.h | 16 ++ + net/url_request/nochromo_intercept.cc | 116 ------------ + net/url_request/nochromo_intercept.h | 13 -- + net/url_request/url_request.cc | 19 +- + 6 files changed, 364 insertions(+), 133 deletions(-) + create mode 100644 net/url_request/adblock_intercept.cc + create mode 100644 net/url_request/adblock_intercept.h + delete mode 100644 net/url_request/nochromo_intercept.cc + delete mode 100644 net/url_request/nochromo_intercept.h + +diff --git a/net/BUILD.gn b/net/BUILD.gn +--- a/net/BUILD.gn ++++ b/net/BUILD.gn +@@ -1756,8 +1756,6 @@ component("net") { + "url_request/url_fetcher_response_writer.h", + "url_request/url_range_request_job.cc", + "url_request/url_range_request_job.h", +- "url_request/nochromo_intercept.cc", +- "url_request/nochromo_intercept.h", + "url_request/url_request.cc", + "url_request/url_request.h", + "url_request/url_request_context.cc", +@@ -1815,6 +1813,13 @@ component("net") { + "//third_party/zlib", + ] + ++ if (is_android) { ++ sources += [ ++ "url_request/adblock_intercept.cc", ++ "url_request/adblock_intercept.h" ++ ] ++ } ++ + if (enable_reporting) { + sources += [ + "network_error_logging/network_error_logging_delegate.cc", +diff --git a/net/url_request/adblock_intercept.cc b/net/url_request/adblock_intercept.cc +new file mode 100644 +--- /dev/null ++++ b/net/url_request/adblock_intercept.cc +@@ -0,0 +1,324 @@ ++#include "url/gurl.h" ++ ++#ifdef ADB_TESTER ++#include ++#include ++#include ++ ++#include "log.h" ++#include ++ ++#else ++ ++#include "net/base/registry_controlled_domains/registry_controlled_domain.h" ++#include ++ ++#endif ++ ++#include "net/url_request/adblock_entries.h" ++ ++namespace net { ++ ++const char *LOG_TAG = "Bromite"; ++ ++#ifdef ADB_TESTER ++int adblock_rules_count() { return ADBLOCK_ENTRY_COUNT; } ++#endif ++ ++// True if the given canonical |host| is "[www.]." ++// with a valid TLD. If |subdomain_permission| is ALLOW_SUBDOMAIN, we check ++// against host "*.." instead. Will return the TLD ++// string in |tld|, if specified and the |host| can be parsed. ++static bool is_first_party(char *l_host, char *l_url_host) { ++ size_t tld_length; ++ ++#ifdef ADB_TESTER ++ char *found_tld; ++ ++ if (TLD_SUCCESS != tld_get_z(l_host, &found_tld)) ++ return false; ++ tld_length = strlen(found_tld); ++ if (tld_length == 0) ++ return false; ++#else ++ tld_length = net::registry_controlled_domains::GetCanonicalHostRegistryLength( ++ l_host, net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, ++ net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); ++ if ((tld_length == 0) || (tld_length == std::string::npos)) ++ return false; ++#endif ++ ++ int len = strlen(l_host); ++ char *tld = l_host + len - tld_length; ++ ++ // Removes any subdomain from origin host. ++ int i = len - tld_length - 2, top_i = i; ++ if (i < 0) { ++ return false; ++ } ++ char *domain = l_host; ++ for (; i >= 0; i--) { ++ if (l_host[i] == '.') { ++ int p_len = top_i - i; ++ // skip "co" in "co.uk", "org" in "org.uk" ++ if (p_len <= 3) { ++ tld -= p_len + 1; ++ continue; ++ } ++ ++ // segment is long enough, accept it at as a domain ++ domain = l_host + i; ++ len -= i; ++ break; ++ } ++ } ++ ++#ifdef ADBLOCK_LOG ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, ++ "%s: extracted domain suffix: \"%s\" (TLD=\"%s\")", ++ l_host, domain, tld); ++#endif ++ ++ // Check if supplied URL host matches, including the dot. ++ int b_len = strlen(l_url_host); ++ if (b_len < len) { ++ return false; ++ } ++ for (int i = 0; i < len; i++) { ++ if (l_url_host[b_len - 1 - i] != domain[len - 1 - i]) ++ return false; ++ } ++ ++ // pass with flying colors ++ return true; ++} ++ ++static char *strtolower(const char *str) { ++ int len = strlen(str); ++ char *ret = (char *)malloc(len + 1); ++ ret[len] = '\0'; ++ for (int i = 0; i < len; i++) { ++ if ((65 <= str[i]) && (str[i] <= 90)) { ++ ret[i] = str[i] + 32; ++ } else { ++ ret[i] = str[i]; ++ } ++ } ++ return ret; ++} ++ ++static char *strtosep(const char *str) { ++ int len = strlen(str); ++ char *ret = (char *)malloc(len + 3); ++ ret[0] = '^'; ++ ret[len + 1] = '^'; ++ ret[len + 2] = '\0'; ++ for (int i = 0; i < len; i++) { ++ if ((str[i] == ':') || (str[i] == '/') || (str[i] == '?') || ++ (str[i] == '&') || (str[i] == '=')) { ++ ret[i + 1] = '^'; ++ } else { ++ ret[i + 1] = str[i]; ++ } ++ } ++ return ret; ++} ++ ++static bool url_matches(const char *c_url, char *c_url_sep, char *c_url_lower, ++ char *c_url_lower_sep, adblock_entry *entry) { ++ bool match = false; ++ // select comparison string based on case and separator presence (separator ++ // takes some shortcuts) ++ bool match_case = ((entry->flags & ADBLOCK_FLAG_MATCH_CASE) != 0); ++ bool match_separator = ((entry->flags & ADBLOCK_FLAG_HAS_SEPARATOR) != 0); ++ const char *match_url = ++ match_case ? (match_separator ? c_url_sep : c_url) ++ : (match_separator ? c_url_lower_sep : c_url_lower); ++ ++#ifdef ADBLOCK_LOG_MORE ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[case:%d][sep:%d][%s]", ++ match_case, match_separator, match_url); ++#endif ++ // check for all match parts at >= position of last match ++ const char *last = match_url; ++ for (int m = 0; const char *url_match = entry->matches[m]; m++) { ++ bool is_last_match = entry->matches[m + 1] == NULL; ++ const char *pos = strstr(last, url_match); ++ match = (pos != NULL); ++ ++#ifdef ADBLOCK_LOG_MORE ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s][found:%d][match:%d]", ++ entry->matches[m], pos == NULL ? 0 : 1, match ? 1 : 0); ++#endif ++ // check if the url starts with the first match part ++ if (match && (m == 0) && ((entry->flags & ADBLOCK_FLAG_MATCH_BEGIN) != 0) && ++ (pos != match_url)) ++ match = false; ++ ++ // check if the url ends with the last match part ++ if (match && is_last_match && ++ ((entry->flags & ADBLOCK_FLAG_MATCH_END) != 0) && ++ (pos != &match_url[strlen(match_url) - strlen(entry->matches[m])])) ++ match = false; ++ ++ // check domain match ++ if (match && (m == 0) && ++ ((entry->flags & ADBLOCK_FLAG_MATCH_DOMAIN) != 0) && ++ (pos != match_url) && (pos[-1] != '^') && (pos[-1] != '.') && ++ (pos[-1] != '/')) ++ match = false; ++ ++ // short circuit ++ if (!match) ++ break; ++ } ++ return match; ++} ++ ++bool url_match_domain(adblock_entry *entry, const std::string &origin_host) { ++ bool match_domain = true; ++ // check for a negative domain match ++ if (entry->domains_neg) { ++ if (origin_host.empty()) { ++ // skip this rule, cannot match on domain ++ return false; ++ } ++ for (int d = 0; const char *domain = entry->domains_neg[d]; d++) { ++ if (domain == origin_host) { ++ match_domain = false; ++ break; ++ } ++ } ++ } ++ ++ // check for a required positive domain match ++ if (entry->domains) { ++ if (origin_host.empty()) { ++ // skip this rule, cannot match on domain ++ return false; ++ } ++ for (int d = 0; const char *domain = entry->domains[d]; d++) { ++ if (domain != origin_host) { ++ match_domain = false; ++ break; ++ } ++ } ++ } ++ return match_domain; ++} ++ ++static bool url_match_party(adblock_entry *entry, const GURL &url, ++ const std::string &origin_host, bool &checked_fp, ++ bool &fp) { ++ bool wanted_fp; ++ if ((entry->flags & ADBLOCK_FLAG_THIRD_PARTY) != 0) { ++ wanted_fp = false; ++ } else if ((entry->flags & ADBLOCK_FLAG_FIRST_PARTY) != 0) { ++ wanted_fp = true; ++ } else { ++ // no-op ++ return true; ++ } ++ ++ if (origin_host.empty()) { ++ // cannot match this rule, no origin host to determine first/third party ++ return false; ++ } ++ ++#ifdef ADB_TESTER ++//__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "matchFirst=%d matchThird=%d", ++// matchFirstParty, matchThirdParty); ++#endif ++ if (!checked_fp) { ++ // lower-case version ++ char *l_host = strtolower(origin_host.c_str()), ++ *l_url_host = strtolower(url.host().c_str()); ++ ++ // is the URL a first-party to the current page's host? ++ fp = is_first_party(l_host, l_url_host); ++ ++ checked_fp = true; ++#ifdef ADB_TESTER ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, ++ "is_first_party(\"%s\", \"%s\") = %s", l_host, ++ l_url_host, fp ? "true" : "false"); ++#endif ++ free(l_host); ++ free(l_url_host); ++ } ++ ++ return fp == wanted_fp; ++} ++ ++int adblock_intercept(const GURL &url, const std::string &origin_host) { ++ // if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) { ++ // return 0; ++ // } ++ ++ if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { ++ const char *c_url = url.spec().c_str(); ++ char *c_url_lower = strtolower(c_url); ++ char *c_url_sep = strtosep(c_url); ++ char *c_url_lower_sep = strtosep(c_url_lower); ++ ++#ifdef ADBLOCK_LOG ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%s with host '%s'] [%s]", ++ c_url, url.host().c_str(), origin_host.c_str()); ++#endif ++ ++ bool checked_fp = false, fp = false; ++ ++ bool intercept = false; ++ for (int i = 0; i < ADBLOCK_ENTRY_COUNT; i++) { ++ adblock_entry *entry = &ADBLOCK_ENTRIES[i]; ++ ++ // no use checking rules when we're intercepting, or exceptions when not ++ bool check = ++ (!intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) == 0)) || ++ (intercept && ((entry->flags & ADBLOCK_FLAG_EXCEPTION) != 0)); ++ if (!check) ++ continue; ++ ++ // first check for domain matches, a quick branch out if matching ++ if (!url_match_domain(entry, origin_host)) ++ continue; ++ ++ // check on the URL matcher ++ if (!url_matches(c_url, c_url_sep, c_url_lower, c_url_lower_sep, entry)) ++ continue; ++ ++ // finally check first/third-party ++ if (!url_match_party(entry, url, origin_host, checked_fp, fp)) ++ continue; ++ ++#ifdef ADBLOCK_LOG ++ if (!intercept) { ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, ++ "--> intercept (#%d: \"%s\") (%x)", i, ++ entry->matches[0], entry->flags); ++ } else { ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "--> pass (%d) (#%d)", i, ++ entry->flags); ++ } ++#endif ++ intercept = !intercept; ++ } // for each entry ++ ++ free(c_url_sep); ++ free(c_url_lower); ++ free(c_url_lower_sep); ++ ++ if (intercept) { ++#ifdef ADBLOCK_LOG ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "blocked"); ++#endif ++ return 1; ++ } ++#ifdef ADBLOCK_LOG ++ __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "pass"); ++#endif ++ } ++ return 0; ++} ++ ++} // namespace net +diff --git a/net/url_request/adblock_intercept.h b/net/url_request/adblock_intercept.h +new file mode 100644 +--- /dev/null ++++ b/net/url_request/adblock_intercept.h +@@ -0,0 +1,16 @@ ++#ifndef NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_ ++#define NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_ ++ ++#include "url/gurl.h" ++ ++namespace net { ++ ++#ifdef ADB_TESTER ++int adblock_rules_count(); ++#endif ++ ++int adblock_intercept(const GURL &url, const std::string &origin_host); ++ ++} // namespace net ++ ++#endif // NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_ +diff --git a/net/url_request/nochromo_intercept.cc b/net/url_request/nochromo_intercept.cc +deleted file mode 100644 +--- a/net/url_request/nochromo_intercept.cc ++++ /dev/null +@@ -1,116 +0,0 @@ +-#include "url/gurl.h" +-#include "net/url_request/nochromo_entries.h" +- +-#include +- +-namespace net { +- +-#define NOCHROMO_LOG 0 +-#define NOCHROMO_LOG_MORE 0 +- +-static char* strtolower(const char* str) { +- int len = strlen(str); +- char* ret = (char*)malloc(len + 1); +- ret[len] = '\0'; +- for (int i = 0; i < len; i++) { +- if ((65 <= str[i]) && (str[i] <= 90)) { +- ret[i] = str[i] + 32; +- } else { +- ret[i] = str[i]; +- } +- } +- return ret; +-} +- +-static char* strtosep(const char* str) { +- int len = strlen(str); +- char* ret = (char*)malloc(len + 3); +- ret[0] = '^'; +- ret[len + 1] = '^'; +- ret[len + 2] = '\0'; +- for (int i = 0; i < len; i++) { +- if ((str[i] == ':') || (str[i] == '/') || (str[i] == '?') || (str[i] == '&') || (str[i] == '=')) { +- ret[i + 1] = '^'; +- } else { +- ret[i + 1] = str[i]; +- } +- } +- return ret; +-} +- +-int nochromo_intercept(const GURL& url) { +- if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { +- const char* c_url = url.spec().c_str(); +- char* c_url_lower = strtolower(c_url); +- char* c_url_sep = strtosep(c_url); +- char* c_url_lower_sep = strtosep(c_url_lower); +- +- if (NOCHROMO_LOG) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "[%s]", c_url); +- +- bool intercept = false; +- for (int i = 0; i < NOCHROMO_ENTRY_COUNT; i++) { +- nochromo_entry* entry = &NOCHROMO_ENTRIES[i]; +- +- // no use checking rules when we're intercepting, or exceptions when not +- bool check = +- (!intercept && ((entry->flags & NOCHROMO_FLAG_EXCEPTION) == 0)) || +- (intercept && ((entry->flags & NOCHROMO_FLAG_EXCEPTION) != 0)); +- +- if (check) { +- bool match = false; +- +- // select comparison string based on case and separator presence (separator takes some shortcuts) +- bool match_case = ((entry->flags & NOCHROMO_FLAG_MATCH_CASE) != 0); +- bool match_separator = ((entry->flags & NOCHROMO_FLAG_HAS_SEPARATOR) != 0); +- const char* match_url = match_case ? (match_separator ? c_url_sep : c_url) : (match_separator ? c_url_lower_sep : c_url_lower); +- +- if (NOCHROMO_LOG || NOCHROMO_LOG_MORE) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "[case:%d][sep:%d][%s]", match_case, match_separator, match_url); +- +- // check for all match parts at >= position of last match +- const char* last = match_url; +- for (int m = 0; m < entry->matchcount; m++) { +- const char* pos = strstr(last, entry->matches[m]); +- match = (pos != NULL); +- +- if (NOCHROMO_LOG || NOCHROMO_LOG_MORE) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "[%s][found:%d][match:%d]", entry->matches[m], pos == NULL ? 0 : 1, match ? 1 : 0); +- +- // check if the url starts with the first match part +- if (match && (m == 0) && ((entry->flags & NOCHROMO_FLAG_MATCH_BEGIN) != 0) && (pos != match_url)) match = false; +- +- // check if the url ends with the last match part +- if (match && (m == entry->matchcount - 1) && ((entry->flags & NOCHROMO_FLAG_MATCH_END) != 0) && (pos != &match_url[strlen(match_url) - strlen(entry->matches[m])])) match = false; +- +- // check domain match +- if (match && (m == 0) && ((entry->flags & NOCHROMO_FLAG_MATCH_DOMAIN) != 0) && (pos != match_url) && (pos[-1] != '^') && (pos[-1] != '.') && (pos[-1] != '/')) match = false; +- +- // short circuit +- if (!match) break; +- } +- +- if (match) { +- if (NOCHROMO_LOG) { +- if (!intercept) { +- __android_log_print(ANDROID_LOG_INFO, "NoChromo", "--> intercept (%d) (%d)", i, entry->flags); +- } else { +- __android_log_print(ANDROID_LOG_INFO, "NoChromo", "--> pass (%d) (%d)", i, entry->flags); +- } +- } +- intercept = !intercept; +- } +- } +- } +- +- free(c_url_sep); +- free(c_url_lower); +- free(c_url_lower_sep); +- +- if (intercept) { +- if (NOCHROMO_LOG) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "intercepted!"); +- return 1; +- } +- if (NOCHROMO_LOG) __android_log_print(ANDROID_LOG_INFO, "NoChromo", "pass!"); +- } +- return 0; +-} +- +-} // namespace net +\ No newline at end of file +diff --git a/net/url_request/nochromo_intercept.h b/net/url_request/nochromo_intercept.h +deleted file mode 100644 +--- a/net/url_request/nochromo_intercept.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-#ifndef NET_URL_REQUEST_NOCHROMO_INTERCEPT_H_ +-#define NET_URL_REQUEST_NOCHROMO_INTERCEPT_H_ +- +-#include "url/gurl.h" +- +-namespace net { +- +-GURL nochromo_intercepted = GURL("http://127.0.0.1/"); +-int nochromo_intercept(const GURL& url); +- +-} // namespace net +- +-#endif // NET_URL_REQUEST_NOCHROMO_INTERCEPT_H_ +diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc +--- a/net/url_request/url_request.cc ++++ b/net/url_request/url_request.cc +@@ -44,7 +44,9 @@ + #include "url/gurl.h" + #include "url/origin.h" + +-#include "net/url_request/nochromo_intercept.h" ++#if defined(OS_ANDROID) ++#include "net/url_request/adblock_intercept.h" ++#endif + + #if BUILDFLAG(ENABLE_REPORTING) + #include "net/network_error_logging/network_error_logging_service.h" +@@ -559,7 +561,9 @@ URLRequest::URLRequest(const GURL& url, + : context->network_delegate()), + net_log_(NetLogWithSource::Make(context->net_log(), + NetLogSourceType::URL_REQUEST)), ++#if !defined(OS_ANDROID) + url_chain_(1, url), ++#endif + attach_same_site_cookies_(false), + method_("GET"), + referrer_policy_(CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE), +@@ -585,7 +589,18 @@ URLRequest::URLRequest(const GURL& url, + // Sanity check out environment. + DCHECK(base::ThreadTaskRunnerHandle::IsSet()); + +- if (nochromo_intercept(url)) url_chain_.push_back(nochromo_intercepted); ++#if defined(OS_ANDROID) ++ std::string initiatorHost; ++ if (initiator_.has_value()) { ++ initiatorHost = initiator_.value().host(); ++ } ++ ++ if (adblock_intercept(url, initiatorHost)) { ++ url_chain_ = { url, GURL("http://127.0.0.1") }; ++ } else { ++ url_chain_ = { url }; ++ } ++#endif + + context->url_requests()->insert(this); + net_log_.BeginEvent( +-- +2.7.4 + diff --git a/patches/BRM048_User-Agent-anonymize.patch b/patches/BRM048_User-Agent-anonymize.patch new file mode 100644 index 00000000..1c3577ff --- /dev/null +++ b/patches/BRM048_User-Agent-anonymize.patch @@ -0,0 +1,54 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 21 Mar 2018 14:15:28 +0100 +Subject: User Agent: anonymize + +Remove device name and build id +--- + content/common/user_agent.cc | 25 ++----------------------- + 1 file changed, 2 insertions(+), 23 deletions(-) + +diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc +--- a/content/common/user_agent.cc ++++ b/content/common/user_agent.cc +@@ -79,26 +79,6 @@ std::string BuildOSCpuInfo() { + + #if defined(OS_ANDROID) + std::string android_version_str = base::SysInfo::OperatingSystemVersion(); +- +- std::string android_info_str; +- +- // Send information about the device. +- bool semicolon_inserted = false; +- std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename(); +- std::string android_device_name = base::SysInfo::HardwareModelName(); +- if ("REL" == android_build_codename && android_device_name.size() > 0) { +- android_info_str += "; " + android_device_name; +- semicolon_inserted = true; +- } +- +- // Append the build ID. +- std::string android_build_id = base::SysInfo::GetAndroidBuildID(); +- if (android_build_id.size() > 0) { +- if (!semicolon_inserted) { +- android_info_str += ";"; +- } +- android_info_str += " Build/" + android_build_id; +- } + #endif + + base::StringAppendF( +@@ -121,9 +101,8 @@ std::string BuildOSCpuInfo() { + os_minor_version, + os_bugfix_version + #elif defined(OS_ANDROID) +- "Android %s%s", +- android_version_str.c_str(), +- android_info_str.c_str() ++ "Android %s", ++ android_version_str.c_str() + #else + "%s %s", + unixinfo.sysname, // e.g. Linux +-- +2.7.4 + diff --git a/patches/BRM049_Battery-API-return-nothing.patch b/patches/BRM049_Battery-API-return-nothing.patch new file mode 100644 index 00000000..b7aef748 --- /dev/null +++ b/patches/BRM049_Battery-API-return-nothing.patch @@ -0,0 +1,77 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Thu, 22 Mar 2018 22:11:57 +0100 +Subject: Battery API: return nothing + +--- + services/device/battery/battery_status_service.cc | 2 +- + .../renderer/modules/battery/battery_manager.cc | 25 ++++------------------ + 2 files changed, 5 insertions(+), 22 deletions(-) + +diff --git a/services/device/battery/battery_status_service.cc b/services/device/battery/battery_status_service.cc +--- a/services/device/battery/battery_status_service.cc ++++ b/services/device/battery/battery_status_service.cc +@@ -41,7 +41,7 @@ BatteryStatusService::AddCallback(const BatteryUpdateCallback& callback) { + if (!battery_fetcher_) + battery_fetcher_ = BatteryStatusManager::Create(update_callback_); + +-#if 0 ++#if !defined(OS_ANDROID) + if (callback_list_.empty()) { + bool success = battery_fetcher_->StartListeningBatteryChange(); + // On failure pass the default values back. +diff --git a/third_party/blink/renderer/modules/battery/battery_manager.cc b/third_party/blink/renderer/modules/battery/battery_manager.cc +--- a/third_party/blink/renderer/modules/battery/battery_manager.cc ++++ b/third_party/blink/renderer/modules/battery/battery_manager.cc +@@ -42,45 +42,28 @@ ScriptPromise BatteryManager::StartRequest(ScriptState* script_state) { + } + + bool BatteryManager::charging() { +- return battery_status_.Charging(); ++ return false; + } + + double BatteryManager::chargingTime() { +- return battery_status_.charging_time(); ++ return 0; + } + + double BatteryManager::dischargingTime() { +- return battery_status_.discharging_time(); ++ return 0; + } + + double BatteryManager::level() { +- return battery_status_.Level(); ++ return 1; + } + + void BatteryManager::DidUpdateData() { + DCHECK(battery_property_); + +- BatteryStatus old_status = battery_status_; +- battery_status_ = *BatteryDispatcher::Instance().LatestData(); +- + if (battery_property_->GetState() == ScriptPromisePropertyBase::kPending) { + battery_property_->Resolve(this); + return; + } +- +- Document* document = ToDocument(GetExecutionContext()); +- DCHECK(document); +- if (document->IsContextPaused() || document->IsContextDestroyed()) +- return; +- +- if (battery_status_.Charging() != old_status.Charging()) +- DispatchEvent(Event::Create(EventTypeNames::chargingchange)); +- if (battery_status_.charging_time() != old_status.charging_time()) +- DispatchEvent(Event::Create(EventTypeNames::chargingtimechange)); +- if (battery_status_.discharging_time() != old_status.discharging_time()) +- DispatchEvent(Event::Create(EventTypeNames::dischargingtimechange)); +- if (battery_status_.Level() != old_status.Level()) +- DispatchEvent(Event::Create(EventTypeNames::levelchange)); + } + + void BatteryManager::RegisterWithDispatcher() { +-- +2.7.4 + diff --git a/patches/BRM050_Disable-plugins-enumeration.patch b/patches/BRM050_Disable-plugins-enumeration.patch new file mode 100644 index 00000000..56e2276f --- /dev/null +++ b/patches/BRM050_Disable-plugins-enumeration.patch @@ -0,0 +1,27 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Thu, 22 Mar 2018 22:38:00 +0100 +Subject: Disable plugins enumeration + +--- + third_party/blink/renderer/core/frame/local_frame.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc +--- a/third_party/blink/renderer/core/frame/local_frame.cc ++++ b/third_party/blink/renderer/core/frame/local_frame.cc +@@ -1175,10 +1175,8 @@ FrameResourceCoordinator* LocalFrame::GetFrameResourceCoordinator() { + } + + PluginData* LocalFrame::GetPluginData() const { +- if (!Loader().AllowPlugins(kNotAboutToInstantiatePlugin)) +- return nullptr; +- return GetPage()->GetPluginData( +- Tree().Top().GetSecurityContext()->GetSecurityOrigin()); ++ // what about no ++ return nullptr; + } + + DEFINE_WEAK_IDENTIFIER_MAP(LocalFrame); +-- +2.7.4 + diff --git a/patches/BRM051_AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch b/patches/BRM051_AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch new file mode 100644 index 00000000..24803ee1 --- /dev/null +++ b/patches/BRM051_AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch @@ -0,0 +1,57 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sun, 25 Mar 2018 21:49:37 +0200 +Subject: AudioBuffer, AnalyserNode: fingerprinting mitigations via IDL + +Return fixed base latency +--- + third_party/blink/renderer/modules/webaudio/analyser_node.idl | 8 ++++---- + third_party/blink/renderer/modules/webaudio/audio_buffer.idl | 4 ++-- + third_party/blink/renderer/modules/webaudio/audio_context.cc | 2 +- + 3 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/third_party/blink/renderer/modules/webaudio/analyser_node.idl b/third_party/blink/renderer/modules/webaudio/analyser_node.idl +--- a/third_party/blink/renderer/modules/webaudio/analyser_node.idl ++++ b/third_party/blink/renderer/modules/webaudio/analyser_node.idl +@@ -42,10 +42,10 @@ interface AnalyserNode : AudioNode { + + // Copies the current frequency data into the passed array. + // If the array has fewer elements than the frequencyBinCount, the excess elements will be dropped. +- void getFloatFrequencyData(Float32Array array); +- void getByteFrequencyData(Uint8Array array); ++ //void getFloatFrequencyData(Float32Array array); ++ //void getByteFrequencyData(Uint8Array array); + + // Real-time waveform data +- void getFloatTimeDomainData(Float32Array array); +- void getByteTimeDomainData(Uint8Array array); ++ //void getFloatTimeDomainData(Float32Array array); ++ //void getByteTimeDomainData(Uint8Array array); + }; +diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.idl b/third_party/blink/renderer/modules/webaudio/audio_buffer.idl +--- a/third_party/blink/renderer/modules/webaudio/audio_buffer.idl ++++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.idl +@@ -38,7 +38,7 @@ + + // Channel access + readonly attribute unsigned long numberOfChannels; +- [RaisesException] Float32Array getChannelData(unsigned long channelIndex); +- [RaisesException] void copyFromChannel(Float32Array destination, long channelNumber, optional unsigned long startInChannel = 0); ++ //[RaisesException] Float32Array getChannelData(unsigned long channelIndex); ++ //[RaisesException] void copyFromChannel(Float32Array destination, long channelNumber, optional unsigned long startInChannel = 0); + [RaisesException] void copyToChannel(Float32Array source, long channelNumber, optional unsigned long startInChannel = 0); + }; +diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc +--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc ++++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc +@@ -261,7 +261,7 @@ void AudioContext::StopRendering() { + } + + double AudioContext::baseLatency() const { +- return FramesPerBuffer() / static_cast(sampleRate()); ++ return 0.04; + } + + } // namespace blink +-- +2.7.4 + diff --git a/patches/BRM052_Add-fingerprinting-mitigation-for-getClientRects-getBoundingClientRect.patch b/patches/BRM052_Add-fingerprinting-mitigation-for-getClientRects-getBoundingClientRect.patch new file mode 100644 index 00000000..80ed1de2 --- /dev/null +++ b/patches/BRM052_Add-fingerprinting-mitigation-for-getClientRects-getBoundingClientRect.patch @@ -0,0 +1,130 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Fri, 30 Mar 2018 10:09:03 +0200 +Subject: Add fingerprinting mitigation for getClientRects, + getBoundingClientRect + +Scale the result of Range::getClientRects and Element::getBoundingClientRect +by a random +/-3% of the original value for each float in the Rect/Quad. +The random value is generated once for each Document and re-used for all the +attached elements. +The rationale is that such value, albeit constant within the rendered Document, +is within the same order of magniture of the floating point precision being +used for fingerprinting and sufficient to poison the well. + +See also: http://www.gsd.inesc-id.pt/~mpc/pubs/fingerprinting-trustcom2016.pdf +--- + third_party/blink/renderer/core/dom/document.cc | 14 ++++++++++++++ + third_party/blink/renderer/core/dom/document.h | 5 +++++ + third_party/blink/renderer/core/dom/element.cc | 7 +++++++ + third_party/blink/renderer/core/dom/range.cc | 8 +++++++- + 4 files changed, 33 insertions(+), 1 deletion(-) + +diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc +--- a/third_party/blink/renderer/core/dom/document.cc ++++ b/third_party/blink/renderer/core/dom/document.cc +@@ -279,6 +279,8 @@ + + #include "extensions/anti_amp_cure.h" + ++#include "base/rand_util.h" ++ + #ifndef NDEBUG + using WeakDocumentSet = + blink::PersistentHeapHashSet>; +@@ -740,6 +742,10 @@ Document::Document(const DocumentInit& initializer, + #ifndef NDEBUG + liveDocumentSet().insert(this); + #endif ++ ++ // add +/- 3% noise against fingerprinting ++ shuffleFactorX_ = 1 + (base::RandDouble() - 0.5) * 0.03; ++ shuffleFactorY_ = 1 + (base::RandDouble() - 0.5) * 0.03; + } + + Document::~Document() { +@@ -766,6 +772,14 @@ Range* Document::CreateRangeAdjustedToTreeScope(const TreeScope& tree_scope, + Position::BeforeNode(*shadow_host)); + } + ++double Document::GetShuffleFactorX() { ++ return shuffleFactorX_; ++} ++ ++double Document::GetShuffleFactorY() { ++ return shuffleFactorY_; ++} ++ + SelectorQueryCache& Document::GetSelectorQueryCache() { + if (!selector_query_cache_) + selector_query_cache_ = std::make_unique(); +diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h +--- a/third_party/blink/renderer/core/dom/document.h ++++ b/third_party/blink/renderer/core/dom/document.h +@@ -408,6 +408,9 @@ class CORE_EXPORT Document : public ContainerNode, + + String origin() const; + ++ double GetShuffleFactorX(); ++ double GetShuffleFactorY(); ++ + String visibilityState() const; + mojom::PageVisibilityState GetPageVisibilityState() const; + bool hidden() const; +@@ -1670,6 +1673,8 @@ class CORE_EXPORT Document : public ContainerNode, + + double start_time_; + ++ double shuffleFactorX_, shuffleFactorY_; ++ + TraceWrapperMember script_runner_; + + HeapVector> current_script_stack_; +diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc +--- a/third_party/blink/renderer/core/dom/element.cc ++++ b/third_party/blink/renderer/core/dom/element.cc +@@ -1348,6 +1348,11 @@ DOMRectList* Element::getClientRects() { + DCHECK(element_layout_object); + GetDocument().AdjustFloatQuadsForScrollAndAbsoluteZoom( + quads, *element_layout_object); ++ ++ for (FloatQuad& quad : quads) { ++ quad.Scale(GetDocument().GetShuffleFactorX(), GetDocument().GetShuffleFactorY()); ++ } ++ + return DOMRectList::Create(quads); + } + +@@ -1365,6 +1370,8 @@ DOMRect* Element::getBoundingClientRect() { + DCHECK(element_layout_object); + GetDocument().AdjustFloatRectForScrollAndAbsoluteZoom(result, + *element_layout_object); ++ result.Scale(GetDocument().GetShuffleFactorX(), GetDocument().GetShuffleFactorY()); ++ + return DOMRect::FromFloatRect(result); + } + +diff --git a/third_party/blink/renderer/core/dom/range.cc b/third_party/blink/renderer/core/dom/range.cc +--- a/third_party/blink/renderer/core/dom/range.cc ++++ b/third_party/blink/renderer/core/dom/range.cc +@@ -1575,11 +1575,17 @@ DOMRectList* Range::getClientRects() const { + Vector quads; + GetBorderAndTextQuads(quads); + ++ for (FloatQuad& quad : quads) { ++ quad.Scale(owner_document_->GetShuffleFactorX(), owner_document_->GetShuffleFactorY()); ++ } ++ + return DOMRectList::Create(quads); + } + + DOMRect* Range::getBoundingClientRect() const { +- return DOMRect::FromFloatRect(BoundingRect()); ++ auto rect = BoundingRect(); ++ rect.Scale(owner_document_->GetShuffleFactorX(), owner_document_->GetShuffleFactorY()); ++ return DOMRect::FromFloatRect(rect); + } + + // TODO(editing-dev): We should make +-- +2.7.4 + diff --git a/patches/BRM053_Canvas-fingerprinting-mitigations-for-image-data-font-metrics-and-webGL.patch b/patches/BRM053_Canvas-fingerprinting-mitigations-for-image-data-font-metrics-and-webGL.patch new file mode 100644 index 00000000..b604ff05 --- /dev/null +++ b/patches/BRM053_Canvas-fingerprinting-mitigations-for-image-data-font-metrics-and-webGL.patch @@ -0,0 +1,300 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sat, 24 Mar 2018 05:18:03 +0100 +Subject: Canvas: fingerprinting mitigations for image data, font metrics and + webGL + +Disable webGL renderering info, add shuffling to TextMetrics; +additionally the color data returned by ToBlob and ToDataURL will +contain randomly manipulated pixels (maximum 6) that slightly +change the color R,G,B components without visibly altering the rendering. +--- + .../renderer/core/html/canvas/text_metrics.cc | 20 +++ + .../blink/renderer/core/html/canvas/text_metrics.h | 2 + + .../core/offscreencanvas/offscreen_canvas.cc | 1 + + .../canvas/canvas2d/base_rendering_context_2d.cc | 3 + + .../canvas/canvas2d/canvas_rendering_context_2d.cc | 6 +- + .../modules/webgl/webgl_debug_renderer_info.cc | 4 +- + .../platform/graphics/image_data_buffer.cc | 136 +++++++++++++++++++++ + .../renderer/platform/graphics/image_data_buffer.h | 2 + + 8 files changed, 171 insertions(+), 3 deletions(-) + +diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.cc b/third_party/blink/renderer/core/html/canvas/text_metrics.cc +--- a/third_party/blink/renderer/core/html/canvas/text_metrics.cc ++++ b/third_party/blink/renderer/core/html/canvas/text_metrics.cc +@@ -47,6 +47,26 @@ float TextMetrics::GetFontBaseline(const TextBaseline& text_baseline, + return 0; + } + ++void TextMetrics::Shuffle(const double amt) { ++ double adjusted = 1 + amt; ++ ++ // x-direction ++ width_ *= adjusted; ++ actual_bounding_box_left_ *= adjusted; ++ actual_bounding_box_right_ *= adjusted; ++ ++ // y-direction ++ font_bounding_box_ascent_ *= adjusted; ++ font_bounding_box_descent_ *= adjusted; ++ actual_bounding_box_ascent_ *= adjusted; ++ actual_bounding_box_descent_ *= adjusted; ++ em_height_ascent_ *= adjusted; ++ em_height_descent_ *= adjusted; ++ hanging_baseline_ *= adjusted; ++ alphabetic_baseline_ *= adjusted; ++ ideographic_baseline_ *= adjusted; ++} ++ + void TextMetrics::Update(const Font& font, + const TextDirection& direction, + const TextBaseline& baseline, +diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.h b/third_party/blink/renderer/core/html/canvas/text_metrics.h +--- a/third_party/blink/renderer/core/html/canvas/text_metrics.h ++++ b/third_party/blink/renderer/core/html/canvas/text_metrics.h +@@ -67,6 +67,8 @@ class CORE_EXPORT TextMetrics final : public ScriptWrappable { + + static float GetFontBaseline(const TextBaseline&, const FontMetrics&); + ++ void Shuffle(const double amt); ++ + private: + void Update(const Font&, + const TextDirection&, +diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc +--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc ++++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc +@@ -403,6 +403,7 @@ ScriptPromise OffscreenCanvas::convertToBlob(ScriptState* script_state, + CanvasAsyncBlobCreator* async_creator = CanvasAsyncBlobCreator::Create( + snapshot, encoding_mime_type, start_time, + ExecutionContext::From(script_state), resolver); ++ + async_creator->ScheduleAsyncBlobCreation(options.quality()); + return resolver->Promise(); + } else { +diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc +--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc ++++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc +@@ -1620,6 +1620,9 @@ ImageData* BaseRenderingContext2D::getImageData( + const CanvasColorParams& color_params = ColorParams(); + scoped_refptr snapshot = GetImage(kPreferNoAcceleration); + ++ //TODO: calculate some random value and use it to shuffle pixel data in 'snapshot' ++ // it should StaticBitmapImage somehow ++ + if (!StaticBitmapImage::ConvertToArrayBufferContents( + snapshot, contents, image_data_rect, color_params, IsAccelerated())) { + exception_state.ThrowRangeError("Out of memory at ImageData creation"); +diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc ++++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +@@ -773,8 +773,12 @@ TextMetrics* CanvasRenderingContext2D::measureText(const String& text) { + else + direction = ToTextDirection(GetState().GetDirection(), canvas()); + +- return TextMetrics::Create(font, direction, GetState().GetTextBaseline(), ++ TextMetrics* textMetrics = TextMetrics::Create(font, direction, GetState().GetTextBaseline(), + GetState().GetTextAlign(), text); ++ ++ textMetrics->Shuffle(canvas()->GetDocument().GetShuffleFactorX()); ++ ++ return textMetrics; + } + + void CanvasRenderingContext2D::DrawTextInternal( +diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc +--- a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc ++++ b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc +@@ -37,11 +37,11 @@ WebGLExtensionName WebGLDebugRendererInfo::GetName() const { + + WebGLDebugRendererInfo* WebGLDebugRendererInfo::Create( + WebGLRenderingContextBase* context) { +- return new WebGLDebugRendererInfo(context); ++ return nullptr; + } + + bool WebGLDebugRendererInfo::Supported(WebGLRenderingContextBase*) { +- return true; ++ return false; + } + + const char* WebGLDebugRendererInfo::ExtensionName() { +diff --git a/third_party/blink/renderer/platform/graphics/image_data_buffer.cc b/third_party/blink/renderer/platform/graphics/image_data_buffer.cc +--- a/third_party/blink/renderer/platform/graphics/image_data_buffer.cc ++++ b/third_party/blink/renderer/platform/graphics/image_data_buffer.cc +@@ -35,6 +35,7 @@ + #include + + #include "base/memory/ptr_util.h" ++#include "base/rand_util.h" + #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h" + #include "third_party/blink/renderer/platform/image-encoders/image_encoder.h" + #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" +@@ -44,6 +45,7 @@ + #include "third_party/blink/renderer/platform/wtf/vector.h" + #include "third_party/skia/include/core/SkSwizzle.h" + #include "third_party/skia/include/encode/SkJpegEncoder.h" ++#include "third_party/skia/src/core/SkColorData.h" + + namespace blink { + +@@ -116,11 +118,145 @@ const unsigned char* ImageDataBuffer::Pixels() const { + return static_cast(pixmap_.addr()); + } + ++void ImageDataBuffer::shuffleSubchannelColorData() const { ++ auto w = pixmap_.width(), h = pixmap_.height(); ++ // generate the first random number here ++ double shuffleX = base::RandDouble(); ++ ++ // cap maximum pixels to change ++ auto pixels = (w + h) / 128; ++ if (pixels > 10) { ++ pixels = 10; ++ } else if (pixels < 2) { ++ pixels = 2; ++ } ++ ++ // second random number (for y/height) ++ double shuffleY = base::RandDouble(); ++ ++ // calculate amounts to change per component ++ double shuffleR = shuffleX - 0.5, shuffleG = shuffleY - 0.5, shuffleB = (shuffleX + shuffleY)/2 - 0.5; ++ shuffleR *= 0.03; ++ shuffleG *= 0.03; ++ shuffleB *= 0.03; ++ ++ auto colorType = pixmap_.colorType(); ++ ++ // calculate random coordinates using bisection ++ auto currentW = w, currentH = h; ++ for(;pixels >= 0; pixels--) { ++ int x = currentW * shuffleX, y = currentH * shuffleY; ++ ++ // manipulate pixel data to slightly change the R, G, B components ++ switch (colorType) { ++ case kAlpha_8_SkColorType: ++ { ++ uint8_t *pixel = pixmap_.writable_addr8(x, y); ++ auto r = SkColorGetR(*pixel), g = SkColorGetG(*pixel), b = SkColorGetB(*pixel), a = SkColorGetA(*pixel); ++ r *= shuffleR; ++ g *= shuffleG; ++ b *= shuffleB; ++ // alpha is left unchanged ++ ++ *pixel = SkColorSetARGB(a, r, g, b); ++ } ++ break; ++ case kGray_8_SkColorType: ++ { ++ uint8_t *pixel = pixmap_.writable_addr8(x, y); ++ *pixel = *pixel * shuffleB; ++ } ++ break; ++ case kRGB_565_SkColorType: ++ { ++ uint16_t *pixel = pixmap_.writable_addr16(x, y); ++ unsigned r = SkPacked16ToR32(*pixel); ++ unsigned g = SkPacked16ToG32(*pixel); ++ unsigned b = SkPacked16ToB32(*pixel); ++ r *= shuffleR; ++ g *= shuffleG; ++ b *= shuffleB; ++ ++ unsigned r16 = (r & SK_R16_MASK) << SK_R16_SHIFT; ++ unsigned g16 = (g & SK_G16_MASK) << SK_G16_SHIFT; ++ unsigned b16 = (b & SK_B16_MASK) << SK_B16_SHIFT; ++ ++ *pixel = r16 | g16 | b16; ++ } ++ break; ++ case kARGB_4444_SkColorType: ++ { ++ uint16_t *pixel = pixmap_.writable_addr16(x, y); ++ auto a = SkGetPackedA4444(*pixel), r = SkGetPackedR4444(*pixel), g = SkGetPackedG4444(*pixel), b = SkGetPackedB4444(*pixel); ++ ++ r *= shuffleR; ++ g *= shuffleG; ++ b *= shuffleB; ++ // alpha is left unchanged ++ ++ unsigned a4 = (a & 0xF) << SK_A4444_SHIFT; ++ unsigned r4 = (r & 0xF) << SK_R4444_SHIFT; ++ unsigned g4 = (g & 0xF) << SK_G4444_SHIFT; ++ unsigned b4 = (b & 0xF) << SK_B4444_SHIFT; ++ ++ *pixel = r4 | b4 | g4 | a4; ++ } ++ break; ++ case kRGBA_8888_SkColorType: ++ { ++ uint32_t *pixel = pixmap_.writable_addr32(x, y); ++ auto a = SkGetPackedA32(*pixel), r = SkGetPackedR32(*pixel), g = SkGetPackedG32(*pixel), b = SkGetPackedB32(*pixel); ++ ++ r *= shuffleR; ++ g *= shuffleG; ++ b *= shuffleB; ++ // alpha is left unchanged ++ ++ *pixel = (a << SK_A32_SHIFT) | (r << SK_R32_SHIFT) | ++ (g << SK_G32_SHIFT) | (b << SK_B32_SHIFT); ++ } ++ break; ++ case kBGRA_8888_SkColorType: ++ { ++ uint32_t *pixel = pixmap_.writable_addr32(x, y); ++ auto a = SkGetPackedA32(*pixel), b = SkGetPackedR32(*pixel), g = SkGetPackedG32(*pixel), r = SkGetPackedB32(*pixel); ++ ++ r *= shuffleR; ++ g *= shuffleG; ++ b *= shuffleB; ++ // alpha is left unchanged ++ ++ *pixel = (a << SK_BGRA_A32_SHIFT) | (r << SK_BGRA_R32_SHIFT) | ++ (g << SK_BGRA_G32_SHIFT) | (b << SK_BGRA_B32_SHIFT); ++ } ++ break; ++ default: ++ // the remaining formats are not expected to be used in Chromium ++ return; ++ } ++ ++ // keep bisecting or reset current width/height as needed ++ if (x == 0) { ++ currentW = w; ++ } else { ++ currentW = x; ++ } ++ if (y == 0) { ++ currentH = h; ++ } else { ++ currentH = y; ++ } ++ } ++} ++ + bool ImageDataBuffer::EncodeImage(const String& mime_type, + const double& quality, + Vector* encoded_image) const { + DCHECK(is_valid_); + ++ // shuffle subchannel color data within the pixmap ++ shuffleSubchannelColorData(); ++ + if (mime_type == "image/jpeg") { + SkJpegEncoder::Options options; + options.fQuality = ImageEncoder::ComputeJpegQuality(quality); +diff --git a/third_party/blink/renderer/platform/graphics/image_data_buffer.h b/third_party/blink/renderer/platform/graphics/image_data_buffer.h +--- a/third_party/blink/renderer/platform/graphics/image_data_buffer.h ++++ b/third_party/blink/renderer/platform/graphics/image_data_buffer.h +@@ -65,6 +65,8 @@ class PLATFORM_EXPORT ImageDataBuffer { + + bool IsValid() { return is_valid_; } // Only used by Create() + ++ void shuffleSubchannelColorData() const; ++ + sk_sp retained_image_; + SkPixmap pixmap_; + bool is_valid_ = false; +-- +2.7.4 + diff --git a/patches/BRM054_Punt-the-Widevine-version-string.patch b/patches/BRM054_Punt-the-Widevine-version-string.patch new file mode 100644 index 00000000..4d01f500 --- /dev/null +++ b/patches/BRM054_Punt-the-Widevine-version-string.patch @@ -0,0 +1,24 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Mon, 2 Apr 2018 11:36:02 +0200 +Subject: Punt the Widevine version string + +Originally from http://bazaar.launchpad.net/~saiarcot895/chromium-browser/chromium-browser.wily.beta/view/head:/debian/patches/fix_building_widevinecdm_with_chromium.patch +--- + chrome/common/chrome_content_client.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc +--- a/chrome/common/chrome_content_client.cc ++++ b/chrome/common/chrome_content_client.cc +@@ -526,7 +526,7 @@ void ChromeContentClient::AddContentDecryptionModules( + bool supports_persistent_license = false; + if (IsWidevineAvailable(&cdm_path, &video_codecs_supported, + &supports_persistent_license)) { +- const base::Version version(WIDEVINE_CDM_VERSION_STRING); ++ const base::Version version("1.0.123.456"); + DCHECK(version.IsValid()); + + cdms->push_back(content::CdmInfo( +-- +2.7.4 + diff --git a/patches/BRM055_Add-menu-option-to-toggle-global-Javascript-preference.patch b/patches/BRM055_Add-menu-option-to-toggle-global-Javascript-preference.patch new file mode 100644 index 00000000..6006911a --- /dev/null +++ b/patches/BRM055_Add-menu-option-to-toggle-global-Javascript-preference.patch @@ -0,0 +1,183 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 18 Oct 2017 21:26:53 +0200 +Subject: Add menu option to toggle global Javascript preference + +--- + chrome/android/java/res/menu/custom_tabs_menu.xml | 13 ++++++++ + chrome/android/java/res/menu/main_menu.xml | 13 ++++++++ + .../chromium/chrome/browser/ChromeActivity.java | 8 +++++ + .../chrome/browser/ChromeTabbedActivity.java | 8 +++++ + .../browser/appmenu/AppMenuPropertiesDelegate.java | 37 ++++++++++++++++++++++ + .../CustomTabAppMenuPropertiesDelegate.java | 1 + + .../java/strings/android_chrome_strings.grd | 11 +++++++ + 7 files changed, 91 insertions(+) + +diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml +--- a/chrome/android/java/res/menu/custom_tabs_menu.xml ++++ b/chrome/android/java/res/menu/custom_tabs_menu.xml +@@ -49,6 +49,19 @@ + ++ ++ ++ ++ ++ ++ ++ ++ + +diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml +--- a/chrome/android/java/res/menu/main_menu.xml ++++ b/chrome/android/java/res/menu/main_menu.xml +@@ -59,6 +59,19 @@ + android:title="@string/menu_add_to_homescreen" /> + ++ ++ ++ ++ ++ ++ ++ ++ + + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +@@ -2054,6 +2054,14 @@ public abstract class ChromeActivity extends AsyncInitializationActivity + final boolean usingDesktopUserAgent = currentTab.getUseDesktopUserAgent(); + currentTab.setUseDesktopUserAgent(!usingDesktopUserAgent, reloadOnChange); + RecordUserAction.record("MobileMenuRequestDesktopSite"); ++ } else if (id == R.id.enable_javascript_id || id == R.id.enable_javascript_check_id) { ++ final boolean reloadOnChange = !currentTab.isNativePage(); ++ final boolean jsEnabled = PrefServiceBridge.getInstance().javaScriptEnabled(); ++ PrefServiceBridge.getInstance().setJavaScriptEnabled(!jsEnabled); ++ if (reloadOnChange) { ++ currentTab.reload(); ++ } ++ RecordUserAction.record("MobileMenuRequestEnableJavascript"); + } else if (id == R.id.reader_mode_prefs_id) { + DomDistillerUIUtils.openSettings(currentTab.getWebContents()); + } else { +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +@@ -1710,6 +1710,14 @@ public class ChromeTabbedActivity + NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_DOWNLOADS_MANAGER); + } + RecordUserAction.record("MobileMenuDownloadManager"); ++ } else if (id == R.id.enable_javascript_id || id == R.id.enable_javascript_check_id) { ++ final boolean reloadOnChange = !currentTab.isNativePage(); ++ final boolean jsEnabled = PrefServiceBridge.getInstance().javaScriptEnabled(); ++ PrefServiceBridge.getInstance().setJavaScriptEnabled(!jsEnabled); ++ if (reloadOnChange) { ++ currentTab.reload(); ++ } ++ RecordUserAction.record("MobileMenuRequestEnableJavascript"); + } else if (id == R.id.open_recently_closed_tab) { + TabModel currentModel = mTabModelSelectorImpl.getCurrentModel(); + if (!currentModel.isIncognito()) currentModel.openMostRecentlyClosedTab(); +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +@@ -214,6 +214,8 @@ public class AppMenuPropertiesDelegate { + + updateRequestDesktopSiteMenuItem(menu, currentTab, true /* can show */); + ++ updateEnableJavascriptMenuItem(menu, currentTab); ++ + // Only display reader mode settings menu option if the current page is in reader mode. + menu.findItem(R.id.reader_mode_prefs_id) + .setVisible(DomDistillerUrlUtils.isDistilledPage(currentTab.getUrl())); +@@ -469,4 +471,39 @@ public class AppMenuPropertiesDelegate { + + return chromeHomeMenuItemFlagEnabled && !sHideChromeHomeMenuItems; + } ++ ++ /** ++ * Updates the enable JavaScript item's state. ++ * ++ * @param menu {@link Menu} for enable javascript ++ * @param currentTab Current tab being displayed. ++ */ ++ protected void updateEnableJavascriptMenuItem( ++ Menu menu, Tab currentTab) { ++ MenuItem enableMenuRow = menu.findItem(R.id.enable_javascript_row_menu_id); ++ MenuItem enableMenuLabel = menu.findItem(R.id.enable_javascript_id); ++ MenuItem enableMenuCheck = menu.findItem(R.id.enable_javascript_check_id); ++ ++ // Hide enable javascript on all chrome:// pages except for the NTP. ++ String url = currentTab.getUrl(); ++ boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX) ++ || url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX); ++ // Also hide enable javascsript on Reader Mode. ++ boolean isDistilledPage = DomDistillerUrlUtils.isDistilledPage(url); ++ ++ boolean itemVisible = (!isChromeScheme || currentTab.isNativePage()) && !isDistilledPage; ++ enableMenuRow.setVisible(itemVisible); ++ if (!itemVisible) return; ++ ++ boolean jsEnabled = PrefServiceBridge.getInstance().javaScriptEnabled(); ++ ++ // Mark the checkbox if Javascript is activated on this tab. ++ enableMenuCheck.setChecked(jsEnabled); ++ ++ // This title doesn't seem to be displayed by Android, but it is used to set up ++ // accessibility text in {@link AppMenuAdapter#setupMenuButton}. ++ enableMenuLabel.setTitleCondensed(jsEnabled ++ ? mActivity.getString(R.string.menu_enable_javascript_on) ++ : mActivity.getString(R.string.menu_enable_javascript_off)); ++ } + } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +@@ -171,6 +171,7 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat + } + + updateRequestDesktopSiteMenuItem(menu, currentTab, requestDesktopSiteVisible); ++ updateEnableJavascriptMenuItem(menu, currentTab); + prepareAddToHomescreenMenuItem(menu, currentTab, addToHomeScreenVisible); + } + } +diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd +--- a/chrome/android/java/strings/android_chrome_strings.grd ++++ b/chrome/android/java/strings/android_chrome_strings.grd +@@ -2548,6 +2548,17 @@ Google may use your browsing activity, content on some sites you visit, and othe + + Find in page + ++ ++ ++ Enable JavaScript ++ ++ ++ Turn off JavaScript ++ ++ ++ Turn on JavaScript ++ ++ + + Desktop site + +-- +2.7.4 + diff --git a/patches/BRM056_Add-menu-option-to-toggle-global-Adblock-preference.patch b/patches/BRM056_Add-menu-option-to-toggle-global-Adblock-preference.patch new file mode 100644 index 00000000..150faa6e --- /dev/null +++ b/patches/BRM056_Add-menu-option-to-toggle-global-Adblock-preference.patch @@ -0,0 +1,259 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Thu, 26 Apr 2018 10:37:05 +0200 +Subject: Add menu option to toggle global Adblock preference + +Allow toggling Chromium's "ads enabled" content settings option together with Bromite adblock engine. +--- + chrome/android/java/res/menu/custom_tabs_menu.xml | 12 +++++++ + chrome/android/java/res/menu/main_menu.xml | 13 ++++++++ + .../chromium/chrome/browser/ChromeActivity.java | 8 +++++ + .../chrome/browser/ChromeTabbedActivity.java | 8 +++++ + .../browser/appmenu/AppMenuPropertiesDelegate.java | 38 ++++++++++++++++++++++ + .../CustomTabAppMenuPropertiesDelegate.java | 2 ++ + .../java/strings/android_chrome_strings.grd | 11 +++++++ + .../subresource_filter_content_settings_manager.cc | 3 ++ + net/url_request/adblock_intercept.cc | 2 ++ + net/url_request/adblock_intercept.h | 2 ++ + net/url_request/url_request.cc | 4 +++ + 11 files changed, 103 insertions(+) + +diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml +--- a/chrome/android/java/res/menu/custom_tabs_menu.xml ++++ b/chrome/android/java/res/menu/custom_tabs_menu.xml +@@ -74,6 +74,18 @@ + + + ++ ++ ++ ++ ++ ++ ++ + + + + ++ ++ ++ ++ ++ ++ ++ ++ + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +@@ -2064,6 +2064,14 @@ public abstract class ChromeActivity extends AsyncInitializationActivity + RecordUserAction.record("MobileMenuRequestEnableJavascript"); + } else if (id == R.id.reader_mode_prefs_id) { + DomDistillerUIUtils.openSettings(currentTab.getWebContents()); ++ } else if (id == R.id.enable_adblock_id || id == R.id.enable_adblock_check_id) { ++ final boolean reloadOnChange = !currentTab.isNativePage(); ++ final boolean adBlockEnabled = !PrefServiceBridge.getInstance().adsEnabled(); ++ PrefServiceBridge.getInstance().setAllowAdsEnabled(adBlockEnabled); ++ if (reloadOnChange) { ++ currentTab.reload(); ++ } ++ RecordUserAction.record("MobileMenuRequestEnableAdBlock"); + } else { + return false; + } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +@@ -1724,6 +1724,14 @@ public class ChromeTabbedActivity + RecordUserAction.record("MobileTabClosedUndoShortCut"); + } else if (id == R.id.enter_vr_id) { + VrShellDelegate.enterVrIfNecessary(); ++ } else if (id == R.id.enable_adblock_id || id == R.id.enable_adblock_check_id) { ++ final boolean reloadOnChange = !currentTab.isNativePage(); ++ final boolean adBlockEnabled = !PrefServiceBridge.getInstance().adsEnabled(); ++ PrefServiceBridge.getInstance().setAllowAdsEnabled(adBlockEnabled); ++ if (reloadOnChange) { ++ currentTab.reload(); ++ } ++ RecordUserAction.record("MobileMenuRequestEnableAdBlock"); + } else { + return super.onMenuOrKeyboardAction(id, fromMenu); + } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +@@ -212,6 +212,8 @@ public class AppMenuPropertiesDelegate { + && !TextUtils.isEmpty(url); + prepareAddToHomescreenMenuItem(menu, currentTab, canShowHomeScreenMenuItem); + ++ updateEnableAdBlockMenuItem(menu, currentTab); ++ + updateRequestDesktopSiteMenuItem(menu, currentTab, true /* can show */); + + updateEnableJavascriptMenuItem(menu, currentTab); +@@ -445,6 +447,42 @@ public class AppMenuPropertiesDelegate { + } + + /** ++ * Updates the enable AdBlock item's state. ++ * ++ * @param menu {@link Menu} for enable adblock ++ * @param currentTab Current tab being displayed. ++ */ ++ protected void updateEnableAdBlockMenuItem( ++ Menu menu, Tab currentTab) { ++ MenuItem enableMenuRow = menu.findItem(R.id.enable_adblock_row_menu_id); ++ MenuItem enableMenuLabel = menu.findItem(R.id.enable_adblock_id); ++ MenuItem enableMenuCheck = menu.findItem(R.id.enable_adblock_check_id); ++ ++ ++ // Hide enable adblock on all chrome:// pages except for the NTP. ++ String url = currentTab.getUrl(); ++ boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX) ++ || url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX); ++ // Also hide enable javascsript on Reader Mode. ++ boolean isDistilledPage = DomDistillerUrlUtils.isDistilledPage(url); ++ ++ boolean itemVisible = (!isChromeScheme || currentTab.isNativePage()) && !isDistilledPage; ++ enableMenuRow.setVisible(itemVisible); ++ if (!itemVisible) return; ++ ++ boolean adBlockEnabled = !PrefServiceBridge.getInstance().adsEnabled(); ++ ++ // Mark the checkbox if adblock is globally activate. ++ enableMenuCheck.setChecked(adBlockEnabled); ++ ++ // This title doesn't seem to be displayed by Android, but it is used to set up ++ // accessibility text in {@link AppMenuAdapter#setupMenuButton}. ++ enableMenuLabel.setTitleCondensed(adBlockEnabled ++ ? mActivity.getString(R.string.menu_enable_adblock_on) ++ : mActivity.getString(R.string.menu_enable_adblock_off)); ++ } ++ ++ /** + * @return Whether bookmarks, downloads, and history should be shown in the menu. + */ + public static boolean shouldShowNavMenuItems() { +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +@@ -170,6 +170,8 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat + } + } + ++ updateEnableAdBlockMenuItem(menu, currentTab); ++ + updateRequestDesktopSiteMenuItem(menu, currentTab, requestDesktopSiteVisible); + updateEnableJavascriptMenuItem(menu, currentTab); + prepareAddToHomescreenMenuItem(menu, currentTab, addToHomeScreenVisible); +diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd +--- a/chrome/android/java/strings/android_chrome_strings.grd ++++ b/chrome/android/java/strings/android_chrome_strings.grd +@@ -2568,6 +2568,17 @@ Google may use your browsing activity, content on some sites you visit, and othe + + Turn on Request desktop site + ++ ++ ++ Enable AdBlock ++ ++ ++ Turn off AdBlock ++ ++ ++ Turn on AdBlock ++ ++ + + Appearance + +diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc +--- a/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc ++++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_manager.cc +@@ -22,6 +22,7 @@ + #include "components/keyed_service/core/service_access_type.h" + #include "components/subresource_filter/core/browser/subresource_filter_features.h" + #include "url/gurl.h" ++#include "net/url_request/adblock_intercept.h" + + namespace { + +@@ -160,9 +161,11 @@ void SubresourceFilterContentSettingsManager::OnContentSettingChanged( + if (global_setting == CONTENT_SETTING_ALLOW) { + ChromeSubresourceFilterClient::LogAction( + kActionContentSettingsAllowedGlobal); ++ net::adblock_enabled = false; + } else if (global_setting == CONTENT_SETTING_BLOCK) { + ChromeSubresourceFilterClient::LogAction( + kActionContentSettingsBlockedGlobal); ++ net::adblock_enabled = true; + } else { + NOTREACHED(); + } +diff --git a/net/url_request/adblock_intercept.cc b/net/url_request/adblock_intercept.cc +--- a/net/url_request/adblock_intercept.cc ++++ b/net/url_request/adblock_intercept.cc +@@ -19,6 +19,8 @@ + + namespace net { + ++bool adblock_enabled = true; ++ + const char *LOG_TAG = "Bromite"; + + #ifdef ADB_TESTER +diff --git a/net/url_request/adblock_intercept.h b/net/url_request/adblock_intercept.h +--- a/net/url_request/adblock_intercept.h ++++ b/net/url_request/adblock_intercept.h +@@ -11,6 +11,8 @@ int adblock_rules_count(); + + int adblock_intercept(const GURL &url, const std::string &origin_host); + ++extern bool adblock_enabled; ++ + } // namespace net + + #endif // NET_URL_REQUEST_ADBLOCK_INTERCEPT_H_ +diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc +--- a/net/url_request/url_request.cc ++++ b/net/url_request/url_request.cc +@@ -590,6 +590,7 @@ URLRequest::URLRequest(const GURL& url, + DCHECK(base::ThreadTaskRunnerHandle::IsSet()); + + #if defined(OS_ANDROID) ++ if (net::adblock_enabled) { + std::string initiatorHost; + if (initiator_.has_value()) { + initiatorHost = initiator_.value().host(); +@@ -600,6 +601,9 @@ URLRequest::URLRequest(const GURL& url, + } else { + url_chain_ = { url }; + } ++ } else { ++ url_chain_ = { url }; ++ } + #endif + + context->url_requests()->insert(this); +-- +2.7.4 + diff --git a/patches/BRM057_Remove-google-account-access-permission-on-reboot.patch b/patches/BRM057_Remove-google-account-access-permission-on-reboot.patch new file mode 100644 index 00000000..4770636d --- /dev/null +++ b/patches/BRM057_Remove-google-account-access-permission-on-reboot.patch @@ -0,0 +1,45 @@ +From: SergeyZhukovsky +Date: Tue, 15 Aug 2017 15:33:16 -0400 +Subject: Remove google account access permission on reboot + +--- + chrome/android/BUILD.gn | 3 +-- + chrome/android/java/AndroidManifest.xml | 4 ++-- + 2 files changed, 3 insertions(+), 4 deletions(-) + +diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn +--- a/chrome/android/BUILD.gn ++++ b/chrome/android/BUILD.gn +@@ -784,8 +784,7 @@ jinja_template_resources("chrome_public_apk_template_resources") { + resources = [ + "java/res_template/xml/file_paths.xml", + "java/res_template/xml/launchershortcuts.xml", +- "java/res_template/xml/searchable.xml", +- "java/res_template/xml/syncadapter.xml", ++ "java/res_template/xml/searchable.xml" + ] + res_dir = "java/res_template" + variables = chrome_public_jinja_variables +diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml +--- a/chrome/android/java/AndroidManifest.xml ++++ b/chrome/android/java/AndroidManifest.xml +@@ -804,14 +804,14 @@ by a child template that "extends" this file. + + + +- + + + + +- ++ --> + + + +-- +2.7.4 + diff --git a/patches/BRM058_Disable-metrics-on-all-I-O-threads.patch b/patches/BRM058_Disable-metrics-on-all-I-O-threads.patch new file mode 100644 index 00000000..cb130d29 --- /dev/null +++ b/patches/BRM058_Disable-metrics-on-all-I-O-threads.patch @@ -0,0 +1,23 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 25 Apr 2018 10:23:51 +0200 +Subject: Disable metrics on all I/O threads + +--- + chrome/browser/profiles/profile_io_data.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc +--- a/chrome/browser/profiles/profile_io_data.cc ++++ b/chrome/browser/profiles/profile_io_data.cc +@@ -964,7 +964,7 @@ void ProfileIOData::InitializeMetricsEnabledStateOnUIThread() { + + bool ProfileIOData::GetMetricsEnabledStateOnIOThread() const { + DCHECK_CURRENTLY_ON(BrowserThread::IO); +- return enable_metrics_.GetValue(); ++ return false; + } + + chrome_browser_net::Predictor* ProfileIOData::GetPredictor() { +-- +2.7.4 + diff --git a/patches/BRM059_Add-a-flag-for-DNS-over-HTTPS.patch b/patches/BRM059_Add-a-flag-for-DNS-over-HTTPS.patch new file mode 100644 index 00000000..2c5b395a --- /dev/null +++ b/patches/BRM059_Add-a-flag-for-DNS-over-HTTPS.patch @@ -0,0 +1,137 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Sat, 28 Apr 2018 08:30:26 +0200 +Subject: Add a flag for DNS-over-HTTPS + +Specify explicit values for the DNS-over-HTTPS servers (Google experimental DNS). +See also: https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt +--- + chrome/browser/about_flags.cc | 6 ++++++ + chrome/browser/flag_descriptions.cc | 3 +++ + chrome/browser/flag_descriptions.h | 3 +++ + chrome/browser/io_thread.cc | 9 +++++---- + chrome/common/chrome_features.cc | 7 +++++++ + chrome/common/chrome_features.h | 4 ++++ + .../network_session_configurator/common/network_features.cc | 3 --- + .../network_session_configurator/common/network_features.h | 4 ---- + 8 files changed, 28 insertions(+), 11 deletions(-) + +diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc +--- a/chrome/browser/about_flags.cc ++++ b/chrome/browser/about_flags.cc +@@ -3544,6 +3544,12 @@ const FeatureEntry kFeatureEntries[] = { + FEATURE_VALUE_TYPE(features::kAsyncDns)}, + #endif // defined(OS_ANDROID) + ++#if defined(OS_ANDROID) ++ {"enable-dns-over-https", flag_descriptions::kDnsOverHttpsName, ++ flag_descriptions::kDnsOverHttpsDescription, kOsAndroid, ++ FEATURE_VALUE_TYPE(features::kDnsOverHttps)}, ++#endif // defined(OS_ANDROID) ++ + {"enable-overflow-icons-for-media-controls", + flag_descriptions::kOverflowIconsForMediaControlsName, + flag_descriptions::kOverflowIconsForMediaControlsDescription, kOsAll, +diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc +--- a/chrome/browser/flag_descriptions.cc ++++ b/chrome/browser/flag_descriptions.cc +@@ -1849,6 +1849,9 @@ const char kAndroidPaymentAppsDescription[] = + const char kAsyncDnsName[] = "Async DNS resolver"; + const char kAsyncDnsDescription[] = "Enables the built-in DNS resolver."; + ++const char kDnsOverHttpsName[] = "DNS over HTTPS"; ++const char kDnsOverHttpsDescription[] = "Enables DNS-over-HTTPS (experimental, non-IETF)."; ++ + const char kAutofillAccessoryViewName[] = + "Autofill suggestions as keyboard accessory view"; + const char kAutofillAccessoryViewDescription[] = +diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h +--- a/chrome/browser/flag_descriptions.h ++++ b/chrome/browser/flag_descriptions.h +@@ -1133,6 +1133,9 @@ extern const char kAndroidPaymentAppsDescription[]; + extern const char kAsyncDnsName[]; + extern const char kAsyncDnsDescription[]; + ++extern const char kDnsOverHttpsName[]; ++extern const char kDnsOverHttpsDescription[]; ++ + extern const char kAutofillAccessoryViewName[]; + extern const char kAutofillAccessoryViewDescription[]; + +diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc +--- a/chrome/browser/io_thread.cc ++++ b/chrome/browser/io_thread.cc +@@ -386,10 +386,11 @@ IOThread::IOThread( + if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) { + base::Value specs(base::Value::Type::LIST); + base::Value methods(base::Value::Type::LIST); +- base::Value spec(variations::GetVariationParamValueByFeature( +- features::kDnsOverHttps, "server")); +- base::Value method(variations::GetVariationParamValueByFeature( +- features::kDnsOverHttps, "method")); ++ ++ // use some hard-coded defaults ++ base::Value spec("https://dns.google.com/experimental"); ++ base::Value method("POST"); ++ + if (spec.GetString().size() > 0) { + specs.GetList().push_back(std::move(spec)); + methods.GetList().push_back(std::move(method)); +diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc +--- a/chrome/common/chrome_features.cc ++++ b/chrome/common/chrome_features.cc +@@ -79,6 +79,13 @@ const base::Feature kAsyncDns { + #endif + }; + ++// Enable DNS over HTTPS ++// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). ++const base::Feature kDnsOverHttps { ++ "dns-over-https", ++ base::FEATURE_DISABLED_BY_DEFAULT ++}; ++ + #if defined(OS_WIN) || defined(OS_MACOSX) + // Enables automatic tab discarding, when the system is in low memory state. + const base::Feature kAutomaticTabDiscarding{"AutomaticTabDiscarding", +diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h +--- a/chrome/common/chrome_features.h ++++ b/chrome/common/chrome_features.h +@@ -48,6 +48,10 @@ extern const base::Feature kAssetDownloadSuggestionsFeature; + + extern const base::Feature kAsyncDns; + ++// Enable DNS over HTTPS ++// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). ++extern const base::Feature kDnsOverHttps; ++ + #if defined(OS_WIN) || defined(OS_MACOSX) + extern const base::Feature kAutomaticTabDiscarding; + #endif // defined(OS_WIN) || defined(OS_MACOSX) +diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc +--- a/components/network_session_configurator/common/network_features.cc ++++ b/components/network_session_configurator/common/network_features.cc +@@ -9,7 +9,4 @@ namespace features { + const base::Feature kTokenBinding{"token-binding", + base::FEATURE_DISABLED_BY_DEFAULT}; + +-const base::Feature kDnsOverHttps{"dns-over-https", +- base::FEATURE_DISABLED_BY_DEFAULT}; +- + } // namespace features +diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h +--- a/components/network_session_configurator/common/network_features.h ++++ b/components/network_session_configurator/common/network_features.h +@@ -14,10 +14,6 @@ namespace features { + // (https://www.ietf.org/id/draft-ietf-tokbind-protocol-04.txt). + NETWORK_SESSION_CONFIGURATOR_EXPORT extern const base::Feature kTokenBinding; + +-// Enabled DNS over HTTPS +-// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). +-NETWORK_SESSION_CONFIGURATOR_EXPORT extern const base::Feature kDnsOverHttps; +- + } // namespace features + + #endif // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_ +-- +2.7.4 + diff --git a/patches/BRM060_Always-respect-async-dns-flag-regardless-of-SDK-version.patch b/patches/BRM060_Always-respect-async-dns-flag-regardless-of-SDK-version.patch new file mode 100644 index 00000000..01e56695 --- /dev/null +++ b/patches/BRM060_Always-respect-async-dns-flag-regardless-of-SDK-version.patch @@ -0,0 +1,46 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Tue, 5 Jun 2018 13:46:40 +0200 +Subject: Always respect async dns flag (regardless of SDK version) + +Do not read experiment value for cronet async DNS configuration +--- + chrome/browser/io_thread.cc | 10 +--------- + components/cronet/url_request_context_config.cc | 3 ++- + 2 files changed, 3 insertions(+), 10 deletions(-) + +diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc +--- a/chrome/browser/io_thread.cc ++++ b/chrome/browser/io_thread.cc +@@ -257,15 +257,7 @@ void UpdateMetricsUsagePrefsOnUIThread(const std::string& service_name, + // Check the AsyncDns field trial and return true if it should be enabled. On + // Android this includes checking the Android version in the field trial. + bool ShouldEnableAsyncDns() { +- bool feature_can_be_enabled = true; +-#if defined(OS_ANDROID) +- int min_sdk = +- base::GetFieldTrialParamByFeatureAsInt(features::kAsyncDns, "min_sdk", 0); +- if (base::android::BuildInfo::GetInstance()->sdk_int() < min_sdk) +- feature_can_be_enabled = false; +-#endif +- return feature_can_be_enabled && +- base::FeatureList::IsEnabled(features::kAsyncDns); ++ return base::FeatureList::IsEnabled(features::kAsyncDns); + } + + } // namespace +diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc +--- a/components/cronet/url_request_context_config.cc ++++ b/components/cronet/url_request_context_config.cc +@@ -398,7 +398,8 @@ void URLRequestContextConfig::ParseAndSetExperimentalOptions( + effective_experimental_options->Remove(it.key(), nullptr); + continue; + } +- async_dns_args->GetBoolean(kAsyncDnsEnable, &async_dns_enable); ++ bool ignored; ++ async_dns_args->GetBoolean(kAsyncDnsEnable, &ignored); + } else if (it.key() == kStaleDnsFieldTrialName) { + const base::DictionaryValue* stale_dns_args = nullptr; + if (!it.value().GetAsDictionary(&stale_dns_args)) { +-- +2.7.4 + diff --git a/patches/BRM061_Disable-custom-tab-activities-permanently.patch b/patches/BRM061_Disable-custom-tab-activities-permanently.patch new file mode 100644 index 00000000..dc905be4 --- /dev/null +++ b/patches/BRM061_Disable-custom-tab-activities-permanently.patch @@ -0,0 +1,28 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Wed, 2 May 2018 01:04:07 +0200 +Subject: Disable custom tab activities permanently + +--- + .../src/org/chromium/chrome/browser/LaunchIntentDispatcher.java | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +@@ -149,9 +149,10 @@ public class LaunchIntentDispatcher implements IntentHandler.IntentHandlerDelega + recordIntentMetrics(); + + mIsVrIntent = VrIntentUtils.isVrIntent(mIntent); +- boolean isCustomTabIntent = (!mIsVrIntent && isCustomTabIntent(mIntent)) +- || (mIsVrIntent && VrIntentUtils.isCustomTabVrIntent(mIntent)); +- mIsCustomTabIntent = isCustomTabIntent; ++ //boolean isCustomTabIntent = (!mIsVrIntent && isCustomTabIntent(mIntent)) ++ // || (mIsVrIntent && VrIntentUtils.isCustomTabVrIntent(mIntent)); ++ //mIsCustomTabIntent = isCustomTabIntent; ++ mIsCustomTabIntent = false; + } + + /** +-- +2.7.4 + diff --git a/patches/BRM062_Always-allow-partner-customisation.patch b/patches/BRM062_Always-allow-partner-customisation.patch new file mode 100644 index 00000000..82aa2781 --- /dev/null +++ b/patches/BRM062_Always-allow-partner-customisation.patch @@ -0,0 +1,37 @@ +From: samartnik +Date: Thu, 14 Dec 2017 16:19:50 +0200 +Subject: Always allow partner customisation + +--- + .../PartnerBrowserCustomizations.java | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java +@@ -243,14 +243,14 @@ public class PartnerBrowserCustomizations { + @Override + protected Void doInBackground(Void... params) { + try { +- boolean systemOrPreStable = +- (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 1 +- || !ChromeVersionInfo.isStableBuild(); +- if (!systemOrPreStable) { +- // Only allow partner customization if this browser is a system package, or +- // is in pre-stable channels. +- return null; +- } ++ //boolean systemOrPreStable = ++ // (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 1 ++ // || !ChromeVersionInfo.isStableBuild(); ++ //if (!systemOrPreStable) { ++ // // Only allow partner customization if this browser is a system package, or ++ // // is in pre-stable channels. ++ // return null; ++ //} + + if (isCancelled()) return null; + refreshIncognitoModeDisabled(); +-- +2.7.4 + diff --git a/patches/BRM063_DNS-over-HTTPS-allow-selection-between-Google-and-CloudFlare.patch b/patches/BRM063_DNS-over-HTTPS-allow-selection-between-Google-and-CloudFlare.patch new file mode 100644 index 00000000..da482871 --- /dev/null +++ b/patches/BRM063_DNS-over-HTTPS-allow-selection-between-Google-and-CloudFlare.patch @@ -0,0 +1,156 @@ +From: csagan5 <32685696+csagan5@users.noreply.github.com> +Date: Thu, 14 Jun 2018 18:45:31 +0200 +Subject: DNS-over-HTTPS: allow selection between Google and CloudFlare + +--- + chrome/browser/about_flags.cc | 8 +++++++- + chrome/browser/flag_descriptions.cc | 2 +- + chrome/browser/io_thread.cc | 9 ++++++--- + chrome/common/chrome_features.cc | 7 ------- + chrome/common/chrome_features.h | 4 ---- + .../network_session_configurator/common/network_features.cc | 4 ++++ + .../network_session_configurator/common/network_features.h | 5 +++++ + .../network_session_configurator/common/network_switch_list.h | 4 ++++ + 8 files changed, 27 insertions(+), 16 deletions(-) + +diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc +--- a/chrome/browser/about_flags.cc ++++ b/chrome/browser/about_flags.cc +@@ -395,6 +395,12 @@ const FeatureEntry::Choice kChromeHomeSwipeLogicChoices[] = { + switches::kChromeHomeSwipeLogicType, "velocity"}, + }; + ++const FeatureEntry::Choice kDnsOverHttpsChoices[] = { ++ {features::kDnsOverHttpsChoiceDefault, "", ""}, ++ {features::kDnsOverHttpsChoiceGoogle, switches::kDnsOverHttpsServer, "https://dns.google.com/experimental"}, ++ {features::kDnsOverHttpsChoiceCloudFlare, switches::kDnsOverHttpsServer, "https://1.1.1.1/dns-query"}, ++}; ++ + #endif // OS_ANDROID + + const FeatureEntry::Choice kNumRasterThreadsChoices[] = { +@@ -3547,7 +3553,7 @@ const FeatureEntry kFeatureEntries[] = { + #if defined(OS_ANDROID) + {"enable-dns-over-https", flag_descriptions::kDnsOverHttpsName, + flag_descriptions::kDnsOverHttpsDescription, kOsAndroid, +- FEATURE_VALUE_TYPE(features::kDnsOverHttps)}, ++ MULTI_VALUE_TYPE(kDnsOverHttpsChoices)}, + #endif // defined(OS_ANDROID) + + {"enable-overflow-icons-for-media-controls", +diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc +--- a/chrome/browser/flag_descriptions.cc ++++ b/chrome/browser/flag_descriptions.cc +@@ -1850,7 +1850,7 @@ const char kAsyncDnsName[] = "Async DNS resolver"; + const char kAsyncDnsDescription[] = "Enables the built-in DNS resolver."; + + const char kDnsOverHttpsName[] = "DNS over HTTPS"; +-const char kDnsOverHttpsDescription[] = "Enables DNS-over-HTTPS (experimental, non-IETF)."; ++const char kDnsOverHttpsDescription[] = "Enables DNS-over-HTTPS (experimental)."; + + const char kAutofillAccessoryViewName[] = + "Autofill suggestions as keyboard accessory view"; +diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc +--- a/chrome/browser/io_thread.cc ++++ b/chrome/browser/io_thread.cc +@@ -53,6 +53,7 @@ + #include "components/metrics/metrics_service.h" + #include "components/net_log/chrome_net_log.h" + #include "components/network_session_configurator/common/network_features.h" ++#include "components/network_session_configurator/common/network_switches.h" + #include "components/policy/core/common/policy_service.h" + #include "components/policy/policy_constants.h" + #include "components/prefs/pref_registry_simple.h" +@@ -375,12 +376,14 @@ IOThread::IOThread( + base::Unretained(this))); + dns_client_enabled_.MoveToThread(io_thread_proxy); + +- if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) { ++ std::string dnsOverHttpsServer = ++ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( ++ switches::kDnsOverHttpsServer); ++ if (!dnsOverHttpsServer.empty()) { + base::Value specs(base::Value::Type::LIST); + base::Value methods(base::Value::Type::LIST); + +- // use some hard-coded defaults +- base::Value spec("https://dns.google.com/experimental"); ++ base::Value spec(dnsOverHttpsServer); + base::Value method("POST"); + + if (spec.GetString().size() > 0) { +diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc +--- a/chrome/common/chrome_features.cc ++++ b/chrome/common/chrome_features.cc +@@ -79,13 +79,6 @@ const base::Feature kAsyncDns { + #endif + }; + +-// Enable DNS over HTTPS +-// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). +-const base::Feature kDnsOverHttps { +- "dns-over-https", +- base::FEATURE_DISABLED_BY_DEFAULT +-}; +- + #if defined(OS_WIN) || defined(OS_MACOSX) + // Enables automatic tab discarding, when the system is in low memory state. + const base::Feature kAutomaticTabDiscarding{"AutomaticTabDiscarding", +diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h +--- a/chrome/common/chrome_features.h ++++ b/chrome/common/chrome_features.h +@@ -48,10 +48,6 @@ extern const base::Feature kAssetDownloadSuggestionsFeature; + + extern const base::Feature kAsyncDns; + +-// Enable DNS over HTTPS +-// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). +-extern const base::Feature kDnsOverHttps; +- + #if defined(OS_WIN) || defined(OS_MACOSX) + extern const base::Feature kAutomaticTabDiscarding; + #endif // defined(OS_WIN) || defined(OS_MACOSX) +diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc +--- a/components/network_session_configurator/common/network_features.cc ++++ b/components/network_session_configurator/common/network_features.cc +@@ -9,4 +9,8 @@ namespace features { + const base::Feature kTokenBinding{"token-binding", + base::FEATURE_DISABLED_BY_DEFAULT}; + ++const char kDnsOverHttpsChoiceDefault[] = "Disabled", ++ kDnsOverHttpsChoiceGoogle[] = "Google", ++ kDnsOverHttpsChoiceCloudFlare[] = "CloudFlare"; ++ + } // namespace features +diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h +--- a/components/network_session_configurator/common/network_features.h ++++ b/components/network_session_configurator/common/network_features.h +@@ -14,6 +14,11 @@ namespace features { + // (https://www.ietf.org/id/draft-ietf-tokbind-protocol-04.txt). + NETWORK_SESSION_CONFIGURATOR_EXPORT extern const base::Feature kTokenBinding; + ++// DNS over HTTPS server endpoint choices ++// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). ++NETWORK_SESSION_CONFIGURATOR_EXPORT extern const char kDnsOverHttpsChoiceDefault[], ++ kDnsOverHttpsChoiceGoogle[], kDnsOverHttpsChoiceCloudFlare[]; ++ + } // namespace features + + #endif // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_ +diff --git a/components/network_session_configurator/common/network_switch_list.h b/components/network_session_configurator/common/network_switch_list.h +--- a/components/network_session_configurator/common/network_switch_list.h ++++ b/components/network_session_configurator/common/network_switch_list.h +@@ -35,6 +35,10 @@ NETWORK_SWITCH(kOriginToForceQuicOn, "origin-to-force-quic-on") + // the server. + NETWORK_SWITCH(kQuicConnectionOptions, "quic-connection-options") + ++// Specifies an IETF DNS-over-HTTPS server endpoint ++// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt). ++NETWORK_SWITCH(kDnsOverHttpsServer, "dns-over-https-server") ++ + // Specifies the maximum length for a QUIC packet. + NETWORK_SWITCH(kQuicMaxPacketLength, "quic-max-packet-length") + +-- +2.7.4 +