Bug 165007 - [meta] [css-grid] Isolate track sizing and items placement data from RenderGrid internal state
Summary: [meta] [css-grid] Isolate track sizing and items placement data from RenderGr...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Layout and Rendering (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on: 165006 165042 165065 165094 165250 165654 166530
Blocks: 60731
  Show dependency treegraph
 
Reported: 2016-11-21 03:30 PST by Sergio Villar Senin
Modified: 2017-01-31 08:04 PST (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Sergio Villar Senin 2016-11-21 03:30:11 PST
The most important piece of code in RenderGrid is the track sizing algorithm which is used to determine the sizes of the tracks (rows and columns) of the grid. That algorithm is used for both the layout phase and the preferred widths (intrinsic size) computations. The problem is that both computations are using exactly the same data structures cached in the RenderGrid object. That's nice for performance reasons but it is also a potential source of problems. 

The risk is low ATM because we do always clear those caches after a layout or a preferred widths computation but that is something that will not stay forever like this, as we want to reuse some computations between layouts (like the placement of items) in order to improve performance. Actually it's already causing some issues right now, like for example the need of using ugly const_casts in computeIntrinsicLogicalWidths() which is supposed to be a const method.

I'm filing this metabug as the process will require several patches.
Comment 1 Sergio Villar Senin 2016-11-28 12:04:59 PST
I'm adding here the steps required to complete this isolation process:

1- Split gridColumnCount()/gridRowCount() so there are 2 different pairs of methods: one pair which returns the actual size of the grid and another which returns the size of the data structure used to represent it
2- Create a new class called Grid which encapsulates grid's internal representation
3- Move items' placement caches to the Grid class
4- Pass the Grid class to all the items' placement methods
5- Use a different Grid object for the intrinsic size computation. Layout will be still using m_grid
6- Const-ify all items' placement methods, including placeItemsOnGrid()
7- Remove ugly const_cast<> in computeIntrinsicLogicalWidths

and that's it.
Comment 2 Sergio Villar Senin 2017-01-31 08:04:27 PST
Closing this as it was completed.