@@ -297,3 +297,385 @@ pub fn aspect_ratio_2() {
297
297
assert_eq ! ( child_a. layout_position( ) . height, 100. ) ;
298
298
}
299
299
}
300
+
301
+ #[ test]
302
+ pub fn aspect_ratio_in_block_width_fixed ( ) {
303
+ unsafe {
304
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
305
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
306
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
307
+ container. set_height ( DefLength :: Auto ) ;
308
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
309
+
310
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
311
+ child. set_width ( DefLength :: Points ( Len :: from_f32 ( 100. ) ) ) ;
312
+ child. set_height ( DefLength :: Auto ) ;
313
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
314
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
315
+
316
+ let child2 = as_ref ( Node :: new_ptr ( ) ) ;
317
+ child2. set_width ( DefLength :: Points ( Len :: from_f32 ( 100. ) ) ) ;
318
+ child2. set_height ( DefLength :: Auto ) ;
319
+ child2. set_aspect_ratio ( Some ( 0.5 / 1. ) ) ;
320
+ container. append_child ( convert_node_ref_to_ptr ( child2) ) ;
321
+
322
+ root. layout (
323
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 400. ) ) , OptionNum :: none ( ) ) ,
324
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
325
+ ) ;
326
+
327
+ assert_eq ! ( child. layout_position( ) . width, 100. ) ;
328
+ assert_eq ! ( child. layout_position( ) . height, 50. ) ;
329
+ assert_eq ! ( child2. layout_position( ) . width, 100. ) ;
330
+ assert_eq ! ( child2. layout_position( ) . height, 200. ) ;
331
+ }
332
+ }
333
+
334
+ #[ test]
335
+ pub fn aspect_ratio_in_block_height_fixed ( ) {
336
+ unsafe {
337
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
338
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
339
+ container. set_width ( DefLength :: Auto ) ;
340
+ container. set_height ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
341
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
342
+
343
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
344
+ child. set_width ( DefLength :: Auto ) ;
345
+ child. set_height ( DefLength :: Points ( Len :: from_f32 ( 100. ) ) ) ;
346
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
347
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
348
+
349
+ let child2 = as_ref ( Node :: new_ptr ( ) ) ;
350
+ child2. set_width ( DefLength :: Auto ) ;
351
+ child2. set_height ( DefLength :: Points ( Len :: from_f32 ( 200. ) ) ) ;
352
+ child2. set_aspect_ratio ( Some ( 0.5 / 1. ) ) ;
353
+ container. append_child ( convert_node_ref_to_ptr ( child2) ) ;
354
+
355
+ root. layout (
356
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 400. ) ) , OptionNum :: none ( ) ) ,
357
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
358
+ ) ;
359
+
360
+ assert_eq ! ( child. layout_position( ) . width, 200. ) ;
361
+ assert_eq ! ( child. layout_position( ) . height, 100. ) ;
362
+ assert_eq ! ( child2. layout_position( ) . width, 100. ) ;
363
+ assert_eq ! ( child2. layout_position( ) . height, 200. ) ;
364
+ }
365
+ }
366
+
367
+ // wpt:css/css-sizing/aspect-ratio/block-aspect-ratio-008.html
368
+ #[ test]
369
+ pub fn aspect_ratio_in_parent_block_cross_size_fixed ( ) {
370
+ unsafe {
371
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
372
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
373
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
374
+ container. set_height ( DefLength :: Auto ) ;
375
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
376
+
377
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
378
+ child. set_width ( DefLength :: Auto ) ;
379
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
380
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
381
+
382
+ let container2 = as_ref ( Node :: new_ptr ( ) ) ;
383
+ container2. set_width ( DefLength :: Auto ) ;
384
+ container2. set_height ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
385
+ container2. set_writing_mode ( WritingMode :: VerticalLr ) ;
386
+ root. append_child ( convert_node_ref_to_ptr ( container2) ) ;
387
+
388
+ let child2 = as_ref ( Node :: new_ptr ( ) ) ;
389
+ child2. set_width ( DefLength :: Auto ) ;
390
+ child2. set_aspect_ratio ( Some ( 0.5 / 1. ) ) ;
391
+ container2. append_child ( convert_node_ref_to_ptr ( child2) ) ;
392
+
393
+ root. layout (
394
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 400. ) ) , OptionNum :: none ( ) ) ,
395
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
396
+ ) ;
397
+
398
+ println ! (
399
+ "{}" ,
400
+ root. dump_to_html(
401
+ DumpOptions {
402
+ recursive: true ,
403
+ layout: true ,
404
+ style: DumpStyleMode :: Mutation
405
+ } ,
406
+ 0
407
+ )
408
+ ) ;
409
+
410
+ assert_eq ! ( child. layout_position( ) . width, 300. ) ;
411
+ assert_eq ! ( child. layout_position( ) . height, 150. ) ;
412
+ assert_eq ! ( child2. layout_position( ) . width, 150. ) ;
413
+ assert_eq ! ( child2. layout_position( ) . height, 300. ) ;
414
+ }
415
+ }
416
+
417
+ #[ test]
418
+ pub fn aspect_ratio_with_min_width_constraint ( ) {
419
+ unsafe {
420
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
421
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
422
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
423
+ container. set_height ( DefLength :: Auto ) ;
424
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
425
+
426
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
427
+ child. set_width ( DefLength :: Auto ) ;
428
+ child. set_height ( DefLength :: Auto ) ;
429
+ child. set_min_width ( DefLength :: Points ( Len :: from_f32 ( 400. ) ) ) ;
430
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
431
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
432
+
433
+ root. layout (
434
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 200. ) ) , OptionNum :: none ( ) ) ,
435
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
436
+ ) ;
437
+
438
+ println ! (
439
+ "{}" ,
440
+ root. dump_to_html(
441
+ DumpOptions {
442
+ recursive: true ,
443
+ layout: true ,
444
+ style: DumpStyleMode :: Mutation
445
+ } ,
446
+ 0
447
+ )
448
+ ) ;
449
+
450
+ assert_eq ! ( child. layout_position( ) . width, 400. ) ;
451
+ assert_eq ! ( child. layout_position( ) . height, 200. ) ;
452
+ }
453
+ }
454
+
455
+ #[ test]
456
+ pub fn aspect_ratio_with_max_width_constraint ( ) {
457
+ unsafe {
458
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
459
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
460
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
461
+ container. set_height ( DefLength :: Auto ) ;
462
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
463
+
464
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
465
+ child. set_width ( DefLength :: Auto ) ;
466
+ child. set_height ( DefLength :: Auto ) ;
467
+ child. set_max_width ( DefLength :: Points ( Len :: from_f32 ( 80. ) ) ) ;
468
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
469
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
470
+
471
+ root. layout (
472
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 200. ) ) , OptionNum :: none ( ) ) ,
473
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
474
+ ) ;
475
+
476
+ println ! (
477
+ "{}" ,
478
+ root. dump_to_html(
479
+ DumpOptions {
480
+ recursive: true ,
481
+ layout: true ,
482
+ style: DumpStyleMode :: Mutation
483
+ } ,
484
+ 0
485
+ )
486
+ ) ;
487
+
488
+ assert_eq ! ( child. layout_position( ) . width, 80. ) ;
489
+ assert_eq ! ( child. layout_position( ) . height, 40. ) ;
490
+ }
491
+ }
492
+
493
+ #[ test]
494
+ pub fn aspect_ratio_with_max_width_violating_min_height_constraint ( ) {
495
+ unsafe {
496
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
497
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
498
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
499
+ container. set_height ( DefLength :: Auto ) ;
500
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
501
+
502
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
503
+ child. set_width ( DefLength :: Auto ) ;
504
+ child. set_height ( DefLength :: Auto ) ;
505
+ child. set_max_width ( DefLength :: Points ( Len :: from_f32 ( 80. ) ) ) ;
506
+ child. set_min_height ( DefLength :: Points ( Len :: from_f32 ( 100. ) ) ) ;
507
+ child. set_aspect_ratio ( Some ( 1. / 1. ) ) ;
508
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
509
+
510
+ root. layout (
511
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 200. ) ) , OptionNum :: none ( ) ) ,
512
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
513
+ ) ;
514
+
515
+ println ! (
516
+ "{}" ,
517
+ root. dump_to_html(
518
+ DumpOptions {
519
+ recursive: true ,
520
+ layout: true ,
521
+ style: DumpStyleMode :: Mutation
522
+ } ,
523
+ 0
524
+ )
525
+ ) ;
526
+
527
+ assert_eq ! ( child. layout_position( ) . width, 80. ) ;
528
+ assert_eq ! ( child. layout_position( ) . height, 100. ) ;
529
+ }
530
+ }
531
+
532
+ #[ test]
533
+ pub fn aspect_ratio_block_size_with_box_sizing ( ) {
534
+ unsafe {
535
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
536
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
537
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
538
+ container. set_height ( DefLength :: Auto ) ;
539
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
540
+
541
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
542
+ child. set_width ( DefLength :: Auto ) ;
543
+ child. set_height ( DefLength :: Auto ) ;
544
+ child. set_width ( DefLength :: Points ( Len :: from_f32 ( 50. ) ) ) ;
545
+ child. set_padding_left ( DefLength :: Points ( Len :: from_f32 ( 30. ) ) ) ;
546
+ child. set_border_left ( DefLength :: Points ( Len :: from_f32 ( 20. ) ) ) ;
547
+ child. set_box_sizing ( BoxSizing :: BorderBox ) ;
548
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
549
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
550
+
551
+ let child2 = as_ref ( Node :: new_ptr ( ) ) ;
552
+ child2. set_width ( DefLength :: Auto ) ;
553
+ child2. set_height ( DefLength :: Auto ) ;
554
+ child2. set_width ( DefLength :: Points ( Len :: from_f32 ( 50. ) ) ) ;
555
+ child2. set_padding_left ( DefLength :: Points ( Len :: from_f32 ( 30. ) ) ) ;
556
+ child2. set_border_left ( DefLength :: Points ( Len :: from_f32 ( 20. ) ) ) ;
557
+ child2. set_box_sizing ( BoxSizing :: PaddingBox ) ;
558
+ child2. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
559
+ container. append_child ( convert_node_ref_to_ptr ( child2) ) ;
560
+
561
+ let child3 = as_ref ( Node :: new_ptr ( ) ) ;
562
+ child3. set_width ( DefLength :: Auto ) ;
563
+ child3. set_height ( DefLength :: Auto ) ;
564
+ child3. set_width ( DefLength :: Points ( Len :: from_f32 ( 50. ) ) ) ;
565
+ child3. set_padding_left ( DefLength :: Points ( Len :: from_f32 ( 30. ) ) ) ;
566
+ child3. set_border_left ( DefLength :: Points ( Len :: from_f32 ( 20. ) ) ) ;
567
+ child3. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
568
+ container. append_child ( convert_node_ref_to_ptr ( child3) ) ;
569
+
570
+ root. layout (
571
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 200. ) ) , OptionNum :: none ( ) ) ,
572
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
573
+ ) ;
574
+
575
+ println ! (
576
+ "{}" ,
577
+ root. dump_to_html(
578
+ DumpOptions {
579
+ recursive: true ,
580
+ layout: true ,
581
+ style: DumpStyleMode :: Mutation
582
+ } ,
583
+ 0
584
+ )
585
+ ) ;
586
+
587
+ assert_eq ! ( child. layout_position( ) . width, 50. ) ;
588
+ assert_eq ! ( child. layout_position( ) . height, 25. ) ;
589
+ assert_eq ! ( child2. layout_position( ) . width, 80. ) ;
590
+ assert_eq ! ( child2. layout_position( ) . height, 25. ) ;
591
+ assert_eq ! ( child3. layout_position( ) . width, 100. ) ;
592
+ assert_eq ! ( child3. layout_position( ) . height, 25. ) ;
593
+ }
594
+ }
595
+
596
+ #[ test]
597
+ pub fn aspect_ratio_block_size_with_box_sizing_and_writing_mode ( ) {
598
+ unsafe {
599
+ let root = as_ref ( Node :: new_ptr ( ) ) ;
600
+ let container = as_ref ( Node :: new_ptr ( ) ) ;
601
+ container. set_width ( DefLength :: Points ( Len :: from_f32 ( 300. ) ) ) ;
602
+ container. set_height ( DefLength :: Auto ) ;
603
+ container. set_writing_mode ( WritingMode :: VerticalLr ) ;
604
+ root. append_child ( convert_node_ref_to_ptr ( container) ) ;
605
+
606
+ let child = as_ref ( Node :: new_ptr ( ) ) ;
607
+ child. set_width ( DefLength :: Auto ) ;
608
+ child. set_height ( DefLength :: Auto ) ;
609
+ child. set_height ( DefLength :: Points ( Len :: from_f32 ( 50. ) ) ) ;
610
+ child. set_padding_top ( DefLength :: Points ( Len :: from_f32 ( 30. ) ) ) ;
611
+ child. set_border_top ( DefLength :: Points ( Len :: from_f32 ( 20. ) ) ) ;
612
+ child. set_box_sizing ( BoxSizing :: BorderBox ) ;
613
+ child. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
614
+ container. append_child ( convert_node_ref_to_ptr ( child) ) ;
615
+
616
+ let child2 = as_ref ( Node :: new_ptr ( ) ) ;
617
+ child2. set_width ( DefLength :: Auto ) ;
618
+ child2. set_height ( DefLength :: Auto ) ;
619
+ child2. set_height ( DefLength :: Points ( Len :: from_f32 ( 50. ) ) ) ;
620
+ child2. set_padding_top ( DefLength :: Points ( Len :: from_f32 ( 30. ) ) ) ;
621
+ child2. set_border_top ( DefLength :: Points ( Len :: from_f32 ( 20. ) ) ) ;
622
+ child2. set_box_sizing ( BoxSizing :: PaddingBox ) ;
623
+ child2. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
624
+ container. append_child ( convert_node_ref_to_ptr ( child2) ) ;
625
+
626
+ let child3 = as_ref ( Node :: new_ptr ( ) ) ;
627
+ child3. set_width ( DefLength :: Auto ) ;
628
+ child3. set_height ( DefLength :: Auto ) ;
629
+ child3. set_height ( DefLength :: Points ( Len :: from_f32 ( 50. ) ) ) ;
630
+ child3. set_padding_top ( DefLength :: Points ( Len :: from_f32 ( 30. ) ) ) ;
631
+ child3. set_border_top ( DefLength :: Points ( Len :: from_f32 ( 20. ) ) ) ;
632
+ child3. set_aspect_ratio ( Some ( 2. / 1. ) ) ;
633
+ container. append_child ( convert_node_ref_to_ptr ( child3) ) ;
634
+
635
+ root. layout (
636
+ OptionSize :: new ( OptionNum :: some ( Len :: from_f32 ( 200. ) ) , OptionNum :: none ( ) ) ,
637
+ Size :: new ( Len :: from_f32 ( 0. ) , Len :: from_f32 ( 0. ) ) ,
638
+ ) ;
639
+
640
+ println ! (
641
+ "{}" ,
642
+ root. dump_to_html(
643
+ DumpOptions {
644
+ recursive: true ,
645
+ layout: true ,
646
+ style: DumpStyleMode :: Mutation
647
+ } ,
648
+ 0
649
+ )
650
+ ) ;
651
+
652
+ assert_eq ! ( child. layout_position( ) . width, 100. ) ;
653
+ assert_eq ! ( child. layout_position( ) . height, 50. ) ;
654
+ assert_eq ! ( child2. layout_position( ) . width, 100. ) ;
655
+ assert_eq ! ( child2. layout_position( ) . height, 80. ) ;
656
+ assert_eq ! ( child3. layout_position( ) . width, 100. ) ;
657
+ assert_eq ! ( child3. layout_position( ) . height, 100. ) ;
658
+ }
659
+ }
660
+
661
+ #[ test]
662
+ pub fn apsect_ratio_writing_mode_streched ( ) {
663
+ assert_xml ! (
664
+ r#"
665
+ <div>
666
+ <div style="height: 400px; width: 300px;">
667
+ <div style="background: red; aspect-ratio: 3 / 1; min-width: 600px" expect_width="600" expect_height="200"></div>
668
+ <div style="background: blue; aspect-ratio: 3 / 1; max-width: 60px" expect_width="60" expect_height="20"></div>
669
+ </div>
670
+ <div style="height: 300px; width: 400px; writing-mode: vertical-lr">
671
+ <div style="background: red; aspect-ratio: 1 / 3; min-height: 600px" expect_width="200" expect_height="600"></div>
672
+ <div style="background: blue; aspect-ratio: 1 / 3; max-height: 60px" expect_width="20" expect_height="60"></div>
673
+ </div>
674
+ <div style="height: 300px; width: 400px; writing-mode: vertical-lr">
675
+ <div style="background: green; aspect-ratio: 3 / 1; min-height: 500px" expect_width="1500" expect_height="500"></div>
676
+ <div style="background: blue; aspect-ratio: 3 / 1; max-height: 90px" expect_width="270" expect_height="90"></div>
677
+ </div>
678
+ </div>
679
+ "#
680
+ )
681
+ }
0 commit comments