Bug 1397128 P7 Add an OpenMode enumeration to control if individual Cache API requests eagerly or lazily opens bodies. r=tt

This commit is contained in:
Ben Kelly 2017-09-15 09:11:23 -07:00
parent 60cc17beb8
commit 66d9e5a447
6 changed files with 52 additions and 19 deletions

12
dom/cache/Cache.cpp vendored
View File

@ -285,7 +285,9 @@ Cache::Match(JSContext* aCx, const RequestOrUSVString& aRequest,
CacheQueryParams params;
ToCacheQueryParams(params, aOptions);
AutoChildOpArgs args(this, CacheMatchArgs(CacheRequest(), params), 1);
AutoChildOpArgs args(this,
CacheMatchArgs(CacheRequest(), params, OpenMode::Eager),
1);
args.Add(ir, IgnoreBody, IgnoreInvalidScheme, aRv);
if (NS_WARN_IF(aRv.Failed())) {
@ -309,7 +311,9 @@ Cache::MatchAll(JSContext* aCx, const Optional<RequestOrUSVString>& aRequest,
CacheQueryParams params;
ToCacheQueryParams(params, aOptions);
AutoChildOpArgs args(this, CacheMatchAllArgs(void_t(), params), 1);
AutoChildOpArgs args(this,
CacheMatchAllArgs(void_t(), params, OpenMode::Eager),
1);
if (aRequest.WasPassed()) {
RefPtr<InternalRequest> ir = ToInternalRequest(aCx, aRequest.Value(),
@ -491,7 +495,9 @@ Cache::Keys(JSContext* aCx, const Optional<RequestOrUSVString>& aRequest,
CacheQueryParams params;
ToCacheQueryParams(params, aOptions);
AutoChildOpArgs args(this, CacheKeysArgs(void_t(), params), 1);
AutoChildOpArgs args(this,
CacheKeysArgs(void_t(), params, OpenMode::Eager),
1);
if (aRequest.WasPassed()) {
RefPtr<InternalRequest> ir =

View File

@ -333,7 +333,7 @@ CacheStorage::Match(JSContext* aCx, const RequestOrUSVString& aRequest,
nsAutoPtr<Entry> entry(new Entry());
entry->mPromise = promise;
entry->mArgs = StorageMatchArgs(CacheRequest(), params);
entry->mArgs = StorageMatchArgs(CacheRequest(), params, OpenMode::Eager);
entry->mRequest = request;
mPendingRequests.AppendElement(entry.forget());

View File

@ -10,6 +10,7 @@ include ChannelInfo;
include PBackgroundSharedTypes;
using HeadersGuardEnum from "mozilla/dom/FetchIPCTypes.h";
using OpenMode from "mozilla/dom/cache/IPCUtils.h";
using ReferrerPolicy from "mozilla/dom/FetchIPCTypes.h";
using RequestCredentials from "mozilla/dom/FetchIPCTypes.h";
using RequestMode from "mozilla/dom/FetchIPCTypes.h";
@ -106,12 +107,14 @@ struct CacheMatchArgs
{
CacheRequest request;
CacheQueryParams params;
OpenMode openMode;
};
struct CacheMatchAllArgs
{
CacheRequestOrVoid requestOrVoid;
CacheQueryParams params;
OpenMode openMode;
};
struct CachePutAllArgs
@ -129,12 +132,14 @@ struct CacheKeysArgs
{
CacheRequestOrVoid requestOrVoid;
CacheQueryParams params;
OpenMode openMode;
};
struct StorageMatchArgs
{
CacheRequest request;
CacheQueryParams params;
OpenMode openMode;
};
struct StorageHasArgs

View File

@ -18,6 +18,13 @@ namespace IPC {
mozilla::dom::cache::DEFAULT_NAMESPACE,
mozilla::dom::cache::NUMBER_OF_NAMESPACES>
{};
template<>
struct ParamTraits<mozilla::dom::cache::OpenMode> :
public ContiguousEnumSerializer<mozilla::dom::cache::OpenMode,
mozilla::dom::cache::OpenMode::Eager,
mozilla::dom::cache::OpenMode::NumTypes>
{};
} // namespace IPC
#endif // mozilla_dom_cache_IPCUtils_h

38
dom/cache/Manager.cpp vendored
View File

@ -544,9 +544,11 @@ public:
}
nsCOMPtr<nsIInputStream> stream;
rv = BodyOpen(aQuotaInfo, aDBDir, mResponse.mBodyId, getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
if (mArgs.openMode() == OpenMode::Eager) {
rv = BodyOpen(aQuotaInfo, aDBDir, mResponse.mBodyId, getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
}
mStreamList->Add(mResponse.mBodyId, Move(stream));
@ -609,10 +611,12 @@ public:
}
nsCOMPtr<nsIInputStream> stream;
rv = BodyOpen(aQuotaInfo, aDBDir, mSavedResponses[i].mBodyId,
getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
if (mArgs.openMode() == OpenMode::Eager) {
rv = BodyOpen(aQuotaInfo, aDBDir, mSavedResponses[i].mBodyId,
getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
}
mStreamList->Add(mSavedResponses[i].mBodyId, Move(stream));
}
@ -1157,10 +1161,12 @@ public:
}
nsCOMPtr<nsIInputStream> stream;
rv = BodyOpen(aQuotaInfo, aDBDir, mSavedRequests[i].mBodyId,
getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
if (mArgs.openMode() == OpenMode::Eager) {
rv = BodyOpen(aQuotaInfo, aDBDir, mSavedRequests[i].mBodyId,
getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
}
mStreamList->Add(mSavedRequests[i].mBodyId, Move(stream));
}
@ -1221,10 +1227,12 @@ public:
}
nsCOMPtr<nsIInputStream> stream;
rv = BodyOpen(aQuotaInfo, aDBDir, mSavedResponse.mBodyId,
getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
if (mArgs.openMode() == OpenMode::Eager) {
rv = BodyOpen(aQuotaInfo, aDBDir, mSavedResponse.mBodyId,
getter_AddRefs(stream));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
if (NS_WARN_IF(!stream)) { return NS_ERROR_FILE_NOT_FOUND; }
}
mStreamList->Add(mSavedResponse.mBodyId, Move(stream));

7
dom/cache/Types.h vendored
View File

@ -39,6 +39,13 @@ struct QuotaInfo
typedef std::function<void(nsCOMPtr<nsIInputStream>&&)> InputStreamResolver;
enum class OpenMode : uint8_t
{
Eager,
Lazy,
NumTypes
};
} // namespace cache
} // namespace dom
} // namespace mozilla