From 1bb907388d09e5177cabae10f6ba767d2ef39ba8 Mon Sep 17 00:00:00 2001 From: Lucas Fantacuci Date: Fri, 21 Dec 2018 17:38:22 -0200 Subject: [PATCH] Implementing the builder pattern for RequestInit --- components/gfx/font_cache_thread.rs | 8 +- components/net/tests/http_loader.rs | 539 +++++++++--------- components/net_traits/request.rs | 102 +++- .../script/dom/dedicatedworkerglobalscope.rs | 19 +- components/script/dom/eventsource.rs | 17 +- components/script/dom/htmlimageelement.rs | 9 +- components/script/dom/htmlmediaelement.rs | 11 +- components/script/dom/htmlscriptelement.rs | 25 +- .../script/dom/serviceworkerglobalscope.rs | 19 +- components/script/dom/websocket.rs | 10 +- components/script/dom/workerglobalscope.rs | 20 +- components/script/dom/worklet.rs | 14 +- components/script/dom/xmlhttprequest.rs | 33 +- components/script/fetch.rs | 47 +- components/script/layout_image.rs | 11 +- components/script/script_thread.rs | 27 +- components/script/stylesheet_loader.rs | 25 +- 17 files changed, 499 insertions(+), 437 deletions(-) diff --git a/components/gfx/font_cache_thread.rs b/components/gfx/font_cache_thread.rs index 4e8712c4ec1fd..91ba58e5fa21e 100644 --- a/components/gfx/font_cache_thread.rs +++ b/components/gfx/font_cache_thread.rs @@ -238,13 +238,7 @@ impl FontCache { None => return, }; - let request = RequestInit { - url: url.clone(), - destination: Destination::Font, - // TODO: Add a proper origin - Can't import GlobalScope from gfx - // We can leave origin to be set by default - ..RequestInit::default() - }; + let request = RequestInit::new(url.clone()).destination(Destination::Font); let channel_to_self = self.channel_to_self.clone(); let bytes = Mutex::new(Vec::new()); diff --git a/components/net/tests/http_loader.rs b/components/net/tests/http_loader.rs index d68be39d581ac..8eb6057e8825c 100644 --- a/components/net/tests/http_loader.rs +++ b/components/net/tests/http_loader.rs @@ -135,14 +135,14 @@ fn test_check_default_headers_loaded_in_every_request() { *expected_headers.lock().unwrap() = Some(headers.clone()); // Testing for method.GET - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - destination: Destination::Document, - origin: url.clone().origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(url.clone().origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); assert!(response .internal_response @@ -163,14 +163,14 @@ fn test_check_default_headers_loaded_in_every_request() { HeaderValue::from_str(&url_str[..url_str.len() - 1]).unwrap(), ); *expected_headers.lock().unwrap() = Some(post_headers); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::POST, - destination: Destination::Document, - origin: url.clone().origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::POST) + .destination(Destination::Document) + .origin(url.clone().origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); assert!(response .internal_response @@ -194,15 +194,15 @@ fn test_load_when_request_is_not_get_or_head_and_there_is_no_body_content_length }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::POST, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::POST) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); assert!(response .internal_response @@ -227,16 +227,16 @@ fn test_request_and_response_data_with_network_messages() { let mut request_headers = HeaderMap::new(); request_headers.typed_insert(Host::from("bar.foo".parse::().unwrap())); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - headers: request_headers, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .headers(request_headers) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let (devtools_chan, devtools_port) = unbounded(); let response = fetch(&mut request, Some(devtools_chan)); assert!(response @@ -328,14 +328,14 @@ fn test_request_and_response_message_from_devtool_without_pipeline_id() { }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: None, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(None), + ); + let (devtools_chan, devtools_port) = unbounded(); let response = fetch(&mut request, Some(devtools_chan)); assert!(response @@ -371,13 +371,13 @@ fn test_redirected_request_to_devtools() { }; let (pre_server, pre_url) = make_server(pre_handler); - let mut request = Request::from_init(RequestInit { - url: pre_url.clone(), - method: Method::POST, - destination: Destination::Document, - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(pre_url.clone()) + .method(Method::POST) + .destination(Destination::Document) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let (devtools_chan, devtools_port) = unbounded(); fetch(&mut request, Some(devtools_chan)); @@ -421,14 +421,14 @@ fn test_load_when_redirecting_from_a_post_should_rewrite_next_request_as_get() { }; let (pre_server, pre_url) = make_server(pre_handler); - let mut request = Request::from_init(RequestInit { - url: pre_url.clone(), - method: Method::POST, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(pre_url.clone()) + .method(Method::POST) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = pre_server.close(); @@ -452,15 +452,15 @@ fn test_load_should_decode_the_response_as_deflate_when_response_headers_have_co }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -486,15 +486,15 @@ fn test_load_should_decode_the_response_as_gzip_when_response_headers_have_conte }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -539,15 +539,15 @@ fn test_load_doesnt_send_request_body_on_any_redirect() { }; let (pre_server, pre_url) = make_server(pre_handler); - let mut request = Request::from_init(RequestInit { - url: pre_url.clone(), - body: Some(b"Body on POST!".to_vec()), - method: Method::POST, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(pre_url.clone()) + .body(Some(b"Body on POST!".to_vec())) + .method(Method::POST) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = pre_server.close(); @@ -568,15 +568,15 @@ fn test_load_doesnt_add_host_to_sts_list_when_url_is_http_even_if_sts_headers_ar }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let mut context = new_fetch_context(None, None); let response = fetch_with_context(&mut request, &mut context); @@ -615,16 +615,16 @@ fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_ assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch_with_context(&mut request, &mut context); let _ = server.close(); @@ -668,16 +668,16 @@ fn test_load_sets_requests_cookies_header_for_url_by_getting_cookies_from_the_re cookie_jar.push(cookie, &url, CookieSource::HTTP); } - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch_with_context(&mut request, &mut context); let _ = server.close(); @@ -715,16 +715,16 @@ fn test_load_sends_cookie_if_nonhttp() { cookie_jar.push(cookie, &url, CookieSource::HTTP); } - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch_with_context(&mut request, &mut context); let _ = server.close(); @@ -753,16 +753,16 @@ fn test_cookie_set_with_httponly_should_not_be_available_using_getcookiesforurl( assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch_with_context(&mut request, &mut context); let _ = server.close(); @@ -801,16 +801,16 @@ fn test_when_cookie_received_marked_secure_is_ignored_for_http() { assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch_with_context(&mut request, &mut context); let _ = server.close(); @@ -839,15 +839,15 @@ fn test_load_sets_content_length_to_length_of_request_body() { }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::POST, - body: Some(content.to_vec()), - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::POST) + .body(Some(content.to_vec())) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -879,15 +879,15 @@ fn test_load_uses_explicit_accept_from_headers_in_load_data() { let mut accept_headers = HeaderMap::new(); accept_headers.insert(header::ACCEPT, HeaderValue::from_static("text/html")); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - headers: accept_headers, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .headers(accept_headers) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -917,14 +917,14 @@ fn test_load_sets_default_accept_to_html_xhtml_xml_and_then_anything_else() { }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -956,15 +956,15 @@ fn test_load_uses_explicit_accept_encoding_from_load_data_headers() { let mut accept_encoding_headers = HeaderMap::new(); accept_encoding_headers.insert(header::ACCEPT_ENCODING, HeaderValue::from_static("chunked")); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - headers: accept_encoding_headers, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .headers(accept_encoding_headers) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -994,14 +994,14 @@ fn test_load_sets_default_accept_encoding_to_gzip_and_deflate() { }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -1048,14 +1048,14 @@ fn test_load_errors_when_there_a_redirect_loop() { *url_b_for_a.lock().unwrap() = Some(url_b.clone()); - let mut request = Request::from_init(RequestInit { - url: url_a.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url_a.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server_a.close(); @@ -1105,14 +1105,14 @@ fn test_load_succeeds_with_a_redirect_loop() { *url_b_for_a.lock().unwrap() = Some(url_b.clone()); - let mut request = Request::from_init(RequestInit { - url: url_a.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url_a.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = server_a.close(); @@ -1145,14 +1145,14 @@ fn test_load_follows_a_redirect() { }; let (pre_server, pre_url) = make_server(pre_handler); - let mut request = Request::from_init(RequestInit { - url: pre_url.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(pre_url.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)), + ); + let response = fetch(&mut request, None); let _ = pre_server.close(); @@ -1229,15 +1229,15 @@ fn test_redirect_from_x_to_y_provides_y_cookies_from_y() { cookie_jar.push(cookie_y, &url_y, CookieSource::HTTP); } - let mut request = Request::from_init(RequestInit { - url: url_x.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url_x.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch_with_context(&mut request, &mut context); let _ = server.close(); @@ -1279,15 +1279,15 @@ fn test_redirect_from_x_to_x_provides_x_with_cookie_from_first_response() { let url = url.join("/initial/").unwrap(); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let response = fetch(&mut request, None); let _ = server.close(); @@ -1311,16 +1311,16 @@ fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() { }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); + let mut context = new_fetch_context(None, None); let auth_entry = AuthCacheEntry { @@ -1356,16 +1356,15 @@ fn test_auth_ui_needs_www_auth() { }; let (server, url) = make_server(handler); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - body: None, - destination: Destination::Document, - origin: mock_origin(), - pipeline_id: Some(TEST_PIPELINE_ID), - credentials_mode: CredentialsMode::Include, - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .body(None) + .destination(Destination::Document) + .origin(mock_origin()) + .pipeline_id(Some(TEST_PIPELINE_ID)) + .credentials_mode(CredentialsMode::Include), + ); let response = fetch(&mut request, None); @@ -1395,13 +1394,13 @@ fn test_origin_set() { let mut origin = Origin::try_from_parts(url.scheme(), url.host_str().unwrap(), url.port()).unwrap(); *origin_header_clone.lock().unwrap() = Some(origin.clone()); - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::POST, - body: None, - origin: url.clone().origin(), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::POST) + .body(None) + .origin(url.clone().origin()), + ); + let response = fetch(&mut request, None); assert!(response .internal_response @@ -1415,14 +1414,13 @@ fn test_origin_set() { origin = Origin::try_from_parts(origin_url.scheme(), origin_url.host_str().unwrap(), None).unwrap(); // Test Origin header is set on Get request with CORS mode - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::GET, - mode: RequestMode::CorsMode, - body: None, - origin: origin_url.clone().origin(), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::GET) + .mode(RequestMode::CorsMode) + .body(None) + .origin(origin_url.clone().origin()), + ); *origin_header_clone.lock().unwrap() = Some(origin.clone()); let response = fetch(&mut request, None); @@ -1435,13 +1433,12 @@ fn test_origin_set() { .is_success()); // Test Origin header is not set on method Head - let mut request = Request::from_init(RequestInit { - url: url.clone(), - method: Method::HEAD, - body: None, - origin: url.clone().origin(), - ..RequestInit::default() - }); + let mut request = Request::from_init( + RequestInit::new(url.clone()) + .method(Method::HEAD) + .body(None) + .origin(url.clone().origin()), + ); *origin_header_clone.lock().unwrap() = None; let response = fetch(&mut request, None); diff --git a/components/net_traits/request.rs b/components/net_traits/request.rs index 2c32b666f5245..658de4d6d852b 100644 --- a/components/net_traits/request.rs +++ b/components/net_traits/request.rs @@ -135,6 +135,7 @@ pub enum CorsSettings { UseCredentials, } +// TODO: Implementing the Builder Pattern #[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)] pub struct RequestInit { #[serde( @@ -172,11 +173,11 @@ pub struct RequestInit { pub url_list: Vec, } -impl Default for RequestInit { - fn default() -> RequestInit { +impl RequestInit { + pub fn new(url: ServoUrl) -> RequestInit { RequestInit { method: Method::GET, - url: ServoUrl::parse("about:blank").unwrap(), + url: url, headers: HeaderMap::new(), unsafe_request: false, body: None, @@ -197,6 +198,101 @@ impl Default for RequestInit { url_list: vec![], } } + + pub fn method(mut self, method: Method) -> RequestInit { + self.method = method; + self + } + + pub fn headers(mut self, headers: HeaderMap) -> RequestInit { + self.headers = headers; + self + } + + pub fn unsafe_request(mut self, unsafe_request: bool) -> RequestInit { + self.unsafe_request = unsafe_request; + self + } + + pub fn body(mut self, body: Option>) -> RequestInit { + self.body = body; + self + } + + pub fn service_workers_mode(mut self, service_workers_mode: ServiceWorkersMode) -> RequestInit { + self.service_workers_mode = service_workers_mode; + self + } + + pub fn destination(mut self, destination: Destination) -> RequestInit { + self.destination = destination; + self + } + + pub fn synchronous(mut self, synchronous: bool) -> RequestInit { + self.synchronous = synchronous; + self + } + + pub fn mode(mut self, mode: RequestMode) -> RequestInit { + self.mode = mode; + self + } + + pub fn cache_mode(mut self, cache_mode: CacheMode) -> RequestInit { + self.cache_mode = cache_mode; + self + } + + pub fn use_cors_preflight(mut self, use_cors_preflight: bool) -> RequestInit { + self.use_cors_preflight = use_cors_preflight; + self + } + + pub fn credentials_mode(mut self, credentials_mode: CredentialsMode) -> RequestInit { + self.credentials_mode = credentials_mode; + self + } + + pub fn use_url_credentials(mut self, use_url_credentials: bool) -> RequestInit { + self.use_url_credentials = use_url_credentials; + self + } + + pub fn origin(mut self, origin: ImmutableOrigin) -> RequestInit { + self.origin = origin; + self + } + + pub fn referrer_url(mut self, referrer_url: Option) -> RequestInit { + self.referrer_url = referrer_url; + self + } + + pub fn referrer_policy(mut self, referrer_policy: Option) -> RequestInit { + self.referrer_policy = referrer_policy; + self + } + + pub fn pipeline_id(mut self, pipeline_id: Option) -> RequestInit { + self.pipeline_id = pipeline_id; + self + } + + pub fn redirect_mode(mut self, redirect_mode: RedirectMode) -> RequestInit { + self.redirect_mode = redirect_mode; + self + } + + pub fn integrity_metadata(mut self, integrity_metadata: String) -> RequestInit { + self.integrity_metadata = integrity_metadata; + self + } + + pub fn url_list(mut self, url_list: Vec) -> RequestInit { + self.url_list = url_list; + self + } } /// A [Request](https://fetch.spec.whatwg.org/#concept-request) as defined by diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index a0c5e19f42159..5304f3b4667ad 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -305,17 +305,14 @@ impl DedicatedWorkerGlobalScope { pipeline_id, } = worker_load_origin; - let request = RequestInit { - url: worker_url.clone(), - destination: Destination::Worker, - credentials_mode: CredentialsMode::Include, - use_url_credentials: true, - pipeline_id: pipeline_id, - referrer_url: referrer_url, - referrer_policy: referrer_policy, - origin, - ..RequestInit::default() - }; + let request = RequestInit::new(worker_url.clone()) + .destination(Destination::Worker) + .credentials_mode(CredentialsMode::Include) + .use_url_credentials(true) + .pipeline_id(pipeline_id) + .referrer_url(referrer_url) + .referrer_policy(referrer_policy) + .origin(origin); let (metadata, bytes) = match load_whole_resource(request, &init.resource_threads.sender()) { diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index 40b9465a5de6e..846d8a6f0b6a7 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -519,20 +519,17 @@ impl EventSource { }; // Step 8 // TODO: Step 9 set request's client settings - let mut request = RequestInit { - url: url_record, - origin: global.origin().immutable().clone(), - pipeline_id: Some(global.pipeline_id()), + let mut request = RequestInit::new(url_record) + .origin(global.origin().immutable().clone()) + .pipeline_id(Some(global.pipeline_id())) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request - use_url_credentials: true, - mode: RequestMode::CorsMode, - credentials_mode: if cors_attribute_state == CorsSettings::Anonymous { + .use_url_credentials(true) + .mode(RequestMode::CorsMode) + .credentials_mode(if cors_attribute_state == CorsSettings::Anonymous { CredentialsMode::CredentialsSameOrigin } else { CredentialsMode::Include - }, - ..RequestInit::default() - }; + }); // Step 10 // TODO(eijebong): Replace once typed headers allow it request.headers.insert( diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index d11cd2ed4dea9..9b31c192bda0d 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -324,12 +324,9 @@ impl HTMLImageElement { }), ); - let request = RequestInit { - url: img_url.clone(), - origin: document.origin().immutable().clone(), - pipeline_id: Some(document.global().pipeline_id()), - ..RequestInit::default() - }; + let request = RequestInit::new(img_url.clone()) + .origin(document.origin().immutable().clone()) + .pipeline_id(Some(document.global().pipeline_id())); // This is a background load because the load blocker already fulfills the // purpose of delaying the document's load event. diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index dbc952688b160..1bdcdd4127d49 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -722,7 +722,16 @@ impl HTMLMediaElement { referrer_policy: document.get_referrer_policy(), ..RequestInit::default() }; - + /*let request = RequestInit::new(self.resource_url.borrow().as_ref().unwrap().clone()) + .headers(headers) + .destination(destination) + .credentials_mode(CredentialsMode::Include) + .use_url_credentials(true) + .origin(document.origin().immutable().clone()) + .pipeline_id(Some(self.global().pipeline_id())) + .referrer_url(Some(document.url())) + .referrer_policy(document.get_referrer_policy()); +*/ let mut current_fetch_context = self.current_fetch_context.borrow_mut(); if let Some(ref mut current_fetch_context) = *current_fetch_context { current_fetch_context.cancel(CancelReason::Overridden); diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1aa2e6fa1f591..55e01fdce3244 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -290,28 +290,25 @@ fn fetch_a_classic_script( let doc = document_from_node(script); // Step 1, 2. - let request = RequestInit { - url: url.clone(), - destination: Destination::Script, + let request = RequestInit::new(url.clone()) + .destination(Destination::Script) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 1 - mode: match cors_setting { + .mode(match cors_setting { Some(_) => RequestMode::CorsMode, None => RequestMode::NoCors, - }, + }) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 3-4 - credentials_mode: match cors_setting { + .credentials_mode(match cors_setting { Some(CorsSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin, _ => CredentialsMode::Include, - }, - origin: doc.origin().immutable().clone(), - pipeline_id: Some(script.global().pipeline_id()), - referrer_url: Some(doc.url()), - referrer_policy: doc.get_referrer_policy(), - integrity_metadata: integrity_metadata, - ..RequestInit::default() - }; + }) + .origin(doc.origin().immutable().clone()) + .pipeline_id(Some(script.global().pipeline_id())) + .referrer_url(Some(doc.url())) + .referrer_policy(doc.get_referrer_policy()) + .integrity_metadata(integrity_metadata); // TODO: Step 3, Add custom steps to perform fetch diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 7c0842d7b65ff..41ab20b120590 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -281,17 +281,14 @@ impl ServiceWorkerGlobalScope { pipeline_id, } = worker_load_origin; - let request = RequestInit { - url: script_url.clone(), - destination: Destination::ServiceWorker, - credentials_mode: CredentialsMode::Include, - use_url_credentials: true, - pipeline_id: pipeline_id, - referrer_url: referrer_url, - referrer_policy: referrer_policy, - origin, - ..RequestInit::default() - }; + let request = RequestInit::new(script_url.clone()) + .destination(Destination::ServiceWorker) + .credentials_mode(CredentialsMode::Include) + .use_url_credentials(true) + .pipeline_id(pipeline_id) + .referrer_url(referrer_url) + .referrer_policy(referrer_policy) + .origin(origin); let (url, source) = match load_whole_resource(request, &init.resource_threads.sender()) { diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index d03e168e3a137..3de9cee3704b9 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -201,12 +201,10 @@ impl WebSocket { let address = Trusted::new(&*ws); // Step 8. - let request = RequestInit { - url: url_record, - origin: global.origin().immutable().clone(), - mode: RequestMode::WebSocket { protocols }, - ..RequestInit::default() - }; + let request = RequestInit::new(url_record) + .origin(global.origin().immutable().clone()) + .mode(RequestMode::WebSocket { protocols }); + let channels = FetchChannels::WebSocket { event_sender: resource_event_sender, action_receiver: resource_action_receiver, diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 75987e2aa17a7..71663806d069e 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -207,17 +207,15 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { rooted!(in(self.runtime.cx()) let mut rval = UndefinedValue()); for url in urls { let global_scope = self.upcast::(); - let request = NetRequestInit { - url: url.clone(), - destination: Destination::Script, - credentials_mode: CredentialsMode::Include, - use_url_credentials: true, - origin: global_scope.origin().immutable().clone(), - pipeline_id: Some(self.upcast::().pipeline_id()), - referrer_url: None, - referrer_policy: None, - ..NetRequestInit::default() - }; + let request = NetRequestInit::new(url.clone()) + .destination(Destination::Script) + .credentials_mode(CredentialsMode::Include) + .use_url_credentials(true) + .origin(global_scope.origin().immutable().clone()) + .pipeline_id(Some(self.upcast::().pipeline_id())) + .referrer_url(None) + .referrer_policy(None); +; let (url, source) = match load_whole_resource(request, &global_scope.resource_threads().sender()) { Err(_) => return Err(Error::Network), diff --git a/components/script/dom/worklet.rs b/components/script/dom/worklet.rs index 16d7ccb5f6bb3..0023485a221f3 100644 --- a/components/script/dom/worklet.rs +++ b/components/script/dom/worklet.rs @@ -619,14 +619,12 @@ impl WorkletThread { // TODO: Fetch the script asynchronously? // TODO: Caching. let resource_fetcher = self.global_init.resource_threads.sender(); - let request = RequestInit { - url: script_url, - destination: Destination::Script, - mode: RequestMode::CorsMode, - credentials_mode: credentials.into(), - origin, - ..RequestInit::default() - }; + let request = RequestInit::new(script_url) + .destination(Destination::Script) + .mode(RequestMode::CorsMode) + .credentials_mode(credentials.into()) + .origin(origin); + let script = load_whole_resource(request, &resource_fetcher) .ok() .and_then(|(_, bytes)| String::from_utf8(bytes).ok()); diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index b8d6002c1d89f..eba06b2ed1628 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -638,27 +638,24 @@ impl XMLHttpRequestMethods for XMLHttpRequest { unreachable!() }; - let mut request = RequestInit { - method: self.request_method.borrow().clone(), - url: self.request_url.borrow().clone().unwrap(), - headers: (*self.request_headers.borrow()).clone(), - unsafe_request: true, + let mut request = RequestInit::new(self.request_url.borrow().clone().unwrap()) + .method(self.request_method.borrow().clone()) + .headers((*self.request_headers.borrow()).clone()) + .unsafe_request(true) // XXXManishearth figure out how to avoid this clone - body: extracted_or_serialized.as_ref().map(|e| e.0.clone()), + .body(extracted_or_serialized.as_ref().map(|e| e.0.clone())) // XXXManishearth actually "subresource", but it doesn't exist // https://github.com/whatwg/xhr/issues/71 - destination: Destination::None, - synchronous: self.sync.get(), - mode: RequestMode::CorsMode, - use_cors_preflight: has_handlers, - credentials_mode: credentials_mode, - use_url_credentials: use_url_credentials, - origin: self.global().origin().immutable().clone(), - referrer_url: self.referrer_url.clone(), - referrer_policy: self.referrer_policy.clone(), - pipeline_id: Some(self.global().pipeline_id()), - ..RequestInit::default() - }; + .destination(Destination::None) + .synchronous(self.sync.get()) + .mode(RequestMode::CorsMode) + .use_cors_preflight(has_handlers) + .credentials_mode(credentials_mode) + .use_url_credentials(use_url_credentials) + .origin(self.global().origin().immutable().clone()) + .referrer_url(self.referrer_url.clone()) + .referrer_policy(self.referrer_policy.clone()) + .pipeline_id(Some(self.global().pipeline_id())); // step 4 (second half) match extracted_or_serialized { diff --git a/components/script/fetch.rs b/components/script/fetch.rs index 04c5e7f5ede5d..adbc78a319cd4 100644 --- a/components/script/fetch.rs +++ b/components/script/fetch.rs @@ -99,30 +99,29 @@ fn from_referrer_to_referrer_url(request: &NetTraitsRequest) -> Option } fn request_init_from_request(request: NetTraitsRequest) -> NetTraitsRequestInit { - NetTraitsRequestInit { - method: request.method.clone(), - url: request.url(), - headers: request.headers.clone(), - unsafe_request: request.unsafe_request, - body: request.body.clone(), - destination: request.destination, - synchronous: request.synchronous, - mode: request.mode.clone(), - use_cors_preflight: request.use_cors_preflight, - credentials_mode: request.credentials_mode, - use_url_credentials: request.use_url_credentials, - origin: GlobalScope::current() - .expect("No current global object") - .origin() - .immutable() - .clone(), - referrer_url: from_referrer_to_referrer_url(&request), - referrer_policy: request.referrer_policy, - pipeline_id: request.pipeline_id, - redirect_mode: request.redirect_mode, - cache_mode: request.cache_mode, - ..NetTraitsRequestInit::default() - } + NetTraitsRequestInit::new(request.url()) + .method(request.method.clone()) + .headers(request.headers.clone()) + .unsafe_request(request.unsafe_request) + .body(request.body.clone()) + .destination(request.destination) + .synchronous(request.synchronous) + .mode(request.mode.clone()) + .use_cors_preflight(request.use_cors_preflight) + .credentials_mode(request.credentials_mode) + .use_url_credentials(request.use_url_credentials) + .origin( + GlobalScope::current() + .expect("No current global object") + .origin() + .immutable() + .clone(), + ) + .referrer_url(from_referrer_to_referrer_url(&request)) + .referrer_policy(request.referrer_policy) + .pipeline_id(request.pipeline_id) + .redirect_mode(request.redirect_mode) + .cache_mode(request.cache_mode) } // https://fetch.spec.whatwg.org/#fetch-method diff --git a/components/script/layout_image.rs b/components/script/layout_image.rs index 01fe65a01d15b..ff79705a5c425 100644 --- a/components/script/layout_image.rs +++ b/components/script/layout_image.rs @@ -110,13 +110,10 @@ pub fn fetch_image_for_layout( }), ); - let request = FetchRequestInit { - url: url, - origin: document.origin().immutable().clone(), - destination: Destination::Image, - pipeline_id: Some(document.global().pipeline_id()), - ..FetchRequestInit::default() - }; + let request = FetchRequestInit::new(url) + .origin(document.origin().immutable().clone()) + .destination(Destination::Image) + .pipeline_id(Some(document.global().pipeline_id())); // Layout image loads do not delay the document load event. document diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 78b7a8606b094..744e9049963a3 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -3331,21 +3331,18 @@ impl ScriptThread { /// argument until a notification is received that the fetch is complete. fn pre_page_load(&self, mut incomplete: InProgressLoad, load_data: LoadData) { let id = incomplete.pipeline_id.clone(); - let req_init = RequestInit { - url: load_data.url.clone(), - method: load_data.method, - destination: Destination::Document, - credentials_mode: CredentialsMode::Include, - use_url_credentials: true, - pipeline_id: Some(id), - referrer_url: load_data.referrer_url, - referrer_policy: load_data.referrer_policy, - headers: load_data.headers, - body: load_data.data, - redirect_mode: RedirectMode::Manual, - origin: incomplete.origin.immutable().clone(), - ..RequestInit::default() - }; + let req_init = RequestInit::new(load_data.url.clone()) + .method(load_data.method) + .destination(Destination::Document) + .credentials_mode(CredentialsMode::Include) + .use_url_credentials(true) + .pipeline_id(Some(id)) + .referrer_url(load_data.referrer_url) + .referrer_policy(load_data.referrer_policy) + .headers(load_data.headers) + .body(load_data.data) + .redirect_mode(RedirectMode::Manual) + .origin(incomplete.origin.immutable().clone()); let context = ParserContext::new(id, load_data.url); self.incomplete_parser_contexts diff --git a/components/script/stylesheet_loader.rs b/components/script/stylesheet_loader.rs index 88ad87ada22b1..12685949ac534 100644 --- a/components/script/stylesheet_loader.rs +++ b/components/script/stylesheet_loader.rs @@ -308,28 +308,25 @@ impl<'a> StylesheetLoader<'a> { document.increment_script_blocking_stylesheet_count(); } - let request = RequestInit { - url: url.clone(), - destination: Destination::Style, + let request = RequestInit::new(url.clone()) + .destination(Destination::Style) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 1 - mode: match cors_setting { + .mode(match cors_setting { Some(_) => RequestMode::CorsMode, None => RequestMode::NoCors, - }, + }) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 3-4 - credentials_mode: match cors_setting { + .credentials_mode(match cors_setting { Some(CorsSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin, _ => CredentialsMode::Include, - }, - origin: document.origin().immutable().clone(), - pipeline_id: Some(self.elem.global().pipeline_id()), - referrer_url: Some(document.url()), - referrer_policy: referrer_policy, - integrity_metadata: integrity_metadata, - ..RequestInit::default() - }; + }) + .origin(document.origin().immutable().clone()) + .pipeline_id(Some(self.elem.global().pipeline_id())) + .referrer_url(Some(document.url())) + .referrer_policy(referrer_policy) + .integrity_metadata(integrity_metadata); document.fetch_async(LoadType::Stylesheet(url), request, action_sender); }