diff --git a/bin/unit_tests/assets/html/newsblur_home_prices_small.html b/bin/unit_tests/assets/html/newsblur_home_prices_small.html new file mode 100644 index 000000000..68a3a5237 --- /dev/null +++ b/bin/unit_tests/assets/html/newsblur_home_prices_small.html @@ -0,0 +1,175 @@ + + + + + + + + +
+
+
+
+
+
+
+
Premium
+
+ $36 + /year +
+
+
+ +
+
+
Premium Archive
+
+ $99 + /year +
+
+
+ +
+
+
Premium Pro
+
+ $29 + /month +
+
+
+
+
+
+
+
+ + diff --git a/src/eepp/ui/uirichtext.cpp b/src/eepp/ui/uirichtext.cpp index c05c550a2..e2118f099 100644 --- a/src/eepp/ui/uirichtext.cpp +++ b/src/eepp/ui/uirichtext.cpp @@ -1592,11 +1592,23 @@ void UIRichText::rebuildRichText( UILayout* container, RichText& richText, Intri Float maxWidth = 0; bool isInlineBlockTextSpan = container->isType( UI_TYPE_TEXTSPAN ) && container->asType()->isInlineBlock(); + Node* parentNode = container->getParent(); + bool parentIsFlexOrGrid = parentNode && parentNode->isType( UI_TYPE_HTML_WIDGET ) && + ( parentNode->asType()->isFlex() || + parentNode->asType()->isGrid() ); if ( isInlineBlockTextSpan && mode == IntrinsicMode::None && container->getPixelsSize().getWidth() > 0 ) { maxWidth = container->getPixelsSize().getWidth() - container->getPixelsContentOffset().Left - container->getPixelsContentOffset().Right; + } else if ( parentIsFlexOrGrid && + container->getLayoutWidthPolicy() == SizePolicy::WrapContent && + mode == IntrinsicMode::None ) { + maxWidth = container->getPixelsSize().getWidth() > 0 + ? container->getPixelsSize().getWidth() - + container->getPixelsContentOffset().Left - + container->getPixelsContentOffset().Right + : 0; } else if ( container->getLayoutWidthPolicy() == SizePolicy::WrapContent ) { maxWidth = container->getMatchParentWidth() - container->getPixelsContentOffset().Left - container->getPixelsContentOffset().Right; @@ -1641,10 +1653,9 @@ void UIRichText::rebuildRichText( UILayout* container, RichText& richText, Intri if ( container->isType( UI_TYPE_TEXTSPAN ) ) { UITextSpan* selfSpan = container->asType(); - Node* parentNode = container->getParent(); - bool parentIsFlex = parentNode->isType( UI_TYPE_HTML_WIDGET ) && + bool parentIsFlex = parentNode && parentNode->isType( UI_TYPE_HTML_WIDGET ) && parentNode->asType()->isFlex(); - bool parentIsGrid = parentNode->isType( UI_TYPE_HTML_WIDGET ) && + bool parentIsGrid = parentNode && parentNode->isType( UI_TYPE_HTML_WIDGET ) && parentNode->asType()->isGrid(); if ( !selfSpan->getText().empty() && ( !selfSpan->isInline() || parentIsFlex || parentIsGrid ) && diff --git a/src/tests/unit_tests/uihtml_tests.cpp b/src/tests/unit_tests/uihtml_tests.cpp index 6ef7a8055..460aaacf9 100644 --- a/src/tests/unit_tests/uihtml_tests.cpp +++ b/src/tests/unit_tests/uihtml_tests.cpp @@ -3800,6 +3800,43 @@ UTEST( UIHTML, FlexAnchorInFlexNavVisible ) { Engine::destroySingleton(); } +UTEST( UIHTML, FlexTextSpanWrapContentUsesItemWidth ) { + Engine::instance()->createWindow( WindowSettings( 1280, 720, "Flex Text Span Width Test", + WindowStyle::Default, WindowBackend::Default, + 32, {}, 1, false, true ), + ContextSettings( false, 0, 0, GLv_default, true, false ) ); + + UISceneNode* sceneNode = init_test_inline_block(); + sceneNode->setURI( "file://" + Sys::getProcessPath() + "assets/html/" ); + + std::string html; + FileSystem::fileGet( "assets/html/newsblur_home_prices_small.html", html ); + sceneNode->loadLayoutFromString( HTMLFormatter::HTMLtoXML( html ) ); + + sceneNode->update( Seconds( 1 ) ); + sceneNode->updateDirtyLayouts(); + + auto priceAmount = sceneNode->getRoot()->findByClass( "NB-pricing-tier-price-amount" ); + ASSERT_TRUE( priceAmount != nullptr ); + ASSERT_TRUE( priceAmount->isType( UI_TYPE_TEXTSPAN ) ); + + auto* amountSpan = priceAmount->asType(); + auto* amountRichText = amountSpan->getRichTextPtr(); + ASSERT_TRUE( amountRichText != nullptr ); + amountRichText->updateLayout(); + + const auto& lines = amountRichText->getLines(); + ASSERT_EQ( lines.size(), 1u ); + ASSERT_EQ( lines.front().spans.size(), 1u ); + ASSERT_EQ( lines.front().spans.front().type, RichText::RenderSpan::Type::Text ); + ASSERT_TRUE( lines.front().spans.front().text != nullptr ); + EXPECT_STRINGEQ( lines.front().spans.front().text->getString(), "$36" ); + EXPECT_NEAR( lines.front().spans.front().position.x, 0.f, 1.f ); + EXPECT_NEAR( amountSpan->getPixelsSize().getWidth(), lines.front().spans.front().size.x, 2.f ); + + Engine::destroySingleton(); +} + UTEST( UIHTML, FlexLiItemsWrapContentWidth ) { Engine::instance()->createWindow( WindowSettings( 1024, 768, "Flex LI Width Test", WindowStyle::Default, WindowBackend::Default,