mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:30:27 +00:00
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:
Vendored
+123
-41
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user