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 @@
+
+
+
+
+
+
+
+
+
+
+
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,