Commit 612fc04a authored by Victor Costan's avatar Victor Costan Committed by Chromium LUCI CQ

WebSQL: Clean up DatabaseQuotaClient.

* Add sequence checks.

* Replace base::PostTask*() calls with calling PostTask*() methods
  directly on TaskRunners.

* Use PostTaskAndReplyWithResult() instead of equivalent implementation
  based on PostTaskAndReply().

Change-Id: I291e6d9dea744bd1eb7c020f86cacf0f1ab40ae1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2633728
Auto-Submit: Victor Costan <pwnall@chromium.org>
Reviewed-by: default avatarJoshua Bell <jsbell@chromium.org>
Commit-Queue: Joshua Bell <jsbell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844905}
parent 5f31861b
...@@ -7,12 +7,15 @@ ...@@ -7,12 +7,15 @@
#include <stdint.h> #include <stdint.h>
#include <memory> #include <memory>
#include <string>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "base/bind.h" #include "base/bind.h"
#include "base/callback_helpers.h" #include "base/callback_helpers.h"
#include "base/location.h" #include "base/location.h"
#include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h"
#include "base/task_runner_util.h" #include "base/task_runner_util.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
#include "net/base/completion_once_callback.h" #include "net/base/completion_once_callback.h"
...@@ -38,32 +41,35 @@ int64_t GetOriginUsageOnDBThread(DatabaseTracker* db_tracker, ...@@ -38,32 +41,35 @@ int64_t GetOriginUsageOnDBThread(DatabaseTracker* db_tracker,
return 0; return 0;
} }
void GetOriginsOnDBThread(DatabaseTracker* db_tracker, std::vector<url::Origin> GetOriginsOnDBThread(DatabaseTracker* db_tracker) {
std::vector<url::Origin>* origins_ptr) { std::vector<url::Origin> all_origins;
std::vector<std::string> origin_identifiers; std::vector<std::string> origin_identifiers;
if (db_tracker->GetAllOriginIdentifiers(&origin_identifiers)) { if (db_tracker->GetAllOriginIdentifiers(&origin_identifiers)) {
all_origins.reserve(origin_identifiers.size());
for (const auto& identifier : origin_identifiers) { for (const auto& identifier : origin_identifiers) {
origins_ptr->push_back(GetOriginFromIdentifier(identifier)); all_origins.push_back(GetOriginFromIdentifier(identifier));
} }
} }
return all_origins;
} }
void GetOriginsForHostOnDBThread(DatabaseTracker* db_tracker, std::vector<url::Origin> GetOriginsForHostOnDBThread(
std::vector<url::Origin>* origins_ptr, DatabaseTracker* db_tracker,
const std::string& host) { const std::string& host) {
std::vector<url::Origin> host_origins;
// In the vast majority of cases, this vector will end up with exactly one
// origin. The origin will be https://host or http://host.
host_origins.reserve(1);
std::vector<std::string> origin_identifiers; std::vector<std::string> origin_identifiers;
if (db_tracker->GetAllOriginIdentifiers(&origin_identifiers)) { if (db_tracker->GetAllOriginIdentifiers(&origin_identifiers)) {
for (const auto& identifier : origin_identifiers) { for (const auto& identifier : origin_identifiers) {
url::Origin origin = GetOriginFromIdentifier(identifier); url::Origin origin = GetOriginFromIdentifier(identifier);
if (host == origin.host()) if (host == origin.host())
origins_ptr->push_back(std::move(origin)); host_origins.push_back(std::move(origin));
} }
} }
} return host_origins;
void DidGetQuotaClientOrigins(QuotaClient::GetOriginsForTypeCallback callback,
std::vector<url::Origin>* origins_ptr) {
std::move(callback).Run(*origins_ptr);
} }
void DidDeleteOriginData(base::SequencedTaskRunner* original_task_runner, void DidDeleteOriginData(base::SequencedTaskRunner* original_task_runner,
...@@ -89,25 +95,32 @@ void DidDeleteOriginData(base::SequencedTaskRunner* original_task_runner, ...@@ -89,25 +95,32 @@ void DidDeleteOriginData(base::SequencedTaskRunner* original_task_runner,
DatabaseQuotaClient::DatabaseQuotaClient( DatabaseQuotaClient::DatabaseQuotaClient(
scoped_refptr<DatabaseTracker> db_tracker) scoped_refptr<DatabaseTracker> db_tracker)
: db_tracker_(std::move(db_tracker)) {} : db_tracker_(std::move(db_tracker)) {
DCHECK(db_tracker_.get());
DETACH_FROM_SEQUENCE(sequence_checker_);
}
DatabaseQuotaClient::~DatabaseQuotaClient() { DatabaseQuotaClient::~DatabaseQuotaClient() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!db_tracker_->task_runner()->RunsTasksInCurrentSequence()) { if (!db_tracker_->task_runner()->RunsTasksInCurrentSequence()) {
db_tracker_->task_runner()->ReleaseSoon(FROM_HERE, std::move(db_tracker_)); db_tracker_->task_runner()->ReleaseSoon(FROM_HERE, std::move(db_tracker_));
} }
} }
void DatabaseQuotaClient::OnQuotaManagerDestroyed() {} void DatabaseQuotaClient::OnQuotaManagerDestroyed() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
void DatabaseQuotaClient::GetOriginUsage(const url::Origin& origin, void DatabaseQuotaClient::GetOriginUsage(const url::Origin& origin,
StorageType type, StorageType type,
GetOriginUsageCallback callback) { GetOriginUsageCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!callback.is_null()); DCHECK(!callback.is_null());
DCHECK(db_tracker_.get());
DCHECK_EQ(type, StorageType::kTemporary); DCHECK_EQ(type, StorageType::kTemporary);
base::PostTaskAndReplyWithResult( db_tracker_->task_runner()->PostTaskAndReplyWithResult(
db_tracker_->task_runner(), FROM_HERE, FROM_HERE,
base::BindOnce(&GetOriginUsageOnDBThread, base::RetainedRef(db_tracker_), base::BindOnce(&GetOriginUsageOnDBThread, base::RetainedRef(db_tracker_),
origin), origin),
std::move(callback)); std::move(callback));
...@@ -116,42 +129,36 @@ void DatabaseQuotaClient::GetOriginUsage(const url::Origin& origin, ...@@ -116,42 +129,36 @@ void DatabaseQuotaClient::GetOriginUsage(const url::Origin& origin,
void DatabaseQuotaClient::GetOriginsForType( void DatabaseQuotaClient::GetOriginsForType(
StorageType type, StorageType type,
GetOriginsForTypeCallback callback) { GetOriginsForTypeCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!callback.is_null()); DCHECK(!callback.is_null());
DCHECK(db_tracker_.get());
DCHECK_EQ(type, StorageType::kTemporary); DCHECK_EQ(type, StorageType::kTemporary);
auto* origins_ptr = new std::vector<url::Origin>(); db_tracker_->task_runner()->PostTaskAndReplyWithResult(
db_tracker_->task_runner()->PostTaskAndReply(
FROM_HERE, FROM_HERE,
base::BindOnce(&GetOriginsOnDBThread, base::RetainedRef(db_tracker_), base::BindOnce(&GetOriginsOnDBThread, base::RetainedRef(db_tracker_)),
base::Unretained(origins_ptr)), std::move(callback));
base::BindOnce(&DidGetQuotaClientOrigins, std::move(callback),
base::Owned(origins_ptr)));
} }
void DatabaseQuotaClient::GetOriginsForHost( void DatabaseQuotaClient::GetOriginsForHost(
StorageType type, StorageType type,
const std::string& host, const std::string& host,
GetOriginsForHostCallback callback) { GetOriginsForHostCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!callback.is_null()); DCHECK(!callback.is_null());
DCHECK(db_tracker_.get());
DCHECK_EQ(type, StorageType::kTemporary); DCHECK_EQ(type, StorageType::kTemporary);
auto* origins_ptr = new std::vector<url::Origin>(); db_tracker_->task_runner()->PostTaskAndReplyWithResult(
db_tracker_->task_runner()->PostTaskAndReply(
FROM_HERE, FROM_HERE,
base::BindOnce(&GetOriginsForHostOnDBThread, base::BindOnce(&GetOriginsForHostOnDBThread,
base::RetainedRef(db_tracker_), base::RetainedRef(db_tracker_), host),
base::Unretained(origins_ptr), host), std::move(callback));
base::BindOnce(&DidGetQuotaClientOrigins, std::move(callback),
base::Owned(origins_ptr)));
} }
void DatabaseQuotaClient::DeleteOriginData(const url::Origin& origin, void DatabaseQuotaClient::DeleteOriginData(const url::Origin& origin,
StorageType type, StorageType type,
DeleteOriginDataCallback callback) { DeleteOriginDataCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!callback.is_null()); DCHECK(!callback.is_null());
DCHECK(db_tracker_.get());
DCHECK_EQ(type, StorageType::kTemporary); DCHECK_EQ(type, StorageType::kTemporary);
// DidDeleteOriginData() translates the net::Error response to a // DidDeleteOriginData() translates the net::Error response to a
...@@ -173,8 +180,10 @@ void DatabaseQuotaClient::DeleteOriginData(const url::Origin& origin, ...@@ -173,8 +180,10 @@ void DatabaseQuotaClient::DeleteOriginData(const url::Origin& origin,
void DatabaseQuotaClient::PerformStorageCleanup( void DatabaseQuotaClient::PerformStorageCleanup(
blink::mojom::StorageType type, blink::mojom::StorageType type,
PerformStorageCleanupCallback callback) { PerformStorageCleanupCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!callback.is_null()); DCHECK(!callback.is_null());
DCHECK_EQ(type, StorageType::kTemporary); DCHECK_EQ(type, StorageType::kTemporary);
std::move(callback).Run(); std::move(callback).Run();
} }
......
...@@ -11,7 +11,9 @@ ...@@ -11,7 +11,9 @@
#include "base/component_export.h" #include "base/component_export.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/sequence_checker.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/thread_annotations.h"
#include "storage/browser/quota/quota_client.h" #include "storage/browser/quota/quota_client.h"
#include "storage/browser/quota/quota_client_type.h" #include "storage/browser/quota/quota_client_type.h"
#include "third_party/blink/public/mojom/quota/quota_types.mojom.h" #include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
...@@ -29,6 +31,9 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseQuotaClient ...@@ -29,6 +31,9 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseQuotaClient
public: public:
explicit DatabaseQuotaClient(scoped_refptr<DatabaseTracker> tracker); explicit DatabaseQuotaClient(scoped_refptr<DatabaseTracker> tracker);
DatabaseQuotaClient(const DatabaseQuotaClient&) = delete;
DatabaseQuotaClient& operator=(const DatabaseQuotaClient&) = delete;
// QuotaClient method overrides // QuotaClient method overrides
void OnQuotaManagerDestroyed() override; void OnQuotaManagerDestroyed() override;
void GetOriginUsage(const url::Origin& origin, void GetOriginUsage(const url::Origin& origin,
...@@ -48,9 +53,13 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseQuotaClient ...@@ -48,9 +53,13 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseQuotaClient
private: private:
~DatabaseQuotaClient() override; ~DatabaseQuotaClient() override;
scoped_refptr<DatabaseTracker> db_tracker_; // only used on its sequence SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(DatabaseQuotaClient); // The scoped_refptr is only be dereferenced on the QuotaClient's sequence.
// However, the DatabaseTracker it points to must only be used on the database
// sequence.
scoped_refptr<DatabaseTracker> db_tracker_
GUARDED_BY_CONTEXT(sequence_checker_);
}; };
} // namespace storage } // namespace storage
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment