Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/content_index/content_index_database.h" |
| 6 | |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 7 | #include <set> |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 8 | #include <string> |
| 9 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 10 | #include "base/barrier_closure.h" |
Gabriel Charette | 9f60dd1 | 2020-03-06 20:48:04 | [diff] [blame] | 11 | #include "base/memory/ptr_util.h" |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 12 | #include "base/stl_util.h" |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 13 | #include "base/time/time.h" |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 14 | #include "content/browser/background_fetch/storage/image_helpers.h" |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 15 | #include "content/browser/content_index/content_index.pb.h" |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 16 | #include "content/browser/content_index/content_index_metrics.h" |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 17 | #include "content/public/browser/browser_context.h" |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 18 | #include "content/public/browser/browser_task_traits.h" |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 19 | #include "content/public/browser/browser_thread.h" |
Anton Bikineev | f62d1bf | 2021-05-15 17:56:07 | [diff] [blame^] | 20 | #include "third_party/abseil-cpp/absl/types/optional.h" |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 21 | #include "url/gurl.h" |
Rayan Kanso | d33e277 | 2019-06-27 16:52:41 | [diff] [blame] | 22 | #include "url/origin.h" |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 23 | |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 24 | // TODO(crbug.com/973844): Move image utility functions to common library. |
| 25 | using content::background_fetch::DeserializeIcon; |
| 26 | using content::background_fetch::SerializeIcon; |
| 27 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 28 | namespace content { |
| 29 | |
| 30 | namespace { |
| 31 | |
| 32 | constexpr char kEntryPrefix[] = "content_index:entry_"; |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 33 | constexpr char kIconPrefix[] = "content_index:icon_"; |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 34 | |
| 35 | std::string EntryKey(const std::string& id) { |
| 36 | return kEntryPrefix + id; |
| 37 | } |
| 38 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 39 | std::string IconsKey(const std::string& id) { |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 40 | return kIconPrefix + id; |
| 41 | } |
| 42 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 43 | std::string CreateSerializedContentEntry( |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 44 | const blink::mojom::ContentDescription& description, |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 45 | const GURL& launch_url, |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 46 | base::Time entry_time) { |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 47 | // Convert description. |
| 48 | proto::ContentDescription description_proto; |
Rayan Kanso | 475b85b | 2019-06-28 01:56:44 | [diff] [blame] | 49 | description_proto.set_id(description.id); |
| 50 | description_proto.set_title(description.title); |
| 51 | description_proto.set_description(description.description); |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 52 | description_proto.set_category(static_cast<int>(description.category)); |
Rayan Kanso | 35c07cf | 2019-08-20 18:46:03 | [diff] [blame] | 53 | |
| 54 | for (const auto& icon : description.icons) { |
| 55 | auto* icon_proto = description_proto.add_icons(); |
| 56 | icon_proto->set_src(icon->src); |
| 57 | if (icon->sizes) |
| 58 | icon_proto->set_sizes(*icon->sizes); |
| 59 | if (icon->type) |
| 60 | icon_proto->set_type(*icon->type); |
| 61 | } |
| 62 | |
Rayan Kanso | 475b85b | 2019-06-28 01:56:44 | [diff] [blame] | 63 | description_proto.set_launch_url(description.launch_url); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 64 | |
| 65 | // Create entry. |
| 66 | proto::ContentEntry entry; |
| 67 | *entry.mutable_description() = std::move(description_proto); |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 68 | entry.set_launch_url(launch_url.spec()); |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 69 | entry.set_timestamp(entry_time.ToDeltaSinceWindowsEpoch().InMicroseconds()); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 70 | |
| 71 | return entry.SerializeAsString(); |
| 72 | } |
| 73 | |
| 74 | blink::mojom::ContentDescriptionPtr DescriptionFromProto( |
| 75 | const proto::ContentDescription& description) { |
| 76 | // Validate. |
| 77 | if (description.category() < |
| 78 | static_cast<int>(blink::mojom::ContentCategory::kMinValue) || |
| 79 | description.category() > |
| 80 | static_cast<int>(blink::mojom::ContentCategory::kMaxValue)) { |
| 81 | return nullptr; |
| 82 | } |
| 83 | |
| 84 | // Convert. |
| 85 | auto result = blink::mojom::ContentDescription::New(); |
| 86 | result->id = description.id(); |
| 87 | result->title = description.title(); |
| 88 | result->description = description.description(); |
| 89 | result->category = |
| 90 | static_cast<blink::mojom::ContentCategory>(description.category()); |
Rayan Kanso | 35c07cf | 2019-08-20 18:46:03 | [diff] [blame] | 91 | for (const auto& icon : description.icons()) { |
| 92 | auto mojo_icon = blink::mojom::ContentIconDefinition::New(); |
| 93 | mojo_icon->src = icon.src(); |
| 94 | if (icon.has_sizes()) |
| 95 | mojo_icon->sizes = icon.sizes(); |
| 96 | if (icon.has_type()) |
| 97 | mojo_icon->type = icon.type(); |
| 98 | result->icons.push_back(std::move(mojo_icon)); |
| 99 | } |
| 100 | |
Rayan Kanso | 475b85b | 2019-06-28 01:56:44 | [diff] [blame] | 101 | result->launch_url = description.launch_url(); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 102 | return result; |
| 103 | } |
| 104 | |
Anton Bikineev | f62d1bf | 2021-05-15 17:56:07 | [diff] [blame^] | 105 | absl::optional<ContentIndexEntry> EntryFromSerializedProto( |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 106 | int64_t service_worker_registration_id, |
| 107 | const std::string& serialized_proto) { |
| 108 | proto::ContentEntry entry_proto; |
| 109 | if (!entry_proto.ParseFromString(serialized_proto)) |
Anton Bikineev | f62d1bf | 2021-05-15 17:56:07 | [diff] [blame^] | 110 | return absl::nullopt; |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 111 | |
| 112 | GURL launch_url(entry_proto.launch_url()); |
| 113 | if (!launch_url.is_valid()) |
Anton Bikineev | f62d1bf | 2021-05-15 17:56:07 | [diff] [blame^] | 114 | return absl::nullopt; |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 115 | |
| 116 | auto description = DescriptionFromProto(entry_proto.description()); |
| 117 | base::Time registration_time = base::Time::FromDeltaSinceWindowsEpoch( |
| 118 | base::TimeDelta::FromMicroseconds(entry_proto.timestamp())); |
| 119 | |
| 120 | return ContentIndexEntry(service_worker_registration_id, |
| 121 | std::move(description), std::move(launch_url), |
| 122 | registration_time); |
| 123 | } |
| 124 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 125 | } // namespace |
| 126 | |
| 127 | ContentIndexDatabase::ContentIndexDatabase( |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 128 | BrowserContext* browser_context, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 129 | scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) |
Rayan Kanso | ba07580 | 2019-06-28 16:33:48 | [diff] [blame] | 130 | : provider_(browser_context->GetContentIndexProvider()), |
Jeremy Roman | 7c5cfabd | 2019-08-12 15:45:27 | [diff] [blame] | 131 | service_worker_context_(std::move(service_worker_context)) {} |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 132 | |
| 133 | ContentIndexDatabase::~ContentIndexDatabase() = default; |
| 134 | |
| 135 | void ContentIndexDatabase::AddEntry( |
| 136 | int64_t service_worker_registration_id, |
Rayan Kanso | d33e277 | 2019-06-27 16:52:41 | [diff] [blame] | 137 | const url::Origin& origin, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 138 | blink::mojom::ContentDescriptionPtr description, |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 139 | const std::vector<SkBitmap>& icons, |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 140 | const GURL& launch_url, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 141 | blink::mojom::ContentIndexService::AddCallback callback) { |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 142 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 143 | |
| 144 | auto wrapped_callback = base::BindOnce( |
| 145 | [](blink::mojom::ContentIndexService::AddCallback callback, |
| 146 | blink::mojom::ContentIndexError error) { |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 147 | GetUIThreadTaskRunner({})->PostTask( |
| 148 | FROM_HERE, base::BindOnce(std::move(callback), error)); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 149 | }, |
| 150 | std::move(callback)); |
| 151 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 152 | RunOrPostTaskOnThread( |
| 153 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 154 | base::BindOnce(&ContentIndexDatabase::AddEntryOnCoreThread, |
| 155 | weak_ptr_factory_core_.GetWeakPtr(), |
| 156 | service_worker_registration_id, origin, |
| 157 | std::move(description), icons, launch_url, |
| 158 | std::move(wrapped_callback))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 159 | } |
| 160 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 161 | void ContentIndexDatabase::AddEntryOnCoreThread( |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 162 | int64_t service_worker_registration_id, |
| 163 | const url::Origin& origin, |
| 164 | blink::mojom::ContentDescriptionPtr description, |
| 165 | const std::vector<SkBitmap>& icons, |
| 166 | const GURL& launch_url, |
| 167 | blink::mojom::ContentIndexService::AddCallback callback) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 168 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 169 | |
Rayan Kanso | 394af70 | 2019-07-25 12:50:37 | [diff] [blame] | 170 | if (blocked_origins_.count(origin)) { |
| 171 | // TODO(crbug.com/973844): Does this need a more specific error? |
| 172 | std::move(callback).Run(blink::mojom::ContentIndexError::STORAGE_ERROR); |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 173 | content_index::RecordRegistrationBlocked(description->category); |
Rayan Kanso | 394af70 | 2019-07-25 12:50:37 | [diff] [blame] | 174 | return; |
| 175 | } |
| 176 | |
Rayan Kanso | 947f56d | 2019-09-04 11:25:22 | [diff] [blame] | 177 | auto* service_worker_registration = |
| 178 | service_worker_context_->GetLiveRegistration( |
| 179 | service_worker_registration_id); |
| 180 | if (!service_worker_registration || |
| 181 | !service_worker_registration->active_version()) { |
| 182 | std::move(callback).Run(blink::mojom::ContentIndexError::NO_SERVICE_WORKER); |
| 183 | return; |
| 184 | } |
| 185 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 186 | auto serialized_icons = std::make_unique<proto::SerializedIcons>(); |
| 187 | proto::SerializedIcons* serialized_icons_ptr = serialized_icons.get(); |
| 188 | |
| 189 | auto barrier_closure = base::BarrierClosure( |
| 190 | icons.size(), |
| 191 | base::BindOnce(&ContentIndexDatabase::DidSerializeIcons, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 192 | weak_ptr_factory_core_.GetWeakPtr(), |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 193 | service_worker_registration_id, origin, |
| 194 | std::move(description), launch_url, |
| 195 | std::move(serialized_icons), std::move(callback))); |
| 196 | |
| 197 | for (const auto& icon : icons) { |
| 198 | SerializeIcon(icon, |
| 199 | base::BindOnce( |
| 200 | [](base::OnceClosure done_closure, |
| 201 | proto::SerializedIcons* icons, std::string icon) { |
| 202 | icons->add_icons()->set_icon(std::move(icon)); |
| 203 | std::move(done_closure).Run(); |
| 204 | }, |
| 205 | barrier_closure, serialized_icons_ptr)); |
| 206 | } |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 207 | } |
| 208 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 209 | void ContentIndexDatabase::DidSerializeIcons( |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 210 | int64_t service_worker_registration_id, |
| 211 | const url::Origin& origin, |
| 212 | blink::mojom::ContentDescriptionPtr description, |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 213 | const GURL& launch_url, |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 214 | std::unique_ptr<proto::SerializedIcons> serialized_icons, |
| 215 | blink::mojom::ContentIndexService::AddCallback callback) { |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 216 | base::Time entry_time = base::Time::Now(); |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 217 | std::string entry_key = EntryKey(description->id); |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 218 | std::string icon_key = IconsKey(description->id); |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 219 | std::string entry_value = |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 220 | CreateSerializedContentEntry(*description, launch_url, entry_time); |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 221 | std::string icons_value = serialized_icons->SerializeAsString(); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 222 | |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 223 | // Entry to pass over to the provider. |
| 224 | ContentIndexEntry entry(service_worker_registration_id, |
Rayan Kanso | 37c0870 | 2019-07-12 17:07:41 | [diff] [blame] | 225 | std::move(description), launch_url, entry_time); |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 226 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 227 | service_worker_context_->StoreRegistrationUserData( |
Nidhi Jaju | 18bd19e | 2020-09-11 04:43:16 | [diff] [blame] | 228 | service_worker_registration_id, origin, |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 229 | {{std::move(entry_key), std::move(entry_value)}, |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 230 | {std::move(icon_key), std::move(icons_value)}}, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 231 | base::BindOnce(&ContentIndexDatabase::DidAddEntry, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 232 | weak_ptr_factory_core_.GetWeakPtr(), std::move(callback), |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 233 | std::move(entry))); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 234 | } |
| 235 | |
| 236 | void ContentIndexDatabase::DidAddEntry( |
| 237 | blink::mojom::ContentIndexService::AddCallback callback, |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 238 | ContentIndexEntry entry, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 239 | blink::ServiceWorkerStatusCode status) { |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 240 | content_index::RecordDatabaseOperationStatus("Add", status); |
| 241 | |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 242 | if (status != blink::ServiceWorkerStatusCode::kOk) { |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 243 | std::move(callback).Run(blink::mojom::ContentIndexError::STORAGE_ERROR); |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 244 | return; |
| 245 | } |
| 246 | |
| 247 | std::move(callback).Run(blink::mojom::ContentIndexError::NONE); |
| 248 | |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 249 | std::vector<ContentIndexEntry> entries; |
| 250 | entries.push_back(std::move(entry)); |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 251 | GetUIThreadTaskRunner({})->PostTask( |
| 252 | FROM_HERE, |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 253 | base::BindOnce(&ContentIndexDatabase::NotifyProviderContentAdded, |
| 254 | weak_ptr_factory_ui_.GetWeakPtr(), std::move(entries))); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 255 | } |
| 256 | |
| 257 | void ContentIndexDatabase::DeleteEntry( |
| 258 | int64_t service_worker_registration_id, |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 259 | const url::Origin& origin, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 260 | const std::string& entry_id, |
| 261 | blink::mojom::ContentIndexService::DeleteCallback callback) { |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 262 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 263 | |
| 264 | auto wrapped_callback = base::BindOnce( |
| 265 | [](blink::mojom::ContentIndexService::DeleteCallback callback, |
| 266 | blink::mojom::ContentIndexError error) { |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 267 | GetUIThreadTaskRunner({})->PostTask( |
| 268 | FROM_HERE, base::BindOnce(std::move(callback), error)); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 269 | }, |
| 270 | std::move(callback)); |
| 271 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 272 | RunOrPostTaskOnThread( |
| 273 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 274 | base::BindOnce(&ContentIndexDatabase::DeleteEntryOnCoreThread, |
| 275 | weak_ptr_factory_core_.GetWeakPtr(), |
| 276 | service_worker_registration_id, origin, entry_id, |
| 277 | std::move(wrapped_callback))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 278 | } |
| 279 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 280 | void ContentIndexDatabase::DeleteEntryOnCoreThread( |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 281 | int64_t service_worker_registration_id, |
| 282 | const url::Origin& origin, |
| 283 | const std::string& entry_id, |
| 284 | blink::mojom::ContentIndexService::DeleteCallback callback) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 285 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 286 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 287 | service_worker_context_->ClearRegistrationUserData( |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 288 | service_worker_registration_id, {EntryKey(entry_id), IconsKey(entry_id)}, |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 289 | base::BindOnce(&ContentIndexDatabase::DidDeleteEntry, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 290 | weak_ptr_factory_core_.GetWeakPtr(), |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 291 | service_worker_registration_id, origin, entry_id, |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 292 | std::move(callback))); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 293 | } |
| 294 | |
| 295 | void ContentIndexDatabase::DidDeleteEntry( |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 296 | int64_t service_worker_registration_id, |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 297 | const url::Origin& origin, |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 298 | const std::string& entry_id, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 299 | blink::mojom::ContentIndexService::DeleteCallback callback, |
| 300 | blink::ServiceWorkerStatusCode status) { |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 301 | content_index::RecordDatabaseOperationStatus("Delete", status); |
| 302 | |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 303 | if (status != blink::ServiceWorkerStatusCode::kOk) { |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 304 | std::move(callback).Run(blink::mojom::ContentIndexError::STORAGE_ERROR); |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 305 | return; |
| 306 | } |
| 307 | |
| 308 | std::move(callback).Run(blink::mojom::ContentIndexError::NONE); |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 309 | |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 310 | GetUIThreadTaskRunner({})->PostTask( |
| 311 | FROM_HERE, |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 312 | base::BindOnce(&ContentIndexDatabase::NotifyProviderContentDeleted, |
| 313 | weak_ptr_factory_ui_.GetWeakPtr(), |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 314 | service_worker_registration_id, origin, entry_id)); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 315 | } |
| 316 | |
| 317 | void ContentIndexDatabase::GetDescriptions( |
| 318 | int64_t service_worker_registration_id, |
| 319 | blink::mojom::ContentIndexService::GetDescriptionsCallback callback) { |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 320 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 321 | |
| 322 | auto wrapped_callback = base::BindOnce( |
| 323 | [](blink::mojom::ContentIndexService::GetDescriptionsCallback callback, |
| 324 | blink::mojom::ContentIndexError error, |
| 325 | std::vector<blink::mojom::ContentDescriptionPtr> descriptions) { |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 326 | GetUIThreadTaskRunner({})->PostTask( |
| 327 | FROM_HERE, base::BindOnce(std::move(callback), error, |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 328 | std::move(descriptions))); |
| 329 | }, |
| 330 | std::move(callback)); |
| 331 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 332 | RunOrPostTaskOnThread( |
| 333 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 334 | base::BindOnce(&ContentIndexDatabase::GetDescriptionsOnCoreThread, |
| 335 | weak_ptr_factory_core_.GetWeakPtr(), |
| 336 | service_worker_registration_id, |
| 337 | std::move(wrapped_callback))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 338 | } |
| 339 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 340 | void ContentIndexDatabase::GetDescriptionsOnCoreThread( |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 341 | int64_t service_worker_registration_id, |
| 342 | blink::mojom::ContentIndexService::GetDescriptionsCallback callback) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 343 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 344 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 345 | service_worker_context_->GetRegistrationUserDataByKeyPrefix( |
| 346 | service_worker_registration_id, kEntryPrefix, |
| 347 | base::BindOnce(&ContentIndexDatabase::DidGetDescriptions, |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 348 | weak_ptr_factory_core_.GetWeakPtr(), |
| 349 | service_worker_registration_id, std::move(callback))); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 350 | } |
| 351 | |
| 352 | void ContentIndexDatabase::DidGetDescriptions( |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 353 | int64_t service_worker_registration_id, |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 354 | blink::mojom::ContentIndexService::GetDescriptionsCallback callback, |
| 355 | const std::vector<std::string>& data, |
| 356 | blink::ServiceWorkerStatusCode status) { |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 357 | content_index::RecordDatabaseOperationStatus("GetDescriptions", status); |
| 358 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 359 | if (status == blink::ServiceWorkerStatusCode::kErrorNotFound) { |
| 360 | std::move(callback).Run(blink::mojom::ContentIndexError::NONE, |
| 361 | /* descriptions= */ {}); |
| 362 | return; |
| 363 | } else if (status != blink::ServiceWorkerStatusCode::kOk) { |
| 364 | std::move(callback).Run(blink::mojom::ContentIndexError::STORAGE_ERROR, |
| 365 | /* descriptions= */ {}); |
| 366 | return; |
| 367 | } |
| 368 | |
| 369 | std::vector<blink::mojom::ContentDescriptionPtr> descriptions; |
| 370 | descriptions.reserve(data.size()); |
| 371 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 372 | for (const auto& serialized_entry : data) { |
| 373 | proto::ContentEntry entry; |
| 374 | if (!entry.ParseFromString(serialized_entry)) { |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 375 | ClearServiceWorkerDataOnCorruption(service_worker_registration_id); |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 376 | std::move(callback).Run(blink::mojom::ContentIndexError::STORAGE_ERROR, |
| 377 | /* descriptions= */ {}); |
| 378 | return; |
| 379 | } |
| 380 | |
| 381 | auto description = DescriptionFromProto(entry.description()); |
| 382 | if (!description) { |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 383 | // Clear entry data. |
| 384 | service_worker_context_->ClearRegistrationUserData( |
| 385 | service_worker_registration_id, |
| 386 | {EntryKey(entry.description().id()), |
| 387 | IconsKey(entry.description().id())}, |
| 388 | base::BindOnce(&content_index::RecordDatabaseOperationStatus, |
| 389 | "ClearCorruptedData")); |
| 390 | continue; |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 391 | } |
| 392 | |
| 393 | descriptions.push_back(std::move(description)); |
| 394 | } |
| 395 | |
| 396 | std::move(callback).Run(blink::mojom::ContentIndexError::NONE, |
| 397 | std::move(descriptions)); |
| 398 | } |
| 399 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 400 | void ContentIndexDatabase::GetIcons( |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 401 | int64_t service_worker_registration_id, |
| 402 | const std::string& description_id, |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 403 | ContentIndexContext::GetIconsCallback callback) { |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 404 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 405 | |
| 406 | auto wrapped_callback = base::BindOnce( |
| 407 | [](ContentIndexContext::GetIconsCallback callback, |
| 408 | std::vector<SkBitmap> icons) { |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 409 | GetUIThreadTaskRunner({})->PostTask( |
| 410 | FROM_HERE, base::BindOnce(std::move(callback), std::move(icons))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 411 | }, |
| 412 | std::move(callback)); |
| 413 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 414 | RunOrPostTaskOnThread( |
| 415 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 416 | base::BindOnce(&ContentIndexDatabase::GetIconsOnCoreThread, |
| 417 | weak_ptr_factory_core_.GetWeakPtr(), |
| 418 | service_worker_registration_id, description_id, |
| 419 | std::move(wrapped_callback))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 420 | } |
| 421 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 422 | void ContentIndexDatabase::GetIconsOnCoreThread( |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 423 | int64_t service_worker_registration_id, |
| 424 | const std::string& description_id, |
| 425 | ContentIndexContext::GetIconsCallback callback) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 426 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 427 | |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 428 | service_worker_context_->GetRegistrationUserData( |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 429 | service_worker_registration_id, {IconsKey(description_id)}, |
| 430 | base::BindOnce(&ContentIndexDatabase::DidGetSerializedIcons, |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 431 | weak_ptr_factory_core_.GetWeakPtr(), |
| 432 | service_worker_registration_id, std::move(callback))); |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 433 | } |
| 434 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 435 | void ContentIndexDatabase::DidGetSerializedIcons( |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 436 | int64_t service_worker_registration_id, |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 437 | ContentIndexContext::GetIconsCallback callback, |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 438 | const std::vector<std::string>& data, |
| 439 | blink::ServiceWorkerStatusCode status) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 440 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 441 | |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 442 | content_index::RecordDatabaseOperationStatus("GetIcon", status); |
| 443 | |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 444 | if (status != blink::ServiceWorkerStatusCode::kOk || data.empty()) { |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 445 | std::move(callback).Run({}); |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 446 | return; |
| 447 | } |
| 448 | |
| 449 | DCHECK_EQ(data.size(), 1u); |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 450 | proto::SerializedIcons serialized_icons; |
| 451 | if (!serialized_icons.ParseFromString(data.front())) { |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 452 | ClearServiceWorkerDataOnCorruption(service_worker_registration_id); |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 453 | std::move(callback).Run({}); |
| 454 | return; |
| 455 | } |
Rayan Kanso | 837b795 | 2019-07-01 10:31:29 | [diff] [blame] | 456 | |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 457 | if (serialized_icons.icons_size() == 0u) { |
| 458 | // There are no icons. |
| 459 | std::move(callback).Run({}); |
| 460 | return; |
| 461 | } |
| 462 | |
| 463 | auto icons = std::make_unique<std::vector<SkBitmap>>(); |
| 464 | std::vector<SkBitmap>* icons_ptr = icons.get(); |
| 465 | |
| 466 | auto barrier_closure = base::BarrierClosure( |
| 467 | serialized_icons.icons_size(), |
| 468 | base::BindOnce(&ContentIndexDatabase::DidDeserializeIcons, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 469 | weak_ptr_factory_core_.GetWeakPtr(), std::move(callback), |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 470 | std::move(icons))); |
| 471 | |
| 472 | for (auto& serialized_icon : *serialized_icons.mutable_icons()) { |
| 473 | DeserializeIcon(base::WrapUnique(serialized_icon.release_icon()), |
| 474 | base::BindOnce( |
| 475 | [](base::OnceClosure done_closure, |
| 476 | std::vector<SkBitmap>* icons, SkBitmap icon) { |
| 477 | icons->push_back(std::move(icon)); |
| 478 | std::move(done_closure).Run(); |
| 479 | }, |
| 480 | barrier_closure, icons_ptr)); |
| 481 | } |
| 482 | } |
| 483 | |
| 484 | void ContentIndexDatabase::DidDeserializeIcons( |
| 485 | ContentIndexContext::GetIconsCallback callback, |
| 486 | std::unique_ptr<std::vector<SkBitmap>> icons) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 487 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | b0f54fe | 2019-08-05 18:59:14 | [diff] [blame] | 488 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 489 | RunOrPostTaskOnThread(FROM_HERE, BrowserThread::UI, |
| 490 | base::BindOnce(std::move(callback), std::move(*icons))); |
Rayan Kanso | 03a847b | 2019-06-27 21:00:09 | [diff] [blame] | 491 | } |
| 492 | |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 493 | void ContentIndexDatabase::GetAllEntries( |
| 494 | ContentIndexContext::GetAllEntriesCallback callback) { |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 495 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 496 | |
| 497 | auto wrapped_callback = base::BindOnce( |
| 498 | [](ContentIndexContext::GetAllEntriesCallback callback, |
| 499 | blink::mojom::ContentIndexError error, |
| 500 | std::vector<ContentIndexEntry> entries) { |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 501 | GetUIThreadTaskRunner({})->PostTask( |
| 502 | FROM_HERE, |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 503 | base::BindOnce(std::move(callback), error, std::move(entries))); |
| 504 | }, |
| 505 | std::move(callback)); |
| 506 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 507 | RunOrPostTaskOnThread( |
| 508 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 509 | base::BindOnce(&ContentIndexDatabase::GetAllEntriesOnCoreThread, |
| 510 | weak_ptr_factory_core_.GetWeakPtr(), |
| 511 | std::move(wrapped_callback))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 512 | } |
| 513 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 514 | void ContentIndexDatabase::GetAllEntriesOnCoreThread( |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 515 | ContentIndexContext::GetAllEntriesCallback callback) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 516 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 517 | |
| 518 | service_worker_context_->GetUserDataForAllRegistrationsByKeyPrefix( |
| 519 | kEntryPrefix, |
| 520 | base::BindOnce(&ContentIndexDatabase::DidGetEntries, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 521 | weak_ptr_factory_core_.GetWeakPtr(), std::move(callback))); |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 522 | } |
| 523 | |
| 524 | void ContentIndexDatabase::DidGetEntries( |
| 525 | ContentIndexContext::GetAllEntriesCallback callback, |
| 526 | const std::vector<std::pair<int64_t, std::string>>& user_data, |
| 527 | blink::ServiceWorkerStatusCode status) { |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 528 | content_index::RecordDatabaseOperationStatus("GetAllEntries", status); |
| 529 | |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 530 | if (status != blink::ServiceWorkerStatusCode::kOk) { |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 531 | std::move(callback).Run(blink::mojom::ContentIndexError::STORAGE_ERROR, |
| 532 | /* entries= */ {}); |
| 533 | return; |
| 534 | } |
| 535 | |
| 536 | if (user_data.empty()) { |
| 537 | std::move(callback).Run(blink::mojom::ContentIndexError::NONE, |
| 538 | /* entries= */ {}); |
| 539 | return; |
| 540 | } |
| 541 | |
| 542 | std::vector<ContentIndexEntry> entries; |
| 543 | entries.reserve(user_data.size()); |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 544 | std::set<int64_t> corrupted_sw_ids; |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 545 | |
| 546 | for (const auto& ud : user_data) { |
| 547 | auto entry = EntryFromSerializedProto(ud.first, ud.second); |
| 548 | if (!entry) { |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 549 | corrupted_sw_ids.insert(ud.first); |
| 550 | continue; |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 551 | } |
| 552 | |
| 553 | entries.emplace_back(std::move(*entry)); |
| 554 | } |
| 555 | |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 556 | if (!corrupted_sw_ids.empty()) { |
| 557 | // Remove soon-to-be-deleted entries. |
| 558 | base::EraseIf(entries, [&corrupted_sw_ids](const auto& entry) { |
| 559 | return corrupted_sw_ids.count(entry.service_worker_registration_id); |
| 560 | }); |
| 561 | |
| 562 | for (int64_t service_worker_registration_id : corrupted_sw_ids) |
| 563 | ClearServiceWorkerDataOnCorruption(service_worker_registration_id); |
| 564 | } |
| 565 | |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 566 | std::move(callback).Run(blink::mojom::ContentIndexError::NONE, |
| 567 | std::move(entries)); |
| 568 | } |
| 569 | |
| 570 | void ContentIndexDatabase::GetEntry( |
| 571 | int64_t service_worker_registration_id, |
| 572 | const std::string& description_id, |
| 573 | ContentIndexContext::GetEntryCallback callback) { |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 574 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 575 | |
| 576 | auto wrapped_callback = base::BindOnce( |
| 577 | [](ContentIndexContext::GetEntryCallback callback, |
Anton Bikineev | f62d1bf | 2021-05-15 17:56:07 | [diff] [blame^] | 578 | absl::optional<ContentIndexEntry> entry) { |
Gabriel Charette | e7cdc5cd | 2020-05-27 23:35:05 | [diff] [blame] | 579 | GetUIThreadTaskRunner({})->PostTask( |
| 580 | FROM_HERE, base::BindOnce(std::move(callback), std::move(entry))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 581 | }, |
| 582 | std::move(callback)); |
| 583 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 584 | RunOrPostTaskOnThread( |
| 585 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 586 | base::BindOnce(&ContentIndexDatabase::GetEntryOnCoreThread, |
| 587 | weak_ptr_factory_core_.GetWeakPtr(), |
| 588 | service_worker_registration_id, description_id, |
| 589 | std::move(wrapped_callback))); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 590 | } |
| 591 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 592 | void ContentIndexDatabase::GetEntryOnCoreThread( |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 593 | int64_t service_worker_registration_id, |
| 594 | const std::string& description_id, |
| 595 | ContentIndexContext::GetEntryCallback callback) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 596 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 597 | |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 598 | service_worker_context_->GetRegistrationUserData( |
| 599 | service_worker_registration_id, {EntryKey(description_id)}, |
| 600 | base::BindOnce(&ContentIndexDatabase::DidGetEntry, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 601 | weak_ptr_factory_core_.GetWeakPtr(), |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 602 | service_worker_registration_id, std::move(callback))); |
| 603 | } |
| 604 | |
| 605 | void ContentIndexDatabase::DidGetEntry( |
| 606 | int64_t service_worker_registration_id, |
| 607 | ContentIndexContext::GetEntryCallback callback, |
| 608 | const std::vector<std::string>& data, |
| 609 | blink::ServiceWorkerStatusCode status) { |
Rayan Kanso | 9f3944a | 2019-07-30 12:18:07 | [diff] [blame] | 610 | content_index::RecordDatabaseOperationStatus("GetEntry", status); |
| 611 | |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 612 | if (status != blink::ServiceWorkerStatusCode::kOk) { |
Anton Bikineev | f62d1bf | 2021-05-15 17:56:07 | [diff] [blame^] | 613 | std::move(callback).Run(absl::nullopt); |
Rayan Kanso | e147def | 2019-07-22 09:56:35 | [diff] [blame] | 614 | return; |
| 615 | } |
| 616 | |
| 617 | DCHECK_EQ(data.size(), 1u); |
| 618 | std::move(callback).Run( |
| 619 | EntryFromSerializedProto(service_worker_registration_id, data.front())); |
| 620 | } |
| 621 | |
Rayan Kanso | 5e2ff0e | 2019-09-04 10:33:10 | [diff] [blame] | 622 | void ContentIndexDatabase::ClearServiceWorkerDataOnCorruption( |
| 623 | int64_t service_worker_registration_id) { |
| 624 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
| 625 | |
| 626 | service_worker_context_->ClearRegistrationUserDataByKeyPrefixes( |
| 627 | service_worker_registration_id, {kEntryPrefix, kIconPrefix}, |
| 628 | base::BindOnce(&content_index::RecordDatabaseOperationStatus, |
| 629 | "ClearCorruptedData")); |
| 630 | } |
| 631 | |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 632 | void ContentIndexDatabase::DeleteItem(int64_t service_worker_registration_id, |
| 633 | const url::Origin& origin, |
| 634 | const std::string& description_id) { |
| 635 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 636 | |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 637 | RunOrPostTaskOnThread( |
| 638 | FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), |
| 639 | base::BindOnce(&ContentIndexDatabase::DeleteEntryOnCoreThread, |
| 640 | weak_ptr_factory_core_.GetWeakPtr(), |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 641 | service_worker_registration_id, origin, description_id, |
| 642 | base::BindOnce(&ContentIndexDatabase::DidDeleteItem, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 643 | weak_ptr_factory_core_.GetWeakPtr(), |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 644 | service_worker_registration_id, origin, |
| 645 | description_id))); |
| 646 | } |
| 647 | |
| 648 | void ContentIndexDatabase::DidDeleteItem( |
| 649 | int64_t service_worker_registration_id, |
| 650 | const url::Origin& origin, |
| 651 | const std::string& description_id, |
| 652 | blink::mojom::ContentIndexError error) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 653 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 654 | |
| 655 | if (error != blink::mojom::ContentIndexError::NONE) |
| 656 | return; |
| 657 | |
| 658 | service_worker_context_->FindReadyRegistrationForId( |
Nidhi Jaju | 96d3809 | 2020-09-11 07:01:30 | [diff] [blame] | 659 | service_worker_registration_id, origin, |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 660 | base::BindOnce(&ContentIndexDatabase::StartActiveWorkerForDispatch, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 661 | weak_ptr_factory_core_.GetWeakPtr(), description_id)); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 662 | } |
| 663 | |
| 664 | void ContentIndexDatabase::StartActiveWorkerForDispatch( |
| 665 | const std::string& description_id, |
| 666 | blink::ServiceWorkerStatusCode service_worker_status, |
| 667 | scoped_refptr<ServiceWorkerRegistration> registration) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 668 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 669 | |
| 670 | content_index::RecordDisptachStatus("Find", service_worker_status); |
| 671 | |
| 672 | if (service_worker_status != blink::ServiceWorkerStatusCode::kOk) |
| 673 | return; |
| 674 | |
| 675 | ServiceWorkerVersion* service_worker_version = registration->active_version(); |
| 676 | DCHECK(service_worker_version); |
| 677 | |
| 678 | service_worker_version->RunAfterStartWorker( |
| 679 | ServiceWorkerMetrics::EventType::CONTENT_DELETE, |
| 680 | base::BindOnce(&ContentIndexDatabase::DeliverMessageToWorker, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 681 | weak_ptr_factory_core_.GetWeakPtr(), |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 682 | base::WrapRefCounted(service_worker_version), |
| 683 | std::move(registration), description_id)); |
| 684 | } |
| 685 | |
| 686 | void ContentIndexDatabase::DeliverMessageToWorker( |
| 687 | scoped_refptr<ServiceWorkerVersion> service_worker, |
| 688 | scoped_refptr<ServiceWorkerRegistration> registration, |
| 689 | const std::string& description_id, |
| 690 | blink::ServiceWorkerStatusCode service_worker_status) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 691 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 692 | |
| 693 | content_index::RecordDisptachStatus("Start", service_worker_status); |
| 694 | |
| 695 | if (service_worker_status != blink::ServiceWorkerStatusCode::kOk) |
| 696 | return; |
| 697 | |
| 698 | // Don't allow DB operations while the `contentdelete` event is firing. |
| 699 | // This is to prevent re-registering the deleted content within the event. |
Nidhi Jaju | e3c7dd4d | 2020-09-11 03:34:27 | [diff] [blame] | 700 | BlockOrigin(service_worker->origin()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 701 | |
| 702 | int request_id = service_worker->StartRequest( |
| 703 | ServiceWorkerMetrics::EventType::CONTENT_DELETE, |
| 704 | base::BindOnce(&ContentIndexDatabase::DidDispatchEvent, |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 705 | weak_ptr_factory_core_.GetWeakPtr(), |
Nidhi Jaju | e3c7dd4d | 2020-09-11 03:34:27 | [diff] [blame] | 706 | service_worker->origin())); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 707 | |
| 708 | service_worker->endpoint()->DispatchContentDeleteEvent( |
| 709 | description_id, service_worker->CreateSimpleEventCallback(request_id)); |
| 710 | } |
| 711 | |
| 712 | void ContentIndexDatabase::DidDispatchEvent( |
| 713 | const url::Origin& origin, |
| 714 | blink::ServiceWorkerStatusCode service_worker_status) { |
Matt Falkenhagen | 105efb82 | 2019-08-29 20:49:17 | [diff] [blame] | 715 | DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); |
Rayan Kanso | 7806f69 | 2019-08-21 12:30:44 | [diff] [blame] | 716 | |
| 717 | content_index::RecordDisptachStatus("Dispatch", service_worker_status); |
| 718 | UnblockOrigin(origin); |
| 719 | } |
| 720 | |
Rayan Kanso | 394af70 | 2019-07-25 12:50:37 | [diff] [blame] | 721 | void ContentIndexDatabase::BlockOrigin(const url::Origin& origin) { |
| 722 | blocked_origins_[origin]++; |
| 723 | } |
| 724 | |
| 725 | void ContentIndexDatabase::UnblockOrigin(const url::Origin& origin) { |
| 726 | DCHECK(blocked_origins_.count(origin)); |
| 727 | auto it = blocked_origins_.find(origin); |
| 728 | if (it->second == 1) |
| 729 | blocked_origins_.erase(it); |
| 730 | else |
| 731 | it->second--; |
| 732 | } |
| 733 | |
Rayan Kanso | ba07580 | 2019-06-28 16:33:48 | [diff] [blame] | 734 | void ContentIndexDatabase::Shutdown() { |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 735 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
Rayan Kanso | ba07580 | 2019-06-28 16:33:48 | [diff] [blame] | 736 | |
| 737 | provider_ = nullptr; |
| 738 | } |
| 739 | |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 740 | void ContentIndexDatabase::NotifyProviderContentAdded( |
| 741 | std::vector<ContentIndexEntry> entries) { |
| 742 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 743 | |
| 744 | if (!provider_) |
| 745 | return; |
| 746 | |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 747 | for (auto& entry : entries) |
| 748 | provider_->OnContentAdded(std::move(entry)); |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 749 | } |
| 750 | |
| 751 | void ContentIndexDatabase::NotifyProviderContentDeleted( |
| 752 | int64_t service_worker_registration_id, |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 753 | const url::Origin& origin, |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 754 | const std::string& entry_id) { |
| 755 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 756 | |
| 757 | if (!provider_) |
| 758 | return; |
| 759 | |
Rayan Kanso | a42c3caf | 2019-07-19 17:21:20 | [diff] [blame] | 760 | provider_->OnContentDeleted(service_worker_registration_id, origin, entry_id); |
Rayan Kanso | 24f7d41 | 2019-07-11 10:09:30 | [diff] [blame] | 761 | } |
| 762 | |
Rayan Kanso | 296eb3d | 2019-06-26 11:32:04 | [diff] [blame] | 763 | } // namespace content |