| Index: content/browser/service_worker/service_worker_database.cc
|
| diff --git a/content/browser/service_worker/service_worker_database.cc b/content/browser/service_worker/service_worker_database.cc
|
| index 530617db68bb909633747a8212ee96fa2942f6b1..30c8860563550f153f8fb8292a4f1ed2ce77e8bb 100644
|
| --- a/content/browser/service_worker/service_worker_database.cc
|
| +++ b/content/browser/service_worker/service_worker_database.cc
|
| @@ -24,6 +24,21 @@
|
| #include "third_party/leveldatabase/src/include/leveldb/db.h"
|
| #include "third_party/leveldatabase/src/include/leveldb/env.h"
|
| #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
|
| +// third_party/webrtc/base/thread_checker.h leaks the define
|
| +// EXCLUSIVE_LOCKS_REQUIRED and more which collide with the same define in
|
| +// third_party/leveldatabase/src/port/thread_annotations.
|
| +#undef EXCLUSIVE_LOCKS_REQUIRED
|
| +#undef SHARED_LOCKS_REQUIRED
|
| +#undef LOCKS_EXCLUDED
|
| +#undef LOCK_RETURNED
|
| +#undef LOCKABLE
|
| +#undef SCOPED_LOCKABLE
|
| +#undef EXCLUSIVE_LOCK_FUNCTION
|
| +#undef SHARED_LOCK_FUNCTION
|
| +#undef EXCLUSIVE_TRYLOCK_FUNCTION
|
| +#undef SHARED_TRYLOCK_FUNCTION
|
| +#undef UNLOCK_FUNCTION
|
| +#undef NO_THREAD_SAFETY_ANALYSIS
|
| #include "url/origin.h"
|
|
|
| // LevelDB database schema
|
| @@ -107,12 +122,12 @@ const char kRegUserDataKeyPrefix[] = "REG_USER_DATA:";
|
| const char kRegHasUserDataKeyPrefix[] = "REG_HAS_USER_DATA:";
|
| const char kRegIdToOriginKeyPrefix[] = "REGID_TO_ORIGIN:";
|
| const char kResKeyPrefix[] = "RES:";
|
| -const char kKeySeparator = '\x00';
|
| +const char kSWKeySeparator = '\x00';
|
|
|
| const char kUncommittedResIdKeyPrefix[] = "URES:";
|
| const char kPurgeableResIdKeyPrefix[] = "PRES:";
|
|
|
| -const int64_t kCurrentSchemaVersion = 2;
|
| +const int64_t kSWCurrentSchemaVersion = 2;
|
|
|
| class ServiceWorkerEnv : public leveldb_env::ChromiumEnv {
|
| public:
|
| @@ -134,7 +149,7 @@ bool RemovePrefix(const std::string& str,
|
|
|
| std::string CreateRegistrationKeyPrefix(const GURL& origin) {
|
| return base::StringPrintf("%s%s%c", kRegKeyPrefix,
|
| - origin.GetOrigin().spec().c_str(), kKeySeparator);
|
| + origin.GetOrigin().spec().c_str(), kSWKeySeparator);
|
| }
|
|
|
| std::string CreateRegistrationKey(int64_t registration_id, const GURL& origin) {
|
| @@ -146,7 +161,7 @@ std::string CreateResourceRecordKeyPrefix(int64_t version_id) {
|
| return base::StringPrintf("%s%s%c",
|
| kResKeyPrefix,
|
| base::Int64ToString(version_id).c_str(),
|
| - kKeySeparator);
|
| + kSWKeySeparator);
|
| }
|
|
|
| std::string CreateResourceRecordKey(int64_t version_id, int64_t resource_id) {
|
| @@ -173,7 +188,7 @@ std::string CreateUserDataKeyPrefix(int64_t registration_id) {
|
| return base::StringPrintf("%s%s%c",
|
| kRegUserDataKeyPrefix,
|
| base::Int64ToString(registration_id).c_str(),
|
| - kKeySeparator);
|
| + kSWKeySeparator);
|
| }
|
|
|
| std::string CreateUserDataKey(int64_t registration_id,
|
| @@ -183,7 +198,7 @@ std::string CreateUserDataKey(int64_t registration_id,
|
|
|
| std::string CreateHasUserDataKeyPrefix(const std::string& user_data_name) {
|
| return base::StringPrintf("%s%s%c", kRegHasUserDataKeyPrefix,
|
| - user_data_name.c_str(), kKeySeparator);
|
| + user_data_name.c_str(), kSWKeySeparator);
|
| }
|
|
|
| std::string CreateHasUserDataKey(int64_t registration_id,
|
| @@ -225,7 +240,7 @@ ServiceWorkerDatabase::Status ParseId(const std::string& serialized,
|
| return ServiceWorkerDatabase::STATUS_OK;
|
| }
|
|
|
| -ServiceWorkerDatabase::Status LevelDBStatusToStatus(
|
| +ServiceWorkerDatabase::Status LevelDBStatusToSWStatus(
|
| const leveldb::Status& status) {
|
| if (status.ok())
|
| return ServiceWorkerDatabase::STATUS_OK;
|
| @@ -352,7 +367,7 @@ ServiceWorkerDatabase::GetOriginsWithRegistrations(std::set<GURL>* origins) {
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(kUniqueOriginKey); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| origins->clear();
|
| break;
|
| @@ -393,7 +408,7 @@ ServiceWorkerDatabase::GetOriginsWithForeignFetchRegistrations(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(kForeignFetchOriginKey); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| origins->clear();
|
| break;
|
| @@ -437,7 +452,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetRegistrationsForOrigin(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| registrations->clear();
|
| if (opt_resources_list)
|
| @@ -490,7 +505,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetAllRegistrations(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(kRegKeyPrefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| registrations->clear();
|
| break;
|
| @@ -558,7 +573,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationOrigin(
|
| return status;
|
|
|
| std::string value;
|
| - status = LevelDBStatusToStatus(
|
| + status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(),
|
| CreateRegistrationIdToOriginKey(registration_id), &value));
|
| if (status != STATUS_OK) {
|
| @@ -868,7 +883,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadUserData(
|
| for (size_t i = 0; i < user_data_names.size(); i++) {
|
| const std::string key =
|
| CreateUserDataKey(registration_id, user_data_names[i]);
|
| - status = LevelDBStatusToStatus(
|
| + status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(), key, &(*user_data_values)[i]));
|
| if (status != STATUS_OK) {
|
| user_data_values->clear();
|
| @@ -900,7 +915,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadUserDataByKeyPrefix(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| user_data_values->clear();
|
| break;
|
| @@ -910,7 +925,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadUserDataByKeyPrefix(
|
| break;
|
|
|
| std::string user_data_value;
|
| - status = LevelDBStatusToStatus(
|
| + status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(), itr->key(), &user_data_value));
|
| if (status != STATUS_OK) {
|
| user_data_values->clear();
|
| @@ -1004,7 +1019,7 @@ ServiceWorkerDatabase::DeleteUserDataByKeyPrefixes(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| @@ -1048,7 +1063,7 @@ ServiceWorkerDatabase::ReadUserDataForAllRegistrations(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| user_data->clear();
|
| break;
|
| @@ -1068,7 +1083,7 @@ ServiceWorkerDatabase::ReadUserDataForAllRegistrations(
|
| }
|
|
|
| std::string value;
|
| - status = LevelDBStatusToStatus(
|
| + status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(),
|
| CreateUserDataKey(registration_id, user_data_name), &value));
|
| if (status != STATUS_OK) {
|
| @@ -1101,7 +1116,7 @@ ServiceWorkerDatabase::ReadUserDataForAllRegistrationsByKeyPrefix(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| user_data->clear();
|
| break;
|
| @@ -1117,7 +1132,7 @@ ServiceWorkerDatabase::ReadUserDataForAllRegistrationsByKeyPrefix(
|
| }
|
|
|
| std::vector<std::string> parts = base::SplitString(
|
| - user_data_name_with_id, base::StringPrintf("%c", kKeySeparator),
|
| + user_data_name_with_id, base::StringPrintf("%c", kSWKeySeparator),
|
| base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
|
| if (parts.size() != 2) {
|
| status = STATUS_ERROR_CORRUPTED;
|
| @@ -1133,7 +1148,7 @@ ServiceWorkerDatabase::ReadUserDataForAllRegistrationsByKeyPrefix(
|
| }
|
|
|
| std::string value;
|
| - status = LevelDBStatusToStatus(
|
| + status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(),
|
| CreateUserDataKey(registration_id, parts[0]), &value));
|
| if (status != STATUS_OK) {
|
| @@ -1284,7 +1299,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen(
|
| options.env = g_service_worker_env.Pointer();
|
| }
|
|
|
| - Status status = LevelDBStatusToStatus(
|
| + Status status = LevelDBStatusToSWStatus(
|
| leveldb_env::OpenDB(options, path_.AsUTF8Unsafe(), &db_));
|
| HandleOpenResult(FROM_HERE, status);
|
| if (status != STATUS_OK) {
|
| @@ -1309,7 +1324,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen(
|
| Disable(FROM_HERE, status);
|
| return status;
|
| case 2:
|
| - DCHECK_EQ(db_version, kCurrentSchemaVersion);
|
| + DCHECK_EQ(db_version, kSWCurrentSchemaVersion);
|
| state_ = INITIALIZED;
|
| return STATUS_OK;
|
| default:
|
| @@ -1335,7 +1350,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId(
|
| DCHECK(next_avail_id);
|
|
|
| std::string value;
|
| - Status status = LevelDBStatusToStatus(
|
| + Status status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(), id_key, &value));
|
| if (status == STATUS_ERROR_NOT_FOUND) {
|
| // Nobody has gotten the next resource id for |id_key|.
|
| @@ -1360,7 +1375,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData(
|
|
|
| const std::string key = CreateRegistrationKey(registration_id, origin);
|
| std::string value;
|
| - Status status = LevelDBStatusToStatus(
|
| + Status status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(), key, &value));
|
| if (status != STATUS_OK) {
|
| HandleReadResult(
|
| @@ -1522,7 +1537,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| - Status status = LevelDBStatusToStatus(itr->status());
|
| + Status status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| resources->clear();
|
| break;
|
| @@ -1623,7 +1638,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteResourceRecords(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK)
|
| break;
|
|
|
| @@ -1668,7 +1683,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceIds(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(id_key_prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK) {
|
| ids->clear();
|
| break;
|
| @@ -1747,7 +1762,7 @@ ServiceWorkerDatabase::DeleteUserDataForRegistration(
|
| std::unique_ptr<leveldb::Iterator> itr(
|
| db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| - status = LevelDBStatusToStatus(itr->status());
|
| + status = LevelDBStatusToSWStatus(itr->status());
|
| if (status != STATUS_OK)
|
| break;
|
|
|
| @@ -1767,7 +1782,7 @@ ServiceWorkerDatabase::DeleteUserDataForRegistration(
|
| ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion(
|
| int64_t* db_version) {
|
| std::string value;
|
| - Status status = LevelDBStatusToStatus(
|
| + Status status = LevelDBStatusToSWStatus(
|
| db_->Get(leveldb::ReadOptions(), kDatabaseVersionKey, &value));
|
| if (status == STATUS_ERROR_NOT_FOUND) {
|
| // The database hasn't been initialized yet.
|
| @@ -1783,7 +1798,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion(
|
|
|
| const int kFirstValidVersion = 1;
|
| if (!base::StringToInt64(value, db_version) ||
|
| - *db_version < kFirstValidVersion || kCurrentSchemaVersion < *db_version) {
|
| + *db_version < kFirstValidVersion || kSWCurrentSchemaVersion < *db_version) {
|
| status = STATUS_ERROR_CORRUPTED;
|
| HandleReadResult(FROM_HERE, status);
|
| return status;
|
| @@ -1801,11 +1816,11 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch(
|
|
|
| if (state_ == UNINITIALIZED) {
|
| // Write database default values.
|
| - batch->Put(kDatabaseVersionKey, base::Int64ToString(kCurrentSchemaVersion));
|
| + batch->Put(kDatabaseVersionKey, base::Int64ToString(kSWCurrentSchemaVersion));
|
| state_ = INITIALIZED;
|
| }
|
|
|
| - Status status = LevelDBStatusToStatus(
|
| + Status status = LevelDBStatusToSWStatus(
|
| db_->Write(leveldb::WriteOptions(), batch));
|
| HandleWriteResult(FROM_HERE, status);
|
| return status;
|
|
|