Bromite-AdBlockUpdaterService.patch 104 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488
  1. From: csagan5 <32685696+csagan5@users.noreply.github.com>
  2. Date: Sat, 14 Sep 2019 10:20:08 +0200
  3. Subject: Bromite AdBlockUpdaterService
  4. Add option to configure the ad blocker filters URL
  5. Disable look-alike, metrics, ablation and navigation throttles
  6. Do not use experiments to enable/disable presets
  7. Always enable ad filtering
  8. Download filters by checking Last-Modified header first
  9. Fix RestoreForeignSessionTab by recreating the tab (issue #681)
  10. ---
  11. chrome/android/chrome_java_resources.gni | 2 +
  12. chrome/android/chrome_java_sources.gni | 2 +
  13. .../java/res/layout/adblock_editor.xml | 67 ++++
  14. chrome/android/java/res/values/values.xml | 2 +
  15. .../java/res/xml/adblock_preferences.xml | 43 +++
  16. .../android/java/res/xml/main_preferences.xml | 5 +
  17. .../chrome/browser/app/ChromeActivity.java | 21 ++
  18. .../browser/settings/AdBlockEditor.java | 93 +++++
  19. .../browser/settings/AdBlockPreferences.java | 173 +++++++++
  20. .../chrome/browser/tabmodel/TabModelImpl.java | 2 +-
  21. chrome/app/generated_resources.grd | 43 +++
  22. chrome/browser/after_startup_task_utils.cc | 5 +
  23. chrome/browser/browser_process.h | 7 +
  24. chrome/browser/browser_process_impl.cc | 29 ++
  25. chrome/browser/browser_process_impl.h | 3 +
  26. chrome/browser/chrome_browser_main.cc | 2 +
  27. .../browser/chrome_content_browser_client.cc | 16 -
  28. chrome/browser/flags/BUILD.gn | 14 +-
  29. .../flags/android/adblock_updater_bridge.cc | 101 +++++
  30. .../flags/android/adblock_updater_bridge.h | 33 ++
  31. .../flags/android/cached_feature_flags.cc | 1 +
  32. .../flags/android/cached_feature_flags.h | 2 +
  33. .../browser/flags/AdblockUpdaterBridge.java | 105 ++++++
  34. chrome/browser/prefs/browser_prefs.cc | 1 +
  35. .../sessions/session_restore_android.cc | 4 +-
  36. .../strings/android_chrome_strings.grd | 14 +
  37. components/component_updater/BUILD.gn | 6 +
  38. .../adblock_updater_service.cc | 348 ++++++++++++++++++
  39. .../adblock_updater_service.h | 125 +++++++
  40. .../download_filters_task.cc | 237 ++++++++++++
  41. .../component_updater/download_filters_task.h | 131 +++++++
  42. ...ent_subresource_filter_throttle_manager.cc | 11 +
  43. .../content/browser/ruleset_publisher.h | 2 +
  44. .../content/browser/ruleset_publisher_impl.cc | 5 +
  45. .../content/browser/ruleset_publisher_impl.h | 2 +
  46. .../content/browser/ruleset_service.cc | 33 +-
  47. .../content/browser/ruleset_service.h | 11 +-
  48. .../content/browser/ruleset_version.h | 4 +
  49. .../browser/verified_ruleset_dealer.cc | 3 +
  50. .../browser/subresource_filter_features.cc | 113 +-----
  51. .../core/common/common_features.cc | 2 +-
  52. .../navigation_throttle_runner.cc | 5 -
  53. 42 files changed, 1687 insertions(+), 141 deletions(-)
  54. create mode 100644 chrome/android/java/res/layout/adblock_editor.xml
  55. create mode 100644 chrome/android/java/res/xml/adblock_preferences.xml
  56. create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
  57. create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
  58. create mode 100644 chrome/browser/flags/android/adblock_updater_bridge.cc
  59. create mode 100644 chrome/browser/flags/android/adblock_updater_bridge.h
  60. create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdblockUpdaterBridge.java
  61. create mode 100644 components/component_updater/adblock_updater_service.cc
  62. create mode 100644 components/component_updater/adblock_updater_service.h
  63. create mode 100644 components/component_updater/download_filters_task.cc
  64. create mode 100644 components/component_updater/download_filters_task.h
  65. diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
  66. --- a/chrome/android/chrome_java_resources.gni
  67. +++ b/chrome/android/chrome_java_resources.gni
  68. @@ -781,6 +781,7 @@ chrome_java_resources = [
  69. "java/res/layout/account_picker_new_account_row_legacy.xml",
  70. "java/res/layout/account_picker_row.xml",
  71. "java/res/layout/account_picker_row_legacy.xml",
  72. + "java/res/layout/adblock_editor.xml",
  73. "java/res/layout/add_languages_main.xml",
  74. "java/res/layout/add_to_homescreen_dialog.xml",
  75. "java/res/layout/add_to_menu_dialog.xml",
  76. @@ -1046,6 +1047,7 @@ chrome_java_resources = [
  77. "java/res/xml/about_chrome_preferences.xml",
  78. "java/res/xml/accessibility_preferences.xml",
  79. "java/res/xml/account_management_preferences.xml",
  80. + "java/res/xml/adblock_preferences.xml",
  81. "java/res/xml/autofill_assistant_preferences.xml",
  82. "java/res/xml/autofill_server_profile_preferences.xml",
  83. "java/res/xml/bookmark_widget_info.xml",
  84. diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
  85. --- a/chrome/android/chrome_java_sources.gni
  86. +++ b/chrome/android/chrome_java_sources.gni
  87. @@ -1300,6 +1300,8 @@ chrome_java_sources = [
  88. "java/src/org/chromium/chrome/browser/payments/ui/ShoppingCart.java",
  89. "java/src/org/chromium/chrome/browser/permissions/PermissionSettingsBridge.java",
  90. "java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java",
  91. + "java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java",
  92. + "java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java",
  93. "java/src/org/chromium/chrome/browser/policy/EnterpriseInfo.java",
  94. "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java",
  95. "java/src/org/chromium/chrome/browser/prerender/ChromePrerenderServiceImpl.java",
  96. diff --git a/chrome/android/java/res/layout/adblock_editor.xml b/chrome/android/java/res/layout/adblock_editor.xml
  97. new file mode 100644
  98. --- /dev/null
  99. +++ b/chrome/android/java/res/layout/adblock_editor.xml
  100. @@ -0,0 +1,67 @@
  101. +<?xml version="1.0" encoding="utf-8"?>
  102. +<!-- Copyright 2015 The Chromium Authors. All rights reserved.
  103. + Use of this source code is governed by a BSD-style license that can be
  104. + found in the LICENSE file. -->
  105. +
  106. +<FrameLayout
  107. + xmlns:android="http://schemas.android.com/apk/res/android"
  108. + xmlns:app="http://schemas.android.com/apk/res-auto"
  109. + xmlns:tools="http://schemas.android.com/tools"
  110. + android:layout_width="match_parent"
  111. + android:layout_height="match_parent" >
  112. +
  113. + <ScrollView
  114. + android:layout_width="match_parent"
  115. + android:layout_height="match_parent"
  116. + android:id="@+id/scroll_view"
  117. + android:fillViewport="true" >
  118. +
  119. + <LinearLayout
  120. + android:layout_width="match_parent"
  121. + android:layout_height="wrap_content"
  122. + android:orientation="vertical"
  123. + android:focusableInTouchMode="true" >
  124. +
  125. + <com.google.android.material.textfield.TextInputLayout
  126. + android:id="@+id/adblock_url"
  127. + android:paddingTop="16dp"
  128. + android:paddingStart="@dimen/pref_autofill_content_spacing"
  129. + android:paddingEnd="@dimen/pref_autofill_content_spacing"
  130. + android:layout_width="match_parent"
  131. + android:layout_height="wrap_content" >
  132. + <!-- TODO(crbug.com/900912): Fix and remove lint ignore -->
  133. + <EditText
  134. + tools:ignore="Autofill"
  135. + android:id="@+id/adblock_url_edit"
  136. + android:layout_width="match_parent"
  137. + android:layout_height="wrap_content"
  138. + android:inputType="textUri"
  139. + android:singleLine="true"
  140. + android:hint="@string/options_adblock_edit_label" />
  141. + </com.google.android.material.textfield.TextInputLayout>
  142. +
  143. + <Space style="@style/ButtonBarTopSpacer" />
  144. + <View style="@style/ButtonBarTopDivider" />
  145. +
  146. + <LinearLayout style="@style/ButtonBar" >
  147. + <org.chromium.ui.widget.ButtonCompat
  148. + android:id="@+id/adblock_reset"
  149. + style="@style/ButtonBarButton"
  150. + android:text="@string/reset" />
  151. +
  152. + <org.chromium.ui.widget.ButtonCompat
  153. + android:id="@+id/adblock_cancel"
  154. + style="@style/ButtonBarButton"
  155. + android:text="@string/cancel" />
  156. +
  157. + <org.chromium.ui.widget.ButtonCompat
  158. + android:id="@+id/adblock_save"
  159. + style="@style/ButtonBarButton"
  160. + android:text="@string/save" />
  161. + </LinearLayout>
  162. + </LinearLayout>
  163. + </ScrollView>
  164. +
  165. + <include layout="@layout/settings_action_bar_shadow"/>
  166. +
  167. +</FrameLayout>
  168. diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
  169. --- a/chrome/android/java/res/values/values.xml
  170. +++ b/chrome/android/java/res/values/values.xml
  171. @@ -32,6 +32,8 @@
  172. <integer name="reload_button_level_reload">0</integer>
  173. <integer name="reload_button_level_stop">1</integer>
  174. + <string name="adblock_help_url">https://www.bromite.org/custom-filters</string>
  175. +
  176. <string name="proxy_title">Proxy configuration</string>
  177. <string name="proxy_url">chrome://proxy</string>
  178. diff --git a/chrome/android/java/res/xml/adblock_preferences.xml b/chrome/android/java/res/xml/adblock_preferences.xml
  179. new file mode 100644
  180. --- /dev/null
  181. +++ b/chrome/android/java/res/xml/adblock_preferences.xml
  182. @@ -0,0 +1,43 @@
  183. +<?xml version="1.0" encoding="utf-8"?>
  184. +<!-- Copyright 2015 The Chromium Authors. All rights reserved.
  185. + Use of this source code is governed by a BSD-style license that can be
  186. + found in the LICENSE file. -->
  187. +
  188. +<PreferenceScreen
  189. + xmlns:android="http://schemas.android.com/apk/res/android"
  190. + xmlns:app="http://schemas.android.com/apk/res-auto">
  191. +
  192. + <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
  193. + android:key="adblock_switch"
  194. + android:summaryOn="@string/text_on"
  195. + android:summaryOff="@string/text_off" />
  196. +
  197. + <org.chromium.chrome.browser.about_settings.HyperlinkPreference
  198. + android:key="adblock_help"
  199. + android:title="@string/adblock_help"
  200. + app:url="@string/adblock_help_url" />
  201. +
  202. + <Preference
  203. + android:key="adblock_edit"
  204. + android:title="@string/options_adblock_edit_label"
  205. + android:fragment="org.chromium.chrome.browser.settings.AdBlockEditor" />
  206. +
  207. + <org.chromium.components.browser_ui.settings.SpinnerPreference
  208. + android:key="adblock_frequency_spinner"
  209. + android:persistent="false"
  210. + android:title="@string/options_adblock_frequency_title"
  211. + app:singleLine="true" />
  212. +
  213. + <org.chromium.components.browser_ui.settings.ButtonPreference
  214. + android:key="adblock_startcheck"
  215. + android:title="@string/options_adblock_startcheck_label"/>
  216. +
  217. + <org.chromium.components.browser_ui.settings.TextMessagePreference
  218. + android:key="adblock_current_index_version"
  219. + app:allowDividerBelow="false" />
  220. +
  221. + <org.chromium.components.browser_ui.settings.TextMessagePreference
  222. + android:key="adblock_current_status"
  223. + app:allowDividerBelow="false" />
  224. +
  225. +</PreferenceScreen>
  226. diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
  227. --- a/chrome/android/java/res/xml/main_preferences.xml
  228. +++ b/chrome/android/java/res/xml/main_preferences.xml
  229. @@ -64,6 +64,11 @@
  230. android:key="privacy"
  231. android:order="12"
  232. android:title="@string/prefs_privacy"/>
  233. + <Preference
  234. + android:fragment="org.chromium.chrome.browser.settings.AdBlockPreferences"
  235. + android:key="adblock"
  236. + android:order="13"
  237. + android:title="@string/prefs_adblock"/>
  238. <Preference
  239. android:fragment="org.chromium.chrome.browser.safety_check.SafetyCheckSettingsFragment"
  240. android:key="safety_check"
  241. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
  242. --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
  243. +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
  244. @@ -59,6 +59,10 @@ import org.chromium.chrome.browser.ChromeActivitySessionTracker;
  245. import org.chromium.chrome.browser.ChromeApplication;
  246. import org.chromium.chrome.browser.ChromeWindow;
  247. import org.chromium.chrome.browser.DeferredStartupHandler;
  248. +import org.chromium.chrome.browser.flags.CachedFeatureFlags;
  249. +import org.chromium.chrome.browser.flags.AdblockUpdaterBridge;
  250. +import org.chromium.chrome.browser.flags.AdblockError;
  251. +import org.chromium.chrome.browser.flags.AdblockEvent;
  252. import org.chromium.chrome.browser.IntentHandler;
  253. import org.chromium.chrome.browser.IntentHandler.IntentHandlerDelegate;
  254. import org.chromium.chrome.browser.IntentHandler.TabOpenType;
  255. @@ -106,6 +110,7 @@ import org.chromium.chrome.browser.gsa.ContextReporter;
  256. import org.chromium.chrome.browser.gsa.GSAAccountChangeListener;
  257. import org.chromium.chrome.browser.gsa.GSAState;
  258. import org.chromium.chrome.browser.history.HistoryManagerUtils;
  259. +import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
  260. import org.chromium.chrome.browser.init.AsyncInitializationActivity;
  261. import org.chromium.chrome.browser.init.ProcessInitializationHandler;
  262. import org.chromium.chrome.browser.init.StartupTabPreloader;
  263. @@ -133,6 +138,7 @@ import org.chromium.chrome.browser.printing.TabPrinter;
  264. import org.chromium.chrome.browser.profiles.Profile;
  265. import org.chromium.chrome.browser.settings.SettingsLauncher;
  266. import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
  267. +import org.chromium.chrome.browser.settings.AdBlockPreferences;
  268. import org.chromium.chrome.browser.share.ShareDelegate;
  269. import org.chromium.chrome.browser.share.ShareDelegateImpl;
  270. import org.chromium.chrome.browser.tab.AccessibilityVisibilityHandler;
  271. @@ -159,6 +165,7 @@ import org.chromium.chrome.browser.ui.TabObscuringHandler;
  272. import org.chromium.chrome.browser.ui.appmenu.AppMenuBlocker;
  273. import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate;
  274. import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
  275. +import org.chromium.chrome.browser.ui.messages.infobar.SimpleConfirmInfoBarBuilder;
  276. import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
  277. import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarManageable;
  278. import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManagerProvider;
  279. @@ -1018,6 +1025,20 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
  280. */
  281. @CallSuper
  282. protected void initDeferredStartupForActivity() {
  283. + DeferredStartupHandler.getInstance().addDeferredTask(() -> {
  284. + AdblockUpdaterBridge.AdBlockRegisterCallback(
  285. + (@AdblockEvent int result, @AdblockError int error) -> {
  286. + if (result == AdblockEvent.ADBLOCK_UPDATED || error == AdblockError.DOWNLOAD_ERROR) {
  287. + Tab tab = ChromeActivity.this.getActivityTabProvider().get();
  288. + if (tab == null) return;
  289. +
  290. + SimpleConfirmInfoBarBuilder.create(tab.getWebContents(),
  291. + InfoBarIdentifier.WINDOW_ERROR_INFOBAR_DELEGATE_ANDROID,
  292. + AdBlockPreferences.GetAdBlockMessage(result, error), true);
  293. + }
  294. + });
  295. + });
  296. +
  297. DeferredStartupHandler.getInstance().addDeferredTask(() -> {
  298. if (isActivityFinishingOrDestroyed()) return;
  299. UpdateInfoBarController.createInstance(ChromeActivity.this);
  300. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
  301. new file mode 100644
  302. --- /dev/null
  303. +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
  304. @@ -0,0 +1,93 @@
  305. +// Copyright 2015 The Chromium Authors. All rights reserved.
  306. +// Use of this source code is governed by a BSD-style license that can be
  307. +// found in the LICENSE file.
  308. +
  309. +package org.chromium.chrome.browser.settings;
  310. +
  311. +import android.os.Bundle;
  312. +import androidx.fragment.app.Fragment;
  313. +import android.text.Editable;
  314. +import android.text.TextWatcher;
  315. +import android.view.LayoutInflater;
  316. +import android.view.View;
  317. +import android.view.ViewGroup;
  318. +import android.widget.Button;
  319. +import android.widget.EditText;
  320. +
  321. +import org.chromium.components.browser_ui.settings.SettingsUtils;
  322. +import org.chromium.chrome.browser.flags.CachedFeatureFlags;
  323. +import org.chromium.chrome.browser.flags.AdblockUpdaterBridge;
  324. +import org.chromium.chrome.R;
  325. +import org.chromium.components.url_formatter.UrlFormatter;
  326. +
  327. +/**
  328. + * Provides the Java-UI for editing AdBlock preferences.
  329. + */
  330. +public class AdBlockEditor extends Fragment implements TextWatcher {
  331. + private EditText mAdBlockFiltersUrlEdit;
  332. + private Button mSaveButton;
  333. + private Button mResetButton;
  334. +
  335. + @Override
  336. + public View onCreateView(LayoutInflater inflater, ViewGroup container,
  337. + Bundle savedInstanceState) {
  338. + super.onCreate(savedInstanceState);
  339. + getActivity().setTitle(R.string.options_adblock_edit_title);
  340. +
  341. + View v = inflater.inflate(R.layout.adblock_editor, container, false);
  342. + View scrollView = v.findViewById(R.id.scroll_view);
  343. + scrollView.getViewTreeObserver().addOnScrollChangedListener(
  344. + SettingsUtils.getShowShadowOnScrollListener(v, v.findViewById(R.id.shadow)));
  345. + mAdBlockFiltersUrlEdit = (EditText) v.findViewById(R.id.adblock_url_edit);
  346. + mAdBlockFiltersUrlEdit.setText(AdblockUpdaterBridge.getAdBlockFiltersURL());
  347. + mAdBlockFiltersUrlEdit.addTextChangedListener(this);
  348. + mAdBlockFiltersUrlEdit.requestFocus();
  349. +
  350. + initializeSaveCancelResetButtons(v);
  351. + return v;
  352. + }
  353. +
  354. + @Override
  355. + public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  356. + }
  357. +
  358. + @Override
  359. + public void onTextChanged(CharSequence s, int start, int before, int count) {
  360. + mSaveButton.setEnabled(s.length() != 0);
  361. + mResetButton.setEnabled(true);
  362. + }
  363. +
  364. + @Override
  365. + public void afterTextChanged(Editable s) {
  366. + }
  367. +
  368. + private void initializeSaveCancelResetButtons(View v) {
  369. + mResetButton = (Button) v.findViewById(R.id.adblock_reset);
  370. + mResetButton.setOnClickListener(new View.OnClickListener() {
  371. + @Override
  372. + public void onClick(View v) {
  373. + mAdBlockFiltersUrlEdit.setText(AdblockUpdaterBridge.getAdBlockFiltersURL());
  374. + getActivity().finish();
  375. + }
  376. + });
  377. +
  378. + mSaveButton = (Button) v.findViewById(R.id.adblock_save);
  379. + mSaveButton.setEnabled(false);
  380. + mSaveButton.setOnClickListener(new View.OnClickListener() {
  381. + @Override
  382. + public void onClick(View v) {
  383. + AdblockUpdaterBridge.setAdBlockFiltersURL(
  384. + UrlFormatter.fixupUrl(mAdBlockFiltersUrlEdit.getText().toString()).getSpec());
  385. + getActivity().finish();
  386. + }
  387. + });
  388. +
  389. + Button button = (Button) v.findViewById(R.id.adblock_cancel);
  390. + button.setOnClickListener(new View.OnClickListener() {
  391. + @Override
  392. + public void onClick(View v) {
  393. + getActivity().finish();
  394. + }
  395. + });
  396. + }
  397. +}
  398. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
  399. new file mode 100644
  400. --- /dev/null
  401. +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
  402. @@ -0,0 +1,173 @@
  403. +// Copyright 2015 The Chromium Authors. All rights reserved.
  404. +// Use of this source code is governed by a BSD-style license that can be
  405. +// found in the LICENSE file.
  406. +
  407. +package org.chromium.chrome.browser.settings;
  408. +
  409. +import android.os.Bundle;
  410. +import android.content.Context;
  411. +import androidx.preference.Preference;
  412. +import androidx.preference.PreferenceFragmentCompat;
  413. +import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
  414. +
  415. +import org.chromium.base.Log;
  416. +import org.chromium.base.ContextUtils;
  417. +import org.chromium.components.embedder_support.browser_context.BrowserContextHandle;
  418. +import org.chromium.components.browser_ui.site_settings.SiteSettingsPreferenceFragment;
  419. +import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge;
  420. +import org.chromium.components.browser_ui.settings.TextMessagePreference;
  421. +import org.chromium.components.browser_ui.settings.ButtonPreference;
  422. +import org.chromium.components.content_settings.ContentSettingsType;
  423. +import org.chromium.components.browser_ui.settings.SettingsUtils;
  424. +import org.chromium.components.browser_ui.settings.SpinnerPreference;
  425. +import org.chromium.chrome.browser.flags.CachedFeatureFlags;
  426. +import org.chromium.chrome.browser.flags.AdblockUpdaterBridge;
  427. +import org.chromium.chrome.browser.flags.AdblockUpdaterBridge.AdblockCallback;
  428. +import org.chromium.chrome.browser.flags.AdblockError;
  429. +import org.chromium.chrome.browser.flags.AdblockEvent;
  430. +import androidx.annotation.VisibleForTesting;
  431. +import androidx.preference.Preference.OnPreferenceClickListener;
  432. +import org.chromium.chrome.R;
  433. +
  434. +import java.text.DateFormat;
  435. +import java.util.ArrayList;
  436. +import java.util.List;
  437. +
  438. +/**
  439. + * Fragment that allows the user to configure AdBlock related preferences.
  440. + */
  441. +public class AdBlockPreferences extends SiteSettingsPreferenceFragment
  442. + implements AdblockCallback {
  443. + @VisibleForTesting
  444. + private static final String PREF_ADBLOCK_SWITCH = "adblock_switch";
  445. + private static final String PREF_ADBLOCK_EDIT = "adblock_edit";
  446. + private static final String PREF_ADBLOCK_INDEX_VERSION = "adblock_current_index_version";
  447. + private static final String PREF_ADBLOCK_CHECK_NOW = "adblock_startcheck";
  448. + private static final String PREF_ADBLOCK_CURRENT_STATUS = "adblock_current_status";
  449. + private static final String PREF_ADBLOCK_FREQUENCY_SPINNER = "adblock_frequency_spinner";
  450. +
  451. + private Preference mAdBlockEdit;
  452. + private TextMessagePreference currentIndexVersion;
  453. +
  454. + @Override
  455. + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
  456. + getActivity().setTitle(R.string.options_adblock_title);
  457. + SettingsUtils.addPreferencesFromResource(this, R.xml.adblock_preferences);
  458. +
  459. + BrowserContextHandle browserContextHandle =
  460. + getSiteSettingsClient().getBrowserContextHandle();
  461. +
  462. + ChromeSwitchPreference mAdBlockSwitch =
  463. + (ChromeSwitchPreference) findPreference(PREF_ADBLOCK_SWITCH);
  464. + boolean isAdBlockEnabled = !WebsitePreferenceBridge.isCategoryEnabled(browserContextHandle, ContentSettingsType.ADS);
  465. + mAdBlockSwitch.setChecked(isAdBlockEnabled);
  466. + mAdBlockSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
  467. + WebsitePreferenceBridge.setCategoryEnabled(browserContextHandle, ContentSettingsType.ADS, !(boolean) newValue);
  468. + return true;
  469. + });
  470. +
  471. + SpinnerPreference spinner = (SpinnerPreference) findPreference(PREF_ADBLOCK_FREQUENCY_SPINNER);
  472. + TimeFrequencySpinnerOption[] spinnerOptions = getTimeFrequencySpinnerOptions();
  473. + int selectedTimeFrequency = AdblockUpdaterBridge.getAdBlockUpdateTimeFrequency();
  474. + int spinnerOptionIndex = -1;
  475. + for (int i = 0; i < spinnerOptions.length; ++i) {
  476. + if (spinnerOptions[i].getDays() == selectedTimeFrequency) {
  477. + spinnerOptionIndex = i;
  478. + break;
  479. + }
  480. + }
  481. + spinner.setOptions(spinnerOptions, spinnerOptionIndex);
  482. + spinner.setOnPreferenceChangeListener((preference, newValue) -> {
  483. + AdblockUpdaterBridge.setAdBlockUpdateTimeFrequency(
  484. + ((TimeFrequencySpinnerOption) newValue).getDays());
  485. + return true;
  486. + });
  487. +
  488. + currentIndexVersion = (TextMessagePreference) findPreference(PREF_ADBLOCK_INDEX_VERSION);
  489. + currentIndexVersion.setTitle(R.string.options_adblock_current_index_title);
  490. +
  491. + mAdBlockEdit = findPreference(PREF_ADBLOCK_EDIT);
  492. + updateCurrentAdBlockSettings();
  493. +
  494. + ButtonPreference startUpdateButton =
  495. + (ButtonPreference) findPreference(PREF_ADBLOCK_CHECK_NOW);
  496. + startUpdateButton.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  497. + @Override
  498. + public boolean onPreferenceClick(Preference preference) {
  499. + AdblockUpdaterBridge.AdBlockStartCheck(AdBlockPreferences.this);
  500. + return true;
  501. + }
  502. + });
  503. + }
  504. +
  505. + private void updateCurrentAdBlockSettings() {
  506. + mAdBlockEdit.setSummary(AdblockUpdaterBridge.getAdBlockFiltersURL());
  507. +
  508. + DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
  509. + currentIndexVersion.setSummary(
  510. + AdblockUpdaterBridge.getAdBlockMostRecentIndexedVersion() +
  511. + "\n" + getString(R.string.adblock_last_checked_text) +
  512. + " " + df.format(AdblockUpdaterBridge.getAdBlockLastUpdate()));
  513. + }
  514. +
  515. + public static String GetAdBlockMessage(@AdblockEvent int event, @AdblockError int error) {
  516. + Context applicationContext = ContextUtils.getApplicationContext();
  517. + String message = "";
  518. + if (error == AdblockError.NONE) {
  519. + if (event == AdblockEvent.ADBLOCK_CHECKING_FOR_UPDATES) message = applicationContext.getString(R.string.options_adblock_event_1);
  520. + else if (event == AdblockEvent.ADBLOCK_UPDATE_DOWNLOADING) message = applicationContext.getString(R.string.options_adblock_event_3);
  521. + else if (event == AdblockEvent.ADBLOCK_UPDATED) message = applicationContext.getString(R.string.options_adblock_event_4);
  522. + }
  523. + else if (error == AdblockError.UPDATE_NOT_NEEDED) message = applicationContext.getString(R.string.options_adblock_error_3);
  524. + else if (error == AdblockError.DOWNLOAD_ERROR) message = applicationContext.getString(R.string.options_adblock_error_4);
  525. + return message;
  526. + }
  527. +
  528. + public void onAdBlockUpdaterResult(@AdblockEvent int event, @AdblockError int error) {
  529. + String message = GetAdBlockMessage(event, error);
  530. + TextMessagePreference currentStatus = (TextMessagePreference) findPreference(PREF_ADBLOCK_CURRENT_STATUS);
  531. + currentStatus.setTitle(message);
  532. +
  533. + updateCurrentAdBlockSettings();
  534. + }
  535. +
  536. + @Override
  537. + public void onResume() {
  538. + super.onResume();
  539. + updateCurrentAdBlockSettings();
  540. + }
  541. +
  542. + private TimeFrequencySpinnerOption[] getTimeFrequencySpinnerOptions() {
  543. + List<TimeFrequencySpinnerOption> options = new ArrayList<>();
  544. + options.add(new TimeFrequencySpinnerOption(1,
  545. + getString(R.string.options_adblock_frequency_day)));
  546. + options.add(new TimeFrequencySpinnerOption(4,
  547. + getString(R.string.options_adblock_frequency_days)));
  548. + options.add(new TimeFrequencySpinnerOption(7,
  549. + getString(R.string.options_adblock_frequency_days)));
  550. + options.add(new TimeFrequencySpinnerOption(10,
  551. + getString(R.string.options_adblock_frequency_days)));
  552. + options.add(new TimeFrequencySpinnerOption(30,
  553. + getString(R.string.options_adblock_frequency_days)));
  554. + return options.toArray(new TimeFrequencySpinnerOption[0]);
  555. + }
  556. +
  557. + static class TimeFrequencySpinnerOption {
  558. + private int mDays;
  559. + private String mTitle;
  560. +
  561. + public TimeFrequencySpinnerOption(int days, String title) {
  562. + mDays = days;
  563. + mTitle = Integer.toString(days) + " " + title;
  564. + }
  565. +
  566. + public int getDays() {
  567. + return mDays;
  568. + }
  569. +
  570. + @Override
  571. + public String toString() {
  572. + return mTitle;
  573. + }
  574. + }
  575. +}
  576. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
  577. --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
  578. +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
  579. @@ -815,7 +815,7 @@ public class TabModelImpl extends TabModelJniBridge {
  580. Tab parent, Profile profile, WebContents webContents) {
  581. return getTabCreator(profile.isOffTheRecord())
  582. .createTabWithWebContents(
  583. - parent, webContents, TabLaunchType.FROM_LONGPRESS_BACKGROUND);
  584. + parent, webContents, TabLaunchType.FROM_LINK);
  585. }
  586. @Override
  587. diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
  588. --- a/chrome/app/generated_resources.grd
  589. +++ b/chrome/app/generated_resources.grd
  590. @@ -10242,6 +10242,49 @@ Please help our engineers fix this problem. Tell us what happened right before y
  591. Never show this again.
  592. </message>
  593. + <!-- Ad Blocking preferences -->
  594. + <if expr="is_android">
  595. + <message name="IDS_OPTIONS_ADBLOCK_TITLE" desc="The title of the Ad Blocking option on Android" formatter_data="android_java">
  596. + Ad Blocking
  597. + </message>
  598. + <message name="IDS_OPTIONS_ADBLOCK_SUMMARY" desc="The title of the Ad Blocking summary on Android" formatter_data="android_java">
  599. + Configure Ad Blocking and filters URL
  600. + </message>
  601. + <message name="IDS_OPTIONS_ADBLOCK_CURRENT_INDEX_TITLE" desc="The title of the Ad Blocking current index version on Android" formatter_data="android_java">
  602. + Current Indexed Filter Version
  603. + </message>
  604. + <message name="IDS_ADBLOCK_LAST_CHECKED_TEXT" desc="The title of the Ad Blocking last checked datetime" formatter_data="android_java">
  605. + Last Checked:
  606. + </message>
  607. + <message name="IDS_OPTIONS_ADBLOCK_FREQUENCY_TITLE" desc="The title of the Ad Blocking frequency to check update" formatter_data="android_java">
  608. + Check every
  609. + </message>
  610. + <message name="IDS_OPTIONS_ADBLOCK_FREQUENCY_DAY" desc="Ad Blocking frequency single day" formatter_data="android_java">
  611. + Day
  612. + </message>
  613. + <message name="IDS_OPTIONS_ADBLOCK_FREQUENCY_DAYS" desc="Ad Blocking frequency multiple day" formatter_data="android_java">
  614. + Days
  615. + </message>
  616. + <message name="IDS_OPTIONS_ADBLOCK_STARTCHECK_LABEL" desc="The title of the Ad Blocking button to check update" formatter_data="android_java">
  617. + Check Now
  618. + </message>
  619. + <message name="IDS_OPTIONS_ADBLOCK_EVENT_1" desc="The text for ADBLOCK_CHECKING_FOR_UPDATES" formatter_data="android_java">
  620. + Adblock filter: checking for update
  621. + </message>
  622. + <message name="IDS_OPTIONS_ADBLOCK_EVENT_3" desc="The text for ADBLOCK_UPDATE_DOWNLOADING" formatter_data="android_java">
  623. + Adblock filter: downloading update...
  624. + </message>
  625. + <message name="IDS_OPTIONS_ADBLOCK_EVENT_4" desc="The text for ADBLOCK_UPDATED" formatter_data="android_java">
  626. + Adblock filter: update successfully installed
  627. + </message>
  628. + <message name="IDS_OPTIONS_ADBLOCK_ERROR_3" desc="The text for UPDATE_NOT_NEEDED" formatter_data="android_java">
  629. + Adblock filter: update not needed
  630. + </message>
  631. + <message name="IDS_OPTIONS_ADBLOCK_ERROR_4" desc="The text for DOWNLOAD_ERROR" formatter_data="android_java">
  632. + Adblock filter: download error
  633. + </message>
  634. + </if>
  635. +
  636. <!-- Ad Blocking UI strings. -->
  637. <message name="IDS_BLOCKED_ADS_PROMPT_TOOLTIP" desc="Explanation that Chrome blocked ads on this site. To be shown as a tooltip on the Ads blocked desktop bubble">
  638. Ads blocked on this site
  639. diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc
  640. --- a/chrome/browser/after_startup_task_utils.cc
  641. +++ b/chrome/browser/after_startup_task_utils.cc
  642. @@ -36,6 +36,8 @@
  643. #include "ui/views/linux_ui/linux_ui.h"
  644. #endif
  645. +#include "chrome/browser/browser_process.h"
  646. +
  647. using content::BrowserThread;
  648. using content::WebContents;
  649. using content::WebContentsObserver;
  650. @@ -138,6 +140,9 @@ void SetBrowserStartupIsComplete() {
  651. g_after_startup_tasks.Get().clear();
  652. g_after_startup_tasks.Get().shrink_to_fit();
  653. + // initialize scheduled updates for the AdBlock updater
  654. + g_browser_process->adblock_updater()->Start();
  655. +
  656. #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
  657. // Make sure we complete the startup notification sequence, or launchers will
  658. // get confused by not receiving the expected message from the main process.
  659. diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
  660. --- a/chrome/browser/browser_process.h
  661. +++ b/chrome/browser/browser_process.h
  662. @@ -21,6 +21,7 @@
  663. #include "build/build_config.h"
  664. #include "chrome/common/buildflags.h"
  665. #include "media/media_buildflags.h"
  666. +#include "components/component_updater/adblock_updater_service.h"
  667. class BackgroundModeManager;
  668. class BrowserProcessPlatformPart;
  669. @@ -66,6 +67,10 @@ class ComponentUpdateService;
  670. class SupervisedUserWhitelistInstaller;
  671. }
  672. +namespace adblock_updater {
  673. +class AdBlockUpdaterService;
  674. +}
  675. +
  676. namespace extensions {
  677. class EventRouterForwarder;
  678. }
  679. @@ -244,6 +249,8 @@ class BrowserProcess {
  680. virtual component_updater::ComponentUpdateService* component_updater() = 0;
  681. + virtual adblock_updater::AdBlockUpdaterService* adblock_updater() = 0;
  682. +
  683. #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
  684. virtual component_updater::SupervisedUserWhitelistInstaller*
  685. supervised_user_whitelist_installer() = 0;
  686. diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
  687. --- a/chrome/browser/browser_process_impl.cc
  688. +++ b/chrome/browser/browser_process_impl.cc
  689. @@ -1047,6 +1047,35 @@ BrowserProcessImpl::component_updater() {
  690. return component_updater_.get();
  691. }
  692. +adblock_updater::AdBlockUpdaterService*
  693. +BrowserProcessImpl::adblock_updater() {
  694. + if (adblock_updater_)
  695. + return adblock_updater_.get();
  696. +
  697. + if (!BrowserThread::CurrentlyOn(BrowserThread::UI))
  698. + return nullptr;
  699. +
  700. + std::unique_ptr<component_updater::UpdateScheduler> scheduler;
  701. +#if defined(OS_ANDROID)
  702. + if (base::FeatureList::IsEnabled(
  703. + chrome::android::kBackgroundTaskComponentUpdate) &&
  704. + component_updater::BackgroundTaskUpdateScheduler::IsAvailable()) {
  705. + scheduler =
  706. + std::make_unique<component_updater::BackgroundTaskUpdateScheduler>();
  707. + }
  708. +#endif
  709. + if (!scheduler)
  710. + scheduler = std::make_unique<component_updater::TimerUpdateScheduler>();
  711. +
  712. + adblock_updater_ = std::make_unique<adblock_updater::AdBlockUpdaterService>(
  713. + g_browser_process->system_network_context_manager()->GetSharedURLLoaderFactory(),
  714. + std::move(scheduler),
  715. + g_browser_process->subresource_filter_ruleset_service(),
  716. + g_browser_process->local_state());
  717. +
  718. + return adblock_updater_.get();
  719. +}
  720. +
  721. #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
  722. component_updater::SupervisedUserWhitelistInstaller*
  723. BrowserProcessImpl::supervised_user_whitelist_installer() {
  724. diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
  725. --- a/chrome/browser/browser_process_impl.h
  726. +++ b/chrome/browser/browser_process_impl.h
  727. @@ -183,6 +183,7 @@ class BrowserProcessImpl : public BrowserProcess,
  728. #endif
  729. component_updater::ComponentUpdateService* component_updater() override;
  730. + adblock_updater::AdBlockUpdaterService* adblock_updater() override;
  731. #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
  732. component_updater::SupervisedUserWhitelistInstaller*
  733. supervised_user_whitelist_installer() override;
  734. @@ -367,6 +368,8 @@ class BrowserProcessImpl : public BrowserProcess,
  735. // but some users of component updater only install per-user.
  736. std::unique_ptr<component_updater::ComponentUpdateService> component_updater_;
  737. + std::unique_ptr<adblock_updater::AdBlockUpdaterService> adblock_updater_;
  738. +
  739. #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
  740. std::unique_ptr<component_updater::SupervisedUserWhitelistInstaller>
  741. supervised_user_whitelist_installer_;
  742. diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
  743. --- a/chrome/browser/chrome_browser_main.cc
  744. +++ b/chrome/browser/chrome_browser_main.cc
  745. @@ -1594,6 +1594,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
  746. if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) {
  747. component_updater::RegisterComponentsForUpdate(profile_->IsOffTheRecord(),
  748. profile_->GetPrefs());
  749. + // force initialisation
  750. + g_browser_process->adblock_updater();
  751. }
  752. variations::VariationsService* variations_service =
  753. diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
  754. --- a/chrome/browser/chrome_content_browser_client.cc
  755. +++ b/chrome/browser/chrome_content_browser_client.cc
  756. @@ -68,7 +68,6 @@
  757. #include "chrome/browser/hid/chrome_hid_delegate.h"
  758. #include "chrome/browser/interstitials/enterprise_util.h"
  759. #include "chrome/browser/lifetime/browser_shutdown.h"
  760. -#include "chrome/browser/lookalikes/lookalike_url_navigation_throttle.h"
  761. #include "chrome/browser/media/audio_service_util.h"
  762. #include "chrome/browser/media/router/media_router_feature.h"
  763. #include "chrome/browser/media/webrtc/audio_debug_recordings_handler.h"
  764. @@ -231,7 +230,6 @@
  765. #include "components/no_state_prefetch/common/prerender_types.mojom.h"
  766. #include "components/no_state_prefetch/common/prerender_url_loader_throttle.h"
  767. #include "components/no_state_prefetch/common/prerender_util.h"
  768. -#include "components/page_load_metrics/browser/metrics_navigation_throttle.h"
  769. #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
  770. #include "components/payments/content/payment_request_display_manager.h"
  771. #include "components/performance_manager/embedder/performance_manager_registry.h"
  772. @@ -3919,16 +3917,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
  773. content::NavigationHandle* handle) {
  774. std::vector<std::unique_ptr<content::NavigationThrottle>> throttles;
  775. - // MetricsNavigationThrottle requires that it runs before NavigationThrottles
  776. - // that may delay or cancel navigations, so only NavigationThrottles that
  777. - // don't delay or cancel navigations (e.g. throttles that are only observing
  778. - // callbacks without affecting navigation behavior) should be added before
  779. - // MetricsNavigationThrottle.
  780. - if (handle->IsInMainFrame()) {
  781. - throttles.push_back(
  782. - page_load_metrics::MetricsNavigationThrottle::Create(handle));
  783. - }
  784. -
  785. #if defined(OS_CHROMEOS)
  786. MaybeAddThrottle(
  787. chromeos::WebTimeLimitNavigationThrottle::MaybeCreateThrottleFor(handle),
  788. @@ -4037,10 +4025,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
  789. &throttles);
  790. #endif
  791. - MaybeAddThrottle(
  792. - LookalikeUrlNavigationThrottle::MaybeCreateNavigationThrottle(handle),
  793. - &throttles);
  794. -
  795. MaybeAddThrottle(PDFIFrameNavigationThrottle::MaybeCreateThrottleFor(handle),
  796. &throttles);
  797. diff --git a/chrome/browser/flags/BUILD.gn b/chrome/browser/flags/BUILD.gn
  798. --- a/chrome/browser/flags/BUILD.gn
  799. +++ b/chrome/browser/flags/BUILD.gn
  800. @@ -14,6 +14,7 @@ android_library("java") {
  801. "android/java/src/org/chromium/chrome/browser/flags/FeatureParamUtils.java",
  802. "android/java/src/org/chromium/chrome/browser/flags/IntCachedFieldTrialParameter.java",
  803. "android/java/src/org/chromium/chrome/browser/flags/StringCachedFieldTrialParameter.java",
  804. + "android/java/src/org/chromium/chrome/browser/flags/AdblockUpdaterBridge.java",
  805. ]
  806. deps = [
  807. "//base:base_java",
  808. @@ -21,7 +22,8 @@ android_library("java") {
  809. "//chrome/browser/preferences:java",
  810. "//third_party/android_deps:androidx_annotation_annotation_java",
  811. ]
  812. - srcjar_deps = [ ":chrome_android_java_switches_srcjar" ]
  813. + srcjar_deps = [ ":chrome_android_java_switches_srcjar",
  814. + ":adblock_enums_javagen" ]
  815. annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
  816. }
  817. @@ -29,6 +31,7 @@ generate_jni("jni_headers") {
  818. sources = [
  819. "android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java",
  820. "android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java",
  821. + "android/java/src/org/chromium/chrome/browser/flags/AdblockUpdaterBridge.java",
  822. ]
  823. }
  824. @@ -36,6 +39,8 @@ static_library("flags_android") {
  825. sources = [
  826. "android/cached_feature_flags.cc",
  827. "android/cached_feature_flags.h",
  828. + "android/adblock_updater_bridge.cc",
  829. + "android/adblock_updater_bridge.h",
  830. ]
  831. deps = [
  832. ":jni_headers",
  833. @@ -44,6 +49,13 @@ static_library("flags_android") {
  834. ]
  835. }
  836. +java_cpp_enum("adblock_enums_javagen") {
  837. + sources = [
  838. + "../../../components/component_updater/download_filters_task.h",
  839. + ]
  840. + visibility = [ ":*" ]
  841. +}
  842. +
  843. java_cpp_strings("chrome_android_java_switches_srcjar") {
  844. sources = [ "//chrome/common/chrome_switches.cc" ]
  845. template = "android/java_templates/ChromeSwitches.java.tmpl"
  846. diff --git a/chrome/browser/flags/android/adblock_updater_bridge.cc b/chrome/browser/flags/android/adblock_updater_bridge.cc
  847. new file mode 100644
  848. --- /dev/null
  849. +++ b/chrome/browser/flags/android/adblock_updater_bridge.cc
  850. @@ -0,0 +1,101 @@
  851. +/*
  852. + This file is part of Bromite.
  853. +
  854. + Bromite is free software: you can redistribute it and/or modify
  855. + it under the terms of the GNU General Public License as published by
  856. + the Free Software Foundation, either version 3 of the License, or
  857. + (at your option) any later version.
  858. +
  859. + Bromite is distributed in the hope that it will be useful,
  860. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  861. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  862. + GNU General Public License for more details.
  863. +
  864. + You should have received a copy of the GNU General Public License
  865. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  866. +*/
  867. +
  868. +#include "chrome/browser/flags/android/adblock_updater_bridge.h"
  869. +
  870. +#include "chrome/browser/flags/jni_headers/AdblockUpdaterBridge_jni.h"
  871. +
  872. +#include "base/android/jni_string.h"
  873. +#include "base/feature_list.h"
  874. +#include "chrome/browser/browser_process.h"
  875. +#include "content/public/common/content_features.h"
  876. +#include "content/public/common/network_service_util.h"
  877. +#include "components/component_updater/adblock_updater_service.h"
  878. +
  879. +using base::android::ConvertJavaStringToUTF8;
  880. +using base::android::ConvertUTF8ToJavaString;
  881. +using base::android::JavaParamRef;
  882. +using base::android::ScopedJavaLocalRef;
  883. +
  884. +namespace {
  885. +
  886. + class AdblockCallbackObserver :
  887. + public adblock_updater::Observer {
  888. + private:
  889. + void OnEvent(adblock_updater::AdblockEvent result, adblock_updater::AdblockError error) override {
  890. + Java_AdblockUpdaterBridge_onAdBlockUpdaterResult(
  891. + base::android::AttachCurrentThread(),
  892. + (int)result,
  893. + (int)error);
  894. + }
  895. +};
  896. +
  897. +AdblockCallbackObserver* g_adblock_updater_observer = NULL;
  898. +
  899. +}
  900. +
  901. +static ScopedJavaLocalRef<jstring> JNI_AdblockUpdaterBridge_GetAdBlockFiltersURL(JNIEnv* env) {
  902. + std::string url = g_browser_process->adblock_updater()->GetAdBlockFiltersURL();
  903. + return base::android::ConvertUTF8ToJavaString(env, url);
  904. +}
  905. +
  906. +static void JNI_AdblockUpdaterBridge_SetAdBlockFiltersURL(JNIEnv* env, const JavaParamRef<jstring>& url) {
  907. + std::string new_url = base::android::ConvertJavaStringToUTF8(env, url);
  908. + g_browser_process->adblock_updater()->SetAdBlockFiltersURL(new_url);
  909. +}
  910. +
  911. +static ScopedJavaLocalRef<jstring> JNI_AdblockUpdaterBridge_GetAdBlockMostRecentIndexedVersion(JNIEnv* env) {
  912. + std::string url = g_browser_process->adblock_updater()->GetMostRecentIndexedVersion();
  913. + return base::android::ConvertUTF8ToJavaString(env, url);
  914. +}
  915. +
  916. +static jint JNI_AdblockUpdaterBridge_GetAdBlockUpdateTimeFrequency(JNIEnv* env) {
  917. + int value = g_browser_process->adblock_updater()->GetAdBlockUpdateTimeFrequency();
  918. + return value;
  919. +}
  920. +
  921. +static void JNI_AdblockUpdaterBridge_SetAdBlockUpdateTimeFrequency(JNIEnv* env, jint days) {
  922. + g_browser_process->adblock_updater()->SetAdBlockUpdateTimeFrequency(days);
  923. +}
  924. +
  925. +static jlong JNI_AdblockUpdaterBridge_GetAdBlockLastOkUpdate(JNIEnv* env) {
  926. + long value = g_browser_process->adblock_updater()->GetLastOkUpdate();
  927. + return value;
  928. +}
  929. +
  930. +static jlong JNI_AdblockUpdaterBridge_GetAdBlockLastUpdate(JNIEnv* env) {
  931. + long value = g_browser_process->adblock_updater()->GetLastUpdate();
  932. + return value;
  933. +}
  934. +
  935. +static void JNI_AdblockUpdaterBridge_AdBlockStartCheckOnDemand(JNIEnv* env) {
  936. + adblock_updater::AdBlockUpdaterService* client = g_browser_process->adblock_updater();
  937. + if (client == nullptr) return;
  938. +
  939. + JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(env);
  940. + client->OnDemandUpdate(adblock_updater::Callback());
  941. +}
  942. +
  943. +static void JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(JNIEnv* env) {
  944. + adblock_updater::AdBlockUpdaterService* client = g_browser_process->adblock_updater();
  945. + if (client == nullptr) return;
  946. +
  947. + if (g_adblock_updater_observer == NULL) {
  948. + g_adblock_updater_observer = new AdblockCallbackObserver();
  949. + client->AddObserver(g_adblock_updater_observer);
  950. + }
  951. +}
  952. diff --git a/chrome/browser/flags/android/adblock_updater_bridge.h b/chrome/browser/flags/android/adblock_updater_bridge.h
  953. new file mode 100644
  954. --- /dev/null
  955. +++ b/chrome/browser/flags/android/adblock_updater_bridge.h
  956. @@ -0,0 +1,33 @@
  957. +/*
  958. + This file is part of Bromite.
  959. +
  960. + Bromite is free software: you can redistribute it and/or modify
  961. + it under the terms of the GNU General Public License as published by
  962. + the Free Software Foundation, either version 3 of the License, or
  963. + (at your option) any later version.
  964. +
  965. + Bromite is distributed in the hope that it will be useful,
  966. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  967. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  968. + GNU General Public License for more details.
  969. +
  970. + You should have received a copy of the GNU General Public License
  971. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  972. +*/
  973. +
  974. +#ifndef CHROME_BROWSER_FLAGS_ANDROID_ADBLOCK_UPDATER_BRIDGE_H_
  975. +#define CHROME_BROWSER_FLAGS_ANDROID_ADBLOCK_UPDATER_BRIDGE_H_
  976. +
  977. +#include <jni.h>
  978. +
  979. +#include <string>
  980. +
  981. +namespace chrome {
  982. +namespace android {
  983. +
  984. +void onAdBlockUpdaterResult(JNIEnv* env, int result);
  985. +
  986. +} // namespace android
  987. +} // namespace chrome
  988. +
  989. +#endif // CHROME_BROWSER_FLAGS_ANDROID_ADBLOCK_UPDATER_BRIDGE_H_
  990. diff --git a/chrome/browser/flags/android/cached_feature_flags.cc b/chrome/browser/flags/android/cached_feature_flags.cc
  991. --- a/chrome/browser/flags/android/cached_feature_flags.cc
  992. +++ b/chrome/browser/flags/android/cached_feature_flags.cc
  993. @@ -41,3 +41,4 @@ static jboolean JNI_CachedFeatureFlags_IsNetworkServiceWarmUpEnabled(
  994. return content::IsOutOfProcessNetworkService() &&
  995. base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess);
  996. }
  997. +
  998. diff --git a/chrome/browser/flags/android/cached_feature_flags.h b/chrome/browser/flags/android/cached_feature_flags.h
  999. --- a/chrome/browser/flags/android/cached_feature_flags.h
  1000. +++ b/chrome/browser/flags/android/cached_feature_flags.h
  1001. @@ -22,6 +22,8 @@ bool IsJavaDrivenFeatureEnabled(const base::Feature& feature);
  1002. // Returns an empty string if the group isn't specified.
  1003. std::string GetReachedCodeProfilerTrialGroup();
  1004. +void onAdBlockUpdaterResult(JNIEnv* env, int result);
  1005. +
  1006. } // namespace android
  1007. } // namespace chrome
  1008. diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdblockUpdaterBridge.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdblockUpdaterBridge.java
  1009. new file mode 100644
  1010. --- /dev/null
  1011. +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdblockUpdaterBridge.java
  1012. @@ -0,0 +1,105 @@
  1013. +/*
  1014. + This file is part of Bromite.
  1015. +
  1016. + Bromite is free software: you can redistribute it and/or modify
  1017. + it under the terms of the GNU General Public License as published by
  1018. + the Free Software Foundation, either version 3 of the License, or
  1019. + (at your option) any later version.
  1020. +
  1021. + Bromite is distributed in the hope that it will be useful,
  1022. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  1023. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1024. + GNU General Public License for more details.
  1025. +
  1026. + You should have received a copy of the GNU General Public License
  1027. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  1028. +*/
  1029. +
  1030. +package org.chromium.chrome.browser.flags;
  1031. +
  1032. +import org.chromium.base.FieldTrialList;
  1033. +import org.chromium.base.annotations.CalledByNative;
  1034. +import org.chromium.base.annotations.CheckDiscard;
  1035. +import org.chromium.base.annotations.NativeMethods;
  1036. +import org.chromium.base.library_loader.LibraryLoader;
  1037. +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
  1038. +import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
  1039. +import org.chromium.chrome.browser.flags.AdblockError;
  1040. +import org.chromium.chrome.browser.flags.AdblockEvent;
  1041. +
  1042. +import java.util.HashMap;
  1043. +import java.util.List;
  1044. +import java.util.Map;
  1045. +import java.util.Date;
  1046. +import java.lang.ref.WeakReference;
  1047. +
  1048. +public class AdblockUpdaterBridge {
  1049. + static WeakReference<AdblockCallback> observer;
  1050. +
  1051. + public interface AdblockCallback {
  1052. + void onAdBlockUpdaterResult(@AdblockEvent int result, @AdblockError int error);
  1053. + }
  1054. +
  1055. + public static void setAdBlockFiltersURL(String url) {
  1056. + AdblockUpdaterBridgeJni.get().setAdBlockFiltersURL(url);
  1057. + }
  1058. +
  1059. + public static String getAdBlockFiltersURL() {
  1060. + return AdblockUpdaterBridgeJni.get().getAdBlockFiltersURL();
  1061. + }
  1062. +
  1063. + public static int getAdBlockUpdateTimeFrequency() {
  1064. + return AdblockUpdaterBridgeJni.get().getAdBlockUpdateTimeFrequency();
  1065. + }
  1066. +
  1067. + public static void setAdBlockUpdateTimeFrequency(int number_of_days) {
  1068. + AdblockUpdaterBridgeJni.get().setAdBlockUpdateTimeFrequency(number_of_days);
  1069. + }
  1070. +
  1071. + public static String getAdBlockMostRecentIndexedVersion() {
  1072. + return AdblockUpdaterBridgeJni.get().getAdBlockMostRecentIndexedVersion();
  1073. + }
  1074. +
  1075. + public static Date getAdBlockLastOkUpdate() {
  1076. + long millis = AdblockUpdaterBridgeJni.get().getAdBlockLastOkUpdate();
  1077. + return new Date(millis);
  1078. + }
  1079. +
  1080. + public static Date getAdBlockLastUpdate() {
  1081. + long millis = AdblockUpdaterBridgeJni.get().getAdBlockLastUpdate();
  1082. + return new Date(millis);
  1083. + }
  1084. +
  1085. + public static void AdBlockStartCheck(AdblockCallback callback) {
  1086. + observer = new WeakReference<AdblockCallback>(callback);
  1087. + AdblockUpdaterBridgeJni.get().adBlockStartCheckOnDemand();
  1088. + }
  1089. +
  1090. + public static void AdBlockRegisterCallback(AdblockCallback callback) {
  1091. + observer = new WeakReference<AdblockCallback>(callback);
  1092. + AdblockUpdaterBridgeJni.get().adBlockRegisterCallback();
  1093. + }
  1094. +
  1095. + @CalledByNative
  1096. + private static void onAdBlockUpdaterResult(@AdblockEvent int result, @AdblockError int error) {
  1097. + if (observer != null) {
  1098. + AdblockCallback reference = observer.get();
  1099. + if (reference != null) {
  1100. + reference.onAdBlockUpdaterResult(result, error);
  1101. + }
  1102. + }
  1103. + }
  1104. +
  1105. + @NativeMethods
  1106. + interface Natives {
  1107. + void setAdBlockFiltersURL(String url);
  1108. + String getAdBlockFiltersURL();
  1109. + String getAdBlockMostRecentIndexedVersion();
  1110. + long getAdBlockLastUpdate();
  1111. + long getAdBlockLastOkUpdate();
  1112. + int getAdBlockUpdateTimeFrequency();
  1113. + void setAdBlockUpdateTimeFrequency(int number_of_days);
  1114. + void adBlockStartCheckOnDemand();
  1115. + void adBlockRegisterCallback();
  1116. + }
  1117. +}
  1118. diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
  1119. --- a/chrome/browser/prefs/browser_prefs.cc
  1120. +++ b/chrome/browser/prefs/browser_prefs.cc
  1121. @@ -615,6 +615,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
  1122. syncer::InvalidatorRegistrarWithMemory::RegisterPrefs(registry);
  1123. syncer::PerUserTopicSubscriptionManager::RegisterPrefs(registry);
  1124. SystemNetworkContextManager::RegisterPrefs(registry);
  1125. + adblock_updater::AdBlockUpdaterService::RegisterPrefs(registry);
  1126. update_client::RegisterPrefs(registry);
  1127. variations::VariationsService::RegisterPrefs(registry);
  1128. diff --git a/chrome/browser/sessions/session_restore_android.cc b/chrome/browser/sessions/session_restore_android.cc
  1129. --- a/chrome/browser/sessions/session_restore_android.cc
  1130. +++ b/chrome/browser/sessions/session_restore_android.cc
  1131. @@ -43,7 +43,9 @@ content::WebContents* SessionRestore::RestoreForeignSessionTab(
  1132. TabAndroid* current_tab = TabAndroid::FromWebContents(web_contents);
  1133. DCHECK(current_tab);
  1134. if (disposition == WindowOpenDisposition::CURRENT_TAB) {
  1135. - current_tab->SwapWebContents(std::move(new_web_contents), false, false);
  1136. + int active_tab_index = tab_model->GetActiveIndex();
  1137. + tab_model->CreateTab(current_tab, new_web_contents.release());
  1138. + tab_model->CloseTabAt(active_tab_index);
  1139. } else {
  1140. DCHECK(disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
  1141. disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB);
  1142. diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
  1143. --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
  1144. +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
  1145. @@ -214,6 +214,20 @@ CHAR-LIMIT guidelines:
  1146. Enter VR
  1147. </message>
  1148. + <!-- AdBlock settings -->
  1149. + <message name="IDS_PREFS_ADBLOCK" desc="Title of the AdBlock Settings screen. [CHAR-LIMIT=32]">
  1150. + AdBlock settings
  1151. + </message>
  1152. + <message name="IDS_OPTIONS_ADBLOCK_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that is used to fetch the ad blocker filters.">
  1153. + Edit filters URL
  1154. + </message>
  1155. + <message name="IDS_OPTIONS_ADBLOCK_EDIT_LABEL" desc="The label for the edit text field that allows the user to change the URL that is used to fetch the ad blocker filters.">
  1156. + Filters URL
  1157. + </message>
  1158. + <message name="IDS_ADBLOCK_HELP" desc="The title of the hyperlink that allows users to visit the web page with instructions for custom ad blocker filters.">
  1159. + Visit help page
  1160. + </message>
  1161. +
  1162. <!-- Notification channels -->
  1163. <message name="IDS_NOTIFICATION_CATEGORY_GROUP_GENERAL" desc='Subheading for "General" section of a list of notification categories. [CHAR-LIMIT=32]'>
  1164. General
  1165. diff --git a/components/component_updater/BUILD.gn b/components/component_updater/BUILD.gn
  1166. --- a/components/component_updater/BUILD.gn
  1167. +++ b/components/component_updater/BUILD.gn
  1168. @@ -10,6 +10,12 @@ static_library("component_updater") {
  1169. "component_updater_command_line_config_policy.h",
  1170. "component_updater_paths.cc",
  1171. "component_updater_paths.h",
  1172. +
  1173. + "adblock_updater_service.cc",
  1174. + "adblock_updater_service.h",
  1175. + "download_filters_task.cc",
  1176. + "download_filters_task.h",
  1177. +
  1178. "component_updater_service.cc",
  1179. "component_updater_service.h",
  1180. "component_updater_service_internal.h",
  1181. diff --git a/components/component_updater/adblock_updater_service.cc b/components/component_updater/adblock_updater_service.cc
  1182. new file mode 100644
  1183. --- /dev/null
  1184. +++ b/components/component_updater/adblock_updater_service.cc
  1185. @@ -0,0 +1,348 @@
  1186. +/*
  1187. + This file is part of Bromite.
  1188. +
  1189. + Bromite is free software: you can redistribute it and/or modify
  1190. + it under the terms of the GNU General Public License as published by
  1191. + the Free Software Foundation, either version 3 of the License, or
  1192. + (at your option) any later version.
  1193. +
  1194. + Bromite is distributed in the hope that it will be useful,
  1195. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  1196. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1197. + GNU General Public License for more details.
  1198. +
  1199. + You should have received a copy of the GNU General Public License
  1200. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  1201. +*/
  1202. +
  1203. +#include "components/component_updater/adblock_updater_service.h"
  1204. +
  1205. +#include <algorithm>
  1206. +#include <map>
  1207. +#include <string>
  1208. +#include <utility>
  1209. +#include <vector>
  1210. +
  1211. +#include "base/bind.h"
  1212. +#include "base/callback.h"
  1213. +#include "base/files/file_path.h"
  1214. +#include "base/files/file_util.h"
  1215. +#include "base/logging.h"
  1216. +#include "base/macros.h"
  1217. +#include "base/threading/thread_checker.h"
  1218. +#include "base/threading/thread_task_runner_handle.h"
  1219. +#include "base/time/time.h"
  1220. +#include "base/timer/timer.h"
  1221. +#include "url/gurl.h"
  1222. +#include "base/strings/safe_sprintf.h"
  1223. +#include "base/strings/string_number_conversions.h"
  1224. +#include "base/strings/string_split.h"
  1225. +#include "components/prefs/pref_service.h"
  1226. +#include "components/prefs/pref_registry_simple.h"
  1227. +#include "chrome/common/pref_names.h"
  1228. +
  1229. +namespace adblock_updater {
  1230. +
  1231. +// Holds the URL to an indexed subresource filters file.
  1232. +const char kAdBlockFiltersURL[] = "adblock.filters_url";
  1233. +
  1234. +// Holds the URL to an indexed subresource filters file.
  1235. +const char kAdBlockFiltersCheckFrequency[] = "adblock.check_frequency";
  1236. +
  1237. +// Last check time
  1238. +const char kAdBlockLastCheckTime[] = "adblock.last_check_time";
  1239. +
  1240. +// Last check time (only with ok)
  1241. +const char kAdBlockLastCheckTimeOk[] = "adblock.last_check_time_ok";
  1242. +
  1243. +// all constants express seconds
  1244. +// these could be made configurable
  1245. +const int initial_check_delay = 5,
  1246. + on_demand_check_delay = 60; // minimum 1 minute between each on-demand check
  1247. +
  1248. +AdBlockUpdaterService::AdBlockUpdaterService(
  1249. + scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
  1250. + std::unique_ptr<component_updater::UpdateScheduler> scheduler,
  1251. + subresource_filter::RulesetService* ruleset_service,
  1252. + PrefService* pref_service)
  1253. + : ruleset_service_(ruleset_service),
  1254. + shared_url_network_factory_(shared_url_network_factory),
  1255. + scheduler_(std::move(scheduler)) {
  1256. + DCHECK(ruleset_service);
  1257. + pref_service_ = pref_service;
  1258. + ruleset_service_->SetRulesetPublishedCallback(
  1259. + base::BindRepeating(&AdBlockUpdaterService::RulesetPublishedCallback,
  1260. + base::Unretained(this)));
  1261. +}
  1262. +
  1263. +AdBlockUpdaterService::~AdBlockUpdaterService() {
  1264. + DCHECK(thread_checker_.CalledOnValidThread());
  1265. +}
  1266. +
  1267. +void AdBlockUpdaterService::AddObserver(Observer* observer) {
  1268. + DCHECK(thread_checker_.CalledOnValidThread());
  1269. + observer_list_.AddObserver(observer);
  1270. +}
  1271. +
  1272. +void AdBlockUpdaterService::RemoveObserver(Observer* observer) {
  1273. + DCHECK(thread_checker_.CalledOnValidThread());
  1274. + observer_list_.RemoveObserver(observer);
  1275. +}
  1276. +
  1277. +void AdBlockUpdaterService::RulesetPublishedCallback() {
  1278. + NotifyObservers(AdblockEvent::ADBLOCK_UPDATED, AdblockError::NONE);
  1279. +}
  1280. +
  1281. +void AdBlockUpdaterService::NotifyObservers(AdblockEvent event, AdblockError error) {
  1282. + DCHECK(thread_checker_.CalledOnValidThread());
  1283. + for (auto& observer : observer_list_)
  1284. + observer.OnEvent(event, error);
  1285. +}
  1286. +
  1287. +void AdBlockUpdaterService::Start() {
  1288. + DCHECK(thread_checker_.CalledOnValidThread());
  1289. +
  1290. + // avoid multiple scheduling
  1291. + if (scheduled_)
  1292. + return;
  1293. + scheduled_ = true;
  1294. +
  1295. + StartWithDelay(initial_check_delay);
  1296. +}
  1297. +
  1298. +void AdBlockUpdaterService::StartWithDelay(int delay) {
  1299. + int days = GetAdBlockUpdateTimeFrequency();
  1300. + if (days <= 0) days = 7;
  1301. + next_check_delay_ = 60*60*24*days;
  1302. +
  1303. + if (delay == 0) delay = next_check_delay_;
  1304. +
  1305. + LOG(INFO) << "AdBlockUpdaterService: starting up. "
  1306. + << "First update attempt will take place in "
  1307. + << delay << " seconds. "
  1308. + << "Next update attempt will take place in "
  1309. + << next_check_delay_ << " seconds. ";
  1310. +
  1311. + scheduler_->Stop();
  1312. + scheduler_->Schedule(
  1313. + base::TimeDelta::FromSeconds(delay),
  1314. + base::TimeDelta::FromSeconds(next_check_delay_),
  1315. + base::Bind(&AdBlockUpdaterService::OnDemandScheduledUpdate,
  1316. + base::Unretained(this)), base::DoNothing());
  1317. +}
  1318. +
  1319. +void AdBlockUpdaterService::OnDemandScheduledUpdate(
  1320. + component_updater::UpdateScheduler::OnFinishedCallback on_finished) {
  1321. + Callback on_finished_callback = base::BindOnce(
  1322. + [](component_updater::UpdateScheduler::OnFinishedCallback on_finished,
  1323. + AdblockError error) { std::move(on_finished).Run(); },
  1324. + std::move(on_finished));
  1325. +
  1326. + OnDemandUpdateAsNeeded(false, std::move(on_finished_callback));
  1327. +}
  1328. +
  1329. +bool AdBlockUpdaterService::OnDemandUpdate(Callback on_finished) {
  1330. + return OnDemandUpdateAsNeeded(true, std::move(on_finished));
  1331. +}
  1332. +
  1333. +bool AdBlockUpdaterService::OnDemandUpdateAsNeeded(bool is_foreground, Callback on_finished) {
  1334. + DCHECK(thread_checker_.CalledOnValidThread());
  1335. +
  1336. + last_update_ = pref_service_->GetTime(kAdBlockLastCheckTime);
  1337. +
  1338. + auto version = ruleset_service_->GetMostRecentlyIndexedVersion();
  1339. + if (!version.content_version.empty()) {
  1340. + // Check if the request is too soon.
  1341. + if (!last_update_.is_null()) {
  1342. + int deltaCheck = is_foreground == false ? next_check_delay_ : on_demand_check_delay;
  1343. + base::TimeDelta delta = base::Time::Now() - last_update_;
  1344. + if (is_updating_ || (delta < base::TimeDelta::FromSeconds(deltaCheck))) {
  1345. + LOG(INFO) << "AdBlockUpdaterService: update delayed. Wait for "
  1346. + << (base::TimeDelta::FromSeconds(deltaCheck)-delta);
  1347. + return false;
  1348. + }
  1349. + }
  1350. + }
  1351. +
  1352. + OnDemandUpdateInternal(is_foreground, std::move(on_finished));
  1353. + return true;
  1354. +}
  1355. +
  1356. +void AdBlockUpdaterService::OnDemandUpdateInternal(bool is_foreground, Callback on_finished) {
  1357. + DCHECK(thread_checker_.CalledOnValidThread());
  1358. +
  1359. + if (is_updating_) {
  1360. + base::ThreadTaskRunnerHandle::Get()->PostTask(
  1361. + FROM_HERE, base::BindOnce(std::move(on_finished),
  1362. + AdblockError::UPDATE_IN_PROGRESS));
  1363. + return;
  1364. + }
  1365. + is_updating_ = true;
  1366. + last_update_ = base::Time::Now();
  1367. + pref_service_->SetTime(kAdBlockLastCheckTime, last_update_);
  1368. +
  1369. + base::Time::Exploded e = {0};
  1370. + base::Time t = base::Time();
  1371. + auto version = ruleset_service_->GetMostRecentlyIndexedVersion();
  1372. + LOG(INFO) << "AdBlockUpdaterService: MostRecentIndexedVersion = " << version.content_version;
  1373. + std::vector<std::string> tokens =
  1374. + base::SplitString(version.content_version, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
  1375. + int i = 0;
  1376. + bool failed = false;
  1377. + for (const std::string& token : tokens) {
  1378. + // parse as number
  1379. + int n = 0;
  1380. + if (!base::StringToInt(token, &n)) {
  1381. + failed = true;
  1382. + break;
  1383. + }
  1384. +
  1385. + switch (i++) {
  1386. + case 0:
  1387. + e.year = 2019 + n;
  1388. + break;
  1389. + case 1:
  1390. + e.month = n + 1;
  1391. + break;
  1392. + case 2:
  1393. + e.day_of_month = n + 1;
  1394. + break;
  1395. + case 3:
  1396. + e.second = n % 60;
  1397. + n -= e.second;
  1398. + n /= 60;
  1399. + e.minute = n % 60;
  1400. + e.hour = n / 60;
  1401. + break;
  1402. + default:
  1403. + failed = true;
  1404. + break;
  1405. + }
  1406. + }
  1407. +
  1408. + if (failed) {
  1409. + LOG(WARNING) << "AdBlockUpdaterService: failed to parse most recent version as x.y.z.w dot-separated integers";
  1410. + } else {
  1411. + if (!base::Time::FromUTCExploded(e, &t))
  1412. + LOG(WARNING) << "AdBlockUpdaterService: failed to convert version to time.";
  1413. + }
  1414. +
  1415. + NotifyObservers(AdblockEvent::ADBLOCK_CHECKING_FOR_UPDATES, AdblockError::NONE);
  1416. +
  1417. + std::string filters_url_ = pref_service_->GetString(kAdBlockFiltersURL);
  1418. + auto task = base::MakeRefCounted<DownloadFiltersTask>(
  1419. + shared_url_network_factory_,
  1420. + is_foreground, filters_url_,
  1421. + t,
  1422. + base::BindOnce(&AdBlockUpdaterService::OnUpdateComplete, base::Unretained(this),
  1423. + std::move(on_finished)));
  1424. +
  1425. + // run task now; task is responsible for clearing the is_updating status
  1426. + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
  1427. + base::BindOnce(&DownloadFiltersTask::Run, base::Unretained(task.get())));
  1428. + tasks_.insert(task);
  1429. +}
  1430. +
  1431. +void AdBlockUpdaterService::OnUpdateComplete(Callback on_finished,
  1432. + scoped_refptr<DownloadFiltersTask> task,
  1433. + AdblockError error) {
  1434. + DCHECK(thread_checker_.CalledOnValidThread());
  1435. +
  1436. + auto file_path = task->file_path();
  1437. + if (error == AdblockError::NONE) {
  1438. + subresource_filter::UnindexedRulesetInfo ruleset_info;
  1439. + ruleset_info.ruleset_path = file_path;
  1440. + ruleset_info.delete_ruleset_path = true;
  1441. + ruleset_info.content_version = "0.0.0.0";
  1442. + DCHECK(!ruleset_info.ruleset_path.empty());
  1443. +
  1444. + // convert time to version
  1445. + auto t = task->last_modified();
  1446. + bool ignore_version = t.is_null();
  1447. + if (!ignore_version) {
  1448. + base::Time::Exploded e;
  1449. + t.UTCExplode(&e);
  1450. +
  1451. + // convert time to version
  1452. + const int major = e.year - 2019,
  1453. + minor = e.month - 1,
  1454. + patch = e.day_of_month - 1,
  1455. + revision = (e.hour*60+e.minute)*60 + e.second;
  1456. + if (major < 0)
  1457. + LOG(WARNING) << "AdBlockUpdaterService: too old Last-Modified header, ignoring version check.";
  1458. + else {
  1459. + char version_buffer[32];
  1460. + base::strings::SafeSNPrintf(version_buffer, sizeof(version_buffer), "%d.%d.%d.%d",
  1461. + major, minor, patch, revision);
  1462. +
  1463. + ruleset_info.content_version = version_buffer;
  1464. +
  1465. + LOG(INFO) << "AdBlockUpdaterService: indexing filters with version " << ruleset_info.content_version;
  1466. + }
  1467. + } else
  1468. + LOG(WARNING) << "AdBlockUpdaterService: invalid Last-Modified header, ignoring version check.";
  1469. +
  1470. + ruleset_service_->IndexAndStoreAndPublishRulesetIfNeeded(ruleset_info, ignore_version);
  1471. +
  1472. + NotifyObservers(AdblockEvent::ADBLOCK_UPDATED, error);
  1473. + } else {
  1474. + NotifyObservers(AdblockEvent::ADBLOCK_NOT_UPDATED, error);
  1475. + }
  1476. +
  1477. + if (error == AdblockError::NONE || error == AdblockError::UPDATE_NOT_NEEDED) {
  1478. + pref_service_->SetTime(kAdBlockLastCheckTimeOk, base::Time::Now());
  1479. + }
  1480. +
  1481. + if (!on_finished.is_null()) {
  1482. + base::ThreadTaskRunnerHandle::Get()->PostTask(
  1483. + FROM_HERE, base::BindOnce(std::move(on_finished), error));
  1484. + }
  1485. +
  1486. + // mark as not updating
  1487. + is_updating_ = false;
  1488. + tasks_.erase(task);
  1489. +}
  1490. +
  1491. +std::string AdBlockUpdaterService::GetAdBlockFiltersURL() {
  1492. + return pref_service_->GetString(kAdBlockFiltersURL);
  1493. +}
  1494. +
  1495. +void AdBlockUpdaterService::SetAdBlockFiltersURL(const std::string url) {
  1496. + pref_service_->SetString(kAdBlockFiltersURL, url);
  1497. +}
  1498. +
  1499. +std::string AdBlockUpdaterService::GetMostRecentIndexedVersion() {
  1500. + auto version = ruleset_service_->GetMostRecentlyIndexedVersion();
  1501. + return version.content_version;
  1502. +}
  1503. +
  1504. +long AdBlockUpdaterService::GetLastUpdate() {
  1505. + return pref_service_->GetTime(kAdBlockLastCheckTime).ToJavaTime();
  1506. +}
  1507. +
  1508. +long AdBlockUpdaterService::GetLastOkUpdate() {
  1509. + base::Time lastOk = pref_service_->GetTime(kAdBlockLastCheckTimeOk);
  1510. + return lastOk.ToJavaTime();
  1511. +}
  1512. +
  1513. +int AdBlockUpdaterService::GetAdBlockUpdateTimeFrequency() {
  1514. + return pref_service_->GetInteger(kAdBlockFiltersCheckFrequency);
  1515. +}
  1516. +
  1517. +void AdBlockUpdaterService::SetAdBlockUpdateTimeFrequency(int days) {
  1518. + pref_service_->SetInteger(kAdBlockFiltersCheckFrequency, days);
  1519. + StartWithDelay(0);
  1520. +}
  1521. +
  1522. +// static
  1523. +void AdBlockUpdaterService::RegisterPrefs(PrefRegistrySimple* registry) {
  1524. + registry->RegisterStringPref(kAdBlockFiltersURL, std::string());
  1525. + registry->RegisterIntegerPref(kAdBlockFiltersCheckFrequency, 7);
  1526. + registry->RegisterTimePref(kAdBlockLastCheckTime, base::Time());
  1527. + registry->RegisterTimePref(kAdBlockLastCheckTimeOk, base::Time());
  1528. +
  1529. + registry->SetDefaultPrefValue(kAdBlockFiltersURL,
  1530. + base::Value("https://www.bromite.org/filters/filters.dat"));
  1531. +}
  1532. +
  1533. +} // namespace adblock_updater
  1534. diff --git a/components/component_updater/adblock_updater_service.h b/components/component_updater/adblock_updater_service.h
  1535. new file mode 100644
  1536. --- /dev/null
  1537. +++ b/components/component_updater/adblock_updater_service.h
  1538. @@ -0,0 +1,125 @@
  1539. +/*
  1540. + This file is part of Bromite.
  1541. +
  1542. + Bromite is free software: you can redistribute it and/or modify
  1543. + it under the terms of the GNU General Public License as published by
  1544. + the Free Software Foundation, either version 3 of the License, or
  1545. + (at your option) any later version.
  1546. +
  1547. + Bromite is distributed in the hope that it will be useful,
  1548. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  1549. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1550. + GNU General Public License for more details.
  1551. +
  1552. + You should have received a copy of the GNU General Public License
  1553. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  1554. +*/
  1555. +
  1556. +#ifndef COMPONENTS_ADBLOCK_UPDATER_SERVICE_H
  1557. +#define COMPONENTS_ADBLOCK_UPDATER_SERVICE_H
  1558. +
  1559. +#include <stdint.h>
  1560. +
  1561. +#include <memory>
  1562. +#include <string>
  1563. +#include <vector>
  1564. +
  1565. +#include "base/callback_forward.h"
  1566. +#include "base/gtest_prod_util.h"
  1567. +#include "base/memory/ref_counted.h"
  1568. +#include "base/version.h"
  1569. +#include "build/build_config.h"
  1570. +#include "components/component_updater/update_scheduler.h"
  1571. +#include "url/gurl.h"
  1572. +#include "components/component_updater/download_filters_task.h"
  1573. +#include "components/subresource_filter/content/browser/ruleset_service.h"
  1574. +#include "services/network/public/cpp/shared_url_loader_factory.h"
  1575. +#include "components/prefs/pref_service.h"
  1576. +#include "components/prefs/pref_registry_simple.h"
  1577. +
  1578. +namespace adblock_updater {
  1579. +
  1580. +// Called when a non-blocking call in this module completes.
  1581. +using Callback = base::OnceCallback<void(AdblockError error)>;
  1582. +
  1583. +class Observer {
  1584. + public:
  1585. + virtual ~Observer() {}
  1586. +
  1587. + // Called by the update service when a state change happens.
  1588. + virtual void OnEvent(AdblockEvent event, AdblockError error) = 0;
  1589. +};
  1590. +
  1591. +// The AdBlock update service is in charge of downloading and saving the
  1592. +// AdBlock filters.
  1593. +//
  1594. +// All methods are safe to call ONLY from the browser's main thread.
  1595. +class AdBlockUpdaterService {
  1596. + public:
  1597. + AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
  1598. + std::unique_ptr<component_updater::UpdateScheduler> scheduler,
  1599. + subresource_filter::RulesetService* ruleset_service,
  1600. + PrefService* pref_service);
  1601. + ~AdBlockUpdaterService();
  1602. +
  1603. + // Adds an observer for this class. An observer should not be added more
  1604. + // than once. The caller retains the ownership of the observer object.
  1605. + void AddObserver(Observer* observer);
  1606. +
  1607. + // Removes an observer. It is safe for an observer to be removed while
  1608. + // the observers are being notified.
  1609. + void RemoveObserver(Observer* observer);
  1610. +
  1611. + // Will schedule automatic updates, run in background.
  1612. + void Start();
  1613. +
  1614. + std::string GetAdBlockFiltersURL();
  1615. + void SetAdBlockFiltersURL(const std::string url);
  1616. + std::string GetMostRecentIndexedVersion();
  1617. +
  1618. + // return date/time (in millis) of last successfully request
  1619. + long GetLastOkUpdate();
  1620. +
  1621. + // return date/time (in millis) of last request
  1622. + long GetLastUpdate();
  1623. +
  1624. + // Get/Set check interval (in days)
  1625. + int GetAdBlockUpdateTimeFrequency();
  1626. + void SetAdBlockUpdateTimeFrequency(int days);
  1627. +
  1628. + // To be called for an user-triggered update.
  1629. + // Will not result in an actual update if the last update was too recently triggered.
  1630. + bool OnDemandUpdate(Callback on_finished);
  1631. +
  1632. + static void RegisterPrefs(PrefRegistrySimple* registry);
  1633. +
  1634. + private:
  1635. + void StartWithDelay(int delay);
  1636. +
  1637. + void NotifyObservers(AdblockEvent event, AdblockError error);
  1638. + void OnDemandScheduledUpdate(component_updater::UpdateScheduler::OnFinishedCallback on_finished);
  1639. + bool OnDemandUpdateAsNeeded(bool is_foreground, Callback on_finished);
  1640. + void OnDemandUpdateInternal(bool is_foreground, Callback on_finished);
  1641. + void OnUpdateComplete(Callback callback, scoped_refptr<DownloadFiltersTask> task, AdblockError error);
  1642. + void RulesetPublishedCallback();
  1643. +
  1644. + base::ObserverList<Observer>::Unchecked observer_list_;
  1645. + base::ThreadChecker thread_checker_;
  1646. + base::Time last_update_;
  1647. +
  1648. + subresource_filter::RulesetService* ruleset_service_;
  1649. +
  1650. + scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory_;
  1651. + std::unique_ptr<component_updater::UpdateScheduler> scheduler_;
  1652. +
  1653. + PrefService* pref_service_;
  1654. +
  1655. + bool is_updating_ = false;
  1656. + bool scheduled_ = false;
  1657. + int next_check_delay_;
  1658. + std::set<scoped_refptr<DownloadFiltersTask>> tasks_;
  1659. +};
  1660. +
  1661. +} // namespace adblock_updater
  1662. +
  1663. +#endif // COMPONENTS_ADBLOCK_UPDATER_SERVICE_H
  1664. diff --git a/components/component_updater/download_filters_task.cc b/components/component_updater/download_filters_task.cc
  1665. new file mode 100644
  1666. --- /dev/null
  1667. +++ b/components/component_updater/download_filters_task.cc
  1668. @@ -0,0 +1,237 @@
  1669. +/*
  1670. + This file is part of Bromite.
  1671. +
  1672. + Bromite is free software: you can redistribute it and/or modify
  1673. + it under the terms of the GNU General Public License as published by
  1674. + the Free Software Foundation, either version 3 of the License, or
  1675. + (at your option) any later version.
  1676. +
  1677. + Bromite is distributed in the hope that it will be useful,
  1678. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  1679. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1680. + GNU General Public License for more details.
  1681. +
  1682. + You should have received a copy of the GNU General Public License
  1683. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  1684. +*/
  1685. +#include "components/component_updater/download_filters_task.h"
  1686. +
  1687. +#include <utility>
  1688. +
  1689. +#include "base/files/file_util.h"
  1690. +#include "base/bind.h"
  1691. +#include "base/location.h"
  1692. +#include "base/threading/thread_task_runner_handle.h"
  1693. +#include "base/logging.h"
  1694. +#include "net/base/load_flags.h"
  1695. +#include "url/gurl.h"
  1696. +
  1697. +namespace adblock_updater {
  1698. +
  1699. +// maximum 10MB for the filters file
  1700. +const int kMaxBodySize = 1024 * 1024 * 10;
  1701. +
  1702. +const int kMaxRetriesOnNetworkChange = 3;
  1703. +
  1704. +const net::NetworkTrafficAnnotationTag traffic_annotation =
  1705. + net::DefineNetworkTrafficAnnotation("update_client", R"(
  1706. + semantics {
  1707. + sender: "Bromite AdBlock filters updater"
  1708. + description:
  1709. + "The AdBlock filters updater is responsible for updating the subresource filters."
  1710. + trigger: "Manual or automatic AdBlock filters updates."
  1711. + data:
  1712. + "Subresource filters rulesets, binary format"
  1713. + destination: WEBSITE
  1714. + }
  1715. + )");
  1716. +
  1717. +DownloadFiltersTask::DownloadFiltersTask(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
  1718. + bool is_foreground, const std::string& filters_url, base::Time min_last_modified,
  1719. + Callback callback)
  1720. + : shared_url_network_factory_(shared_url_network_factory),
  1721. + is_foreground_(is_foreground),
  1722. + complete_callback_(std::move(callback)) {
  1723. + DCHECK(!filters_url.empty());
  1724. + filters_url_ = GURL(filters_url);
  1725. + min_last_modified_ = min_last_modified;
  1726. +
  1727. + if (filters_url.empty()) {
  1728. + return;
  1729. + }
  1730. +}
  1731. +
  1732. +void DownloadFiltersTask::createSimpleURLLoader(bool headers_only) {
  1733. + // always reset response-related fields
  1734. + response_code_ = -1;
  1735. + final_url_ = GURL();
  1736. + download_start_time_ = base::TimeTicks();
  1737. +
  1738. + auto resource_request = std::make_unique<network::ResourceRequest>();
  1739. + resource_request->url = filters_url_;
  1740. + resource_request->load_flags = net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE | net::LOAD_DO_NOT_SAVE_COOKIES;
  1741. + resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
  1742. + if (headers_only)
  1743. + // will chain two requests - first one is to check last modified header alone
  1744. + resource_request->method = "HEAD";
  1745. + else
  1746. + resource_request->method = "GET";
  1747. +
  1748. + simple_url_loader_ = network::SimpleURLLoader::Create(
  1749. + std::move(resource_request), traffic_annotation);
  1750. + simple_url_loader_->SetRetryOptions(
  1751. + kMaxRetriesOnNetworkChange,
  1752. + network::SimpleURLLoader::RetryMode::RETRY_ON_NETWORK_CHANGE);
  1753. + simple_url_loader_->SetAllowPartialResults(false);
  1754. + simple_url_loader_->SetOnResponseStartedCallback(base::BindOnce(
  1755. + &DownloadFiltersTask::OnResponseStarted, base::Unretained(this)));
  1756. +}
  1757. +
  1758. +DownloadFiltersTask::~DownloadFiltersTask() {
  1759. + DCHECK(thread_checker_.CalledOnValidThread());
  1760. +}
  1761. +
  1762. +void DownloadFiltersTask::Run() {
  1763. + DCHECK(thread_checker_.CalledOnValidThread());
  1764. +
  1765. + createSimpleURLLoader(true);
  1766. +
  1767. + if (!simple_url_loader_) {
  1768. + TaskComplete(AdblockError::INVALID_ARGUMENT);
  1769. + return;
  1770. + }
  1771. +
  1772. + download_start_time_ = base::TimeTicks::Now();
  1773. + if (min_last_modified_.is_null()) {
  1774. + internalDownload();
  1775. + } else {
  1776. + simple_url_loader_->DownloadHeadersOnly(
  1777. + shared_url_network_factory_.get(),
  1778. + base::BindOnce(&DownloadFiltersTask::OnHeadersDownloadComplete, base::Unretained(this))
  1779. + );
  1780. + }
  1781. +}
  1782. +
  1783. +void DownloadFiltersTask::internalDownload() {
  1784. + LOG(INFO) << "DownloadFiltersTask: Start downloading";
  1785. +
  1786. + simple_url_loader_->DownloadToTempFile(
  1787. + shared_url_network_factory_.get(),
  1788. + base::BindOnce(&DownloadFiltersTask::OnDownloadComplete, base::Unretained(this)),
  1789. + kMaxBodySize);
  1790. +}
  1791. +
  1792. +void DownloadFiltersTask::OnHeadersDownloadComplete(scoped_refptr<net::HttpResponseHeaders> headers) {
  1793. + // something went wrong
  1794. + if (headers == nullptr) {
  1795. + OnDownloadComplete(base::FilePath());
  1796. + return;
  1797. + }
  1798. +
  1799. + int net_error = simple_url_loader_->NetError();
  1800. + simple_url_loader_.reset();
  1801. +
  1802. + if (net_error == 0) {
  1803. + // ignoring 'headers' as 'Last-Modified' has already been picked up by OnResponseStarted
  1804. + const base::TimeDelta dt =
  1805. + last_modified_ - min_last_modified_;
  1806. +
  1807. + if (dt.InSeconds() > 0) {
  1808. + // prepare for next simple URL loader and trigger download
  1809. + createSimpleURLLoader(false);
  1810. + internalDownload();
  1811. + return;
  1812. + }
  1813. +
  1814. + // the remote filters are not more recent than known ones
  1815. + LOG(INFO) << "DownloadFiltersTask: Update not needed";
  1816. + TaskComplete(AdblockError::UPDATE_NOT_NEEDED);
  1817. + } else {
  1818. + TaskComplete(AdblockError::DOWNLOAD_ERROR);
  1819. + }
  1820. +}
  1821. +
  1822. +void DownloadFiltersTask::OnResponseStarted(
  1823. + const GURL& final_url,
  1824. + const network::mojom::URLResponseHead& response_head) {
  1825. +
  1826. + final_url_ = final_url;
  1827. + response_code_ = response_head.headers ? response_head.headers->response_code() : -1;
  1828. +
  1829. + if (!response_head.headers->GetLastModifiedValue(&last_modified_))
  1830. + LOG(WARNING) << "DownloadFiltersTask: fetched URL '" << final_url.spec()
  1831. + << "' with method " << (min_last_modified_.is_null() ? "GET" : "HEAD")
  1832. + << " (no Last-Modified header)";
  1833. + else
  1834. + LOG(INFO) << "DownloadFiltersTask: fetched URL '" << final_url.spec()
  1835. + << "' with method " << (min_last_modified_.is_null() ? "GET" : "HEAD")
  1836. + << " response_code " << response_code_
  1837. + << " last_modified " << last_modified_;
  1838. +}
  1839. +
  1840. +void DownloadFiltersTask::OnDownloadComplete(base::FilePath file_path) {
  1841. + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  1842. + int net_error = simple_url_loader_->NetError();
  1843. + int64_t content_size = simple_url_loader_->GetContentSize();
  1844. +
  1845. + const base::TimeTicks download_end_time(base::TimeTicks::Now());
  1846. + const base::TimeDelta download_time =
  1847. + download_end_time >= download_start_time_
  1848. + ? download_end_time - download_start_time_
  1849. + : base::TimeDelta();
  1850. +
  1851. + // Consider a 5xx response from the server as an indication to terminate
  1852. + // the request and avoid overloading the server in this case.
  1853. + // is not accepting requests for the moment.
  1854. + int error = -1;
  1855. + if (!file_path.empty() && response_code_ == 200) {
  1856. + DCHECK_EQ(0, net_error);
  1857. + error = 0;
  1858. + } else if (response_code_ != -1) {
  1859. + error = response_code_;
  1860. + } else {
  1861. + error = net_error;
  1862. + }
  1863. +
  1864. + simple_url_loader_.reset();
  1865. +
  1866. + LOG(INFO) << "DownloadFiltersTask: downloaded " << content_size << " bytes in "
  1867. + << download_time.InMilliseconds() << "ms from '" << final_url_.spec()
  1868. + << "' to '" << file_path << "' with net_error " << net_error << " and error " << error;
  1869. +
  1870. + if (error) {
  1871. + TaskComplete(AdblockError::DOWNLOAD_ERROR);
  1872. + return;
  1873. + }
  1874. +
  1875. + file_path_ = file_path;
  1876. + TaskComplete(AdblockError::NONE);
  1877. +}
  1878. +
  1879. +void DownloadFiltersTask::Cancel() {
  1880. + DCHECK(thread_checker_.CalledOnValidThread());
  1881. +
  1882. + LOG(INFO) << "DownloadFiltersTask: update cancelled";
  1883. +
  1884. + // deletion of the simple_url_loader_ will cause cancellation of its active request, if any
  1885. +
  1886. + TaskComplete(AdblockError::UPDATE_CANCELED);
  1887. +}
  1888. +
  1889. +void DownloadFiltersTask::TaskComplete(AdblockError error) {
  1890. + DCHECK(thread_checker_.CalledOnValidThread());
  1891. +
  1892. + base::ThreadTaskRunnerHandle::Get()->PostTask(
  1893. + FROM_HERE, base::BindOnce(std::move(complete_callback_),
  1894. + scoped_refptr<DownloadFiltersTask>(this), error));
  1895. +}
  1896. +
  1897. +base::Time DownloadFiltersTask::last_modified() {
  1898. + return last_modified_;
  1899. +}
  1900. +
  1901. +base::FilePath DownloadFiltersTask::file_path() {
  1902. + return file_path_;
  1903. +}
  1904. +
  1905. +} // namespace adblock_updater
  1906. diff --git a/components/component_updater/download_filters_task.h b/components/component_updater/download_filters_task.h
  1907. new file mode 100644
  1908. --- /dev/null
  1909. +++ b/components/component_updater/download_filters_task.h
  1910. @@ -0,0 +1,131 @@
  1911. +/*
  1912. + This file is part of Bromite.
  1913. +
  1914. + Bromite is free software: you can redistribute it and/or modify
  1915. + it under the terms of the GNU General Public License as published by
  1916. + the Free Software Foundation, either version 3 of the License, or
  1917. + (at your option) any later version.
  1918. +
  1919. + Bromite is distributed in the hope that it will be useful,
  1920. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  1921. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1922. + GNU General Public License for more details.
  1923. +
  1924. + You should have received a copy of the GNU General Public License
  1925. + along with Bromite. If not, see <https://www.gnu.org/licenses/>.
  1926. +*/
  1927. +
  1928. +#ifndef COMPONENTS_DOWNLOAD_FILTERS_TASK_H_
  1929. +#define COMPONENTS_DOWNLOAD_FILTERS_TASK_H_
  1930. +
  1931. +#include <string>
  1932. +#include <vector>
  1933. +
  1934. +#include "base/callback.h"
  1935. +#include "base/macros.h"
  1936. +#include "base/memory/ref_counted.h"
  1937. +#include "base/threading/thread_checker.h"
  1938. +#include "components/update_client/network.h"
  1939. +#include "url/gurl.h"
  1940. +#include "base/files/file_path.h"
  1941. +#include "services/network/public/cpp/shared_url_loader_factory.h"
  1942. +#include "services/network/public/cpp/simple_url_loader.h"
  1943. +
  1944. +namespace adblock_updater {
  1945. +
  1946. +// Errors generated as a result of calling Run() or by the service itself (UPDATE_IN_PROGRESS or UPDATE_CANCELED)
  1947. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.flags
  1948. +enum class AdblockError {
  1949. + NONE = 0,
  1950. + UPDATE_IN_PROGRESS = 1,
  1951. + UPDATE_CANCELED = 2,
  1952. + UPDATE_NOT_NEEDED = 3,
  1953. + DOWNLOAD_ERROR = 4,
  1954. + INVALID_ARGUMENT = 5,
  1955. + MAX_VALUE,
  1956. +};
  1957. +
  1958. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.flags
  1959. +enum class AdblockEvent {
  1960. + // Sent before the update client does an update check.
  1961. + ADBLOCK_CHECKING_FOR_UPDATES = 1,
  1962. +
  1963. + // Sent after the new filters have been downloaded but before the install
  1964. + // or the upgrade is attempted.
  1965. + ADBLOCK_UPDATE_READY,
  1966. +
  1967. + // Sent when filters are being downloaded.
  1968. + ADBLOCK_UPDATE_DOWNLOADING,
  1969. +
  1970. + // Sent when filters have been successfully updated.
  1971. + ADBLOCK_UPDATED,
  1972. +
  1973. + // Sent when filters have not been updated because there
  1974. + // was no new version available
  1975. + //TODO: implement this with the headers check
  1976. + ADBLOCK_NOT_UPDATED,
  1977. +
  1978. + // Sent when an error ocurred during an update for any reason, including
  1979. + // the update check itself failed, or the download of the update payload
  1980. + // failed, or applying the update failed.
  1981. + ADBLOCK_UPDATE_ERROR,
  1982. +};
  1983. +
  1984. +// Defines a specialized task for updating AdBlock filters.
  1985. +class DownloadFiltersTask : public base::RefCounted<DownloadFiltersTask> {
  1986. + public:
  1987. + using Callback =
  1988. + base::OnceCallback<void(scoped_refptr<DownloadFiltersTask> task, AdblockError error)>;
  1989. +
  1990. + // |shared_url_network_factory| is injected here for the URL loader factory.
  1991. + // |is_foreground| is true when the update task is initiated by the user.
  1992. + // |filters_url| is the URL to load filters from.
  1993. + // |complete_callback| is called to return the execution flow back to creator of
  1994. + // this task when the task is done.
  1995. + DownloadFiltersTask(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
  1996. + bool is_foreground, const std::string& filters_url, base::Time min_last_modified,
  1997. + Callback complete_callback);
  1998. +
  1999. + void Run();
  2000. +
  2001. + void Cancel();
  2002. +
  2003. + base::FilePath file_path();
  2004. +
  2005. + base::Time last_modified();
  2006. +
  2007. + private:
  2008. + ~DownloadFiltersTask();
  2009. +
  2010. + void OnDownloadProgress(uint64_t current);
  2011. + void OnResponseStarted(const GURL& final_url,
  2012. + const network::mojom::URLResponseHead& response_head);
  2013. + void OnDownloadComplete(base::FilePath file_path);
  2014. + void OnHeadersDownloadComplete(scoped_refptr<net::HttpResponseHeaders> headers);
  2015. + void createSimpleURLLoader(bool);
  2016. + void internalDownload();
  2017. +
  2018. + // Called when the task has completed either because the task has run or
  2019. + // it has been canceled.
  2020. + void TaskComplete(AdblockError error);
  2021. +
  2022. + base::ThreadChecker thread_checker_;
  2023. + scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory_;
  2024. + const bool is_foreground_;
  2025. + Callback complete_callback_;
  2026. + std::unique_ptr<network::SimpleURLLoader> simple_url_loader_;
  2027. +
  2028. + // fields populated while downloading
  2029. + base::TimeTicks download_start_time_;
  2030. + GURL final_url_, filters_url_;
  2031. + int response_code_;
  2032. + base::Time last_modified_, min_last_modified_;
  2033. + base::FilePath file_path_;
  2034. +
  2035. + friend class base::RefCounted<DownloadFiltersTask>;
  2036. + DISALLOW_COPY_AND_ASSIGN(DownloadFiltersTask);
  2037. +};
  2038. +
  2039. +} // namespace update_client
  2040. +
  2041. +#endif // COMPONENTS_DOWNLOAD_FILTERS_TASK_H_
  2042. diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
  2043. --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
  2044. +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
  2045. @@ -551,6 +551,17 @@ ContentSubresourceFilterThrottleManager::
  2046. throttle->NotifyPageActivationWithRuleset(EnsureRulesetHandle(),
  2047. ad_tagging_state);
  2048. }
  2049. +
  2050. + //TODO: could use same logic as in SubresourceFilterSafeBrowsingActivationThrottle::NotifyResult()
  2051. + {
  2052. + subresource_filter::ActivationDecision ignored_decision;
  2053. + mojom::ActivationState ad_filtering_state;
  2054. + ad_filtering_state.activation_level = client_->OnPageActivationComputed(
  2055. + navigation_handle, mojom::ActivationLevel::kEnabled, &ignored_decision);
  2056. + throttle->NotifyPageActivationWithRuleset(EnsureRulesetHandle(),
  2057. + ad_filtering_state);
  2058. + }
  2059. +
  2060. return throttle;
  2061. }
  2062. diff --git a/components/subresource_filter/content/browser/ruleset_publisher.h b/components/subresource_filter/content/browser/ruleset_publisher.h
  2063. --- a/components/subresource_filter/content/browser/ruleset_publisher.h
  2064. +++ b/components/subresource_filter/content/browser/ruleset_publisher.h
  2065. @@ -45,6 +45,8 @@ class RulesetPublisher {
  2066. // Set the callback on publish associated with the RulesetPublisher.
  2067. virtual void SetRulesetPublishedCallbackForTesting(
  2068. base::OnceClosure callback) = 0;
  2069. + virtual void SetRulesetPublishedCallback(
  2070. + base::OnceClosure callback) = 0;
  2071. };
  2072. } // namespace subresource_filter
  2073. diff --git a/components/subresource_filter/content/browser/ruleset_publisher_impl.cc b/components/subresource_filter/content/browser/ruleset_publisher_impl.cc
  2074. --- a/components/subresource_filter/content/browser/ruleset_publisher_impl.cc
  2075. +++ b/components/subresource_filter/content/browser/ruleset_publisher_impl.cc
  2076. @@ -79,6 +79,11 @@ void RulesetPublisherImpl::SetRulesetPublishedCallbackForTesting(
  2077. ruleset_published_callback_ = std::move(callback);
  2078. }
  2079. +void RulesetPublisherImpl::SetRulesetPublishedCallback(
  2080. + base::OnceClosure callback) {
  2081. + ruleset_published_callback_ = std::move(callback);
  2082. +}
  2083. +
  2084. void RulesetPublisherImpl::TryOpenAndSetRulesetFile(
  2085. const base::FilePath& file_path,
  2086. int expected_checksum,
  2087. diff --git a/components/subresource_filter/content/browser/ruleset_publisher_impl.h b/components/subresource_filter/content/browser/ruleset_publisher_impl.h
  2088. --- a/components/subresource_filter/content/browser/ruleset_publisher_impl.h
  2089. +++ b/components/subresource_filter/content/browser/ruleset_publisher_impl.h
  2090. @@ -46,6 +46,8 @@ class RulesetPublisherImpl : public RulesetPublisher,
  2091. VerifiedRulesetDealer::Handle* GetRulesetDealer() override;
  2092. void SetRulesetPublishedCallbackForTesting(
  2093. base::OnceClosure callback) override;
  2094. + void SetRulesetPublishedCallback(
  2095. + base::OnceClosure callback) override;
  2096. // Forwards calls to the underlying ruleset_service_.
  2097. void IndexAndStoreAndPublishRulesetIfNeeded(
  2098. diff --git a/components/subresource_filter/content/browser/ruleset_service.cc b/components/subresource_filter/content/browser/ruleset_service.cc
  2099. --- a/components/subresource_filter/content/browser/ruleset_service.cc
  2100. +++ b/components/subresource_filter/content/browser/ruleset_service.cc
  2101. @@ -47,9 +47,7 @@ namespace {
  2102. void RecordIndexAndWriteRulesetResult(
  2103. RulesetService::IndexAndWriteRulesetResult result) {
  2104. - UMA_HISTOGRAM_ENUMERATION(
  2105. - "SubresourceFilter.WriteRuleset.Result", static_cast<int>(result),
  2106. - static_cast<int>(RulesetService::IndexAndWriteRulesetResult::MAX));
  2107. + VLOG(1) << "SubresourceFilter.WriteRuleset.Result: " << static_cast<int>(result);
  2108. }
  2109. // Implements operations on a `sentinel file`, which is used as a safeguard to
  2110. @@ -228,10 +226,13 @@ RulesetService::RulesetService(
  2111. RulesetService::~RulesetService() {}
  2112. void RulesetService::IndexAndStoreAndPublishRulesetIfNeeded(
  2113. - const UnindexedRulesetInfo& unindexed_ruleset_info) {
  2114. - if (unindexed_ruleset_info.content_version.empty())
  2115. + const UnindexedRulesetInfo& unindexed_ruleset_info, bool ignore_recent_version) {
  2116. + if (unindexed_ruleset_info.content_version.empty()) {
  2117. + LOG(INFO) << "RulesetService: ignoring update with empty version.";
  2118. return;
  2119. + }
  2120. + if (!ignore_recent_version) {
  2121. // Trying to store a ruleset with the same version for a second time would
  2122. // not only be futile, but would fail on Windows due to "File System
  2123. // Tunneling" as long as the previously stored copy of the rules is still
  2124. @@ -241,13 +242,16 @@ void RulesetService::IndexAndStoreAndPublishRulesetIfNeeded(
  2125. if (most_recently_indexed_version.IsCurrentFormatVersion() &&
  2126. most_recently_indexed_version.content_version ==
  2127. unindexed_ruleset_info.content_version) {
  2128. + LOG(INFO) << "RulesetService: ignoring update with equal or older version.";
  2129. return;
  2130. }
  2131. + }
  2132. // Before initialization, retain information about the most recently supplied
  2133. // unindexed ruleset, to be processed during initialization.
  2134. if (!is_initialized_) {
  2135. queued_unindexed_ruleset_info_ = unindexed_ruleset_info;
  2136. + LOG(INFO) << "RulesetService: ignoring update while not initialized.";
  2137. return;
  2138. }
  2139. @@ -266,6 +270,18 @@ IndexedRulesetVersion RulesetService::GetMostRecentlyIndexedVersion() const {
  2140. IndexedRulesetVersion RulesetService::IndexAndWriteRuleset(
  2141. const base::FilePath& indexed_ruleset_base_dir,
  2142. const UnindexedRulesetInfo& unindexed_ruleset_info) {
  2143. + IndexedRulesetVersion version = IndexAndWriteRulesetInternal(indexed_ruleset_base_dir, unindexed_ruleset_info);
  2144. + // cleanup temporary file when done
  2145. + if (unindexed_ruleset_info.delete_ruleset_path) {
  2146. + base::DeleteFile(unindexed_ruleset_info.ruleset_path);
  2147. + }
  2148. + return version;
  2149. +}
  2150. +
  2151. +// static
  2152. +IndexedRulesetVersion RulesetService::IndexAndWriteRulesetInternal(
  2153. + const base::FilePath& indexed_ruleset_base_dir,
  2154. + const UnindexedRulesetInfo& unindexed_ruleset_info) {
  2155. base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
  2156. base::BlockingType::MAY_BLOCK);
  2157. @@ -273,6 +289,7 @@ IndexedRulesetVersion RulesetService::IndexAndWriteRuleset(
  2158. unindexed_ruleset_info);
  2159. if (!unindexed_ruleset_stream_generator.ruleset_stream()) {
  2160. + LOG(WARNING) << "RulesetService: failed to open: " << unindexed_ruleset_info.ruleset_path;
  2161. RecordIndexAndWriteRulesetResult(
  2162. IndexAndWriteRulesetResult::FAILED_OPENING_UNINDEXED_RULESET);
  2163. return IndexedRulesetVersion();
  2164. @@ -286,6 +303,7 @@ IndexedRulesetVersion RulesetService::IndexAndWriteRuleset(
  2165. indexed_ruleset_base_dir, indexed_version);
  2166. if (!base::CreateDirectory(indexed_ruleset_version_dir)) {
  2167. + LOG(WARNING) << "RulesetService: failed to create version dir: " << indexed_ruleset_version_dir;
  2168. RecordIndexAndWriteRulesetResult(
  2169. IndexAndWriteRulesetResult::FAILED_CREATING_VERSION_DIR);
  2170. return IndexedRulesetVersion();
  2171. @@ -311,6 +329,7 @@ IndexedRulesetVersion RulesetService::IndexAndWriteRuleset(
  2172. RulesetIndexer indexer;
  2173. if (!(*g_index_ruleset_func)(&unindexed_ruleset_stream_generator, &indexer)) {
  2174. + LOG(WARNING) << "RulesetService: failed parsing.";
  2175. RecordIndexAndWriteRulesetResult(
  2176. IndexAndWriteRulesetResult::FAILED_PARSING_UNINDEXED_RULESET);
  2177. return IndexedRulesetVersion();
  2178. @@ -331,6 +350,8 @@ IndexedRulesetVersion RulesetService::IndexAndWriteRuleset(
  2179. if (result != IndexAndWriteRulesetResult::SUCCESS)
  2180. return IndexedRulesetVersion();
  2181. + LOG(INFO) << "RulesetService: successful parsing.";
  2182. +
  2183. DCHECK(indexed_version.IsValid());
  2184. return indexed_version;
  2185. }
  2186. @@ -455,6 +476,7 @@ void RulesetService::IndexAndStoreRuleset(
  2187. void RulesetService::OnWrittenRuleset(WriteRulesetCallback result_callback,
  2188. const IndexedRulesetVersion& version) {
  2189. DCHECK(!result_callback.is_null());
  2190. + LOG(INFO) << "RulesetService: valid version: " << version.IsValid();
  2191. if (!version.IsValid())
  2192. return;
  2193. version.SaveToPrefs(local_state_);
  2194. @@ -467,7 +489,6 @@ void RulesetService::OpenAndPublishRuleset(
  2195. IndexedRulesetLocator::GetRulesetDataFilePath(
  2196. IndexedRulesetLocator::GetSubdirectoryPathForVersion(
  2197. indexed_ruleset_base_dir_, version));
  2198. -
  2199. publisher_->TryOpenAndSetRulesetFile(
  2200. file_path, version.checksum,
  2201. base::BindOnce(&RulesetService::OnRulesetSet, AsWeakPtr()));
  2202. diff --git a/components/subresource_filter/content/browser/ruleset_service.h b/components/subresource_filter/content/browser/ruleset_service.h
  2203. --- a/components/subresource_filter/content/browser/ruleset_service.h
  2204. +++ b/components/subresource_filter/content/browser/ruleset_service.h
  2205. @@ -171,6 +171,10 @@ class RulesetService : public base::SupportsWeakPtr<RulesetService> {
  2206. publisher_->SetRulesetPublishedCallbackForTesting(std::move(callback));
  2207. }
  2208. + void SetRulesetPublishedCallback(base::OnceClosure callback) {
  2209. + publisher_->SetRulesetPublishedCallback(std::move(callback));
  2210. + }
  2211. +
  2212. // Indexes, stores, and publishes the given unindexed ruleset, unless its
  2213. // |content_version| matches that of the most recently indexed version, in
  2214. // which case it does nothing. The files comprising the unindexed ruleset
  2215. @@ -182,7 +186,7 @@ class RulesetService : public base::SupportsWeakPtr<RulesetService> {
  2216. //
  2217. // Virtual so that it can be mocked out in tests.
  2218. virtual void IndexAndStoreAndPublishRulesetIfNeeded(
  2219. - const UnindexedRulesetInfo& unindexed_ruleset_info);
  2220. + const UnindexedRulesetInfo& unindexed_ruleset_info, bool ignore_recent_version = false);
  2221. // Get the ruleset version associated with the current local_state_.
  2222. IndexedRulesetVersion GetMostRecentlyIndexedVersion() const;
  2223. @@ -215,6 +219,11 @@ class RulesetService : public base::SupportsWeakPtr<RulesetService> {
  2224. const base::FilePath& indexed_ruleset_base_dir,
  2225. const UnindexedRulesetInfo& unindexed_ruleset_info);
  2226. + // internal function used to wrap the temporary file deletion for unindexed rulesets
  2227. + static IndexedRulesetVersion IndexAndWriteRulesetInternal(
  2228. + const base::FilePath& indexed_ruleset_base_dir,
  2229. + const UnindexedRulesetInfo& unindexed_ruleset_info);
  2230. +
  2231. // Reads the rules via the |unindexed_ruleset_stream_generator|, and indexes
  2232. // them using |indexer|. Returns whether the entire ruleset could be parsed.
  2233. static bool IndexRuleset(
  2234. diff --git a/components/subresource_filter/content/browser/ruleset_version.h b/components/subresource_filter/content/browser/ruleset_version.h
  2235. --- a/components/subresource_filter/content/browser/ruleset_version.h
  2236. +++ b/components/subresource_filter/content/browser/ruleset_version.h
  2237. @@ -53,6 +53,10 @@ struct UnindexedRulesetInfo {
  2238. // can be indicated not only by setting |license_path| to empty, but also by
  2239. // setting it to any non existent path.
  2240. base::FilePath license_path;
  2241. +
  2242. + // Whether to delete or not the ruleset path once done indexing; useful for disposal
  2243. + // of temporary files.
  2244. + bool delete_ruleset_path;
  2245. };
  2246. // Encapsulates the combination of the binary format version of the indexed
  2247. diff --git a/components/subresource_filter/content/browser/verified_ruleset_dealer.cc b/components/subresource_filter/content/browser/verified_ruleset_dealer.cc
  2248. --- a/components/subresource_filter/content/browser/verified_ruleset_dealer.cc
  2249. +++ b/components/subresource_filter/content/browser/verified_ruleset_dealer.cc
  2250. @@ -11,6 +11,7 @@
  2251. #include "base/check.h"
  2252. #include "base/files/file.h"
  2253. #include "base/location.h"
  2254. +#include "base/logging.h"
  2255. #include "base/metrics/histogram_macros.h"
  2256. #include "base/notreached.h"
  2257. #include "base/task_runner_util.h"
  2258. @@ -36,6 +37,8 @@ base::File VerifiedRulesetDealer::OpenAndSetRulesetFile(
  2259. TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("loading"),
  2260. "VerifiedRulesetDealer::OpenAndSetRulesetFile", "file_valid",
  2261. file.IsValid());
  2262. +
  2263. + LOG(INFO) << "OpenAndSetRulesetFile: " << file_path << " is valid: " << file.IsValid();
  2264. if (file.IsValid()) {
  2265. SetRulesetFile(file.Duplicate());
  2266. expected_checksum_ = expected_checksum;
  2267. diff --git a/components/subresource_filter/core/browser/subresource_filter_features.cc b/components/subresource_filter/core/browser/subresource_filter_features.cc
  2268. --- a/components/subresource_filter/core/browser/subresource_filter_features.cc
  2269. +++ b/components/subresource_filter/core/browser/subresource_filter_features.cc
  2270. @@ -53,69 +53,7 @@ class CommaSeparatedStrings {
  2271. DISALLOW_COPY_AND_ASSIGN(CommaSeparatedStrings);
  2272. };
  2273. -std::string TakeVariationParamOrReturnEmpty(
  2274. - std::map<std::string, std::string>* params,
  2275. - const std::string& key) {
  2276. - auto it = params->find(key);
  2277. - if (it == params->end())
  2278. - return std::string();
  2279. - std::string value = std::move(it->second);
  2280. - params->erase(it);
  2281. - return value;
  2282. -}
  2283. -
  2284. -mojom::ActivationLevel ParseActivationLevel(
  2285. - const base::StringPiece activation_level) {
  2286. - if (base::LowerCaseEqualsASCII(activation_level, kActivationLevelEnabled))
  2287. - return mojom::ActivationLevel::kEnabled;
  2288. - else if (base::LowerCaseEqualsASCII(activation_level, kActivationLevelDryRun))
  2289. - return mojom::ActivationLevel::kDryRun;
  2290. - return mojom::ActivationLevel::kDisabled;
  2291. -}
  2292. -
  2293. -ActivationScope ParseActivationScope(const base::StringPiece activation_scope) {
  2294. - if (base::LowerCaseEqualsASCII(activation_scope, kActivationScopeAllSites))
  2295. - return ActivationScope::ALL_SITES;
  2296. - else if (base::LowerCaseEqualsASCII(activation_scope,
  2297. - kActivationScopeActivationList))
  2298. - return ActivationScope::ACTIVATION_LIST;
  2299. - return ActivationScope::NO_SITES;
  2300. -}
  2301. -
  2302. -ActivationList ParseActivationList(std::string activation_lists_string) {
  2303. - CommaSeparatedStrings activation_lists(std::move(activation_lists_string));
  2304. - if (activation_lists.CaseInsensitiveContains(
  2305. - kActivationListPhishingInterstitial)) {
  2306. - return ActivationList::PHISHING_INTERSTITIAL;
  2307. - } else if (activation_lists.CaseInsensitiveContains(
  2308. - kActivationListSocialEngineeringAdsInterstitial)) {
  2309. - return ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL;
  2310. - } else if (activation_lists.CaseInsensitiveContains(
  2311. - kActivationListSubresourceFilter)) {
  2312. - return ActivationList::SUBRESOURCE_FILTER;
  2313. - } else if (activation_lists.CaseInsensitiveContains(
  2314. - kActivationListBetterAds)) {
  2315. - return ActivationList::BETTER_ADS;
  2316. - }
  2317. - return ActivationList::NONE;
  2318. -}
  2319. -
  2320. -// Will return a value between 0 and 1 inclusive.
  2321. -double ParsePerformanceMeasurementRate(const std::string& rate) {
  2322. - double value = 0.0;
  2323. - if (!base::StringToDouble(rate, &value) || value < 0)
  2324. - return 0.0;
  2325. - return value < 1 ? value : 1;
  2326. -}
  2327. -
  2328. -int ParseInt(const base::StringPiece value) {
  2329. - int result = 0;
  2330. - base::StringToInt(value, &result);
  2331. - return result;
  2332. -}
  2333. -
  2334. -std::vector<Configuration> FillEnabledPresetConfigurations(
  2335. - std::map<std::string, std::string>* params) {
  2336. +std::vector<Configuration> FillEnabledPresetConfigurations() {
  2337. // If ad tagging is enabled, turn on the dryrun automatically.
  2338. bool ad_tagging_enabled = base::FeatureList::IsEnabled(kAdTagging);
  2339. const struct {
  2340. @@ -123,23 +61,16 @@ std::vector<Configuration> FillEnabledPresetConfigurations(
  2341. bool enabled_by_default;
  2342. Configuration (*factory_method)();
  2343. } kAvailablePresetConfigurations[] = {
  2344. - {kPresetLiveRunOnPhishingSites, true,
  2345. + {kPresetLiveRunOnPhishingSites, false,
  2346. &Configuration::MakePresetForLiveRunOnPhishingSites},
  2347. {kPresetPerformanceTestingDryRunOnAllSites, ad_tagging_enabled,
  2348. &Configuration::MakePresetForPerformanceTestingDryRunOnAllSites},
  2349. {kPresetLiveRunForBetterAds, true,
  2350. &Configuration::MakePresetForLiveRunForBetterAds}};
  2351. - CommaSeparatedStrings enabled_presets(
  2352. - TakeVariationParamOrReturnEmpty(params, kEnablePresetsParameterName));
  2353. - CommaSeparatedStrings disabled_presets(
  2354. - TakeVariationParamOrReturnEmpty(params, kDisablePresetsParameterName));
  2355. -
  2356. std::vector<Configuration> enabled_configurations;
  2357. for (const auto& available_preset : kAvailablePresetConfigurations) {
  2358. - if ((enabled_presets.CaseInsensitiveContains(available_preset.name) ||
  2359. - available_preset.enabled_by_default) &&
  2360. - !disabled_presets.CaseInsensitiveContains(available_preset.name)) {
  2361. + if (available_preset.enabled_by_default) {
  2362. enabled_configurations.push_back(available_preset.factory_method());
  2363. }
  2364. }
  2365. @@ -147,46 +78,10 @@ std::vector<Configuration> FillEnabledPresetConfigurations(
  2366. return enabled_configurations;
  2367. }
  2368. -Configuration ParseExperimentalConfiguration(
  2369. - std::map<std::string, std::string>* params) {
  2370. - Configuration configuration;
  2371. -
  2372. - // ActivationConditions:
  2373. - configuration.activation_conditions.activation_scope = ParseActivationScope(
  2374. - TakeVariationParamOrReturnEmpty(params, kActivationScopeParameterName));
  2375. -
  2376. - configuration.activation_conditions.activation_list = ParseActivationList(
  2377. - TakeVariationParamOrReturnEmpty(params, kActivationListsParameterName));
  2378. -
  2379. - configuration.activation_conditions.priority =
  2380. - ParseInt(TakeVariationParamOrReturnEmpty(
  2381. - params, kActivationPriorityParameterName));
  2382. -
  2383. - // ActivationOptions:
  2384. - configuration.activation_options.activation_level = ParseActivationLevel(
  2385. - TakeVariationParamOrReturnEmpty(params, kActivationLevelParameterName));
  2386. -
  2387. - configuration.activation_options.performance_measurement_rate =
  2388. - ParsePerformanceMeasurementRate(TakeVariationParamOrReturnEmpty(
  2389. - params, kPerformanceMeasurementRateParameterName));
  2390. -
  2391. - // GeneralSettings:
  2392. - configuration.general_settings.ruleset_flavor =
  2393. - TakeVariationParamOrReturnEmpty(params, kRulesetFlavorParameterName);
  2394. -
  2395. - return configuration;
  2396. -}
  2397. -
  2398. std::vector<Configuration> ParseEnabledConfigurations() {
  2399. - std::map<std::string, std::string> params;
  2400. - base::GetFieldTrialParamsByFeature(kSafeBrowsingSubresourceFilter, &params);
  2401. -
  2402. std::vector<Configuration> configs;
  2403. if (base::FeatureList::IsEnabled(kSafeBrowsingSubresourceFilter))
  2404. - configs = FillEnabledPresetConfigurations(&params);
  2405. -
  2406. - Configuration experimental_config = ParseExperimentalConfiguration(&params);
  2407. - configs.push_back(std::move(experimental_config));
  2408. + configs = FillEnabledPresetConfigurations();
  2409. return configs;
  2410. }
  2411. diff --git a/components/subresource_filter/core/common/common_features.cc b/components/subresource_filter/core/common/common_features.cc
  2412. --- a/components/subresource_filter/core/common/common_features.cc
  2413. +++ b/components/subresource_filter/core/common/common_features.cc
  2414. @@ -6,6 +6,6 @@
  2415. namespace subresource_filter {
  2416. -const base::Feature kAdTagging{"AdTagging", base::FEATURE_ENABLED_BY_DEFAULT};
  2417. +const base::Feature kAdTagging{"AdTagging", base::FEATURE_DISABLED_BY_DEFAULT};
  2418. } // namespace subresource_filter
  2419. diff --git a/content/browser/renderer_host/navigation_throttle_runner.cc b/content/browser/renderer_host/navigation_throttle_runner.cc
  2420. --- a/content/browser/renderer_host/navigation_throttle_runner.cc
  2421. +++ b/content/browser/renderer_host/navigation_throttle_runner.cc
  2422. @@ -131,11 +131,6 @@ void NavigationThrottleRunner::RegisterNavigationThrottles() {
  2423. // than other throttles that might care about those navigations, e.g.
  2424. // throttles handling pages with 407 errors that require extra authentication.
  2425. AddThrottle(HttpErrorNavigationThrottle::MaybeCreateThrottleFor(*request));
  2426. -
  2427. - // Insert all testing NavigationThrottles last.
  2428. - throttles_.insert(throttles_.end(),
  2429. - std::make_move_iterator(testing_throttles.begin()),
  2430. - std::make_move_iterator(testing_throttles.end()));
  2431. }
  2432. NavigationThrottle* NavigationThrottleRunner::GetDeferringThrottle() const {
  2433. --
  2434. 2.17.1