mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 05:11:16 +00:00
Bug 1108181 - Make Headers iterable; r=bzbarsky
This commit is contained in:
parent
61dc0b019b
commit
c796c19fd9
@ -102,6 +102,19 @@ public:
|
|||||||
mInternalHeaders->Set(aName, aValue, aRv);
|
mInternalHeaders->Set(aName, aValue, aRv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t GetIterableLength() const
|
||||||
|
{
|
||||||
|
return mInternalHeaders->GetIterableLength();
|
||||||
|
}
|
||||||
|
const nsString GetKeyAtIndex(unsigned aIndex) const
|
||||||
|
{
|
||||||
|
return mInternalHeaders->GetKeyAtIndex(aIndex);
|
||||||
|
}
|
||||||
|
const nsString GetValueAtIndex(unsigned aIndex) const
|
||||||
|
{
|
||||||
|
return mInternalHeaders->GetValueAtIndex(aIndex);
|
||||||
|
}
|
||||||
|
|
||||||
// ChromeOnly
|
// ChromeOnly
|
||||||
HeadersGuardEnum Guard() const
|
HeadersGuardEnum Guard() const
|
||||||
{
|
{
|
||||||
|
@ -70,6 +70,21 @@ public:
|
|||||||
bool Has(const nsACString& aName, ErrorResult& aRv) const;
|
bool Has(const nsACString& aName, ErrorResult& aRv) const;
|
||||||
void Set(const nsACString& aName, const nsACString& aValue, ErrorResult& aRv);
|
void Set(const nsACString& aName, const nsACString& aValue, ErrorResult& aRv);
|
||||||
|
|
||||||
|
uint32_t GetIterableLength() const
|
||||||
|
{
|
||||||
|
return mList.Length();
|
||||||
|
}
|
||||||
|
const NS_ConvertASCIItoUTF16 GetKeyAtIndex(unsigned aIndex) const
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(aIndex < mList.Length());
|
||||||
|
return NS_ConvertASCIItoUTF16(mList[aIndex].mName);
|
||||||
|
}
|
||||||
|
const NS_ConvertASCIItoUTF16 GetValueAtIndex(unsigned aIndex) const
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(aIndex < mList.Length());
|
||||||
|
return NS_ConvertASCIItoUTF16(mList[aIndex].mValue);
|
||||||
|
}
|
||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
HeadersGuardEnum Guard() const { return mGuard; }
|
HeadersGuardEnum Guard() const { return mGuard; }
|
||||||
|
@ -13,16 +13,27 @@ function shouldThrow(func, expected, msg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function recursiveArrayCompare(actual, expected) {
|
||||||
|
is(Array.isArray(actual), Array.isArray(expected), "Both should either be arrays, or not");
|
||||||
|
if (Array.isArray(actual) && Array.isArray(expected)) {
|
||||||
|
var diff = actual.length !== expected.length;
|
||||||
|
|
||||||
|
for (var i = 0, n = actual.length; !diff && i < n; ++i) {
|
||||||
|
diff = recursiveArrayCompare(actual[i], expected[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return diff;
|
||||||
|
} else {
|
||||||
|
return actual !== expected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function arrayEquals(actual, expected, msg) {
|
function arrayEquals(actual, expected, msg) {
|
||||||
if (actual === expected) {
|
if (actual === expected) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var diff = actual.length !== expected.length;
|
var diff = recursiveArrayCompare(actual, expected);
|
||||||
|
|
||||||
for (var i = 0, n = actual.length; !diff && i < n; ++i) {
|
|
||||||
diff = actual[i] !== expected[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
ok(!diff, msg);
|
ok(!diff, msg);
|
||||||
if (diff) {
|
if (diff) {
|
||||||
@ -169,8 +180,60 @@ function TestFilledHeaders() {
|
|||||||
}, TypeError, "Fill with non-tuple sequence should throw TypeError.");
|
}, TypeError, "Fill with non-tuple sequence should throw TypeError.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function iterate(iter) {
|
||||||
|
var result = [];
|
||||||
|
for (var val = iter.next(); !val.done;) {
|
||||||
|
result.push(val.value);
|
||||||
|
val = iter.next();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function iterateForOf(iter) {
|
||||||
|
var result = [];
|
||||||
|
for (var value of iter) {
|
||||||
|
result.push(value);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function byteInflate(str) {
|
||||||
|
var encoder = new TextEncoder("utf-8");
|
||||||
|
var encoded = encoder.encode(str);
|
||||||
|
var result = "";
|
||||||
|
for (var i = 0; i < encoded.length; ++i) {
|
||||||
|
result += String.fromCharCode(encoded[i]);
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
function TestHeadersIterator() {
|
||||||
|
var ehsanInflated = byteInflate("احسان");
|
||||||
|
var headers = new Headers();
|
||||||
|
headers.set("foo0", "bar0");
|
||||||
|
headers.append("foo", "bar");
|
||||||
|
headers.append("foo", ehsanInflated);
|
||||||
|
headers.append("Foo2", "bar2");
|
||||||
|
headers.set("Foo2", "baz2");
|
||||||
|
headers.set("foo3", "bar3");
|
||||||
|
headers.delete("foo0");
|
||||||
|
headers.delete("foo3");
|
||||||
|
|
||||||
|
var key_iter = headers.keys();
|
||||||
|
var value_iter = headers.values();
|
||||||
|
var entries_iter = headers.entries();
|
||||||
|
|
||||||
|
arrayEquals(iterate(key_iter), ["foo", "foo", "foo2"], "Correct key iterator");
|
||||||
|
arrayEquals(iterate(value_iter), ["bar", ehsanInflated, "baz2"], "Correct value iterator");
|
||||||
|
arrayEquals(iterate(entries_iter), [["foo", "bar"], ["foo", ehsanInflated], ["foo2", "baz2"]], "Correct entries iterator");
|
||||||
|
|
||||||
|
arrayEquals(iterateForOf(headers), [["foo", "bar"], ["foo", ehsanInflated], ["foo2", "baz2"]], "Correct entries iterator");
|
||||||
|
arrayEquals(iterateForOf(new Headers(headers)), [["foo", "bar"], ["foo", ehsanInflated], ["foo2", "baz2"]], "Correct entries iterator");
|
||||||
|
}
|
||||||
|
|
||||||
function runTest() {
|
function runTest() {
|
||||||
TestEmptyHeaders();
|
TestEmptyHeaders();
|
||||||
TestFilledHeaders();
|
TestFilledHeaders();
|
||||||
|
TestHeadersIterator();
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ interface Headers {
|
|||||||
[Throws] sequence<ByteString> getAll(ByteString name);
|
[Throws] sequence<ByteString> getAll(ByteString name);
|
||||||
[Throws] boolean has(ByteString name);
|
[Throws] boolean has(ByteString name);
|
||||||
[Throws] void set(ByteString name, ByteString value);
|
[Throws] void set(ByteString name, ByteString value);
|
||||||
|
iterable<ByteString, ByteString>;
|
||||||
|
|
||||||
// Used to test different guard states from mochitest.
|
// Used to test different guard states from mochitest.
|
||||||
// Note: Must be set prior to populating headers or will throw.
|
// Note: Must be set prior to populating headers or will throw.
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
@ -1,3 +0,0 @@
|
|||||||
[cache-add.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
@ -1,3 +0,0 @@
|
|||||||
[cache-delete.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
@ -1,54 +0,0 @@
|
|||||||
[cache-match.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
||||||
[Cache.match and Cache.matchAll]
|
|
||||||
bug: https://github.com/w3c/web-platform-tests/issues/2098
|
|
||||||
|
|
||||||
[Cache.matchAll with URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with new Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with new Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with ignoreSearch option (request with no search parameters)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with ignoreSearch option (request with no search parameters)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with ignoreSearch option (request with search parameter)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with ignoreSearch option (request with search parameter)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with URL containing fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with URL containing fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with responses containing "Vary" header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with responses containing "Vary" header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with "ignoreVary" parameter]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with Request and Response objects with different URLs]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
[cache-put.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
||||||
[Cache.put with request URLs containing embedded credentials]
|
|
||||||
expected: FAIL
|
|
||||||
bug: https://github.com/w3c/web-platform-tests/issues/2098
|
|
||||||
|
|
||||||
[Cache.put called with Request and Response from fetch()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with a Response containing an empty URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with HTTP 500 response]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put called twice with matching Requests and different Responses]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put called twice with request URLs that differ only by a fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with a relative URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[cache-storage-keys.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
@ -1,15 +0,0 @@
|
|||||||
[cache-storage-match.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
||||||
[CacheStorageMatch with no cache name provided]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch from one of many caches]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch from one of many caches by name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch a string request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[cache-storage.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.serviceWorkers.enabled: true, dom.serviceWorkers.interception.enabled: true, dom.serviceWorkers.exemptFromPerDomainMax:true, dom.caches.enabled:true]
|
|
@ -1,52 +0,0 @@
|
|||||||
[cache-match.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
||||||
bug: https://github.com/w3c/web-platform-tests/issues/2098
|
|
||||||
[Cache.matchAll with URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with new Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with new Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with ignoreSearch option (request with no search parameters)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with ignoreSearch option (request with no search parameters)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with ignoreSearch option (request with search parameter)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with ignoreSearch option (request with search parameter)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with URL containing fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with URL containing fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with responses containing "Vary" header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with responses containing "Vary" header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with "ignoreVary" parameter]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with Request and Response objects with different URLs]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
[cache-put.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
||||||
[Cache.put with request URLs containing embedded credentials]
|
|
||||||
expected: FAIL
|
|
||||||
bug: https://github.com/w3c/web-platform-tests/issues/2098
|
|
||||||
|
|
||||||
[Cache.put called with Request and Response from fetch()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with a Response containing an empty URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with HTTP 500 response]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put called twice with matching Requests and different Responses]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put called twice with request URLs that differ only by a fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with a relative URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
[cache-storage-match.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
||||||
[CacheStorageMatch with no cache name provided]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch from one of many caches]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch from one of many caches by name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch a string request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
prefs: [dom.caches.enabled:true]
|
@ -1,3 +0,0 @@
|
|||||||
[cache-add.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
@ -1,3 +0,0 @@
|
|||||||
[cache-delete.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
@ -1,52 +0,0 @@
|
|||||||
[cache-match.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
||||||
bug: https://github.com/w3c/web-platform-tests/issues/2098
|
|
||||||
[Cache.matchAll with URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with new Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with new Request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with ignoreSearch option (request with no search parameters)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with ignoreSearch option (request with no search parameters)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with ignoreSearch option (request with search parameter)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with ignoreSearch option (request with search parameter)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with URL containing fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with URL containing fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with responses containing "Vary" header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with responses containing "Vary" header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.matchAll with "ignoreVary" parameter]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.match with Request and Response objects with different URLs]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
[cache-put.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
||||||
[Cache.put with request URLs containing embedded credentials]
|
|
||||||
expected: FAIL
|
|
||||||
bug: https://github.com/w3c/web-platform-tests/issues/2098
|
|
||||||
|
|
||||||
[Cache.put called with Request and Response from fetch()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with a Response containing an empty URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with HTTP 500 response]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put called twice with matching Requests and different Responses]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put called twice with request URLs that differ only by a fragment]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Cache.put with a relative URL]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[cache-storage-keys.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
@ -1,15 +0,0 @@
|
|||||||
[cache-storage-match.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
||||||
[CacheStorageMatch with no cache name provided]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch from one of many caches]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch from one of many caches by name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[CacheStorageMatch a string request]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[cache-storage.https.html]
|
|
||||||
type: testharness
|
|
||||||
prefs: [dom.caches.enabled:true]
|
|
Loading…
Reference in New Issue
Block a user