Skip to content

Commit

Permalink
Bug 1147699 - Part 14: Add a test for FetchEvent.request.context when…
Browse files Browse the repository at this point in the history
… intercepting loads coming from plugins; r=nsm
  • Loading branch information
rmottola committed Jul 2, 2019
1 parent ac8c96a commit 0e1769b
Show file tree
Hide file tree
Showing 6 changed files with 321 additions and 17 deletions.
120 changes: 105 additions & 15 deletions dom/cache/DBSchema.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@
#include "mozilla/dom/RequestBinding.h"
#include "mozilla/dom/ResponseBinding.h"
#include "Types.h"
#include "nsIContentPolicy.h"

namespace mozilla {
namespace dom {
namespace cache {

const int32_t DBSchema::kMaxWipeSchemaVersion = 4;
const int32_t DBSchema::kLatestSchemaVersion = 4;
const int32_t DBSchema::kMaxWipeSchemaVersion = 5;
const int32_t DBSchema::kLatestSchemaVersion = 5;
const int32_t DBSchema::kMaxEntriesPerStatement = 255;

// If any of the static_asserts below fail, it means that you have changed
Expand All @@ -51,6 +52,40 @@ static_assert(int(RequestCredentials::Omit) == 0 &&
int(RequestCredentials::Include) == 2 &&
int(RequestCredentials::EndGuard_) == 3,
"RequestCredentials values are as expected");
static_assert(int(RequestContext::Audio) == 0 &&
int(RequestContext::Beacon) == 1 &&
int(RequestContext::Cspreport) == 2 &&
int(RequestContext::Download) == 3 &&
int(RequestContext::Embed) == 4 &&
int(RequestContext::Eventsource) == 5 &&
int(RequestContext::Favicon) == 6 &&
int(RequestContext::Fetch) == 7 &&
int(RequestContext::Font) == 8 &&
int(RequestContext::Form) == 9 &&
int(RequestContext::Frame) == 10 &&
int(RequestContext::Hyperlink) == 11 &&
int(RequestContext::Iframe) == 12 &&
int(RequestContext::Image) == 13 &&
int(RequestContext::Imageset) == 14 &&
int(RequestContext::Import) == 15 &&
int(RequestContext::Internal) == 16 &&
int(RequestContext::Location) == 17 &&
int(RequestContext::Manifest) == 18 &&
int(RequestContext::Object) == 19 &&
int(RequestContext::Ping) == 20 &&
int(RequestContext::Plugin) == 21 &&
int(RequestContext::Prefetch) == 22 &&
int(RequestContext::Script) == 23 &&
int(RequestContext::Serviceworker) == 24 &&
int(RequestContext::Sharedworker) == 25 &&
int(RequestContext::Subresource) == 26 &&
int(RequestContext::Style) == 27 &&
int(RequestContext::Track) == 28 &&
int(RequestContext::Video) == 29 &&
int(RequestContext::Worker) == 30 &&
int(RequestContext::Xmlhttprequest) == 31 &&
int(RequestContext::Xslt) == 32,
"RequestContext values are as expected");
static_assert(int(RequestCache::Default) == 0 &&
int(RequestCache::No_store) == 1 &&
int(RequestCache::Reload) == 2 &&
Expand All @@ -76,6 +111,35 @@ static_assert(DEFAULT_NAMESPACE == 0 &&
NUMBER_OF_NAMESPACES == 2,
"Namespace values are as expected");

// If the static_asserts below fails, it means that you have changed the
// nsContentPolicy enum in a way that may be incompatible with the existing data
// stored in the DOM Cache. You would need to update the Cache database schema
// accordingly and adjust the failing static_assert.
static_assert(nsIContentPolicy::TYPE_INVALID == 0 &&
nsIContentPolicy::TYPE_OTHER == 1 &&
nsIContentPolicy::TYPE_SCRIPT == 2 &&
nsIContentPolicy::TYPE_IMAGE == 3 &&
nsIContentPolicy::TYPE_STYLESHEET == 4 &&
nsIContentPolicy::TYPE_OBJECT == 5 &&
nsIContentPolicy::TYPE_DOCUMENT == 6 &&
nsIContentPolicy::TYPE_SUBDOCUMENT == 7 &&
nsIContentPolicy::TYPE_REFRESH == 8 &&
nsIContentPolicy::TYPE_XBL == 9 &&
nsIContentPolicy::TYPE_PING == 10 &&
nsIContentPolicy::TYPE_XMLHTTPREQUEST == 11 &&
nsIContentPolicy::TYPE_DATAREQUEST == 11 &&
nsIContentPolicy::TYPE_OBJECT_SUBREQUEST == 12 &&
nsIContentPolicy::TYPE_DTD == 13 &&
nsIContentPolicy::TYPE_FONT == 14 &&
nsIContentPolicy::TYPE_MEDIA == 15 &&
nsIContentPolicy::TYPE_WEBSOCKET == 16 &&
nsIContentPolicy::TYPE_CSP_REPORT == 17 &&
nsIContentPolicy::TYPE_XSLT == 18 &&
nsIContentPolicy::TYPE_BEACON == 19 &&
nsIContentPolicy::TYPE_FETCH == 20 &&
nsIContentPolicy::TYPE_IMAGESET == 21,
"nsContentPolicytType values are as expected");

using mozilla::void_t;

// static
Expand Down Expand Up @@ -139,6 +203,8 @@ DBSchema::CreateSchema(mozIStorageConnection* aConn)
"request_headers_guard INTEGER NOT NULL, "
"request_mode INTEGER NOT NULL, "
"request_credentials INTEGER NOT NULL, "
"request_contentpolicytype INTEGER NOT NULL, "
"request_context INTEGER NOT NULL, "
"request_cache INTEGER NOT NULL, "
"request_body_id TEXT NULL, "
"response_type INTEGER NOT NULL, "
Expand Down Expand Up @@ -1035,6 +1101,8 @@ DBSchema::InsertEntry(mozIStorageConnection* aConn, CacheId aCacheId,
"request_headers_guard, "
"request_mode, "
"request_credentials, "
"request_contentpolicytype, "
"request_context, "
"request_cache, "
"request_body_id, "
"response_type, "
Expand All @@ -1045,7 +1113,7 @@ DBSchema::InsertEntry(mozIStorageConnection* aConn, CacheId aCacheId,
"response_body_id, "
"response_security_info, "
"cache_id "
") VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17)"
") VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19)"
), getter_AddRefs(state));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

Expand Down Expand Up @@ -1073,37 +1141,45 @@ DBSchema::InsertEntry(mozIStorageConnection* aConn, CacheId aCacheId,
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(7,
static_cast<int32_t>(aRequest.contentPolicyType()));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(8,
static_cast<int32_t>(aRequest.context()));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(9,
static_cast<int32_t>(aRequest.requestCache()));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = BindId(state, 8, aRequestBodyId);
rv = BindId(state, 10, aRequestBodyId);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(9, static_cast<int32_t>(aResponse.type()));
rv = state->BindInt32Parameter(11, static_cast<int32_t>(aResponse.type()));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindStringParameter(10, aResponse.url());
rv = state->BindStringParameter(12, aResponse.url());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(11, aResponse.status());
rv = state->BindInt32Parameter(13, aResponse.status());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindUTF8StringParameter(12, aResponse.statusText());
rv = state->BindUTF8StringParameter(14, aResponse.statusText());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(13,
rv = state->BindInt32Parameter(15,
static_cast<int32_t>(aResponse.headersGuard()));
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = BindId(state, 14, aResponseBodyId);
rv = BindId(state, 16, aResponseBodyId);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindBlobParameter(15, reinterpret_cast<const uint8_t*>
rv = state->BindBlobParameter(17, reinterpret_cast<const uint8_t*>
(aResponse.securityInfo().get()),
aResponse.securityInfo().Length());
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->BindInt32Parameter(16, aCacheId);
rv = state->BindInt32Parameter(18, aCacheId);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }

rv = state->Execute();
Expand Down Expand Up @@ -1289,6 +1365,8 @@ DBSchema::ReadRequest(mozIStorageConnection* aConn, EntryId aEntryId,
"request_headers_guard, "
"request_mode, "
"request_credentials, "
"request_contentpolicytype, "
"request_context, "
"request_cache, "
"request_body_id "
"FROM entries "
Expand Down Expand Up @@ -1332,19 +1410,31 @@ DBSchema::ReadRequest(mozIStorageConnection* aConn, EntryId aEntryId,
aSavedRequestOut->mValue.credentials() =
static_cast<RequestCredentials>(credentials);

int32_t requestContentPolicyType;
rv = state->GetInt32(7, &requestContentPolicyType);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.contentPolicyType() =
static_cast<nsContentPolicyType>(requestContentPolicyType);

int32_t requestContext;
rv = state->GetInt32(8, &requestContext);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.context() =
static_cast<RequestContext>(requestContext);

int32_t requestCache;
rv = state->GetInt32(7, &requestCache);
rv = state->GetInt32(9, &requestCache);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mValue.requestCache() =
static_cast<RequestCache>(requestCache);

bool nullBody = false;
rv = state->GetIsNull(8, &nullBody);
rv = state->GetIsNull(10, &nullBody);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
aSavedRequestOut->mHasBodyId = !nullBody;

if (aSavedRequestOut->mHasBodyId) {
rv = ExtractId(state, 8, &aSavedRequestOut->mBodyId);
rv = ExtractId(state, 10, &aSavedRequestOut->mBodyId);
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
}

Expand Down
44 changes: 44 additions & 0 deletions dom/workers/test/serviceworkers/fetch/context/context_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ self.addEventListener("fetch", function(event) {
event.request.url.indexOf("register.html") >= 0 ||
event.request.url.indexOf("unregister.html") >= 0 ||
event.request.url.indexOf("ping.html") >= 0 ||
event.request.url.indexOf("xml.xml") >= 0 ||
event.request.url.indexOf("csp-violate.sjs") >= 0) {
// Handle pass-through requests
event.respondWith(fetch(event.request));
Expand Down Expand Up @@ -54,6 +55,49 @@ self.addEventListener("fetch", function(event) {
respondToServiceWorker(event, "newwindow");
} else if (event.request.url.indexOf("ping") >= 0) {
respondToServiceWorker(event, "ping");
} else if (event.request.url.indexOf("plugin") >= 0) {
respondToServiceWorker(event, "plugin");
} else if (event.request.url.indexOf("script.js") >= 0) {
if (event.request.context == "script") {
event.respondWith(new Response(""));
}
} else if (event.request.url.indexOf("style.css") >= 0) {
respondToServiceWorker(event, "style");
} else if (event.request.url.indexOf("track") >= 0) {
respondToServiceWorker(event, "track");
} else if (event.request.url.indexOf("xhr") >= 0) {
if (event.request.context == "xmlhttprequest") {
event.respondWith(new Response(""));
}
} else if (event.request.url.indexOf("xslt") >= 0) {
respondToServiceWorker(event, "xslt");
} else if (event.request.url.indexOf("cache") >= 0) {
var cache;
var origContext = event.request.context;
event.respondWith(caches.open("cache")
.then(function(c) {
cache = c;
// Store the Request in the cache.
return cache.put(event.request, new Response("fake"));
}).then(function() {
// Read it back.
return cache.keys(event.request);
}).then(function(res) {
var req = res[0];
// Check to see if the context remained the same.
var success = req.context === origContext;
return clients.matchAll()
.then(function(clients) {
// Report it back to the main page.
clients.forEach(function(c) {
c.postMessage({data: "cache", success: success});
});
})}).then(function() {
// Cleanup.
return caches.delete("cache");
}).then(function() {
return new Response("ack");
}));
}
// Fail any request that we don't know about.
try {
Expand Down
Loading

0 comments on commit 0e1769b

Please sign in to comment.