Index: Source/core/page/Page.cpp |
diff --git a/Source/core/page/Page.cpp b/Source/core/page/Page.cpp |
index a82d7dd4ac3300ebce6ca41c20751af11b552277..2b964b35778957f77a79a1069db17c2524196532 100644 |
--- a/Source/core/page/Page.cpp |
+++ b/Source/core/page/Page.cpp |
@@ -262,6 +262,16 @@ void Page::setNeedsRecalcStyleInAllFrames() |
frame->document()->styleResolverChanged(RecalcStyleDeferred); |
} |
+void Page::setNeedsLayoutInAllFrames() |
+{ |
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) { |
+ if (FrameView* view = frame->view()) { |
+ view->setNeedsLayout(); |
+ view->scheduleRelayout(); |
+ } |
+ } |
+} |
+ |
void Page::refreshPlugins(bool reload) |
{ |
if (allPages().isEmpty()) |
@@ -491,17 +501,29 @@ void Page::settingsChanged(SettingsDelegate::ChangeType changeType) |
} |
break; |
case SettingsDelegate::TextAutosizingChange: |
- // FIXME: I wonder if this needs to traverse frames like in WebViewImpl::resize, or whether there is only one document per Settings instance? |
- for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) { |
- TextAutosizer* textAutosizer = frame->document()->textAutosizer(); |
- if (textAutosizer) |
- textAutosizer->recalculateMultipliers(); |
+ // FTA needs both setNeedsRecalcStyle and setNeedsLayout after a setting change. |
+ if (RuntimeEnabledFeatures::fastTextAutosizingEnabled()) { |
+ setNeedsRecalcStyleInAllFrames(); |
+ } else { |
+ // FIXME: I wonder if this needs to traverse frames like in WebViewImpl::resize, or whether there is only one document per Settings instance? |
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) { |
+ TextAutosizer* textAutosizer = frame->document()->textAutosizer(); |
+ if (textAutosizer) |
+ textAutosizer->recalculateMultipliers(); |
+ } |
} |
- setNeedsRecalcStyleInAllFrames(); |
+ // TextAutosizing updates RenderStyle during layout phase (via TextAutosizer::processSubtree). |
+ // We should invoke setNeedsLayout here. |
+ setNeedsLayoutInAllFrames(); |
break; |
case SettingsDelegate::ScriptEnableChange: |
m_inspectorController->scriptsEnabled(settings().scriptEnabled()); |
break; |
+ case SettingsDelegate::FontFamilyChange: |
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) |
+ frame->document()->styleEngine()->updateGenericFontFamilySettings(); |
+ setNeedsRecalcStyleInAllFrames(); |
+ break; |
} |
} |