chromium设置字体大小功能

来源:互联网 发布:表白网页源码下载 编辑:程序博客网 时间:2024/05/21 10:25

 其实对于手机浏览器来说,设置字体大小实在是一个非常鸡肋又蛋疼无比的功能,因为本身可以缩放,还有缩放重排等功能。谁会有那么无聊想设置字体大小。改变字体大小强制改变了原网页的意图,排版完全改变,很可能造成较差的用户体验,真是一个吃力不讨好的功能。

   在browser端设置字体大小之后,不出意外会最终设置到WebCore::Settings::setTextAutosizingFontScaleFactor函数。当然,前提是你必须开启了TEXT_AUTOSIZING功能。否则你的设置完全不会起作用。

    TEXT_AUTOSIZING功能是什么,直白的理解就是自动调节字体大小以使用户获得更佳的体验。怎样来调节?当然是按照chromium自己的逻辑来调节。这个流程从排版开始:

#0  WebCore::TextAutosizer::processContainer (this=0x4bb6ee98, multiplier=1.5, container=0x4c9d1bd0, subtreeRoot=0x4c9d1bd0, windowInfo=...) at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:149
#1  0x5b60758a in WebCore::TextAutosizer::processContainer (this=0x4bb6ee98, multiplier=1.5, container=<value optimized out>, subtreeRoot=0x4c9d136c, windowInfo=...)
    at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:167
#2  0x5b60758a in WebCore::TextAutosizer::processContainer (this=0x4bb6ee98, multiplier=1.5, container=<value optimized out>, subtreeRoot=0x4c9d1300, windowInfo=...)
    at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:167
#3  0x5b60758a in WebCore::TextAutosizer::processContainer (this=0x4bb6ee98, multiplier=1.5, container=<value optimized out>, subtreeRoot=0x4c9d11cc, windowInfo=...)
    at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:167
#4  0x5b60758a in WebCore::TextAutosizer::processContainer (this=0x4bb6ee98, multiplier=1.5, container=<value optimized out>, subtreeRoot=0x4c9d1018, windowInfo=...)
    at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:167
#5  0x5b607774 in WebCore::TextAutosizer::processCluster (this=0x4bb6ee98, cluster=<value optimized out>, container=0x4c9d1018, subtreeRoot=0x4c9d1018, windowInfo=...)
    at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:125
#6  0x5b607982 in WebCore::TextAutosizer::processSubtree (this=0x4bb6ee98, layoutRoot=0x4c9d1018) at third_party/WebKit/Source/WebCore/rendering/TextAutosizer.cpp:95
#7  0x5b5d7028 in WebCore::FrameView::layout (this=0x4c0046c0, allowSubtree=<value optimized out>) at third_party/WebKit/Source/WebCore/page/FrameView.cpp:1186
#8  WebCore::FrameView::layout

  TEXT_AUTOSIZING功能在TextAutosizer类中实现。

  这里不得不插一句,TEXT_AUTOSIZING与设置字体大小简直是一对悖论。因为设置字体大小是使浏览器强制改变字体,而TEXT_AUTOSIZING又使浏览器自动调节字体。。。。这就导致最终的结果是调节后的结果,设置字体未必会起作用。。。。


  TEXT_AUTOSIZING在哪些情况下不会理会字体大小设置呢?

1. 从clusterShouldBeAutosized函数中可以看出,太短的一段文字chromium不会理会。要多短,大约是小于四行

2. 从contentHeightIsConstrained函数中可以看出,行高被强制设置的节点(除去html和body节点),chromium不会理会

  用膝盖想也知道这容易造成一种情况。。。。就是一个页面中有的被改变有的不会被改变。。。。真是奇葩。


 TEXT_AUTOSIZING还会对设置的值进行自动调节,比如processCluster函数,就对该值进行了狠狠的一番改造。说实话它的逻辑我完全没看懂。。。。但这样造成的效果就是,即使字体会改变,那么不同节点字体改变的大小也不一定一样。。。。。又一个奇葩

  包括computeAutosizedFontSize函数中,对字体的大小,包括最小值又有限制。


   总之,chromium改变字体大小的功能与TEXT_AUTOSIZING相悖,导致了较差的用户体验。