Skip to content

Commit 5ea105e

Browse files
committed
Use ImportSheet::Pending mechanism to load stylesheets
Signed-off-by: Nico Burns <[email protected]>
1 parent c625981 commit 5ea105e

File tree

1 file changed

+56
-60
lines changed

1 file changed

+56
-60
lines changed

packages/blitz-dom/src/net.rs

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
use selectors::context::QuirksMode;
2-
use std::{io::Cursor, sync::Arc, sync::atomic::AtomicBool};
2+
use std::{io::Cursor, sync::Arc};
33
use style::{
44
font_face::{FontFaceSourceFormat, FontFaceSourceFormatKeyword, Source},
55
media_queries::MediaList,
6-
parser::ParserContext,
76
servo_arc::Arc as ServoArc,
87
shared_lock::SharedRwLock,
98
shared_lock::{Locked, SharedRwLockReadGuard},
109
stylesheets::{
11-
AllowImportRules, CssRule, CssRules, DocumentStyleSheet, ImportRule, Origin, Stylesheet,
12-
StylesheetContents, StylesheetInDocument, StylesheetLoader as ServoStylesheetLoader,
13-
UrlExtraData,
10+
AllowImportRules, CssRule, DocumentStyleSheet, ImportRule, Origin, Stylesheet,
11+
StylesheetInDocument, StylesheetLoader as ServoStylesheetLoader, UrlExtraData,
1412
import_rule::{ImportLayer, ImportSheet, ImportSupportsCondition},
1513
},
1614
values::{CssUrl, SourceLocation},
@@ -49,7 +47,6 @@ impl ServoStylesheetLoader for StylesheetLoader {
4947
&self,
5048
url: CssUrl,
5149
location: SourceLocation,
52-
context: &ParserContext,
5350
lock: &SharedRwLock,
5451
media: ServoArc<Locked<MediaList>>,
5552
supports: Option<ImportSupportsCondition>,
@@ -65,76 +62,74 @@ impl ServoStylesheetLoader for StylesheetLoader {
6562
}));
6663
}
6764

68-
let sheet = ServoArc::new(Stylesheet {
69-
contents: StylesheetContents::from_data(
70-
CssRules::new(Vec::new(), lock),
71-
context.stylesheet_origin,
72-
context.url_data.clone(),
73-
context.quirks_mode,
74-
),
75-
media,
76-
shared_lock: lock.clone(),
77-
disabled: AtomicBool::new(false),
78-
});
79-
80-
let stylesheet = ImportSheet::new(sheet.clone());
8165
let import = ImportRule {
8266
url,
83-
stylesheet,
67+
stylesheet: ImportSheet::new_pending(),
8468
supports,
8569
layer,
8670
source_location: location,
8771
};
8872

89-
struct StylesheetLoaderInner {
90-
loader: StylesheetLoader,
91-
read_lock: SharedRwLock,
92-
url: ServoArc<Url>,
93-
sheet: ServoArc<Stylesheet>,
94-
provider: SharedProvider<Resource>,
95-
}
96-
impl NetHandler<Resource> for StylesheetLoaderInner {
97-
fn bytes(
98-
self: Box<Self>,
99-
doc_id: usize,
100-
bytes: Bytes,
101-
callback: SharedCallback<Resource>,
102-
) {
103-
let Ok(css) = std::str::from_utf8(&bytes) else {
104-
callback.call(doc_id, Err(Some(String::from("Invalid UTF8"))));
105-
return;
106-
};
107-
108-
// NOTE(Nico): I don't *think* external stylesheets should have HTML entities escaped
109-
// let escaped_css = html_escape::decode_html_entities(css);
110-
Stylesheet::update_from_str(
111-
&self.sheet,
112-
css,
113-
UrlExtraData(self.url),
114-
Some(&self.loader),
115-
None,
116-
AllowImportRules::Yes,
117-
);
118-
fetch_font_face(doc_id, &self.sheet, &self.provider, &self.read_lock.read());
119-
callback.call(doc_id, Ok(Resource::None))
120-
}
121-
}
122-
let url = import.url.url().unwrap();
73+
let url = import.url.url().unwrap().clone();
74+
let import = ServoArc::new(lock.wrap(import));
12375
self.1.fetch(
12476
self.0,
12577
Request::get(url.as_ref().clone()),
12678
Box::new(StylesheetLoaderInner {
12779
url: url.clone(),
12880
loader: self.clone(),
129-
read_lock: lock.clone(),
130-
sheet: sheet.clone(),
81+
lock: lock.clone(),
82+
media,
83+
import_rule: import.clone(),
13184
provider: self.1.clone(),
13285
}),
13386
);
13487

135-
ServoArc::new(lock.wrap(import))
88+
import
13689
}
13790
}
91+
92+
struct StylesheetLoaderInner {
93+
loader: StylesheetLoader,
94+
lock: SharedRwLock,
95+
url: ServoArc<Url>,
96+
media: ServoArc<Locked<MediaList>>,
97+
import_rule: ServoArc<Locked<ImportRule>>,
98+
provider: SharedProvider<Resource>,
99+
}
100+
101+
impl NetHandler<Resource> for StylesheetLoaderInner {
102+
fn bytes(self: Box<Self>, doc_id: usize, bytes: Bytes, callback: SharedCallback<Resource>) {
103+
let Ok(css) = std::str::from_utf8(&bytes) else {
104+
callback.call(doc_id, Err(Some(String::from("Invalid UTF8"))));
105+
return;
106+
};
107+
108+
// NOTE(Nico): I don't *think* external stylesheets should have HTML entities escaped
109+
// let escaped_css = html_escape::decode_html_entities(css);
110+
111+
let sheet = ServoArc::new(Stylesheet::from_str(
112+
css,
113+
UrlExtraData(self.url),
114+
Origin::Author,
115+
self.media.clone(),
116+
self.lock.clone(),
117+
Some(&self.loader),
118+
None, // error_reporter
119+
QuirksMode::NoQuirks,
120+
AllowImportRules::Yes,
121+
));
122+
123+
// Fetch @font-face fonts
124+
fetch_font_face(doc_id, &sheet, &self.provider, &self.lock.read());
125+
126+
let mut guard = self.lock.write();
127+
self.import_rule.write_with(&mut guard).stylesheet = ImportSheet::Sheet(sheet);
128+
129+
callback.call(doc_id, Ok(Resource::None))
130+
}
131+
}
132+
138133
impl NetHandler<Resource> for CssHandler {
139134
fn bytes(self: Box<Self>, doc_id: usize, bytes: Bytes, callback: SharedCallback<Resource>) {
140135
let Ok(css) = std::str::from_utf8(&bytes) else {
@@ -152,12 +147,13 @@ impl NetHandler<Resource> for CssHandler {
152147
ServoArc::new(self.guard.wrap(MediaList::empty())),
153148
self.guard.clone(),
154149
Some(&StylesheetLoader(doc_id, self.provider.clone())),
155-
None,
150+
None, // error_reporter
156151
QuirksMode::NoQuirks,
157152
AllowImportRules::Yes,
158153
);
159-
let read_guard = self.guard.read();
160-
fetch_font_face(doc_id, &sheet, &self.provider, &read_guard);
154+
155+
// Fetch @font-face fonts
156+
fetch_font_face(doc_id, &sheet, &self.provider, &self.guard.read());
161157

162158
callback.call(
163159
doc_id,

0 commit comments

Comments
 (0)