1
1
use selectors:: context:: QuirksMode ;
2
- use std:: { io:: Cursor , sync:: Arc , sync :: atomic :: AtomicBool } ;
2
+ use std:: { io:: Cursor , sync:: Arc } ;
3
3
use style:: {
4
4
font_face:: { FontFaceSourceFormat , FontFaceSourceFormatKeyword , Source } ,
5
5
media_queries:: MediaList ,
6
- parser:: ParserContext ,
7
6
servo_arc:: Arc as ServoArc ,
8
7
shared_lock:: SharedRwLock ,
9
8
shared_lock:: { Locked , SharedRwLockReadGuard } ,
10
9
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 ,
14
12
import_rule:: { ImportLayer , ImportSheet , ImportSupportsCondition } ,
15
13
} ,
16
14
values:: { CssUrl , SourceLocation } ,
@@ -49,7 +47,6 @@ impl ServoStylesheetLoader for StylesheetLoader {
49
47
& self ,
50
48
url : CssUrl ,
51
49
location : SourceLocation ,
52
- context : & ParserContext ,
53
50
lock : & SharedRwLock ,
54
51
media : ServoArc < Locked < MediaList > > ,
55
52
supports : Option < ImportSupportsCondition > ,
@@ -65,76 +62,74 @@ impl ServoStylesheetLoader for StylesheetLoader {
65
62
} ) ) ;
66
63
}
67
64
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 ( ) ) ;
81
65
let import = ImportRule {
82
66
url,
83
- stylesheet,
67
+ stylesheet : ImportSheet :: new_pending ( ) ,
84
68
supports,
85
69
layer,
86
70
source_location : location,
87
71
} ;
88
72
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) ) ;
123
75
self . 1 . fetch (
124
76
self . 0 ,
125
77
Request :: get ( url. as_ref ( ) . clone ( ) ) ,
126
78
Box :: new ( StylesheetLoaderInner {
127
79
url : url. clone ( ) ,
128
80
loader : self . clone ( ) ,
129
- read_lock : lock. clone ( ) ,
130
- sheet : sheet. clone ( ) ,
81
+ lock : lock. clone ( ) ,
82
+ media,
83
+ import_rule : import. clone ( ) ,
131
84
provider : self . 1 . clone ( ) ,
132
85
} ) ,
133
86
) ;
134
87
135
- ServoArc :: new ( lock . wrap ( import) )
88
+ import
136
89
}
137
90
}
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
+
138
133
impl NetHandler < Resource > for CssHandler {
139
134
fn bytes ( self : Box < Self > , doc_id : usize , bytes : Bytes , callback : SharedCallback < Resource > ) {
140
135
let Ok ( css) = std:: str:: from_utf8 ( & bytes) else {
@@ -152,12 +147,13 @@ impl NetHandler<Resource> for CssHandler {
152
147
ServoArc :: new ( self . guard . wrap ( MediaList :: empty ( ) ) ) ,
153
148
self . guard . clone ( ) ,
154
149
Some ( & StylesheetLoader ( doc_id, self . provider . clone ( ) ) ) ,
155
- None ,
150
+ None , // error_reporter
156
151
QuirksMode :: NoQuirks ,
157
152
AllowImportRules :: Yes ,
158
153
) ;
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 ( ) ) ;
161
157
162
158
callback. call (
163
159
doc_id,
0 commit comments