Skip to content

Commit 9fc0e48

Browse files
committed
servo: Merge #17491 - Introduce service-worker mode (from KiChjang:update-fetch); r=jdm
Bringing in the spec changes from whatwg/fetch#435. Source-Repo: https://github.com/servo/servo Source-Revision: e2a26e7bd0d8089a441bc3072cf15351b0ef1252 UltraBlame original commit: 7ad2e4b94b03bb9e821f6962fc7df6fc0f936519
1 parent 12805c1 commit 9fc0e48

File tree

6 files changed

+80
-66
lines changed

6 files changed

+80
-66
lines changed

servo/components/net/http_loader.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use msg::constellation_msg::PipelineId;
3434
use net_traits::{CookieSource, FetchMetadata, NetworkError, ReferrerPolicy};
3535
use net_traits::request::{CacheMode, CredentialsMode, Destination, Origin};
3636
use net_traits::request::{RedirectMode, Referrer, Request, RequestMode};
37-
use net_traits::request::{ResponseTainting, Type};
37+
use net_traits::request::{ResponseTainting, ServiceWorkersMode, Type};
3838
use net_traits::response::{HttpsState, Response, ResponseBody, ResponseType};
3939
use resource_thread::AuthCache;
4040
use servo_url::{ImmutableOrigin, ServoUrl};
@@ -521,15 +521,29 @@ pub fn http_fetch(request: &mut Request,
521521

522522

523523

524-
if !request.skip_service_worker && !request.is_service_worker_global_scope {
524+
if request.service_workers_mode != ServiceWorkersMode::None {
525525

526+
if request.service_workers_mode == ServiceWorkersMode::All {
527+
528+
}
529+
526530

531+
if response.is_none() && request.is_subresource_request() && match request.origin {
532+
Origin::Origin(ref origin) if *origin == request.url().origin() => true,
533+
_ => false,
534+
} {
535+
536+
}
527537

538+
528539
if let Some(ref res) = response {
529540

530541

531542

532543

544+
545+
546+
533547
if (res.response_type == ResponseType::Opaque &&
534548
request.mode != RequestMode::NoCors) ||
535549
(res.response_type == ResponseType::OpaqueRedirect &&
@@ -576,7 +590,9 @@ pub fn http_fetch(request: &mut Request,
576590
}
577591

578592

579-
request.skip_service_worker = true;
593+
if request.redirect_mode == RedirectMode::Follow {
594+
request.service_workers_mode = ServiceWorkersMode::Foreign;
595+
}
580596

581597

582598
let mut fetch_result = http_network_or_cache_fetch(
@@ -1238,8 +1254,7 @@ fn cors_preflight_fetch(request: &Request,
12381254
context: &FetchContext)
12391255
-> Response {
12401256

1241-
let mut preflight = Request::new(request.current_url(), Some(request.origin.clone()),
1242-
request.is_service_worker_global_scope, request.pipeline_id);
1257+
let mut preflight = Request::new(request.current_url(), Some(request.origin.clone()), request.pipeline_id);
12431258
preflight.method = Method::Options;
12441259
preflight.initiator = request.initiator.clone();
12451260
preflight.type_ = request.type_.clone();

servo/components/net_traits/request.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ pub enum CacheMode {
9898
}
9999

100100

101+
#[derive(Copy, Clone, PartialEq, Serialize, Deserialize, HeapSizeOf)]
102+
pub enum ServiceWorkersMode {
103+
All,
104+
Foreign,
105+
None,
106+
}
107+
108+
101109
#[derive(Copy, Clone, PartialEq, Serialize, Deserialize, HeapSizeOf)]
102110
pub enum RedirectMode {
103111
Follow,
@@ -140,6 +148,7 @@ pub struct RequestInit {
140148
pub headers: Headers,
141149
pub unsafe_request: bool,
142150
pub body: Option<Vec<u8>>,
151+
pub service_workers_mode: ServiceWorkersMode,
143152

144153
pub type_: Type,
145154
pub destination: Destination,
@@ -170,6 +179,7 @@ impl Default for RequestInit {
170179
headers: Headers::new(),
171180
unsafe_request: false,
172181
body: None,
182+
service_workers_mode: ServiceWorkersMode::All,
173183
type_: Type::None,
174184
destination: Destination::None,
175185
synchronous: false,
@@ -208,12 +218,12 @@ pub struct Request {
208218

209219
pub body: Option<Vec<u8>>,
210220

211-
pub is_service_worker_global_scope: bool,
212221
pub window: Window,
213222

214223

215224
pub keep_alive: bool,
216-
pub skip_service_worker: bool,
225+
226+
pub service_workers_mode: ServiceWorkersMode,
217227

218228
pub initiator: Initiator,
219229

@@ -257,7 +267,6 @@ pub struct Request {
257267
impl Request {
258268
pub fn new(url: ServoUrl,
259269
origin: Option<Origin>,
260-
is_service_worker_global_scope: bool,
261270
pipeline_id: Option<PipelineId>)
262271
-> Request {
263272
Request {
@@ -267,10 +276,9 @@ impl Request {
267276
headers: Headers::new(),
268277
unsafe_request: false,
269278
body: None,
270-
is_service_worker_global_scope: is_service_worker_global_scope,
271279
window: Window::Client,
272280
keep_alive: false,
273-
skip_service_worker: false,
281+
service_workers_mode: ServiceWorkersMode::All,
274282
initiator: Initiator::None,
275283
type_: Type::None,
276284
destination: Destination::None,
@@ -295,12 +303,12 @@ impl Request {
295303
pub fn from_init(init: RequestInit) -> Request {
296304
let mut req = Request::new(init.url.clone(),
297305
Some(Origin::Origin(init.origin.origin())),
298-
false,
299306
init.pipeline_id);
300307
req.method = init.method;
301308
req.headers = init.headers;
302309
req.unsafe_request = init.unsafe_request;
303310
req.body = init.body;
311+
req.service_workers_mode = init.service_workers_mode;
304312
req.type_ = init.type_;
305313
req.destination = init.destination;
306314
req.synchronous = init.synchronous;

servo/components/script/dom/request.rs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,11 @@ pub struct Request {
5555

5656
impl Request {
5757
fn new_inherited(global: &GlobalScope,
58-
url: ServoUrl,
59-
is_service_worker_global_scope: bool) -> Request {
58+
url: ServoUrl) -> Request {
6059
Request {
6160
reflector_: Reflector::new(),
6261
request: DOMRefCell::new(
63-
net_request_from_global(global,
64-
url,
65-
is_service_worker_global_scope)),
62+
net_request_from_global(global, url)),
6663
body_used: Cell::new(false),
6764
headers: Default::default(),
6865
mime_type: DOMRefCell::new("".to_string().into_bytes()),
@@ -71,11 +68,9 @@ impl Request {
7168
}
7269

7370
pub fn new(global: &GlobalScope,
74-
url: ServoUrl,
75-
is_service_worker_global_scope: bool) -> Root<Request> {
71+
url: ServoUrl) -> Root<Request> {
7672
reflect_dom_object(box Request::new_inherited(global,
77-
url,
78-
is_service_worker_global_scope),
73+
url),
7974
global, RequestBinding::Wrap)
8075
}
8176

@@ -111,9 +106,7 @@ impl Request {
111106
return Err(Error::Type("Url includes credentials".to_string()))
112107
}
113108
// Step 5.4
114-
temporary_request = net_request_from_global(global,
115-
url,
116-
false);
109+
temporary_request = net_request_from_global(global, url);
117110
// Step 5.5
118111
fallback_mode = Some(NetTraitsRequestMode::CorsMode);
119112
// Step 5.6
@@ -152,9 +145,7 @@ impl Request {
152145

153146
// Step 12
154147
let mut request: NetTraitsRequest;
155-
request = net_request_from_global(global,
156-
temporary_request.current_url(),
157-
false);
148+
request = net_request_from_global(global, temporary_request.current_url());
158149
request.method = temporary_request.method;
159150
request.headers = temporary_request.headers.clone();
160151
request.unsafe_request = true;
@@ -293,9 +284,7 @@ impl Request {
293284
}
294285

295286
// Step 26
296-
let r = Request::from_net_request(global,
297-
false,
298-
request);
287+
let r = Request::from_net_request(global, request);
299288
r.headers.or_init(|| Headers::for_request(&r.global()));
300289

301290
// Step 27
@@ -421,23 +410,20 @@ impl Request {
421410

422411
impl Request {
423412
fn from_net_request(global: &GlobalScope,
424-
is_service_worker_global_scope: bool,
425413
net_request: NetTraitsRequest) -> Root<Request> {
426414
let r = Request::new(global,
427-
net_request.current_url(),
428-
is_service_worker_global_scope);
415+
net_request.current_url());
429416
*r.request.borrow_mut() = net_request;
430417
r
431418
}
432419

433420
fn clone_from(r: &Request) -> Fallible<Root<Request>> {
434421
let req = r.request.borrow();
435422
let url = req.url();
436-
let is_service_worker_global_scope = req.is_service_worker_global_scope;
437423
let body_used = r.body_used.get();
438424
let mime_type = r.mime_type.borrow().clone();
439425
let headers_guard = r.Headers().get_guard();
440-
let r_clone = Request::new(&r.global(), url, is_service_worker_global_scope);
426+
let r_clone = Request::new(&r.global(), url);
441427
r_clone.request.borrow_mut().pipeline_id = req.pipeline_id;
442428
{
443429
let mut borrowed_r_request = r_clone.request.borrow_mut();
@@ -457,13 +443,11 @@ impl Request {
457443
}
458444

459445
fn net_request_from_global(global: &GlobalScope,
460-
url: ServoUrl,
461-
is_service_worker_global_scope: bool) -> NetTraitsRequest {
446+
url: ServoUrl) -> NetTraitsRequest {
462447
let origin = Origin::Origin(global.get_url().origin());
463448
let pipeline_id = global.pipeline_id();
464449
NetTraitsRequest::new(url,
465450
Some(origin),
466-
is_service_worker_global_scope,
467451
Some(pipeline_id))
468452
}
469453

servo/components/script/fetch.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
77
use dom::bindings::codegen::Bindings::ResponseBinding::ResponseBinding::ResponseMethods;
88
use dom::bindings::codegen::Bindings::ResponseBinding::ResponseType as DOMResponseType;
99
use dom::bindings::error::Error;
10+
use dom::bindings::inheritance::Castable;
1011
use dom::bindings::js::Root;
1112
use dom::bindings::refcounted::{Trusted, TrustedPromise};
1213
use dom::bindings::reflector::DomObject;
@@ -16,13 +17,14 @@ use dom::headers::Guard;
1617
use dom::promise::Promise;
1718
use dom::request::Request;
1819
use dom::response::Response;
20+
use dom::serviceworkerglobalscope::ServiceWorkerGlobalScope;
1921
use ipc_channel::ipc;
2022
use ipc_channel::router::ROUTER;
2123
use js::jsapi::JSAutoCompartment;
2224
use net_traits::{FetchResponseListener, NetworkError};
2325
use net_traits::{FilteredMetadata, FetchMetadata, Metadata};
2426
use net_traits::CoreResourceMsg::Fetch as NetTraitsFetch;
25-
use net_traits::request::Request as NetTraitsRequest;
27+
use net_traits::request::{Request as NetTraitsRequest, ServiceWorkersMode};
2628
use net_traits::request::RequestInit as NetTraitsRequestInit;
2729
use network_listener::{NetworkListener, PreInvoke};
2830
use servo_url::ServoUrl;
@@ -83,7 +85,12 @@ pub fn Fetch(global: &GlobalScope, input: RequestInfo, init: RootedTraceableBox<
8385
},
8486
Ok(r) => r.get_request(),
8587
};
86-
let request_init = request_init_from_request(request);
88+
let mut request_init = request_init_from_request(request);
89+
90+
91+
if global.downcast::<ServiceWorkerGlobalScope>().is_some() {
92+
request_init.service_workers_mode = ServiceWorkersMode::Foreign;
93+
}
8794

8895

8996
response.Headers().set_guard(Guard::Immutable);

servo/tests/unit/net/data_loader.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fn assert_parse(url: &'static str,
1919
data: Option<&[u8]>) {
2020
let url = ServoUrl::parse(url).unwrap();
2121
let origin = Origin::Origin(url.origin());
22-
let mut request = Request::new(url, Some(origin), false, None);
22+
let mut request = Request::new(url, Some(origin), None);
2323

2424
let response = fetch(&mut request, None);
2525

0 commit comments

Comments
 (0)