Skip to content

Commit 96eeddd

Browse files
belenkoElectron Bot
and
Electron Bot
authored
chore: backport Chromium fixes (electron#24419)
* Backport 1063177 (https://chromium-review.googlesource.com/c/chromium/src/+/2111393/) * Backport 1019161 (https://chromium-review.googlesource.com/c/chromium/src/+/2125690) * update patches Co-authored-by: Andrey Belenko <anbelen@microsoft.com> Co-authored-by: Electron Bot <anonymous@electronjs.org>
1 parent 7a77619 commit 96eeddd

File tree

3 files changed

+232
-0
lines changed

3 files changed

+232
-0
lines changed

patches/chromium/.patches

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,5 @@ a11y_iterate_all_descendants_for_getselectioncount.patch
111111
allow_ime_to_insert_zero-length_composition_string.patch
112112
cherry-pick-eac3d9283d11.patch
113113
remove_menu_window_task_item.patch
114+
backport_1063177.patch
115+
backport_1019161.patch
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Andrey Belenko <anbelen@microsoft.com>
3+
Date: Fri, 3 Jul 2020 17:27:20 +0200
4+
Subject: Backport 1019161
5+
(https://chromium-review.googlesource.com/c/chromium/src/+/2125690)
6+
7+
diff --git a/extensions/browser/service_worker_task_queue.cc b/extensions/browser/service_worker_task_queue.cc
8+
index dedb8c39f7db8c416540cdb930683778c2a9a5a5..3519926a06a35b375e13695d59fafce0c7f49c81 100644
9+
--- a/extensions/browser/service_worker_task_queue.cc
10+
+++ b/extensions/browser/service_worker_task_queue.cc
11+
@@ -170,8 +170,17 @@ void ServiceWorkerTaskQueue::DidStartWorkerFail(
12+
DCHECK(!base::Contains(pending_tasks_, context_id));
13+
return;
14+
}
15+
- // TODO(lazyboy): Handle failure cases.
16+
- DCHECK(false) << "DidStartWorkerFail: " << context_id.first.extension_id();
17+
+
18+
+ if (g_test_observer) {
19+
+ g_test_observer->DidStartWorkerFail(context_id.first.extension_id(),
20+
+ pending_tasks_[context_id].size());
21+
+ }
22+
+
23+
+ pending_tasks_.erase(context_id);
24+
+ // TODO(https://crbug/1062936): Needs more thought: extension would be in
25+
+ // perma-broken state after this as the registration wouldn't be stored if
26+
+ // this happens.
27+
+ LOG(ERROR) << "DidStartWorkerFail " << context_id.first.extension_id();
28+
}
29+
30+
void ServiceWorkerTaskQueue::DidInitializeServiceWorkerContext(
31+
@@ -530,6 +539,16 @@ ServiceWorkerTaskQueue::GetOrCreateWorkerState(const WorkerKey& worker_key) {
32+
return &(iter->second);
33+
}
34+
35+
+size_t ServiceWorkerTaskQueue::GetNumPendingTasksForTest(
36+
+ const LazyContextId& lazy_context_id) {
37+
+ auto current_sequence = GetCurrentSequence(lazy_context_id.extension_id());
38+
+ if (!current_sequence)
39+
+ return 0u;
40+
+ const SequencedContextId context_id(lazy_context_id, *current_sequence);
41+
+ auto iter = pending_tasks_.find(context_id);
42+
+ return iter == pending_tasks_.end() ? 0u : iter->second.size();
43+
+}
44+
+
45+
ServiceWorkerTaskQueue::WorkerState* ServiceWorkerTaskQueue::GetWorkerState(
46+
const WorkerKey& worker_key) {
47+
auto iter = worker_state_map_.find(worker_key);
48+
diff --git a/extensions/browser/service_worker_task_queue.h b/extensions/browser/service_worker_task_queue.h
49+
index 2e5e215bd193098fe4b183a60df5d3c6d1dc8d19..953a72d3c4fe0ce396e0399c890518068f9dbde7 100644
50+
--- a/extensions/browser/service_worker_task_queue.h
51+
+++ b/extensions/browser/service_worker_task_queue.h
52+
@@ -121,7 +121,9 @@ class ServiceWorkerTaskQueue : public KeyedService,
53+
// |will_register_service_worker| is true if a Service Worker will be
54+
// registered.
55+
virtual void OnActivateExtension(const ExtensionId& extension_id,
56+
- bool will_register_service_worker) = 0;
57+
+ bool will_register_service_worker) {}
58+
+ virtual void DidStartWorkerFail(const ExtensionId& extension_id,
59+
+ size_t num_pending_tasks) {}
60+
61+
private:
62+
DISALLOW_COPY_AND_ASSIGN(TestObserver);
63+
@@ -129,6 +131,8 @@ class ServiceWorkerTaskQueue : public KeyedService,
64+
65+
static void SetObserverForTest(TestObserver* observer);
66+
67+
+ size_t GetNumPendingTasksForTest(const LazyContextId& lazy_context_id);
68+
+
69+
private:
70+
// Unique identifier for an extension's activation->deactivation span.
71+
using ActivationSequence = int;
72+
diff --git a/extensions/browser/service_worker_task_queue_factory.cc b/extensions/browser/service_worker_task_queue_factory.cc
73+
index b62d2c1c1e31414a3b26160c95cfcc6996995dff..29ff874ef47be3f7172bda276a7dba519a2f1b9b 100644
74+
--- a/extensions/browser/service_worker_task_queue_factory.cc
75+
+++ b/extensions/browser/service_worker_task_queue_factory.cc
76+
@@ -6,6 +6,7 @@
77+
78+
#include "components/keyed_service/content/browser_context_dependency_manager.h"
79+
#include "extensions/browser/extension_registry_factory.h"
80+
+#include "extensions/browser/process_manager_factory.h"
81+
#include "extensions/browser/service_worker_task_queue.h"
82+
83+
using content::BrowserContext;
84+
@@ -28,6 +29,7 @@ ServiceWorkerTaskQueueFactory::ServiceWorkerTaskQueueFactory()
85+
"ServiceWorkerTaskQueue",
86+
BrowserContextDependencyManager::GetInstance()) {
87+
DependsOn(ExtensionRegistryFactory::GetInstance());
88+
+ DependsOn(ProcessManagerFactory::GetInstance());
89+
}
90+
91+
ServiceWorkerTaskQueueFactory::~ServiceWorkerTaskQueueFactory() {}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Andrey Belenko <anbelen@microsoft.com>
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+
7+
diff --git a/extensions/browser/api/declarative_net_request/file_sequence_helper.cc b/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
8+
index b4e340f3a865b79a9c8a1aa38fd86eb4db043c3c..2579f39d4b2f10b665f95febe2c69409188529ff 100644
9+
--- a/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
10+
+++ b/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
11+
@@ -7,9 +7,11 @@
12+
#include <set>
13+
#include <utility>
14+
15+
+#include "base/barrier_closure.h"
16+
#include "base/bind.h"
17+
#include "base/files/file_util.h"
18+
#include "base/logging.h"
19+
+#include "base/memory/ref_counted.h"
20+
#include "base/metrics/histogram_functions.h"
21+
#include "base/metrics/histogram_macros.h"
22+
#include "base/stl_util.h"
23+
@@ -31,49 +33,57 @@ namespace {
24+
namespace dnr_api = extensions::api::declarative_net_request;
25+
26+
// A class to help in re-indexing multiple rulesets.
27+
-class ReindexHelper {
28+
+class ReindexHelper : public base::RefCountedThreadSafe<ReindexHelper> {
29+
public:
30+
- // Starts re-indexing rulesets. Must be called on the extension file task
31+
- // runner.
32+
using ReindexCallback = base::OnceCallback<void(LoadRequestData)>;
33+
- static void Start(LoadRequestData data, ReindexCallback callback) {
34+
- auto* helper = new ReindexHelper(std::move(data), std::move(callback));
35+
- helper->Start();
36+
- }
37+
-
38+
- private:
39+
- // We manage our own lifetime.
40+
ReindexHelper(LoadRequestData data, ReindexCallback callback)
41+
: data_(std::move(data)), callback_(std::move(callback)) {}
42+
- ~ReindexHelper() = default;
43+
-
44+
+
45+
+ // Starts re-indexing rulesets. Must be called on the extension file task
46+
+ // runner.
47+
void Start() {
48+
DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
49+
50+
- // Post tasks to reindex individual rulesets.
51+
- bool did_post_task = false;
52+
+ std::vector<RulesetInfo*> rulesets_to_reindex;
53+
+
54+
for (auto& ruleset : data_.rulesets) {
55+
if (ruleset.did_load_successfully())
56+
continue;
57+
58+
- // Using Unretained is safe since this class manages its own lifetime and
59+
- // |this| won't be deleted until the |callback| returns.
60+
- auto callback = base::BindOnce(&ReindexHelper::OnReindexCompleted,
61+
- base::Unretained(this), &ruleset);
62+
- callback_count_++;
63+
- did_post_task = true;
64+
- ruleset.source().IndexAndPersistJSONRuleset(&decoder_,
65+
- std::move(callback));
66+
+ rulesets_to_reindex.push_back(&ruleset);
67+
}
68+
69+
- // It's possible that the callbacks return synchronously and we are deleted
70+
- // at this point. Hence don't use any member variables here. Also, if we
71+
- // don't post any task, we'll leak. Ensure that's not the case.
72+
- DCHECK(did_post_task);
73+
+ // |done_closure| will be invoked once |barrier_closure| is run
74+
+ // |rulesets_to_reindex.size()| times.
75+
+ base::OnceClosure done_closure =
76+
+ base::BindOnce(&ReindexHelper::OnAllRulesetsReindexed, this);
77+
+ base::RepeatingClosure barrier_closure = base::BarrierClosure(
78+
+ rulesets_to_reindex.size(), std::move(done_closure));
79+
+
80+
+ // Post tasks to reindex individual rulesets.
81+
+ for (RulesetInfo* ruleset : rulesets_to_reindex) {
82+
+ auto callback = base::BindOnce(&ReindexHelper::OnReindexCompleted, this,
83+
+ ruleset, barrier_closure);
84+
+ ruleset->source().IndexAndPersistJSONRuleset(&decoder_,
85+
+ std::move(callback));
86+
+ }
87+
+ }
88+
+
89+
+ private:
90+
+ friend class base::RefCountedThreadSafe<ReindexHelper>;
91+
+ ~ReindexHelper() = default;
92+
+
93+
+ // Callback invoked when reindexing of all rulesets is completed.
94+
+ void OnAllRulesetsReindexed() {
95+
+ DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
96+
+
97+
+ // Our job is done.
98+
+ std::move(callback_).Run(std::move(data_));
99+
}
100+
101+
// Callback invoked when a single ruleset is re-indexed.
102+
void OnReindexCompleted(RulesetInfo* ruleset,
103+
+ base::OnceClosure done_closure,
104+
IndexAndPersistJSONRulesetResult result) {
105+
DCHECK(ruleset);
106+
107+
@@ -105,19 +115,11 @@ class ReindexHelper {
108+
"Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
109+
reindexing_success);
110+
111+
- callback_count_--;
112+
- DCHECK_GE(callback_count_, 0);
113+
-
114+
- if (callback_count_ == 0) {
115+
- // Our job is done.
116+
- std::move(callback_).Run(std::move(data_));
117+
- delete this;
118+
- }
119+
+ std::move(done_closure).Run();
120+
}
121+
122+
LoadRequestData data_;
123+
ReindexCallback callback_;
124+
- int callback_count_ = 0;
125+
126+
// We use a single shared Data Decoder service instance to process all of the
127+
// rulesets for this ReindexHelper.
128+
@@ -362,7 +364,10 @@ void FileSequenceHelper::LoadRulesets(
129+
auto reindex_callback =
130+
base::BindOnce(&FileSequenceHelper::OnRulesetsReindexed,
131+
weak_factory_.GetWeakPtr(), std::move(ui_callback));
132+
- ReindexHelper::Start(std::move(load_data), std::move(reindex_callback));
133+
+
134+
+ auto reindex_helper = base::MakeRefCounted<ReindexHelper>(
135+
+ std::move(load_data), std::move(reindex_callback));
136+
+ reindex_helper->Start();
137+
}
138+
139+
void FileSequenceHelper::UpdateDynamicRules(

0 commit comments

Comments
 (0)