1 // Don't want to copy that nasty `cfg` below...
2 #[allow(unused_extern_crates)]
3 extern crate bindgen;
4 
5 /// A sanity test that we can generate bindings for Stylo.
6 ///
7 /// We don't assert on expected output because its just too big. The output will
8 /// change too often, and it won't be clear what is going on at a glance, unlike
9 /// the other tests with smaller input headers.
10 ///
11 /// This test is relatively slow, so we also only run it in release mode.
12 ///
13 /// Finally, uncomment the `panic!` at the bottom of the test to get logs timing
14 /// how long bindings generation takes for Stylo. Stylo bindings generation
15 /// takes too long to be a proper `#[bench]`.
16 #[test]
17 #[cfg(not(any(debug_assertions, feature = "testing_only_extra_assertions",)))]
18 #[cfg(any(
19     feature = "testing_only_libclang_5",
20     feature = "testing_only_libclang_9"
21 ))]
sanity_check_can_generate_stylo_bindingsnull22 fn sanity_check_can_generate_stylo_bindings() {
23     use std::time::Instant;
24 
25     let then = Instant::now();
26 
27     bindgen::builder()
28         .time_phases(true)
29         .disable_header_comment()
30         .header(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/stylo.hpp"))
31         .allowlist_function("Servo_.*")
32         .allowlist_function("Gecko_.*")
33         .blocklist_type("nsACString_internal")
34         .blocklist_type("nsAString_internal")
35         .blocklist_type("mozilla::css::URLValue")
36         .blocklist_type("RawGeckoAnimationPropertySegment")
37         .blocklist_type("RawGeckoComputedTiming")
38         .blocklist_type("RawGeckoDocument")
39         .blocklist_type("RawGeckoElement")
40         .blocklist_type("RawGeckoKeyframeList")
41         .blocklist_type("RawGeckoComputedKeyframeValuesList")
42         .blocklist_type("RawGeckoFontFaceRuleList")
43         .blocklist_type("RawGeckoNode")
44         .blocklist_type("RawGeckoAnimationValueList")
45         .blocklist_type("RawServoAnimationValue")
46         .blocklist_type("RawServoAnimationValueMap")
47         .blocklist_type("RawServoDeclarationBlock")
48         .blocklist_type("RawGeckoPresContext")
49         .blocklist_type("RawGeckoPresContextOwned")
50         .blocklist_type("RawGeckoStyleAnimationList")
51         .blocklist_type("RawGeckoURLExtraData")
52         .blocklist_type("RefPtr")
53         .blocklist_type("CSSPseudoClassType")
54         .blocklist_type("TraversalRootBehavior")
55         .blocklist_type("ComputedTimingFunction_BeforeFlag")
56         .blocklist_type("FontFamilyList")
57         .blocklist_type("FontFamilyType")
58         .blocklist_type("Keyframe")
59         .blocklist_type("ServoBundledURI")
60         .blocklist_type("ServoElementSnapshot")
61         .blocklist_type("SheetParsingMode")
62         .blocklist_type("StyleBasicShape")
63         .blocklist_type("StyleBasicShapeType")
64         .blocklist_type("StyleShapeSource")
65         .blocklist_type("nsCSSFontFaceRule")
66         .blocklist_type("nsCSSKeyword")
67         .blocklist_type("nsCSSPropertyID")
68         .blocklist_type("nsCSSShadowArray")
69         .blocklist_type("nsCSSUnit")
70         .blocklist_type("nsCSSValue")
71         .blocklist_type("nsCSSValueSharedList")
72         .blocklist_type("nsChangeHint")
73         .blocklist_type("nsCursorImage")
74         .blocklist_type("nsFont")
75         .blocklist_type("nsIAtom")
76         .blocklist_type("nsMediaFeature")
77         .blocklist_type("nsRestyleHint")
78         .blocklist_type("nsStyleBackground")
79         .blocklist_type("nsStyleBorder")
80         .blocklist_type("nsStyleColor")
81         .blocklist_type("nsStyleColumn")
82         .blocklist_type("nsStyleContent")
83         .blocklist_type("nsStyleContentData")
84         .blocklist_type("nsStyleContentType")
85         .blocklist_type("nsStyleContext")
86         .blocklist_type("nsStyleCoord")
87         .blocklist_type("nsStyleCoord_Calc")
88         .blocklist_type("nsStyleCoord_CalcValue")
89         .blocklist_type("nsStyleDisplay")
90         .blocklist_type("nsStyleEffects")
91         .blocklist_type("nsStyleFilter")
92         .blocklist_type("nsStyleFont")
93         .blocklist_type("nsStyleGradient")
94         .blocklist_type("nsStyleGradientStop")
95         .blocklist_type("nsStyleImage")
96         .blocklist_type("nsStyleImageLayers")
97         .blocklist_type("nsStyleImageLayers_Layer")
98         .blocklist_type("nsStyleImageLayers_LayerType")
99         .blocklist_type("nsStyleImageRequest")
100         .blocklist_type("nsStyleList")
101         .blocklist_type("nsStyleMargin")
102         .blocklist_type("nsStyleOutline")
103         .blocklist_type("nsStylePadding")
104         .blocklist_type("nsStylePosition")
105         .blocklist_type("nsStyleQuoteValues")
106         .blocklist_type("nsStyleSVG")
107         .blocklist_type("nsStyleSVGPaint")
108         .blocklist_type("nsStyleSVGReset")
109         .blocklist_type("nsStyleTable")
110         .blocklist_type("nsStyleTableBorder")
111         .blocklist_type("nsStyleText")
112         .blocklist_type("nsStyleTextReset")
113         .blocklist_type("nsStyleUIReset")
114         .blocklist_type("nsStyleUnion")
115         .blocklist_type("nsStyleUnit")
116         .blocklist_type("nsStyleUserInterface")
117         .blocklist_type("nsStyleVariables")
118         .blocklist_type("nsStyleVisibility")
119         .blocklist_type("nsStyleXUL")
120         .blocklist_type("nsTimingFunction")
121         .blocklist_type("nscolor")
122         .blocklist_type("nscoord")
123         .blocklist_type("nsresult")
124         .blocklist_type("Loader")
125         .blocklist_type("ServoStyleSheet")
126         .blocklist_type("EffectCompositor_CascadeLevel")
127         .blocklist_type("UpdateAnimationsTasks")
128         .blocklist_type("nsTArrayBorrowed_uintptr_t")
129         .blocklist_type("ServoCssRulesStrong")
130         .blocklist_type("ServoCssRulesBorrowed")
131         .blocklist_type("ServoCssRulesBorrowedOrNull")
132         .blocklist_type("ServoCssRules")
133         .blocklist_type("RawServoStyleSheetStrong")
134         .blocklist_type("RawServoStyleSheetBorrowed")
135         .blocklist_type("RawServoStyleSheetBorrowedOrNull")
136         .blocklist_type("RawServoStyleSheet")
137         .blocklist_type("ServoComputedValuesStrong")
138         .blocklist_type("ServoComputedValuesBorrowed")
139         .blocklist_type("ServoComputedValuesBorrowedOrNull")
140         .blocklist_type("ServoComputedValues")
141         .blocklist_type("RawServoDeclarationBlockStrong")
142         .blocklist_type("RawServoDeclarationBlockBorrowed")
143         .blocklist_type("RawServoDeclarationBlockBorrowedOrNull")
144         .blocklist_type("RawServoStyleRuleStrong")
145         .blocklist_type("RawServoStyleRuleBorrowed")
146         .blocklist_type("RawServoStyleRuleBorrowedOrNull")
147         .blocklist_type("RawServoStyleRule")
148         .blocklist_type("RawServoImportRuleStrong")
149         .blocklist_type("RawServoImportRuleBorrowed")
150         .blocklist_type("RawServoImportRuleBorrowedOrNull")
151         .blocklist_type("RawServoImportRule")
152         .blocklist_type("RawServoAnimationValueStrong")
153         .blocklist_type("RawServoAnimationValueBorrowed")
154         .blocklist_type("RawServoAnimationValueBorrowedOrNull")
155         .blocklist_type("RawServoAnimationValueMapStrong")
156         .blocklist_type("RawServoAnimationValueMapBorrowed")
157         .blocklist_type("RawServoAnimationValueMapBorrowedOrNull")
158         .blocklist_type("RawServoMediaListStrong")
159         .blocklist_type("RawServoMediaListBorrowed")
160         .blocklist_type("RawServoMediaListBorrowedOrNull")
161         .blocklist_type("RawServoMediaList")
162         .blocklist_type("RawServoMediaRuleStrong")
163         .blocklist_type("RawServoMediaRuleBorrowed")
164         .blocklist_type("RawServoMediaRuleBorrowedOrNull")
165         .blocklist_type("RawServoMediaRule")
166         .blocklist_type("RawServoNamespaceRuleStrong")
167         .blocklist_type("RawServoNamespaceRuleBorrowed")
168         .blocklist_type("RawServoNamespaceRuleBorrowedOrNull")
169         .blocklist_type("RawServoNamespaceRule")
170         .blocklist_type("RawServoStyleSetOwned")
171         .blocklist_type("RawServoStyleSetOwnedOrNull")
172         .blocklist_type("RawServoStyleSetBorrowed")
173         .blocklist_type("RawServoStyleSetBorrowedOrNull")
174         .blocklist_type("RawServoStyleSetBorrowedMut")
175         .blocklist_type("RawServoStyleSetBorrowedMutOrNull")
176         .blocklist_type("RawServoStyleSet")
177         .blocklist_type("StyleChildrenIteratorOwned")
178         .blocklist_type("StyleChildrenIteratorOwnedOrNull")
179         .blocklist_type("StyleChildrenIteratorBorrowed")
180         .blocklist_type("StyleChildrenIteratorBorrowedOrNull")
181         .blocklist_type("StyleChildrenIteratorBorrowedMut")
182         .blocklist_type("StyleChildrenIteratorBorrowedMutOrNull")
183         .blocklist_type("StyleChildrenIterator")
184         .blocklist_type("ServoElementSnapshotOwned")
185         .blocklist_type("ServoElementSnapshotOwnedOrNull")
186         .blocklist_type("ServoElementSnapshotBorrowed")
187         .blocklist_type("ServoElementSnapshotBorrowedOrNull")
188         .blocklist_type("ServoElementSnapshotBorrowedMut")
189         .blocklist_type("ServoElementSnapshotBorrowedMutOrNull")
190         .blocklist_type("RawGeckoNodeBorrowed")
191         .blocklist_type("RawGeckoNodeBorrowedOrNull")
192         .blocklist_type("RawGeckoElementBorrowed")
193         .blocklist_type("RawGeckoElementBorrowedOrNull")
194         .blocklist_type("RawGeckoDocumentBorrowed")
195         .blocklist_type("RawGeckoDocumentBorrowedOrNull")
196         .blocklist_type("RawServoDeclarationBlockStrongBorrowed")
197         .blocklist_type("RawServoDeclarationBlockStrongBorrowedOrNull")
198         .blocklist_type("RawGeckoPresContextBorrowed")
199         .blocklist_type("RawGeckoPresContextBorrowedOrNull")
200         .blocklist_type("RawGeckoStyleAnimationListBorrowed")
201         .blocklist_type("RawGeckoStyleAnimationListBorrowedOrNull")
202         .blocklist_type("nsCSSValueBorrowed")
203         .blocklist_type("nsCSSValueBorrowedOrNull")
204         .blocklist_type("nsCSSValueBorrowedMut")
205         .blocklist_type("nsCSSValueBorrowedMutOrNull")
206         .blocklist_type("nsTimingFunctionBorrowed")
207         .blocklist_type("nsTimingFunctionBorrowedOrNull")
208         .blocklist_type("nsTimingFunctionBorrowedMut")
209         .blocklist_type("nsTimingFunctionBorrowedMutOrNull")
210         .blocklist_type("RawGeckoAnimationPropertySegmentBorrowed")
211         .blocklist_type("RawGeckoAnimationPropertySegmentBorrowedOrNull")
212         .blocklist_type("RawGeckoAnimationPropertySegmentBorrowedMut")
213         .blocklist_type("RawGeckoAnimationPropertySegmentBorrowedMutOrNull")
214         .blocklist_type("RawGeckoAnimationValueListBorrowed")
215         .blocklist_type("RawGeckoAnimationValueListBorrowedOrNull")
216         .blocklist_type("RawGeckoAnimationValueListBorrowedMut")
217         .blocklist_type("RawGeckoAnimationValueListBorrowedMutOrNull")
218         .blocklist_type("RawGeckoComputedTimingBorrowed")
219         .blocklist_type("RawGeckoComputedTimingBorrowedOrNull")
220         .blocklist_type("RawGeckoComputedTimingBorrowedMut")
221         .blocklist_type("RawGeckoComputedTimingBorrowedMutOrNull")
222         .blocklist_type("RawGeckoKeyframeListBorrowed")
223         .blocklist_type("RawGeckoKeyframeListBorrowedOrNull")
224         .blocklist_type("RawGeckoKeyframeListBorrowedMut")
225         .blocklist_type("RawGeckoKeyframeListBorrowedMutOrNull")
226         .blocklist_type("RawGeckoComputedKeyframeValuesListBorrowed")
227         .blocklist_type("RawGeckoComputedKeyframeValuesListBorrowedOrNull")
228         .blocklist_type("RawGeckoComputedKeyframeValuesListBorrowedMut")
229         .blocklist_type("RawGeckoComputedKeyframeValuesListBorrowedMutOrNull")
230         .blocklist_type("RawGeckoFontFaceRuleListBorrowed")
231         .blocklist_type("RawGeckoFontFaceRuleListBorrowedOrNull")
232         .blocklist_type("RawGeckoFontFaceRuleListBorrowedMut")
233         .blocklist_type("RawGeckoFontFaceRuleListBorrowedMutOrNull")
234         .raw_line(r#"pub use nsstring::{nsACString, nsAString, nsString};"#)
235         .raw_line(r#"type nsACString_internal = nsACString;"#)
236         .raw_line(r#"type nsAString_internal = nsAString;"#)
237         .raw_line(r#"use gecko_bindings::structs::mozilla::css::URLValue;"#)
238         .raw_line(r#"use gecko_bindings::structs::RawGeckoAnimationPropertySegment;"#)
239         .raw_line(r#"use gecko_bindings::structs::RawGeckoComputedTiming;"#)
240         .raw_line(r#"use gecko_bindings::structs::RawGeckoDocument;"#)
241         .raw_line(r#"use gecko_bindings::structs::RawGeckoElement;"#)
242         .raw_line(r#"use gecko_bindings::structs::RawGeckoKeyframeList;"#)
243         .raw_line(r#"use gecko_bindings::structs::RawGeckoComputedKeyframeValuesList;"#)
244         .raw_line(r#"use gecko_bindings::structs::RawGeckoFontFaceRuleList;"#)
245         .raw_line(r#"use gecko_bindings::structs::RawGeckoNode;"#)
246         .raw_line(r#"use gecko_bindings::structs::RawGeckoAnimationValueList;"#)
247         .raw_line(r#"use gecko_bindings::structs::RawServoAnimationValue;"#)
248         .raw_line(r#"use gecko_bindings::structs::RawServoAnimationValueMap;"#)
249         .raw_line(r#"use gecko_bindings::structs::RawServoDeclarationBlock;"#)
250         .raw_line(r#"use gecko_bindings::structs::RawGeckoPresContext;"#)
251         .raw_line(r#"use gecko_bindings::structs::RawGeckoPresContextOwned;"#)
252         .raw_line(r#"use gecko_bindings::structs::RawGeckoStyleAnimationList;"#)
253         .raw_line(r#"use gecko_bindings::structs::RawGeckoURLExtraData;"#)
254         .raw_line(r#"use gecko_bindings::structs::RefPtr;"#)
255         .raw_line(r#"use gecko_bindings::structs::CSSPseudoClassType;"#)
256         .raw_line(r#"use gecko_bindings::structs::TraversalRootBehavior;"#)
257         .raw_line(r#"use gecko_bindings::structs::ComputedTimingFunction_BeforeFlag;"#)
258         .raw_line(r#"use gecko_bindings::structs::FontFamilyList;"#)
259         .raw_line(r#"use gecko_bindings::structs::FontFamilyType;"#)
260         .raw_line(r#"use gecko_bindings::structs::Keyframe;"#)
261         .raw_line(r#"use gecko_bindings::structs::ServoBundledURI;"#)
262         .raw_line(r#"use gecko_bindings::structs::ServoElementSnapshot;"#)
263         .raw_line(r#"use gecko_bindings::structs::SheetParsingMode;"#)
264         .raw_line(r#"use gecko_bindings::structs::StyleBasicShape;"#)
265         .raw_line(r#"use gecko_bindings::structs::StyleBasicShapeType;"#)
266         .raw_line(r#"use gecko_bindings::structs::StyleShapeSource;"#)
267         .raw_line(r#"use gecko_bindings::structs::nsCSSFontFaceRule;"#)
268         .raw_line(r#"use gecko_bindings::structs::nsCSSKeyword;"#)
269         .raw_line(r#"use gecko_bindings::structs::nsCSSPropertyID;"#)
270         .raw_line(r#"use gecko_bindings::structs::nsCSSShadowArray;"#)
271         .raw_line(r#"use gecko_bindings::structs::nsCSSUnit;"#)
272         .raw_line(r#"use gecko_bindings::structs::nsCSSValue;"#)
273         .raw_line(r#"use gecko_bindings::structs::nsCSSValueSharedList;"#)
274         .raw_line(r#"use gecko_bindings::structs::nsChangeHint;"#)
275         .raw_line(r#"use gecko_bindings::structs::nsCursorImage;"#)
276         .raw_line(r#"use gecko_bindings::structs::nsFont;"#)
277         .raw_line(r#"use gecko_bindings::structs::nsIAtom;"#)
278         .raw_line(r#"use gecko_bindings::structs::nsMediaFeature;"#)
279         .raw_line(r#"use gecko_bindings::structs::nsRestyleHint;"#)
280         .raw_line(r#"use gecko_bindings::structs::nsStyleBackground;"#)
281         .raw_line(r#"unsafe impl Send for nsStyleBackground {}"#)
282         .raw_line(r#"unsafe impl Sync for nsStyleBackground {}"#)
283         .raw_line(r#"use gecko_bindings::structs::nsStyleBorder;"#)
284         .raw_line(r#"unsafe impl Send for nsStyleBorder {}"#)
285         .raw_line(r#"unsafe impl Sync for nsStyleBorder {}"#)
286         .raw_line(r#"use gecko_bindings::structs::nsStyleColor;"#)
287         .raw_line(r#"unsafe impl Send for nsStyleColor {}"#)
288         .raw_line(r#"unsafe impl Sync for nsStyleColor {}"#)
289         .raw_line(r#"use gecko_bindings::structs::nsStyleColumn;"#)
290         .raw_line(r#"unsafe impl Send for nsStyleColumn {}"#)
291         .raw_line(r#"unsafe impl Sync for nsStyleColumn {}"#)
292         .raw_line(r#"use gecko_bindings::structs::nsStyleContent;"#)
293         .raw_line(r#"unsafe impl Send for nsStyleContent {}"#)
294         .raw_line(r#"unsafe impl Sync for nsStyleContent {}"#)
295         .raw_line(r#"use gecko_bindings::structs::nsStyleContentData;"#)
296         .raw_line(r#"unsafe impl Send for nsStyleContentData {}"#)
297         .raw_line(r#"unsafe impl Sync for nsStyleContentData {}"#)
298         .raw_line(r#"use gecko_bindings::structs::nsStyleContentType;"#)
299         .raw_line(r#"unsafe impl Send for nsStyleContentType {}"#)
300         .raw_line(r#"unsafe impl Sync for nsStyleContentType {}"#)
301         .raw_line(r#"use gecko_bindings::structs::nsStyleContext;"#)
302         .raw_line(r#"unsafe impl Send for nsStyleContext {}"#)
303         .raw_line(r#"unsafe impl Sync for nsStyleContext {}"#)
304         .raw_line(r#"use gecko_bindings::structs::nsStyleCoord;"#)
305         .raw_line(r#"unsafe impl Send for nsStyleCoord {}"#)
306         .raw_line(r#"unsafe impl Sync for nsStyleCoord {}"#)
307         .raw_line(r#"use gecko_bindings::structs::nsStyleCoord_Calc;"#)
308         .raw_line(r#"unsafe impl Send for nsStyleCoord_Calc {}"#)
309         .raw_line(r#"unsafe impl Sync for nsStyleCoord_Calc {}"#)
310         .raw_line(r#"use gecko_bindings::structs::nsStyleCoord_CalcValue;"#)
311         .raw_line(r#"unsafe impl Send for nsStyleCoord_CalcValue {}"#)
312         .raw_line(r#"unsafe impl Sync for nsStyleCoord_CalcValue {}"#)
313         .raw_line(r#"use gecko_bindings::structs::nsStyleDisplay;"#)
314         .raw_line(r#"unsafe impl Send for nsStyleDisplay {}"#)
315         .raw_line(r#"unsafe impl Sync for nsStyleDisplay {}"#)
316         .raw_line(r#"use gecko_bindings::structs::nsStyleEffects;"#)
317         .raw_line(r#"unsafe impl Send for nsStyleEffects {}"#)
318         .raw_line(r#"unsafe impl Sync for nsStyleEffects {}"#)
319         .raw_line(r#"use gecko_bindings::structs::nsStyleFilter;"#)
320         .raw_line(r#"unsafe impl Send for nsStyleFilter {}"#)
321         .raw_line(r#"unsafe impl Sync for nsStyleFilter {}"#)
322         .raw_line(r#"use gecko_bindings::structs::nsStyleFont;"#)
323         .raw_line(r#"unsafe impl Send for nsStyleFont {}"#)
324         .raw_line(r#"unsafe impl Sync for nsStyleFont {}"#)
325         .raw_line(r#"use gecko_bindings::structs::nsStyleGradient;"#)
326         .raw_line(r#"unsafe impl Send for nsStyleGradient {}"#)
327         .raw_line(r#"unsafe impl Sync for nsStyleGradient {}"#)
328         .raw_line(r#"use gecko_bindings::structs::nsStyleGradientStop;"#)
329         .raw_line(r#"unsafe impl Send for nsStyleGradientStop {}"#)
330         .raw_line(r#"unsafe impl Sync for nsStyleGradientStop {}"#)
331         .raw_line(r#"use gecko_bindings::structs::nsStyleImage;"#)
332         .raw_line(r#"unsafe impl Send for nsStyleImage {}"#)
333         .raw_line(r#"unsafe impl Sync for nsStyleImage {}"#)
334         .raw_line(r#"use gecko_bindings::structs::nsStyleImageLayers;"#)
335         .raw_line(r#"unsafe impl Send for nsStyleImageLayers {}"#)
336         .raw_line(r#"unsafe impl Sync for nsStyleImageLayers {}"#)
337         .raw_line(r#"use gecko_bindings::structs::nsStyleImageLayers_Layer;"#)
338         .raw_line(r#"unsafe impl Send for nsStyleImageLayers_Layer {}"#)
339         .raw_line(r#"unsafe impl Sync for nsStyleImageLayers_Layer {}"#)
340         .raw_line(r#"use gecko_bindings::structs::nsStyleImageLayers_LayerType;"#)
341         .raw_line(r#"unsafe impl Send for nsStyleImageLayers_LayerType {}"#)
342         .raw_line(r#"unsafe impl Sync for nsStyleImageLayers_LayerType {}"#)
343         .raw_line(r#"use gecko_bindings::structs::nsStyleImageRequest;"#)
344         .raw_line(r#"unsafe impl Send for nsStyleImageRequest {}"#)
345         .raw_line(r#"unsafe impl Sync for nsStyleImageRequest {}"#)
346         .raw_line(r#"use gecko_bindings::structs::nsStyleList;"#)
347         .raw_line(r#"unsafe impl Send for nsStyleList {}"#)
348         .raw_line(r#"unsafe impl Sync for nsStyleList {}"#)
349         .raw_line(r#"use gecko_bindings::structs::nsStyleMargin;"#)
350         .raw_line(r#"unsafe impl Send for nsStyleMargin {}"#)
351         .raw_line(r#"unsafe impl Sync for nsStyleMargin {}"#)
352         .raw_line(r#"use gecko_bindings::structs::nsStyleOutline;"#)
353         .raw_line(r#"unsafe impl Send for nsStyleOutline {}"#)
354         .raw_line(r#"unsafe impl Sync for nsStyleOutline {}"#)
355         .raw_line(r#"use gecko_bindings::structs::nsStylePadding;"#)
356         .raw_line(r#"unsafe impl Send for nsStylePadding {}"#)
357         .raw_line(r#"unsafe impl Sync for nsStylePadding {}"#)
358         .raw_line(r#"use gecko_bindings::structs::nsStylePosition;"#)
359         .raw_line(r#"unsafe impl Send for nsStylePosition {}"#)
360         .raw_line(r#"unsafe impl Sync for nsStylePosition {}"#)
361         .raw_line(r#"use gecko_bindings::structs::nsStyleQuoteValues;"#)
362         .raw_line(r#"unsafe impl Send for nsStyleQuoteValues {}"#)
363         .raw_line(r#"unsafe impl Sync for nsStyleQuoteValues {}"#)
364         .raw_line(r#"use gecko_bindings::structs::nsStyleSVG;"#)
365         .raw_line(r#"unsafe impl Send for nsStyleSVG {}"#)
366         .raw_line(r#"unsafe impl Sync for nsStyleSVG {}"#)
367         .raw_line(r#"use gecko_bindings::structs::nsStyleSVGPaint;"#)
368         .raw_line(r#"unsafe impl Send for nsStyleSVGPaint {}"#)
369         .raw_line(r#"unsafe impl Sync for nsStyleSVGPaint {}"#)
370         .raw_line(r#"use gecko_bindings::structs::nsStyleSVGReset;"#)
371         .raw_line(r#"unsafe impl Send for nsStyleSVGReset {}"#)
372         .raw_line(r#"unsafe impl Sync for nsStyleSVGReset {}"#)
373         .raw_line(r#"use gecko_bindings::structs::nsStyleTable;"#)
374         .raw_line(r#"unsafe impl Send for nsStyleTable {}"#)
375         .raw_line(r#"unsafe impl Sync for nsStyleTable {}"#)
376         .raw_line(r#"use gecko_bindings::structs::nsStyleTableBorder;"#)
377         .raw_line(r#"unsafe impl Send for nsStyleTableBorder {}"#)
378         .raw_line(r#"unsafe impl Sync for nsStyleTableBorder {}"#)
379         .raw_line(r#"use gecko_bindings::structs::nsStyleText;"#)
380         .raw_line(r#"unsafe impl Send for nsStyleText {}"#)
381         .raw_line(r#"unsafe impl Sync for nsStyleText {}"#)
382         .raw_line(r#"use gecko_bindings::structs::nsStyleTextReset;"#)
383         .raw_line(r#"unsafe impl Send for nsStyleTextReset {}"#)
384         .raw_line(r#"unsafe impl Sync for nsStyleTextReset {}"#)
385         .raw_line(r#"use gecko_bindings::structs::nsStyleUIReset;"#)
386         .raw_line(r#"unsafe impl Send for nsStyleUIReset {}"#)
387         .raw_line(r#"unsafe impl Sync for nsStyleUIReset {}"#)
388         .raw_line(r#"use gecko_bindings::structs::nsStyleUnion;"#)
389         .raw_line(r#"unsafe impl Send for nsStyleUnion {}"#)
390         .raw_line(r#"unsafe impl Sync for nsStyleUnion {}"#)
391         .raw_line(r#"use gecko_bindings::structs::nsStyleUnit;"#)
392         .raw_line(r#"unsafe impl Send for nsStyleUnit {}"#)
393         .raw_line(r#"unsafe impl Sync for nsStyleUnit {}"#)
394         .raw_line(r#"use gecko_bindings::structs::nsStyleUserInterface;"#)
395         .raw_line(r#"unsafe impl Send for nsStyleUserInterface {}"#)
396         .raw_line(r#"unsafe impl Sync for nsStyleUserInterface {}"#)
397         .raw_line(r#"use gecko_bindings::structs::nsStyleVariables;"#)
398         .raw_line(r#"unsafe impl Send for nsStyleVariables {}"#)
399         .raw_line(r#"unsafe impl Sync for nsStyleVariables {}"#)
400         .raw_line(r#"use gecko_bindings::structs::nsStyleVisibility;"#)
401         .raw_line(r#"unsafe impl Send for nsStyleVisibility {}"#)
402         .raw_line(r#"unsafe impl Sync for nsStyleVisibility {}"#)
403         .raw_line(r#"use gecko_bindings::structs::nsStyleXUL;"#)
404         .raw_line(r#"unsafe impl Send for nsStyleXUL {}"#)
405         .raw_line(r#"unsafe impl Sync for nsStyleXUL {}"#)
406         .raw_line(r#"use gecko_bindings::structs::nsTimingFunction;"#)
407         .raw_line(r#"use gecko_bindings::structs::nscolor;"#)
408         .raw_line(r#"use gecko_bindings::structs::nscoord;"#)
409         .raw_line(r#"use gecko_bindings::structs::nsresult;"#)
410         .raw_line(r#"use gecko_bindings::structs::Loader;"#)
411         .raw_line(r#"use gecko_bindings::structs::ServoStyleSheet;"#)
412         .raw_line(r#"use gecko_bindings::structs::EffectCompositor_CascadeLevel;"#)
413         .raw_line(r#"use gecko_bindings::structs::UpdateAnimationsTasks;"#)
414         .raw_line(r#"pub type nsTArrayBorrowed_uintptr_t<'a> = &'a mut ::gecko_bindings::structs::nsTArray<usize>;"#)
415         .raw_line(r#"pub type ServoCssRulesStrong = ::gecko_bindings::sugar::ownership::Strong<ServoCssRules>;"#)
416         .raw_line(r#"pub type ServoCssRulesBorrowed<'a> = &'a ServoCssRules;"#)
417         .raw_line(r#"pub type ServoCssRulesBorrowedOrNull<'a> = Option<&'a ServoCssRules>;"#)
418         .raw_line(r#"enum ServoCssRulesVoid { }"#)
419         .raw_line(r#"pub struct ServoCssRules(ServoCssRulesVoid);"#)
420         .raw_line(r#"pub type RawServoStyleSheetStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoStyleSheet>;"#)
421         .raw_line(r#"pub type RawServoStyleSheetBorrowed<'a> = &'a RawServoStyleSheet;"#)
422         .raw_line(r#"pub type RawServoStyleSheetBorrowedOrNull<'a> = Option<&'a RawServoStyleSheet>;"#)
423         .raw_line(r#"enum RawServoStyleSheetVoid { }"#)
424         .raw_line(r#"pub struct RawServoStyleSheet(RawServoStyleSheetVoid);"#)
425         .raw_line(r#"pub type ServoComputedValuesStrong = ::gecko_bindings::sugar::ownership::Strong<ServoComputedValues>;"#)
426         .raw_line(r#"pub type ServoComputedValuesBorrowed<'a> = &'a ServoComputedValues;"#)
427         .raw_line(r#"pub type ServoComputedValuesBorrowedOrNull<'a> = Option<&'a ServoComputedValues>;"#)
428         .raw_line(r#"enum ServoComputedValuesVoid { }"#)
429         .raw_line(r#"pub struct ServoComputedValues(ServoComputedValuesVoid);"#)
430         .raw_line(r#"pub type RawServoDeclarationBlockStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoDeclarationBlock>;"#)
431         .raw_line(r#"pub type RawServoDeclarationBlockBorrowed<'a> = &'a RawServoDeclarationBlock;"#)
432         .raw_line(r#"pub type RawServoDeclarationBlockBorrowedOrNull<'a> = Option<&'a RawServoDeclarationBlock>;"#)
433         .raw_line(r#"pub type RawServoStyleRuleStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoStyleRule>;"#)
434         .raw_line(r#"pub type RawServoStyleRuleBorrowed<'a> = &'a RawServoStyleRule;"#)
435         .raw_line(r#"pub type RawServoStyleRuleBorrowedOrNull<'a> = Option<&'a RawServoStyleRule>;"#)
436         .raw_line(r#"enum RawServoStyleRuleVoid { }"#)
437         .raw_line(r#"pub struct RawServoStyleRule(RawServoStyleRuleVoid);"#)
438         .raw_line(r#"pub type RawServoImportRuleStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoImportRule>;"#)
439         .raw_line(r#"pub type RawServoImportRuleBorrowed<'a> = &'a RawServoImportRule;"#)
440         .raw_line(r#"pub type RawServoImportRuleBorrowedOrNull<'a> = Option<&'a RawServoImportRule>;"#)
441         .raw_line(r#"enum RawServoImportRuleVoid { }"#)
442         .raw_line(r#"pub struct RawServoImportRule(RawServoImportRuleVoid);"#)
443         .raw_line(r#"pub type RawServoAnimationValueStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoAnimationValue>;"#)
444         .raw_line(r#"pub type RawServoAnimationValueBorrowed<'a> = &'a RawServoAnimationValue;"#)
445         .raw_line(r#"pub type RawServoAnimationValueBorrowedOrNull<'a> = Option<&'a RawServoAnimationValue>;"#)
446         .raw_line(r#"pub type RawServoAnimationValueMapStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoAnimationValueMap>;"#)
447         .raw_line(r#"pub type RawServoAnimationValueMapBorrowed<'a> = &'a RawServoAnimationValueMap;"#)
448         .raw_line(r#"pub type RawServoAnimationValueMapBorrowedOrNull<'a> = Option<&'a RawServoAnimationValueMap>;"#)
449         .raw_line(r#"pub type RawServoMediaListStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoMediaList>;"#)
450         .raw_line(r#"pub type RawServoMediaListBorrowed<'a> = &'a RawServoMediaList;"#)
451         .raw_line(r#"pub type RawServoMediaListBorrowedOrNull<'a> = Option<&'a RawServoMediaList>;"#)
452         .raw_line(r#"enum RawServoMediaListVoid { }"#)
453         .raw_line(r#"pub struct RawServoMediaList(RawServoMediaListVoid);"#)
454         .raw_line(r#"pub type RawServoMediaRuleStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoMediaRule>;"#)
455         .raw_line(r#"pub type RawServoMediaRuleBorrowed<'a> = &'a RawServoMediaRule;"#)
456         .raw_line(r#"pub type RawServoMediaRuleBorrowedOrNull<'a> = Option<&'a RawServoMediaRule>;"#)
457         .raw_line(r#"enum RawServoMediaRuleVoid { }"#)
458         .raw_line(r#"pub struct RawServoMediaRule(RawServoMediaRuleVoid);"#)
459         .raw_line(r#"pub type RawServoNamespaceRuleStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoNamespaceRule>;"#)
460         .raw_line(r#"pub type RawServoNamespaceRuleBorrowed<'a> = &'a RawServoNamespaceRule;"#)
461         .raw_line(r#"pub type RawServoNamespaceRuleBorrowedOrNull<'a> = Option<&'a RawServoNamespaceRule>;"#)
462         .raw_line(r#"enum RawServoNamespaceRuleVoid { }"#)
463         .raw_line(r#"pub struct RawServoNamespaceRule(RawServoNamespaceRuleVoid);"#)
464         .raw_line(r#"pub type RawServoStyleSetOwned = ::gecko_bindings::sugar::ownership::Owned<RawServoStyleSet>;"#)
465         .raw_line(r#"pub type RawServoStyleSetOwnedOrNull = ::gecko_bindings::sugar::ownership::OwnedOrNull<RawServoStyleSet>;"#)
466         .raw_line(r#"pub type RawServoStyleSetBorrowed<'a> = &'a RawServoStyleSet;"#)
467         .raw_line(r#"pub type RawServoStyleSetBorrowedOrNull<'a> = Option<&'a RawServoStyleSet>;"#)
468         .raw_line(r#"pub type RawServoStyleSetBorrowedMut<'a> = &'a mut RawServoStyleSet;"#)
469         .raw_line(r#"pub type RawServoStyleSetBorrowedMutOrNull<'a> = Option<&'a mut RawServoStyleSet>;"#)
470         .raw_line(r#"enum RawServoStyleSetVoid { }"#)
471         .raw_line(r#"pub struct RawServoStyleSet(RawServoStyleSetVoid);"#)
472         .raw_line(r#"pub type StyleChildrenIteratorOwned = ::gecko_bindings::sugar::ownership::Owned<StyleChildrenIterator>;"#)
473         .raw_line(r#"pub type StyleChildrenIteratorOwnedOrNull = ::gecko_bindings::sugar::ownership::OwnedOrNull<StyleChildrenIterator>;"#)
474         .raw_line(r#"pub type StyleChildrenIteratorBorrowed<'a> = &'a StyleChildrenIterator;"#)
475         .raw_line(r#"pub type StyleChildrenIteratorBorrowedOrNull<'a> = Option<&'a StyleChildrenIterator>;"#)
476         .raw_line(r#"pub type StyleChildrenIteratorBorrowedMut<'a> = &'a mut StyleChildrenIterator;"#)
477         .raw_line(r#"pub type StyleChildrenIteratorBorrowedMutOrNull<'a> = Option<&'a mut StyleChildrenIterator>;"#)
478         .raw_line(r#"enum StyleChildrenIteratorVoid { }"#)
479         .raw_line(r#"pub struct StyleChildrenIterator(StyleChildrenIteratorVoid);"#)
480         .raw_line(r#"pub type ServoElementSnapshotOwned = ::gecko_bindings::sugar::ownership::Owned<ServoElementSnapshot>;"#)
481         .raw_line(r#"pub type ServoElementSnapshotOwnedOrNull = ::gecko_bindings::sugar::ownership::OwnedOrNull<ServoElementSnapshot>;"#)
482         .raw_line(r#"pub type ServoElementSnapshotBorrowed<'a> = &'a ServoElementSnapshot;"#)
483         .raw_line(r#"pub type ServoElementSnapshotBorrowedOrNull<'a> = Option<&'a ServoElementSnapshot>;"#)
484         .raw_line(r#"pub type ServoElementSnapshotBorrowedMut<'a> = &'a mut ServoElementSnapshot;"#)
485         .raw_line(r#"pub type ServoElementSnapshotBorrowedMutOrNull<'a> = Option<&'a mut ServoElementSnapshot>;"#)
486         .raw_line(r#"pub type RawGeckoNodeBorrowed<'a> = &'a RawGeckoNode;"#)
487         .raw_line(r#"pub type RawGeckoNodeBorrowedOrNull<'a> = Option<&'a RawGeckoNode>;"#)
488         .raw_line(r#"pub type RawGeckoElementBorrowed<'a> = &'a RawGeckoElement;"#)
489         .raw_line(r#"pub type RawGeckoElementBorrowedOrNull<'a> = Option<&'a RawGeckoElement>;"#)
490         .raw_line(r#"pub type RawGeckoDocumentBorrowed<'a> = &'a RawGeckoDocument;"#)
491         .raw_line(r#"pub type RawGeckoDocumentBorrowedOrNull<'a> = Option<&'a RawGeckoDocument>;"#)
492         .raw_line(r#"pub type RawServoDeclarationBlockStrongBorrowed<'a> = &'a RawServoDeclarationBlockStrong;"#)
493         .raw_line(r#"pub type RawServoDeclarationBlockStrongBorrowedOrNull<'a> = Option<&'a RawServoDeclarationBlockStrong>;"#)
494         .raw_line(r#"pub type RawGeckoPresContextBorrowed<'a> = &'a RawGeckoPresContext;"#)
495         .raw_line(r#"pub type RawGeckoPresContextBorrowedOrNull<'a> = Option<&'a RawGeckoPresContext>;"#)
496         .raw_line(r#"pub type RawGeckoStyleAnimationListBorrowed<'a> = &'a RawGeckoStyleAnimationList;"#)
497         .raw_line(r#"pub type RawGeckoStyleAnimationListBorrowedOrNull<'a> = Option<&'a RawGeckoStyleAnimationList>;"#)
498         .raw_line(r#"pub type nsCSSValueBorrowed<'a> = &'a nsCSSValue;"#)
499         .raw_line(r#"pub type nsCSSValueBorrowedOrNull<'a> = Option<&'a nsCSSValue>;"#)
500         .raw_line(r#"pub type nsCSSValueBorrowedMut<'a> = &'a mut nsCSSValue;"#)
501         .raw_line(r#"pub type nsCSSValueBorrowedMutOrNull<'a> = Option<&'a mut nsCSSValue>;"#)
502         .raw_line(r#"pub type nsTimingFunctionBorrowed<'a> = &'a nsTimingFunction;"#)
503         .raw_line(r#"pub type nsTimingFunctionBorrowedOrNull<'a> = Option<&'a nsTimingFunction>;"#)
504         .raw_line(r#"pub type nsTimingFunctionBorrowedMut<'a> = &'a mut nsTimingFunction;"#)
505         .raw_line(r#"pub type nsTimingFunctionBorrowedMutOrNull<'a> = Option<&'a mut nsTimingFunction>;"#)
506         .raw_line(r#"pub type RawGeckoAnimationPropertySegmentBorrowed<'a> = &'a RawGeckoAnimationPropertySegment;"#)
507         .raw_line(r#"pub type RawGeckoAnimationPropertySegmentBorrowedOrNull<'a> = Option<&'a RawGeckoAnimationPropertySegment>;"#)
508         .raw_line(r#"pub type RawGeckoAnimationPropertySegmentBorrowedMut<'a> = &'a mut RawGeckoAnimationPropertySegment;"#)
509         .raw_line(r#"pub type RawGeckoAnimationPropertySegmentBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoAnimationPropertySegment>;"#)
510         .raw_line(r#"pub type RawGeckoAnimationValueListBorrowed<'a> = &'a RawGeckoAnimationValueList;"#)
511         .raw_line(r#"pub type RawGeckoAnimationValueListBorrowedOrNull<'a> = Option<&'a RawGeckoAnimationValueList>;"#)
512         .raw_line(r#"pub type RawGeckoAnimationValueListBorrowedMut<'a> = &'a mut RawGeckoAnimationValueList;"#)
513         .raw_line(r#"pub type RawGeckoAnimationValueListBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoAnimationValueList>;"#)
514         .raw_line(r#"pub type RawGeckoComputedTimingBorrowed<'a> = &'a RawGeckoComputedTiming;"#)
515         .raw_line(r#"pub type RawGeckoComputedTimingBorrowedOrNull<'a> = Option<&'a RawGeckoComputedTiming>;"#)
516         .raw_line(r#"pub type RawGeckoComputedTimingBorrowedMut<'a> = &'a mut RawGeckoComputedTiming;"#)
517         .raw_line(r#"pub type RawGeckoComputedTimingBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoComputedTiming>;"#)
518         .raw_line(r#"pub type RawGeckoKeyframeListBorrowed<'a> = &'a RawGeckoKeyframeList;"#)
519         .raw_line(r#"pub type RawGeckoKeyframeListBorrowedOrNull<'a> = Option<&'a RawGeckoKeyframeList>;"#)
520         .raw_line(r#"pub type RawGeckoKeyframeListBorrowedMut<'a> = &'a mut RawGeckoKeyframeList;"#)
521         .raw_line(r#"pub type RawGeckoKeyframeListBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoKeyframeList>;"#)
522         .raw_line(r#"pub type RawGeckoComputedKeyframeValuesListBorrowed<'a> = &'a RawGeckoComputedKeyframeValuesList;"#)
523         .raw_line(r#"pub type RawGeckoComputedKeyframeValuesListBorrowedOrNull<'a> = Option<&'a RawGeckoComputedKeyframeValuesList>;"#)
524         .raw_line(r#"pub type RawGeckoComputedKeyframeValuesListBorrowedMut<'a> = &'a mut RawGeckoComputedKeyframeValuesList;"#)
525         .raw_line(r#"pub type RawGeckoComputedKeyframeValuesListBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoComputedKeyframeValuesList>;"#)
526         .raw_line(r#"pub type RawGeckoFontFaceRuleListBorrowed<'a> = &'a RawGeckoFontFaceRuleList;"#)
527         .raw_line(r#"pub type RawGeckoFontFaceRuleListBorrowedOrNull<'a> = Option<&'a RawGeckoFontFaceRuleList>;"#)
528         .raw_line(r#"pub type RawGeckoFontFaceRuleListBorrowedMut<'a> = &'a mut RawGeckoFontFaceRuleList;"#)
529         .raw_line(r#"pub type RawGeckoFontFaceRuleListBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoFontFaceRuleList>;"#)
530         .clang_arg("-x")
531         .clang_arg("c++")
532         .clang_arg("-std=c++14")
533         .clang_arg("-DTRACING=1")
534         .clang_arg("-DIMPL_LIBXUL")
535         .clang_arg("-DMOZ_STYLO_BINDINGS=1")
536         .clang_arg("-DMOZILLA_INTERNAL_API")
537         .clang_arg("-DRUST_BINDGEN")
538         .clang_arg("-DMOZ_STYLO")
539         .clang_arg("-DOS_POSIX=1")
540         .clang_arg("-DOS_LINUX=1")
541         .generate()
542         .expect("Should generate stylo bindings");
543 
544     let now = Instant::now();
545 
546     println!();
547     println!();
548     println!(
549         "Generated Stylo bindings in: {:?}",
550         now.duration_since(then)
551     );
552     println!();
553     println!();
554 
555     // panic!("Uncomment this line to get timing logs");
556 }
557