Dillo v3.1.1-119-g140d9ebd
|
TODO: Much missing.
(Historical) Note: Floats make use of Size requisitions depending on positions, which reduces the complexity of a previous design.
Floats are sorted, to make binary search possible, in these lists:
The other two lists, dw::OutOfFlowMgr::leftFloatsAll and dw::OutOfFlowMgr::rightFloatsAll are not sorted at all.
New floats are always added to the end of either list; this order is called generation order. See also above: GB lists and CB lists.
On the other hand, there are different sorting criteria, implemented by different comparators, so that different kinds of keys may be used for searching. These sorting criteria are equivalent to the generation order.
dw::OutOfFlowMgr::Float::CompareSideSpanningIndex compares sideSpanningIndex* (used to compare floats to those on the respective other side); if you look at the definition (dw::OutOfFlowMgr::addWidgetOOF) it becomes clear that this order is equivalent to the generation order.
dw::OutOfFlowMgr::Float::CompareGBAndExtIndex compares externalIndex for floats with same generators, otherwise: (i) if one generator (T1) is a direct ancestor of the other generator (T2), the child of T1, which is an ancestor of, or identical to, T2 is compared to the float generated by T1, using externalIndex, as in this example:
T1 -+-> child --> ... -> T2 -> Float `-> Float
Otherwise, the two blocks are compared, according to their position in dw::OutOfFlowMgr::tbInfos:
common ancestor -+-> ... --> T1 -> Float `-> ... --> T2 -> Float
This is equivalent to the generation order, as long it is ensured that externalIndex* reflects the generation order within a generating block, for both floats and child blocks.
dw::OutOfFlowMgr::Float::ComparePosition ...
The CSS specification allows two strategies to deal with colliding floats: placing the second float beside or below the first one. Many other browsers implement the first approach, while dillo implements the second one, which may cause problems when the author assumes the first. Example: the "tabs" at the top of every page at Wikipedia ("Article", "Talk", ...).
Consider the following HTML snippet:
<body> <img src="....jpg" style="float:right"> <p style="overflow:hidden">Text</p> </body>
Interestingly, dillo shows "Text" always below the image, even if there is enough space left of it. An investigation shows that the paragraph (<p>) is regarded as own floats container (because of overflow:hidden*), so the floats container above (<body>) regards this block as widget which must be fit between the floats (dw::Textblock::mustBorderBeRegarded > dw::Textblock::getWidgetRegardingBorderForLine). However, since a textblock in flow always covers (at least) the whole available width, which is defined without considering floats, the space left of the float will always be to narrow, so that the paragraph is moved below the float, by inserting an empty line before.
When searching for a solution, several difficulties show up:
Instead, this approach is focussed:
Real-world cases: Overflow:hidden is set for headings in Wikipedia, and so this case occurs when there is a float (thumb image) before a heading. See e. g. this page and scroll a bit up; the company logos should be right of this section.
Priority: Since this is not a regression, compared to not supporting floats at all, a fix is not urgent for a new release.
Has the case that a float changes its position to be regarded? Probably yes, but cases where no other mechanisms come into play are rather unlikely.
Priority: If this plays a role, this means a regression compared to not supporting floats at all.