New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(fetch): accept arraybuffer in consume_body #20406
Merged
+39
−269
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
c0b5eee
feat(webidl): expose arraybuffer overload in body idl
kwonoj 168f610
feat(consume_body): implement consume_body accepts arraybuffer
kwonoj e6de213
refactor(consume_body): json stored in roottraceablebox
kwonoj 80304a1
test(wpt): update fetch test metadata
kwonoj File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.
| @@ -7,17 +7,22 @@ use dom::bindings::error::{Error, Fallible}; | ||
| use dom::bindings::reflector::DomObject; | ||
| use dom::bindings::root::DomRoot; | ||
| use dom::bindings::str::USVString; | ||
| use dom::bindings::trace::RootedTraceableBox; | ||
| use dom::blob::{Blob, BlobImpl}; | ||
| use dom::formdata::FormData; | ||
| use dom::globalscope::GlobalScope; | ||
| use dom::promise::Promise; | ||
| use js::jsapi::Heap; | ||
| use js::jsapi::JSContext; | ||
| use js::jsapi::JSObject; | ||
| use js::jsapi::JS_ClearPendingException; | ||
| use js::jsapi::JS_ParseJSON; | ||
| use js::jsapi::Value as JSValue; | ||
| use js::jsval::UndefinedValue; | ||
| use js::typedarray::{ArrayBuffer, CreateWith}; | ||
| use mime::{Mime, TopLevel, SubLevel}; | ||
| use std::cell::Ref; | ||
| use std::ptr; | ||
| use std::rc::Rc; | ||
| use std::str; | ||
| use url::form_urlencoded; | ||
| @@ -27,14 +32,16 @@ pub enum BodyType { | ||
| Blob, | ||
| FormData, | ||
| Json, | ||
| Text | ||
| Text, | ||
| ArrayBuffer | ||
| } | ||
|
|
||
| pub enum FetchedData { | ||
| Text(String), | ||
| Json(JSValue), | ||
| Json(RootedTraceableBox<Heap<JSValue>>), | ||
|
||
| BlobData(DomRoot<Blob>), | ||
| FormData(DomRoot<FormData>), | ||
| ArrayBuffer(RootedTraceableBox<Heap<*mut JSObject>>), | ||
| } | ||
|
|
||
| // https://fetch.spec.whatwg.org/#concept-body-consume-body | ||
| @@ -83,6 +90,7 @@ pub fn consume_body_with_promise<T: BodyOperations + DomObject>(object: &T, | ||
| FetchedData::Json(j) => promise.resolve_native(&j), | ||
| FetchedData::BlobData(b) => promise.resolve_native(&b), | ||
| FetchedData::FormData(f) => promise.resolve_native(&f), | ||
| FetchedData::ArrayBuffer(a) => promise.resolve_native(&a) | ||
| }; | ||
| }, | ||
| Err(err) => promise.reject_error(err), | ||
| @@ -104,6 +112,9 @@ fn run_package_data_algorithm<T: BodyOperations + DomObject>(object: &T, | ||
| BodyType::Json => run_json_data_algorithm(cx, bytes), | ||
| BodyType::Blob => run_blob_data_algorithm(&global, bytes, mime), | ||
| BodyType::FormData => run_form_data_algorithm(&global, bytes, mime), | ||
| BodyType::ArrayBuffer => unsafe { | ||
| run_array_buffer_data_algorithm(cx, bytes) | ||
kwonoj
Author
Contributor
|
||
| } | ||
| } | ||
| } | ||
|
|
||
| @@ -126,7 +137,8 @@ fn run_json_data_algorithm(cx: *mut JSContext, | ||
| // TODO: See issue #13464. Exception should be thrown instead of cleared. | ||
| return Err(Error::Type("Failed to parse JSON".to_string())); | ||
| } | ||
| Ok(FetchedData::Json(rval.get())) | ||
| let rooted_heap = RootedTraceableBox::from_box(Heap::boxed(rval.get())); | ||
| Ok(FetchedData::Json(rooted_heap)) | ||
| } | ||
| } | ||
|
|
||
| @@ -166,6 +178,17 @@ fn run_form_data_algorithm(root: &GlobalScope, bytes: Vec<u8>, mime: &[u8]) -> F | ||
| } | ||
| } | ||
|
|
||
| #[allow(unsafe_code)] | ||
| unsafe fn run_array_buffer_data_algorithm(cx: *mut JSContext, bytes: Vec<u8>) -> Fallible<FetchedData> { | ||
| rooted!(in(cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>()); | ||
| let arraybuffer = ArrayBuffer::create(cx, CreateWith::Slice(&bytes), array_buffer_ptr.handle_mut()); | ||
| if arraybuffer.is_err() { | ||
| return Err(Error::JSFailed); | ||
| } | ||
| let rooted_heap = RootedTraceableBox::from_box(Heap::boxed(array_buffer_ptr.get())); | ||
| Ok(FetchedData::ArrayBuffer(rooted_heap)) | ||
| } | ||
|
|
||
| pub trait BodyOperations { | ||
| fn get_body_used(&self) -> bool; | ||
| fn set_body_promise(&self, p: &Rc<Promise>, body_type: BodyType); | ||
| @@ -1,5 +1,3 @@ | ||
| [request-structure.html] | ||
| type: testharness | ||
| [Request has arrayBuffer method] | ||
| expected: FAIL | ||
|
|
| @@ -1,5 +1,3 @@ | ||
| [response-stream-disturbed-5.html] | ||
| type: testharness | ||
| [Getting a body reader after consuming as arrayBuffer] | ||
| expected: FAIL | ||
|
||
|
|
||
Oops, something went wrong.
ProTip!
Use n and p to navigate between commits in a pull request.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Updated Json to store
RootedTraceableBox<Heap>as suggested. Still it storesJSValueinstead ofJSVal, byJSValdoesn't meet trait bounds forRootedTraceableBox.