OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 bool hasSpecifiedPageLogicalHeight = false; | 485 bool hasSpecifiedPageLogicalHeight = false; |
486 checkForPaginationLogicalHeightChange(pageLogicalHeight, | 486 checkForPaginationLogicalHeightChange(pageLogicalHeight, |
487 pageLogicalHeightChanged, | 487 pageLogicalHeightChanged, |
488 hasSpecifiedPageLogicalHeight); | 488 hasSpecifiedPageLogicalHeight); |
489 if (pageLogicalHeightChanged) | 489 if (pageLogicalHeightChanged) |
490 relayoutChildren = true; | 490 relayoutChildren = true; |
491 | 491 |
492 LayoutState state(*this, locationOffset(), pageLogicalHeight, | 492 LayoutState state(*this, locationOffset(), pageLogicalHeight, |
493 pageLogicalHeightChanged, logicalWidthChanged); | 493 pageLogicalHeightChanged, logicalWidthChanged); |
494 | 494 |
| 495 if (m_paginationStateChanged) { |
| 496 // We now need a deep layout to clean up struts after pagination, if we |
| 497 // just ceased to be paginated, or, if we just became paginated on the |
| 498 // other hand, we now need the deep layout, to insert pagination struts. |
| 499 m_paginationStateChanged = false; |
| 500 state.setPaginationStateChanged(); |
| 501 } |
| 502 |
495 // We use four values, maxTopPos, maxTopNeg, maxBottomPos, and maxBottomNeg, | 503 // We use four values, maxTopPos, maxTopNeg, maxBottomPos, and maxBottomNeg, |
496 // to track our current maximal positive and negative margins. These values | 504 // to track our current maximal positive and negative margins. These values |
497 // are used when we are collapsed with adjacent blocks, so for example, if you | 505 // are used when we are collapsed with adjacent blocks, so for example, if you |
498 // have block A and B collapsing together, then you'd take the maximal | 506 // have block A and B collapsing together, then you'd take the maximal |
499 // positive margin from both A and B and subtract it from the maximal negative | 507 // positive margin from both A and B and subtract it from the maximal negative |
500 // margin from both A and B to get the true collapsed margin. This algorithm | 508 // margin from both A and B to get the true collapsed margin. This algorithm |
501 // is recursive, so when we finish layout() our block knows its current | 509 // is recursive, so when we finish layout() our block knows its current |
502 // maximal positive/negative values. | 510 // maximal positive/negative values. |
503 // | 511 // |
504 // Start out by setting our margin values to our current margins. Table cells | 512 // Start out by setting our margin values to our current margins. Table cells |
(...skipping 3694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4199 | 4207 |
4200 if (multiColumnFlowThread()) { | 4208 if (multiColumnFlowThread()) { |
4201 ASSERT(oldStyle); | 4209 ASSERT(oldStyle); |
4202 if (type != getFlowThreadType(*oldStyle)) { | 4210 if (type != getFlowThreadType(*oldStyle)) { |
4203 // If we're no longer to be multicol/paged, destroy the flow thread. Also | 4211 // If we're no longer to be multicol/paged, destroy the flow thread. Also |
4204 // destroy it when switching between multicol and paged, since that | 4212 // destroy it when switching between multicol and paged, since that |
4205 // affects the column set structure (multicol containers may have | 4213 // affects the column set structure (multicol containers may have |
4206 // spanners, paged containers may not). | 4214 // spanners, paged containers may not). |
4207 multiColumnFlowThread()->evacuateAndDestroy(); | 4215 multiColumnFlowThread()->evacuateAndDestroy(); |
4208 ASSERT(!multiColumnFlowThread()); | 4216 ASSERT(!multiColumnFlowThread()); |
| 4217 m_paginationStateChanged = true; |
4209 } | 4218 } |
4210 } | 4219 } |
4211 | 4220 |
4212 if (type == NoFlowThread || multiColumnFlowThread()) | 4221 if (type == NoFlowThread || multiColumnFlowThread()) |
4213 return; | 4222 return; |
4214 | 4223 |
4215 // Ruby elements manage child insertion in a special way, and would mess up | 4224 // Ruby elements manage child insertion in a special way, and would mess up |
4216 // insertion of the flow thread. The flow thread needs to be a direct child of | 4225 // insertion of the flow thread. The flow thread needs to be a direct child of |
4217 // the multicol block (|this|). | 4226 // the multicol block (|this|). |
4218 if (isRuby()) | 4227 if (isRuby()) |
4219 return; | 4228 return; |
4220 | 4229 |
4221 // Form controls are replaced content, and are therefore not supposed to | 4230 // Form controls are replaced content, and are therefore not supposed to |
4222 // support multicol. | 4231 // support multicol. |
4223 if (isFileUploadControl() || isTextControl() || isListBox()) | 4232 if (isFileUploadControl() || isTextControl() || isListBox()) |
4224 return; | 4233 return; |
4225 | 4234 |
4226 LayoutMultiColumnFlowThread* flowThread = createMultiColumnFlowThread(type); | 4235 LayoutMultiColumnFlowThread* flowThread = createMultiColumnFlowThread(type); |
4227 addChild(flowThread); | 4236 addChild(flowThread); |
| 4237 m_paginationStateChanged = true; |
4228 | 4238 |
4229 // Check that addChild() put the flow thread as a direct child, and didn't do | 4239 // Check that addChild() put the flow thread as a direct child, and didn't do |
4230 // fancy things. | 4240 // fancy things. |
4231 ASSERT(flowThread->parent() == this); | 4241 ASSERT(flowThread->parent() == this); |
4232 | 4242 |
4233 flowThread->populate(); | 4243 flowThread->populate(); |
4234 LayoutBlockFlowRareData& rareData = ensureRareData(); | 4244 LayoutBlockFlowRareData& rareData = ensureRareData(); |
4235 ASSERT(!rareData.m_multiColumnFlowThread); | 4245 ASSERT(!rareData.m_multiColumnFlowThread); |
4236 rareData.m_multiColumnFlowThread = flowThread; | 4246 rareData.m_multiColumnFlowThread = flowThread; |
4237 } | 4247 } |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4537 return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); | 4547 return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); |
4538 } | 4548 } |
4539 | 4549 |
4540 void LayoutBlockFlow::invalidateDisplayItemClients( | 4550 void LayoutBlockFlow::invalidateDisplayItemClients( |
4541 PaintInvalidationReason invalidationReason) const { | 4551 PaintInvalidationReason invalidationReason) const { |
4542 BlockFlowPaintInvalidator(*this).invalidateDisplayItemClients( | 4552 BlockFlowPaintInvalidator(*this).invalidateDisplayItemClients( |
4543 invalidationReason); | 4553 invalidationReason); |
4544 } | 4554 } |
4545 | 4555 |
4546 } // namespace blink | 4556 } // namespace blink |
OLD | NEW |