backport_1063177.patch 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Andrey Belenko <[email protected]>
  3. Date: Fri, 3 Jul 2020 17:05:10 +0200
  4. Subject: Backport 1063177
  5. (https://chromium-review.googlesource.com/c/chromium/src/+/2111393/)
  6. diff --git a/extensions/browser/api/declarative_net_request/file_sequence_helper.cc b/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
  7. index b4e340f3a865b79a9c8a1aa38fd86eb4db043c3c..2579f39d4b2f10b665f95febe2c69409188529ff 100644
  8. --- a/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
  9. +++ b/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
  10. @@ -7,9 +7,11 @@
  11. #include <set>
  12. #include <utility>
  13. +#include "base/barrier_closure.h"
  14. #include "base/bind.h"
  15. #include "base/files/file_util.h"
  16. #include "base/logging.h"
  17. +#include "base/memory/ref_counted.h"
  18. #include "base/metrics/histogram_functions.h"
  19. #include "base/metrics/histogram_macros.h"
  20. #include "base/stl_util.h"
  21. @@ -31,49 +33,57 @@ namespace {
  22. namespace dnr_api = extensions::api::declarative_net_request;
  23. // A class to help in re-indexing multiple rulesets.
  24. -class ReindexHelper {
  25. +class ReindexHelper : public base::RefCountedThreadSafe<ReindexHelper> {
  26. public:
  27. - // Starts re-indexing rulesets. Must be called on the extension file task
  28. - // runner.
  29. using ReindexCallback = base::OnceCallback<void(LoadRequestData)>;
  30. - static void Start(LoadRequestData data, ReindexCallback callback) {
  31. - auto* helper = new ReindexHelper(std::move(data), std::move(callback));
  32. - helper->Start();
  33. - }
  34. -
  35. - private:
  36. - // We manage our own lifetime.
  37. ReindexHelper(LoadRequestData data, ReindexCallback callback)
  38. : data_(std::move(data)), callback_(std::move(callback)) {}
  39. - ~ReindexHelper() = default;
  40. -
  41. +
  42. + // Starts re-indexing rulesets. Must be called on the extension file task
  43. + // runner.
  44. void Start() {
  45. DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
  46. - // Post tasks to reindex individual rulesets.
  47. - bool did_post_task = false;
  48. + std::vector<RulesetInfo*> rulesets_to_reindex;
  49. +
  50. for (auto& ruleset : data_.rulesets) {
  51. if (ruleset.did_load_successfully())
  52. continue;
  53. - // Using Unretained is safe since this class manages its own lifetime and
  54. - // |this| won't be deleted until the |callback| returns.
  55. - auto callback = base::BindOnce(&ReindexHelper::OnReindexCompleted,
  56. - base::Unretained(this), &ruleset);
  57. - callback_count_++;
  58. - did_post_task = true;
  59. - ruleset.source().IndexAndPersistJSONRuleset(&decoder_,
  60. - std::move(callback));
  61. + rulesets_to_reindex.push_back(&ruleset);
  62. }
  63. - // It's possible that the callbacks return synchronously and we are deleted
  64. - // at this point. Hence don't use any member variables here. Also, if we
  65. - // don't post any task, we'll leak. Ensure that's not the case.
  66. - DCHECK(did_post_task);
  67. + // |done_closure| will be invoked once |barrier_closure| is run
  68. + // |rulesets_to_reindex.size()| times.
  69. + base::OnceClosure done_closure =
  70. + base::BindOnce(&ReindexHelper::OnAllRulesetsReindexed, this);
  71. + base::RepeatingClosure barrier_closure = base::BarrierClosure(
  72. + rulesets_to_reindex.size(), std::move(done_closure));
  73. +
  74. + // Post tasks to reindex individual rulesets.
  75. + for (RulesetInfo* ruleset : rulesets_to_reindex) {
  76. + auto callback = base::BindOnce(&ReindexHelper::OnReindexCompleted, this,
  77. + ruleset, barrier_closure);
  78. + ruleset->source().IndexAndPersistJSONRuleset(&decoder_,
  79. + std::move(callback));
  80. + }
  81. + }
  82. +
  83. + private:
  84. + friend class base::RefCountedThreadSafe<ReindexHelper>;
  85. + ~ReindexHelper() = default;
  86. +
  87. + // Callback invoked when reindexing of all rulesets is completed.
  88. + void OnAllRulesetsReindexed() {
  89. + DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
  90. +
  91. + // Our job is done.
  92. + std::move(callback_).Run(std::move(data_));
  93. }
  94. // Callback invoked when a single ruleset is re-indexed.
  95. void OnReindexCompleted(RulesetInfo* ruleset,
  96. + base::OnceClosure done_closure,
  97. IndexAndPersistJSONRulesetResult result) {
  98. DCHECK(ruleset);
  99. @@ -105,19 +115,11 @@ class ReindexHelper {
  100. "Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
  101. reindexing_success);
  102. - callback_count_--;
  103. - DCHECK_GE(callback_count_, 0);
  104. -
  105. - if (callback_count_ == 0) {
  106. - // Our job is done.
  107. - std::move(callback_).Run(std::move(data_));
  108. - delete this;
  109. - }
  110. + std::move(done_closure).Run();
  111. }
  112. LoadRequestData data_;
  113. ReindexCallback callback_;
  114. - int callback_count_ = 0;
  115. // We use a single shared Data Decoder service instance to process all of the
  116. // rulesets for this ReindexHelper.
  117. @@ -362,7 +364,10 @@ void FileSequenceHelper::LoadRulesets(
  118. auto reindex_callback =
  119. base::BindOnce(&FileSequenceHelper::OnRulesetsReindexed,
  120. weak_factory_.GetWeakPtr(), std::move(ui_callback));
  121. - ReindexHelper::Start(std::move(load_data), std::move(reindex_callback));
  122. +
  123. + auto reindex_helper = base::MakeRefCounted<ReindexHelper>(
  124. + std::move(load_data), std::move(reindex_callback));
  125. + reindex_helper->Start();
  126. }
  127. void FileSequenceHelper::UpdateDynamicRules(