Skip to content

Commit

Permalink
Trust Tokens: Add an XMLHttpRequest interface
Browse files Browse the repository at this point in the history
The experimental Trust Token API
(https://github.com/wicg/trust-token-api)
takes in parameters specifying a Trust Tokens protocol operation,
annotates outgoing requests with request headers corresponding to
protocol state, and processes corresponding response headers. For the
MVP of the API, we're making the functionality available via Fetch,
iframe, and XHR.

To implement the XHR surface, this CL adds a new XHR setter,
that accepts a trustToken object (identical to the one for the Fetch
interface added in crrev.com/c/2036648) specifying a Trust Tokens
operation to execute against the request.

Test: Expands integration tests to ensure Trust Tokens params are
propagated correctly from the XHR interface to the network stack.
Bug: 1062395
Change-Id: I5f32d60c7b59002e79dc877719ba549ce5b9f412
  • Loading branch information
David Van Cleve authored and chromium-wpt-export-bot committed Mar 30, 2020
1 parent 14988fd commit 195e4c5
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 3 deletions.
Expand Up @@ -6,7 +6,7 @@
// and signing ("send-srr") should both be available; when it's disabled,
// they should both be unavailable. Send the number of available operations
// upstream in order to enforce this in assertions.
let num_enabled = 2;
let num_enabled = 4;
try {
new Request("https://issuer.example/", {
trustToken: {
Expand All @@ -26,6 +26,26 @@
} catch (e) {
num_enabled--;
}

try {
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://issuer.example/");
xhr.setTrustToken( { type: "srr-token-redemption" } );
} catch (e) {
num_enabled--;
}

try {
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://destination.example/");
xhr.setTrustToken({
type: "send-srr",
issuer: "https://issuer.example/"
});
} catch (e) {
num_enabled--;
}

parent.postMessage({
num_operations_enabled: num_enabled
}, '*');
Expand Down
Expand Up @@ -14,17 +14,30 @@

test(() => {
try {
// The feature policy gates redemption and signing via both the Fetch
// and XHR interfaces.
new Request("https://issuer.example/", {
trustToken: {
type: "srr-token-redemption"
}
});
new Request("https://destination.example/", {
trustToken: {
type: "send-srr",
type: "send-srr", // signing
issuer: "https://issuer.example/"
}
});

const redemption_xhr = new XMLHttpRequest();
redemption_xhr.open("GET", "https://issuer.example/");
redemption_xhr.setTrustToken( { type: "srr-token-redemption" } );

const signing_xhr = new XMLHttpRequest();
signing_xhr.open("GET", "https://destination.example/");
signing_xhr.setTrustToken({
type: "send-srr", // signing
issuer: "https://issuer.example/"
});
} catch (e) {
assert_unreached();
}
Expand All @@ -33,7 +46,7 @@
async_test(t => {
test_feature_availability('Trust token redemption', t, same_origin_src,
(data, desc) => {
assert_equals(data.num_operations_enabled, 2, desc);
assert_equals(data.num_operations_enabled, 4, desc);
});
}, header + ' allows same-origin iframes.');

Expand Down
@@ -0,0 +1,99 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>JavaScript: the Trust Token API XHR interface correctly validates its parameters</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';

test(() => {
assert_throws_dom("InvalidStateError", () => {
let request = new XMLHttpRequest();
request.setTrustToken({
type: 'token-request'
});
});
}, 'Setting XHR Trust Tokens parameters requires that the XHR request be open.');

test(() => {
assert_throws_dom("InvalidStateError", () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.send();
request.setTrustToken({
type: 'token-request'
});
});
}, 'Setting XHR Trust Tokens parameters requires that the XHR request not have been sent.');

test(() => {
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({});
});
}, 'Trust Tokens operations require present `type` values.');

test(() => {
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({
type: "invalid"
});
});
}, 'Trust Tokens operations require valid `type` values.');

test(() => {
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({
type: "token-request",
signRequestData: "not a member of the signRequestData enum"
});
});
}, 'Trust Tokens operations require valid `signRequestData` values, if provided.');

test(() => {
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({
type: "token-request",
refreshPolicy: "not a member of the refreshPolicy enum",
});
});
}, 'Trust Tokens operations require valid `refreshPolicy:` values, if provided.');

test(() => {
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({
type: "send-srr",
issuer: "not a valid URL"
});
});
}, 'Trust Tokens operations require valid issuer URLs, if provided.');

test(() => {
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({
type: "send-srr",
issuer: "http://not-secure.com"
});
});
}, 'Trust Tokens operations require secure issuer URLs, if provided.');

test(() => {
let request = new XMLHttpRequest();
request.open('GET', 'https://trusttoken.example');
request.setTrustToken({
type: "send-srr",
issuer: "http://localhost"
});
}, 'Since localhost URLs are potentially trustworthy, setting an issuer to localhost should succeed.');
</script>

0 comments on commit 195e4c5

Please sign in to comment.