import changes from `dev' branch of rmottola/Arctic-Fox:

- Bug 1137653: Correct the shape of the data object sent over if there are are crashes or the packet is malformed; r=jgriffin (d05804fe4)
- Bug 1121577 - Unset pref at delete_session, r=dburns (d2cefee52)
- Bug 1144907 - Restore previous context after calling marionette's gather_debug. r=davehunt (2d35526d2)
- Bug 1135846 - Expose marionette's actions code to chrome scope where applicable. r=dburns (2c91389b5)
- Bug 1118313 - newSession looks for non-conforming session_id property on Command. r=dburns (d72f256ec)
- Bug 1107706: Part 1: Change context from strings to enum (d4936c869)
- Bug 1107706: Part 2: Add error module and WebDriver error objects (95a58e4fa)
- Bug 1107706: Part 3: Add a command processor to Marionette (4ed444206)
- Bug 1107706: Part 4: Add dispatching mechanism to encapsulate connection (5a0cf4bfa)
- Bug 1107706: Part 5: Refactor Marionette chrome/content communication (a110867e3)
- Bug 1107706: Part 6: Make SpecialPowersError a prototypal Error (bebfc4e13)
- Bug 1107706: Part 7: Add timeout test for async scripts (795921b56)
- Bug 1107706: Part 8: Adapt emulator callbacks (4f0ec4ea3)
- Bug 1165395 Test Cache API after QuotaManager reset. r=janv (27ffd1273)
- Bug 1154325 P1 Add convenience routines to bind and get Blobs as strings. r=asuth (df1f9930a)
- Bug 1154325 P2 Use Blobs for CacheStorage keys to avoid encoding issues. r=ehsan (625588969)
- Bug 1179063 - Cleanup: Rename scopal back to scopeStmt. (r=me) (eaa5d8e3a)
- pointer style (39588e254)
- pointer style (7be6abefc)
- Bug 1162342 Enable sqlite WAL transactions in Cache API. r=ehsan (60a767033)
- Bug 1130452 - Remove support for the prefixMatch option in the service worker cache code; r=bkelly,baku (48d4d62f2)
- Bug 1166577 Use named sqlite params in Cache API code. r=ehsan (a0cbc5674)
- Bug 1166038 De-duplicate security info stored in the Cache API. r=ehsan (cdb8e8396)
- Bug 1166911 Modify Cache API sqlite code to use IS NULL literal when comparing an empty key. r=ehsan (a893706bf)
- Bug 1164620 - Part 1: Remove instances of #ifdef PR_LOGGING in various places. r=froydnj (69f3becd3)
- Bug 1161684 - Allow JAR channels to be intercepted by service workers. r=jdm (292f83299)
- Bug 1146169 - Check mChannel for null-ness in nsIInterceptedChannel::SetSecurityInfo(); r=jdm (9ed238664)
- Bug 1168208 - Refactor the existing logic for syncing the security info between Response and channel objects into a new helper class; r=nsm,jdm,bkelly (ea8852934)
- pointer style (b6ada460f)
- Bug 1163423 - Introduce JS_HasOwnProperty. r=bhackett (c189e58f0)
- pointer style (4693171b0)
- Bug 1163423 - Use JS_HasOwnProperty in WrapperAnswer::RecvHasOwn. r=billm (5029c2787)
- Bug 1168152 P1 Use a smaller sqlite page size and a growth increment in Cache. r=ehsan (9ad7f999f)
- Bug 1120501 P1 Make it easier to use Promise::All() from C++ code. r=nsm (95d1d5e2f)
- Bug 1120501 P2 Move Cache Add/AddAll logic to child process. r=ehsan,smaug (c71f9c49b)
- Bug 1168152 P2 Use a wrapper mozIStorageConnection for shared Cache connections. r=ehsan (f930635ac)
- Bug 1168152 P3 Perform incremental vacuum at tail end of Cache db connections. r=ehsan (df76df80c)
- Bug 1168152 P4 Add a test to verify Cache incremental vacuum works. r=ehsan (320d50436)
- Bug 1168152 P5 Follow-up to use 32kb growth size as intended in previous patches. r=me (92e2d3f27)
- Bug 1144236 - Add tests for the ignoreMethod match mode in DOM cache; r=bkelly (795a31d3c)
- Bug 1150001 - Cache API should not return Response body when matching Request with HEAD method. r=bkelly (690927f85)
This commit is contained in:
2021-02-22 07:38:03 +08:00
parent 3bb6519e01
commit 13b1aeb09f
115 changed files with 8993 additions and 5729 deletions
+123 -41
View File
@@ -7,6 +7,8 @@
#include "mozilla/dom/cache/AutoUtils.h"
#include "mozilla/unused.h"
#include "mozilla/dom/InternalHeaders.h"
#include "mozilla/dom/InternalRequest.h"
#include "mozilla/dom/cache/CacheParent.h"
#include "mozilla/dom/cache/CachePushStreamChild.h"
#include "mozilla/dom/cache/CacheStreamControlParent.h"
@@ -17,6 +19,8 @@
#include "mozilla/ipc/FileDescriptorSetChild.h"
#include "mozilla/ipc/FileDescriptorSetParent.h"
#include "mozilla/ipc/PBackgroundParent.h"
#include "nsCRT.h"
#include "nsHttp.h"
namespace {
@@ -168,15 +172,6 @@ AutoChildOpArgs::~AutoChildOpArgs()
CleanupChild(args.requestOrVoid().get_CacheRequest().body(), action);
break;
}
case CacheOpArgs::TCacheAddAllArgs:
{
CacheAddAllArgs& args = mOpArgs.get_CacheAddAllArgs();
auto& list = args.requestList();
for (uint32_t i = 0; i < list.Length(); ++i) {
CleanupChild(list[i].body(), action);
}
break;
}
case CacheOpArgs::TCachePutAllArgs:
{
CachePutAllArgs& args = mOpArgs.get_CachePutAllArgs();
@@ -216,8 +211,7 @@ AutoChildOpArgs::~AutoChildOpArgs()
void
AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
ReferrerAction aReferrerAction, SchemeAction aSchemeAction,
ErrorResult& aRv)
SchemeAction aSchemeAction, ErrorResult& aRv)
{
MOZ_ASSERT(!mSent);
@@ -226,7 +220,7 @@ AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
{
CacheMatchArgs& args = mOpArgs.get_CacheMatchArgs();
mTypeUtils->ToCacheRequest(args.request(), aRequest, aBodyAction,
aReferrerAction, aSchemeAction, aRv);
aSchemeAction, aRv);
break;
}
case CacheOpArgs::TCacheMatchAllArgs:
@@ -235,35 +229,14 @@ AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
MOZ_ASSERT(args.requestOrVoid().type() == CacheRequestOrVoid::Tvoid_t);
args.requestOrVoid() = CacheRequest();
mTypeUtils->ToCacheRequest(args.requestOrVoid().get_CacheRequest(),
aRequest, aBodyAction, aReferrerAction,
aSchemeAction, aRv);
break;
}
case CacheOpArgs::TCacheAddAllArgs:
{
CacheAddAllArgs& args = mOpArgs.get_CacheAddAllArgs();
// The FileDescriptorSetChild asserts in its destructor that all fds have
// been removed. The copy constructor, however, simply duplicates the
// fds without removing any. This means each temporary and copy must be
// explicitly cleaned up.
//
// Avoid a lot of this hassle by making sure we only create one here. On
// error we remove it.
CacheRequest& request = *args.requestList().AppendElement();
mTypeUtils->ToCacheRequest(request, aRequest, aBodyAction,
aReferrerAction, aSchemeAction, aRv);
if (aRv.Failed()) {
args.requestList().RemoveElementAt(args.requestList().Length() - 1);
}
aRequest, aBodyAction, aSchemeAction, aRv);
break;
}
case CacheOpArgs::TCacheDeleteArgs:
{
CacheDeleteArgs& args = mOpArgs.get_CacheDeleteArgs();
mTypeUtils->ToCacheRequest(args.request(), aRequest, aBodyAction,
aReferrerAction, aSchemeAction, aRv);
aSchemeAction, aRv);
break;
}
case CacheOpArgs::TCacheKeysArgs:
@@ -272,15 +245,14 @@ AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
MOZ_ASSERT(args.requestOrVoid().type() == CacheRequestOrVoid::Tvoid_t);
args.requestOrVoid() = CacheRequest();
mTypeUtils->ToCacheRequest(args.requestOrVoid().get_CacheRequest(),
aRequest, aBodyAction, aReferrerAction,
aSchemeAction, aRv);
aRequest, aBodyAction, aSchemeAction, aRv);
break;
}
case CacheOpArgs::TStorageMatchArgs:
{
StorageMatchArgs& args = mOpArgs.get_StorageMatchArgs();
mTypeUtils->ToCacheRequest(args.request(), aRequest, aBodyAction,
aReferrerAction, aSchemeAction, aRv);
aSchemeAction, aRv);
break;
}
default:
@@ -288,10 +260,112 @@ AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
}
}
namespace {
bool
MatchInPutList(InternalRequest* aRequest,
const nsTArray<CacheRequestResponse>& aPutList)
{
MOZ_ASSERT(aRequest);
// This method implements the SW spec QueryCache algorithm against an
// in memory array of Request/Response objects. This essentially the
// same algorithm that is implemented in DBSchema.cpp. Unfortunately
// we cannot unify them because when operating against the real database
// we don't want to load all request/response objects into memory.
// Note, we can skip the check for a invalid request method because
// Cache should only call into here with a GET or HEAD.
#ifdef DEBUG
nsAutoCString method;
aRequest->GetMethod(method);
MOZ_ASSERT(method.LowerCaseEqualsLiteral("get") ||
method.LowerCaseEqualsLiteral("head"));
#endif
nsRefPtr<InternalHeaders> requestHeaders = aRequest->Headers();
for (uint32_t i = 0; i < aPutList.Length(); ++i) {
const CacheRequest& cachedRequest = aPutList[i].request();
const CacheResponse& cachedResponse = aPutList[i].response();
nsAutoCString url;
aRequest->GetURL(url);
// If the URLs don't match, then just skip to the next entry.
if (NS_ConvertUTF8toUTF16(url) != cachedRequest.url()) {
continue;
}
nsRefPtr<InternalHeaders> cachedRequestHeaders =
TypeUtils::ToInternalHeaders(cachedRequest.headers());
nsRefPtr<InternalHeaders> cachedResponseHeaders =
TypeUtils::ToInternalHeaders(cachedResponse.headers());
nsAutoTArray<nsCString, 16> varyHeaders;
ErrorResult rv;
cachedResponseHeaders->GetAll(NS_LITERAL_CSTRING("vary"), varyHeaders, rv);
MOZ_ALWAYS_TRUE(!rv.Failed());
// Assume the vary headers match until we find a conflict
bool varyHeadersMatch = true;
for (uint32_t j = 0; j < varyHeaders.Length(); ++j) {
// Extract the header names inside the Vary header value.
nsAutoCString varyValue(varyHeaders[j]);
char* rawBuffer = varyValue.BeginWriting();
char* token = nsCRT::strtok(rawBuffer, NS_HTTP_HEADER_SEPS, &rawBuffer);
bool bailOut = false;
for (; token;
token = nsCRT::strtok(rawBuffer, NS_HTTP_HEADER_SEPS, &rawBuffer)) {
nsDependentCString header(token);
MOZ_ASSERT(!header.EqualsLiteral("*"),
"We should have already caught this in "
"TypeUtils::ToPCacheResponseWithoutBody()");
ErrorResult headerRv;
nsAutoCString value;
requestHeaders->Get(header, value, headerRv);
if (NS_WARN_IF(headerRv.Failed())) {
headerRv.SuppressException();
MOZ_ASSERT(value.IsEmpty());
}
nsAutoCString cachedValue;
cachedRequestHeaders->Get(header, value, headerRv);
if (NS_WARN_IF(headerRv.Failed())) {
headerRv.SuppressException();
MOZ_ASSERT(cachedValue.IsEmpty());
}
if (value != cachedValue) {
varyHeadersMatch = false;
bailOut = true;
break;
}
}
if (bailOut) {
break;
}
}
// URL was equal and all vary headers match!
if (varyHeadersMatch) {
return true;
}
}
return false;
}
} // namespace
void
AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
ReferrerAction aReferrerAction, SchemeAction aSchemeAction,
Response& aResponse, ErrorResult& aRv)
SchemeAction aSchemeAction, Response& aResponse,
ErrorResult& aRv)
{
MOZ_ASSERT(!mSent);
@@ -300,6 +374,14 @@ AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
{
CachePutAllArgs& args = mOpArgs.get_CachePutAllArgs();
// Throw an error if a request/response pair would mask another
// request/response pair in the same PutAll operation. This is
// step 2.3.2.3 from the "Batch Cache Operations" spec algorithm.
if (MatchInPutList(aRequest, args.requestResponseList())) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
// The FileDescriptorSetChild asserts in its destructor that all fds have
// been removed. The copy constructor, however, simply duplicates the
// fds without removing any. This means each temporary and copy must be
@@ -312,7 +394,7 @@ AutoChildOpArgs::Add(InternalRequest* aRequest, BodyAction aBodyAction,
pair.response().body() = void_t();
mTypeUtils->ToCacheRequest(pair.request(), aRequest, aBodyAction,
aReferrerAction, aSchemeAction, aRv);
aSchemeAction, aRv);
if (!aRv.Failed()) {
mTypeUtils->ToCacheResponse(pair.response(), aResponse, aRv);
}