mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-11 10:08:41 +00:00
Bug 1071290 - Allow Blobs in Fetch BodyInit. r=baku
--HG-- extra : rebase_source : 412dffd78d5b0c4cddad58374bbe1dd051877c47
This commit is contained in:
parent
e1bbdf4cc1
commit
9771d67d26
@ -49,6 +49,22 @@ ExtractFromArrayBufferView(const ArrayBufferView& aBuffer,
|
||||
aBuffer.Length(), NS_ASSIGNMENT_COPY);
|
||||
}
|
||||
|
||||
nsresult
|
||||
ExtractFromBlob(const File& aFile, nsIInputStream** aStream,
|
||||
nsCString& aContentType)
|
||||
{
|
||||
nsRefPtr<FileImpl> impl = aFile.Impl();
|
||||
nsresult rv = impl->GetInternalStream(aStream);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsString type;
|
||||
impl->GetType(type);
|
||||
aContentType = NS_ConvertUTF16toUTF8(type);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
ExtractFromScalarValueString(const nsString& aStr,
|
||||
nsIInputStream** aStream,
|
||||
@ -99,7 +115,7 @@ ExtractFromURLSearchParams(const URLSearchParams& aParams,
|
||||
}
|
||||
|
||||
nsresult
|
||||
ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
nsIInputStream** aStream,
|
||||
nsCString& aContentType)
|
||||
{
|
||||
@ -111,6 +127,9 @@ ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrScalarValueS
|
||||
} else if (aBodyInit.IsArrayBufferView()) {
|
||||
const ArrayBufferView& buf = aBodyInit.GetAsArrayBufferView();
|
||||
return ExtractFromArrayBufferView(buf, aStream);
|
||||
} else if (aBodyInit.IsBlob()) {
|
||||
const File& blob = aBodyInit.GetAsBlob();
|
||||
return ExtractFromBlob(blob, aStream, aContentType);
|
||||
} else if (aBodyInit.IsScalarValueString()) {
|
||||
nsAutoString str;
|
||||
str.Assign(aBodyInit.GetAsScalarValueString());
|
||||
@ -125,7 +144,7 @@ ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrScalarValueS
|
||||
}
|
||||
|
||||
nsresult
|
||||
ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
nsIInputStream** aStream,
|
||||
nsCString& aContentType)
|
||||
{
|
||||
@ -137,6 +156,9 @@ ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrScalarValueStringO
|
||||
} else if (aBodyInit.IsArrayBufferView()) {
|
||||
const ArrayBufferView& buf = aBodyInit.GetAsArrayBufferView();
|
||||
return ExtractFromArrayBufferView(buf, aStream);
|
||||
} else if (aBodyInit.IsBlob()) {
|
||||
const File& blob = aBodyInit.GetAsBlob();
|
||||
return ExtractFromBlob(blob, aStream, aContentType);
|
||||
} else if (aBodyInit.IsScalarValueString()) {
|
||||
nsAutoString str;
|
||||
str.Assign(aBodyInit.GetAsScalarValueString());
|
||||
|
@ -21,7 +21,7 @@ class Promise;
|
||||
* Stores content type in out param aContentType.
|
||||
*/
|
||||
nsresult
|
||||
ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
nsIInputStream** aStream,
|
||||
nsCString& aContentType);
|
||||
|
||||
@ -29,7 +29,7 @@ ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrScalarValueS
|
||||
* Non-owning version.
|
||||
*/
|
||||
nsresult
|
||||
ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams& aBodyInit,
|
||||
nsIInputStream** aStream,
|
||||
nsCString& aContentType);
|
||||
|
||||
|
@ -194,7 +194,7 @@ Request::Constructor(const GlobalObject& aGlobal,
|
||||
}
|
||||
|
||||
if (aInit.mBody.WasPassed()) {
|
||||
const OwningArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams& bodyInit = aInit.mBody.Value();
|
||||
const OwningArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams& bodyInit = aInit.mBody.Value();
|
||||
nsCOMPtr<nsIInputStream> stream;
|
||||
nsCString contentType;
|
||||
aRv = ExtractByteStreamFromBody(bodyInit,
|
||||
|
@ -55,14 +55,14 @@ Response::Redirect(const GlobalObject& aGlobal, const nsAString& aUrl,
|
||||
{
|
||||
ErrorResult result;
|
||||
ResponseInit init;
|
||||
Optional<ArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams> body;
|
||||
Optional<ArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams> body;
|
||||
nsRefPtr<Response> r = Response::Constructor(aGlobal, body, init, result);
|
||||
return r.forget();
|
||||
}
|
||||
|
||||
/*static*/ already_AddRefed<Response>
|
||||
Response::Constructor(const GlobalObject& aGlobal,
|
||||
const Optional<ArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams>& aBody,
|
||||
const Optional<ArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams>& aBody,
|
||||
const ResponseInit& aInit, ErrorResult& aRv)
|
||||
{
|
||||
if (aInit.mStatus < 200 || aInit.mStatus > 599) {
|
||||
|
@ -85,7 +85,7 @@ public:
|
||||
|
||||
static already_AddRefed<Response>
|
||||
Constructor(const GlobalObject& aGlobal,
|
||||
const Optional<ArrayBufferOrArrayBufferViewOrScalarValueStringOrURLSearchParams>& aBody,
|
||||
const Optional<ArrayBufferOrArrayBufferViewOrBlobOrScalarValueStringOrURLSearchParams>& aBody,
|
||||
const ResponseInit& aInit, ErrorResult& rv);
|
||||
|
||||
nsIGlobalObject* GetParentObject() const
|
||||
|
@ -8,10 +8,9 @@
|
||||
*/
|
||||
|
||||
typedef object JSON;
|
||||
// FIXME(nsm): Bug 1071290: Blobs can't be passed as unions in workers.
|
||||
// FIXME(nsm): Bug 739173: FormData is not available in workers.
|
||||
// typedef (ArrayBuffer or ArrayBufferView or Blob or FormData or ScalarValueString or URLSearchParams) BodyInit;
|
||||
typedef (ArrayBuffer or ArrayBufferView or ScalarValueString or URLSearchParams) BodyInit;
|
||||
typedef (ArrayBuffer or ArrayBufferView or Blob or ScalarValueString or URLSearchParams) BodyInit;
|
||||
|
||||
[NoInterfaceObject, Exposed=(Window,Worker)]
|
||||
interface Body {
|
||||
|
@ -131,7 +131,6 @@ function testBodyUsed() {
|
||||
});
|
||||
}
|
||||
|
||||
// FIXME(nsm): Bug 1071290: We can't use Blobs as the body yet.
|
||||
function testBodyCreation() {
|
||||
var text = "κόσμε";
|
||||
var req1 = new Request("", { body: text });
|
||||
@ -150,6 +149,11 @@ function testBodyCreation() {
|
||||
is("Hello", v, "Extracted string should match");
|
||||
});
|
||||
|
||||
var reqblob = new Request("", { body: new Blob([text]) });
|
||||
var pblob = reqblob.text().then(function(v) {
|
||||
is(v, text, "Extracted string should match");
|
||||
});
|
||||
|
||||
var params = new URLSearchParams();
|
||||
params.append("item", "Geckos");
|
||||
params.append("feature", "stickyfeet");
|
||||
@ -162,7 +166,7 @@ function testBodyCreation() {
|
||||
is(extracted.get("quantity"), "700", "Param should match");
|
||||
});
|
||||
|
||||
return Promise.all([p1, p2, p2b, p3]);
|
||||
return Promise.all([p1, p2, p2b, pblob, p3]);
|
||||
}
|
||||
|
||||
function testBodyExtraction() {
|
||||
|
@ -44,7 +44,6 @@ function testBodyUsed() {
|
||||
});
|
||||
}
|
||||
|
||||
// FIXME(nsm): Bug 1071290: We can't use Blobs as the body yet.
|
||||
function testBodyCreation() {
|
||||
var text = "κόσμε";
|
||||
var res1 = new Response(text);
|
||||
@ -63,6 +62,11 @@ function testBodyCreation() {
|
||||
is("Hello", v, "Extracted string should match");
|
||||
});
|
||||
|
||||
var resblob = new Response(new Blob([text]));
|
||||
var pblob = resblob.text().then(function(v) {
|
||||
is(v, text, "Extracted string should match");
|
||||
});
|
||||
|
||||
var params = new URLSearchParams();
|
||||
params.append("item", "Geckos");
|
||||
params.append("feature", "stickyfeet");
|
||||
@ -75,7 +79,7 @@ function testBodyCreation() {
|
||||
is(extracted.get("quantity"), "700", "Param should match");
|
||||
});
|
||||
|
||||
return Promise.all([p1, p2, p2b, p3]);
|
||||
return Promise.all([p1, p2, p2b, pblob, p3]);
|
||||
}
|
||||
|
||||
function testBodyExtraction() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user