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