Bug 1731546 - Replace existing ToResultGet uses with MOZ_TO_RESULT_GET_TYPED; r=dom-storage-reviewers,jstutte,jari

Differential Revision: https://phabricator.services.mozilla.com/D125325
This commit is contained in:
Jan Varga 2021-10-11 06:00:15 +00:00
parent a2602f840c
commit 5a11502111
10 changed files with 153 additions and 61 deletions

View File

@ -163,11 +163,11 @@ Result<nsCOMPtr<mozIStorageConnection>, nsresult> OpenDBConnection(
.SetQuery("cache=private"_ns + directoryLockIdClause)
.Finalize(dbFileUrl)));
QM_TRY_INSPECT(
const auto& storageService,
ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService), MOZ_STORAGE_SERVICE_CONTRACTID),
Err(NS_ERROR_UNEXPECTED));
QM_TRY_INSPECT(const auto& storageService,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID),
Err(NS_ERROR_UNEXPECTED));
QM_TRY_UNWRAP(
auto conn,

View File

@ -1034,7 +1034,8 @@ Result<EntryIds, nsresult> QueryCache(mozIStorageConnection& aConn,
QM_TRY(MOZ_TO_RESULT(state->BindInt64ByName("cache_id"_ns, aCacheId)));
QM_TRY_INSPECT(const auto& crypto, ToResultGet<nsCOMPtr<nsICryptoHash>>(
QM_TRY_INSPECT(const auto& crypto,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsICryptoHash>,
MOZ_SELECT_OVERLOAD(do_CreateInstance),
NS_CRYPTO_HASH_CONTRACTID));
@ -1498,7 +1499,8 @@ nsresult InsertEntry(mozIStorageConnection& aConn, CacheId aCacheId,
const nsID* aResponseBodyId) {
MOZ_ASSERT(!NS_IsMainThread());
QM_TRY_INSPECT(const auto& crypto, ToResultGet<nsCOMPtr<nsICryptoHash>>(
QM_TRY_INSPECT(const auto& crypto,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsICryptoHash>,
MOZ_SELECT_OVERLOAD(do_CreateInstance),
NS_CRYPTO_HASH_CONTRACTID));

View File

@ -131,9 +131,10 @@ Result<std::pair<nsID, nsCOMPtr<nsISupports>>, nsresult> BodyStartWriteStream(
MOZ_DIAGNOSTIC_ASSERT(aClosure);
MOZ_DIAGNOSTIC_ASSERT(aCallback);
QM_TRY_INSPECT(const auto& idGen, ToResultGet<nsCOMPtr<nsIUUIDGenerator>>(
MOZ_SELECT_OVERLOAD(do_GetService),
"@mozilla.org/uuid-generator;1"));
QM_TRY_INSPECT(const auto& idGen,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsIUUIDGenerator>,
MOZ_SELECT_OVERLOAD(do_GetService),
"@mozilla.org/uuid-generator;1"));
nsID id;
QM_TRY(MOZ_TO_RESULT(idGen->GenerateUUIDInPlace(&id)));

View File

@ -589,14 +589,16 @@ Result<nsCOMPtr<nsIFileURL>, nsresult> GetDatabaseFileURL(
const Maybe<CipherKey>& aMaybeKey) {
MOZ_ASSERT(aDirectoryLockId >= -1);
QM_TRY_INSPECT(const auto& protocolHandler,
ToResultGet<nsCOMPtr<nsIProtocolHandler>>(
MOZ_SELECT_OVERLOAD(do_GetService),
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "file"));
QM_TRY_INSPECT(
const auto& protocolHandler,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsIProtocolHandler>,
MOZ_SELECT_OVERLOAD(do_GetService),
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "file"));
QM_TRY_INSPECT(const auto& fileHandler,
ToResultGet<nsCOMPtr<nsIFileProtocolHandler>>(
MOZ_SELECT_OVERLOAD(do_QueryInterface), protocolHandler));
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsIFileProtocolHandler>,
MOZ_SELECT_OVERLOAD(do_QueryInterface),
protocolHandler));
QM_TRY_INSPECT(const auto& mutator, MOZ_TO_RESULT_INVOKE_TYPED(
nsCOMPtr<nsIURIMutator>, fileHandler,
@ -843,10 +845,10 @@ CreateStorageConnection(nsIFile& aDBFile, nsIFile& aFMDirectory,
QM_TRY_INSPECT(const auto& dbFileUrl,
GetDatabaseFileURL(aDBFile, aDirectoryLockId, aMaybeKey));
QM_TRY_INSPECT(
const auto& storageService,
ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService), MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& storageService,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(
auto connection,
@ -1101,10 +1103,10 @@ GetStorageConnection(nsIFile& aDatabaseFile, const int64_t aDirectoryLockId,
const auto& dbFileUrl,
GetDatabaseFileURL(aDatabaseFile, aDirectoryLockId, aMaybeKey));
QM_TRY_INSPECT(
const auto& storageService,
ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService), MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& storageService,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(
nsCOMPtr<mozIStorageConnection> connection,

View File

@ -103,10 +103,10 @@ Result<StructuredCloneFileParent, nsresult> DeserializeStructuredCloneFile(
const StructuredCloneFileBase::FileType type =
ToStructuredCloneFileType(aText.First());
QM_TRY_INSPECT(
const auto& id,
ToResultGet<int32_t>(
ToInteger, type == StructuredCloneFileBase::eBlob
QM_TRY_INSPECT(const auto& id,
MOZ_TO_RESULT_GET_TYPED(
int32_t, ToInteger,
type == StructuredCloneFileBase::eBlob
? aText
: static_cast<const nsAString&>(Substring(aText, 1))));

View File

@ -468,10 +468,10 @@ Result<nsCOMPtr<mozIStorageConnection>, nsresult> CreateStorageConnection(
// XXX Common logic should be refactored out of this method and
// cache::DBAction::OpenDBConnection, and maybe other similar functions.
QM_TRY_INSPECT(
const auto& storageService,
ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService), MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& storageService,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
// XXX We can't use QM_OR_ELSE_WARN_IF because base-toolchains builds fail
// with: error: use of 'tryResult28' before deduction of 'auto'
@ -651,9 +651,10 @@ Result<nsCOMPtr<mozIStorageConnection>, nsresult> GetStorageConnection(
QM_TRY(OkIf(exists), Err(NS_ERROR_FAILURE));
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(auto connection,
MOZ_TO_RESULT_INVOKE_TYPED(nsCOMPtr<mozIStorageConnection>, ss,
@ -697,9 +698,10 @@ CreateArchiveStorageConnection(const nsAString& aStoragePath) {
return nsCOMPtr<mozIStorageConnection>{};
}
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(
auto connection,
@ -832,9 +834,10 @@ Result<nsCOMPtr<mozIStorageConnection>, nsresult> CreateShadowStorageConnection(
QM_TRY_INSPECT(const auto& shadowFile, GetShadowFile(aBasePath));
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(
auto connection,
@ -904,9 +907,10 @@ Result<nsCOMPtr<mozIStorageConnection>, nsresult> GetShadowStorageConnection(
QM_TRY(OkIf(exists), Err(NS_ERROR_FAILURE));
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_RETURN(MOZ_TO_RESULT_INVOKE_TYPED(nsCOMPtr<mozIStorageConnection>, ss,
OpenUnsharedDatabase, shadowFile));

View File

@ -5612,9 +5612,10 @@ Result<Ok, nsresult> QuotaManager::CopyLocalStorageArchiveFromWebAppsStore(
#endif
// Get the storage service first, we will need it at multiple places.
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
// Get the web apps store file.
QM_TRY_INSPECT(const auto& webAppsStoreFile, QM_NewLocalFile(mBasePath));
@ -5739,9 +5740,10 @@ QuotaManager::CreateLocalStorageArchiveConnection(
// (similarly as wrong content of the file).
QM_TRY(OkIf(!isDirectory), Err(NS_ERROR_FILE_CORRUPTED));
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
// This may return NS_ERROR_FILE_CORRUPTED too.
QM_TRY_UNWRAP(auto connection, MOZ_TO_RESULT_INVOKE_TYPED(
@ -6108,9 +6110,10 @@ Result<Ok, nsresult> QuotaManager::CreateEmptyLocalStorageArchive(
// words, finishing what was started here).
}
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(
const auto connection,
@ -6142,9 +6145,10 @@ nsresult QuotaManager::EnsureStorageIsInitialized() {
QM_TRY(MOZ_TO_RESULT(MaybeUpgradeToDefaultStorageDirectory(*storageFile)));
QM_TRY_INSPECT(const auto& ss, ToResultGet<nsCOMPtr<mozIStorageService>>(
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_INSPECT(const auto& ss,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<mozIStorageService>,
MOZ_SELECT_OVERLOAD(do_GetService),
MOZ_STORAGE_SERVICE_CONTRACTID));
QM_TRY_UNWRAP(
auto connection,
@ -6350,8 +6354,9 @@ nsresult QuotaManager::EnsureTemporaryStorageIsInitialized() {
QM_TRY_INSPECT(
const auto& storageDir,
ToResultGet<nsCOMPtr<nsIFile>>(MOZ_SELECT_OVERLOAD(do_CreateInstance),
NS_LOCAL_FILE_CONTRACTID));
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsIFile>,
MOZ_SELECT_OVERLOAD(do_CreateInstance),
NS_LOCAL_FILE_CONTRACTID));
QM_TRY(MOZ_TO_RESULT(storageDir->InitWithPath(GetStoragePath())));

View File

@ -130,9 +130,10 @@ Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath) {
MOZ_ASSERT(gUseDOSDevicePathSyntax != -1);
if (gUseDOSDevicePathSyntax) {
QM_TRY_INSPECT(const auto& winFile,
ToResultGet<nsCOMPtr<nsILocalFileWin>>(
MOZ_SELECT_OVERLOAD(do_QueryInterface), file));
QM_TRY_INSPECT(
const auto& winFile,
MOZ_TO_RESULT_GET_TYPED(nsCOMPtr<nsILocalFileWin>,
MOZ_SELECT_OVERLOAD(do_QueryInterface), file));
MOZ_ASSERT(winFile);
winFile->SetUseDOSDevicePathSyntax(true);

View File

@ -1061,6 +1061,9 @@ Result<R, nsresult> ToResultGet(const Func& aFunc, Args&&... aArgs) {
return res;
}
#define MOZ_TO_RESULT_GET_TYPED(resultType, ...) \
::mozilla::ToResultGet<MOZ_REMOVE_PAREN(resultType)>(__VA_ARGS__)
// Like Rust's collect with a step function, not a generic iterator/range.
//
// Cond must be a function type with a return type to Result<V, E>, where

View File

@ -1601,6 +1601,80 @@ TEST(QuotaCommon_ToResultGet, Lambda_WithInput_Err)
EXPECT_EQ(res.unwrapErr(), NS_ERROR_FAILURE);
}
TEST(QuotaCommon_ToResultGet, Lambda_NoInput_Macro_Typed)
{
auto res = MOZ_TO_RESULT_GET_TYPED(int32_t, [](nsresult* aRv) -> int32_t {
*aRv = NS_OK;
return 42;
});
static_assert(std::is_same_v<decltype(res), Result<int32_t, nsresult>>);
EXPECT_TRUE(res.isOk());
EXPECT_EQ(res.unwrap(), 42);
}
TEST(QuotaCommon_ToResultGet, Lambda_NoInput_Macro_Typed_Parens)
{
auto res =
MOZ_TO_RESULT_GET_TYPED((std::pair<int32_t, int32_t>),
[](nsresult* aRv) -> std::pair<int32_t, int32_t> {
*aRv = NS_OK;
return std::pair{42, 42};
});
static_assert(std::is_same_v<decltype(res),
Result<std::pair<int32_t, int32_t>, nsresult>>);
EXPECT_TRUE(res.isOk());
EXPECT_EQ(res.unwrap(), (std::pair{42, 42}));
}
TEST(QuotaCommon_ToResultGet, Lambda_NoInput_Err_Macro_Typed)
{
auto res = MOZ_TO_RESULT_GET_TYPED(int32_t, [](nsresult* aRv) -> int32_t {
*aRv = NS_ERROR_FAILURE;
return -1;
});
static_assert(std::is_same_v<decltype(res), Result<int32_t, nsresult>>);
EXPECT_TRUE(res.isErr());
EXPECT_EQ(res.unwrapErr(), NS_ERROR_FAILURE);
}
TEST(QuotaCommon_ToResultGet, Lambda_WithInput_Macro_Typed)
{
auto res = MOZ_TO_RESULT_GET_TYPED(
int32_t,
[](int32_t aValue, nsresult* aRv) -> int32_t {
*aRv = NS_OK;
return aValue * 2;
},
42);
static_assert(std::is_same_v<decltype(res), Result<int32_t, nsresult>>);
EXPECT_TRUE(res.isOk());
EXPECT_EQ(res.unwrap(), 84);
}
TEST(QuotaCommon_ToResultGet, Lambda_WithInput_Err_Macro_Typed)
{
auto res = MOZ_TO_RESULT_GET_TYPED(
int32_t,
[](int32_t aValue, nsresult* aRv) -> int32_t {
*aRv = NS_ERROR_FAILURE;
return -1;
},
42);
static_assert(std::is_same_v<decltype(res), Result<int32_t, nsresult>>);
EXPECT_TRUE(res.isErr());
EXPECT_EQ(res.unwrapErr(), NS_ERROR_FAILURE);
}
// BEGIN COPY FROM mfbt/tests/TestResult.cpp
struct Failed {};