WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Updated patch per discussion with Ojan: Always force a layout in minContentForChild / maxContentForChild.
bug-109100-20130211163621.patch (text/plain), 39.87 KB, created by
Julien Chaffraix
on 2013-02-11 16:39:51 PST
(
hide
)
Description:
Updated patch per discussion with Ojan: Always force a layout in minContentForChild / maxContentForChild.
Filename:
MIME Type:
Creator:
Julien Chaffraix
Created:
2013-02-11 16:39:51 PST
Size:
39.87 KB
patch
obsolete
>Subversion Revision: 142518 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c2c7f8b739e2a076548e0ad0a6aab6e985a77e07..f3860a3d8b1ff3f126da0e3756825cccee280a32 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,39 @@ >+2013-02-11 Julien Chaffraix <jchaffraix@webkit.org> >+ >+ [CSS Grid Layout] Adding or removing grid items doesn't properly recompute the track sizes >+ https://bugs.webkit.org/show_bug.cgi?id=109100 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Test: fast/css-grid-layout/grid-item-removal-track-breadth-update.html >+ >+ The test uncovered several bugs in our implementation that is fixed as part >+ of this change. They will be detailed below. >+ >+ * rendering/RenderGrid.cpp: >+ (WebCore::RenderGrid::logicalContentHeightForChild): >+ Added this function to share the code between minContentForChild and maxContentForChild. >+ Also forced a relayout in this case to avoid getting a wrong answer (e.g. the logical height >+ constrained by the previous layout's grid breadth). >+ >+ (WebCore::RenderGrid::minContentForChild): >+ (WebCore::RenderGrid::maxContentForChild): >+ Updated to use logicalContentHeightForChild. >+ >+ (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions): >+ Updated to match the specification and set max breadth to current breadth per the specification. >+ This made us over-grow some cases in the test. >+ >+ (WebCore::RenderGrid::distributeSpaceToTracks): >+ Updated to match the specification and use an extra variable to do the intermediate spreading. Also removed >+ a now unneeded max. This fixes the case of multiple grid items in the same grid area that was completely broken. >+ >+ (WebCore::RenderGrid::layoutGridItems): >+ Added a FIXME about always relaying out content sized tracks' children. >+ >+ * rendering/RenderGrid.h: >+ Added logicalContentHeightForChild. >+ > 2013-02-11 Roger Fong <roger_fong@apple.com> > > Unreviewed. Build fix for Win7 Release. >diff --git a/Source/WebCore/rendering/RenderGrid.cpp b/Source/WebCore/rendering/RenderGrid.cpp >index 75e0b79215342a1b20155bde307ca1fc2707cf73..a250deaaba17c1e2a6d9dd2786173f0d6f2bd56d 100644 >--- a/Source/WebCore/rendering/RenderGrid.cpp >+++ b/Source/WebCore/rendering/RenderGrid.cpp >@@ -287,6 +287,22 @@ size_t RenderGrid::maximumIndexInDirection(TrackSizingDirection direction) const > return maximumIndex; > } > >+LayoutUnit RenderGrid::logicalContentHeightForChild(RenderBox* child, Vector<GridTrack>& columnTracks) >+{ >+ // FIXME: We shouldn't force a layout every time this function is called but >+ // 1) Return computeLogicalHeight's value if it's available. Unfortunately computeLogicalHeight >+ // doesn't return if the logical height is available so would need to be changed. >+ // 2) Relayout if the column track's used breadth changed OR the logical height is unavailable. >+ if (!child->needsLayout()) >+ child->setNeedsLayout(true, MarkOnlyThis); >+ >+ size_t columnTrack = resolveGridPosition(ForColumns, child); >+ child->setOverrideContainingBlockContentLogicalWidth(columnTracks[columnTrack].m_usedBreadth); >+ child->clearOverrideContainingBlockContentLogicalHeight(); >+ child->layout(); >+ return child->logicalHeight(); >+} >+ > LayoutUnit RenderGrid::minContentForChild(RenderBox* child, TrackSizingDirection direction, Vector<GridTrack>& columnTracks) > { > bool hasOrthogonalWritingMode = child->isHorizontalWritingMode() != isHorizontalWritingMode(); >@@ -300,13 +316,7 @@ LayoutUnit RenderGrid::minContentForChild(RenderBox* child, TrackSizingDirection > return child->minPreferredLogicalWidth(); > } > >- if (child->needsLayout()) { >- size_t columnTrack = resolveGridPosition(ForColumns, child); >- child->setOverrideContainingBlockContentLogicalWidth(columnTracks[columnTrack].m_usedBreadth); >- child->clearOverrideContainingBlockContentLogicalHeight(); >- child->layout(); >- } >- return child->logicalHeight(); >+ return logicalContentHeightForChild(child, columnTracks); > } > > LayoutUnit RenderGrid::maxContentForChild(RenderBox* child, TrackSizingDirection direction, Vector<GridTrack>& columnTracks) >@@ -322,13 +332,7 @@ LayoutUnit RenderGrid::maxContentForChild(RenderBox* child, TrackSizingDirection > return child->maxPreferredLogicalWidth(); > } > >- if (child->needsLayout()) { >- size_t columnTrack = resolveGridPosition(ForColumns, child); >- child->setOverrideContainingBlockContentLogicalWidth(columnTracks[columnTrack].m_usedBreadth); >- child->clearOverrideContainingBlockContentLogicalHeight(); >- child->layout(); >- } >- return child->logicalHeight(); >+ return logicalContentHeightForChild(child, columnTracks); > } > > void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, LayoutUnit& availableLogicalSpace) >@@ -359,9 +363,10 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di > > if (maxTrackBreadth.isMaxContent()) > resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); >- } > >- // FIXME: The spec says to update maxBreadth if it is Infinity. >+ if (track.m_maxBreadth == infinity) >+ track.m_maxBreadth = track.m_usedBreadth; >+ } > } > > void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, size_t i, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) >@@ -391,29 +396,31 @@ void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid > std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); > > size_t tracksSize = tracks.size(); >+ // FIXME: This should probably use a RAII pattern to ensure we always update our tracks. >+ Vector<LayoutUnit> updatedTrackBreadths(tracksSize); >+ > for (size_t i = 0; i < tracksSize; ++i) { > GridTrack& track = *tracks[i]; > LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksSize - i); >- // We never shrink the used breadth by clamping the difference between max and used breadth. The spec uses >- // 2 extra-variables and 2 extra iterations to ensure that we always grow our tracks (thus never going below >- // min-track). If we decide to follow it to the letter, we should remove this clamping. >- LayoutUnit growthShare = std::min(availableLogicalSpaceShare, std::max(LayoutUnit(0), track.m_maxBreadth - (track.*trackGetter)())); >- (track.*trackGrowthFunction)(growthShare); >+ LayoutUnit trackBreadth = (tracks[i]->*trackGetter)(); >+ LayoutUnit growthShare = std::min(availableLogicalSpaceShare, track.m_maxBreadth - trackBreadth); >+ updatedTrackBreadths[i] = trackBreadth + growthShare; > availableLogicalSpace -= growthShare; > } > >- if (availableLogicalSpace <= 0) >- return; >- >- if (!tracksForGrowthAboveMaxBreadth) >- return; >+ if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) { >+ tracksSize = tracksForGrowthAboveMaxBreadth->size(); >+ for (size_t i = 0; i < tracksSize; ++i) { >+ LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); >+ updatedTrackBreadths[i] += growthShare; >+ availableLogicalSpace -= growthShare; >+ } >+ } > >- tracksSize = tracksForGrowthAboveMaxBreadth->size(); > for (size_t i = 0; i < tracksSize; ++i) { >- GridTrack& track = *tracksForGrowthAboveMaxBreadth->at(i); >- LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); >- (track.*trackGrowthFunction)(growthShare); >- availableLogicalSpace -= growthShare; >+ LayoutUnit growth = updatedTrackBreadths[i] - (tracks[i]->*trackGetter)(); >+ if (growth >= 0) >+ (tracks[i]->*trackGrowthFunction)(growth); > } > } > >@@ -450,6 +457,8 @@ void RenderGrid::layoutGridItems() > LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOverrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogicalWidth() : LayoutUnit(); > LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOverrideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogicalHeight() : LayoutUnit(); > >+ // FIXME: For children in a content sized track, we clear the overrideContainingBlockContentLogicalHeight >+ // in minContentForChild / maxContentForChild which means that we will always relayout the child. > if (oldOverrideContainingBlockContentLogicalWidth != columnTracks[columnTrack].m_usedBreadth || oldOverrideContainingBlockContentLogicalHeight != rowTracks[rowTrack].m_usedBreadth) > child->setNeedsLayout(true, MarkOnlyThis); > >diff --git a/Source/WebCore/rendering/RenderGrid.h b/Source/WebCore/rendering/RenderGrid.h >index 96e6a49231071d9bc9c9e999f17e2adce4b6be0e..2513c21b975c4ab32fa51644eda86c117c6e9f7e 100644 >--- a/Source/WebCore/rendering/RenderGrid.h >+++ b/Source/WebCore/rendering/RenderGrid.h >@@ -67,6 +67,7 @@ private: > const GridTrackSize& gridTrackSize(TrackSizingDirection, size_t); > size_t maximumIndexInDirection(TrackSizingDirection) const; > >+ LayoutUnit logicalContentHeightForChild(RenderBox*, Vector<GridTrack>&); > LayoutUnit minContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks); > LayoutUnit maxContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks); > LayoutPoint findChildLogicalPosition(RenderBox*, const Vector<GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks); >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index b9668c464f78eb8f31817ac9eafdbe85b4d7bf78..fa712c0fc3ca70cde2ffeb88c4e229403a3a4020 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,32 @@ >+2013-02-11 Julien Chaffraix <jchaffraix@webkit.org> >+ >+ [CSS Grid Layout] Adding or removing grid items doesn't properly recompute the track sizes >+ https://bugs.webkit.org/show_bug.cgi?id=109100 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * fast/css-grid-layout/grid-item-addition-track-breadth-update-expected.txt: Added. >+ * fast/css-grid-layout/grid-item-addition-track-breadth-update.html: Added. >+ * fast/css-grid-layout/grid-item-removal-track-breadth-update-expected.txt: Added. >+ * fast/css-grid-layout/grid-item-removal-track-breadth-update.html: Added. >+ New tests. >+ >+ * fast/css-grid-layout/resources/grid.css: >+ (.constrainedContainer): >+ (.unconstrainedContainer): >+ Added these class to share them with other tests. >+ >+ * fast/css-grid-layout/auto-content-resolution-columns.html: >+ * fast/css-grid-layout/auto-content-resolution-rows.html: >+ * fast/css-grid-layout/implicit-columns-auto-resolution.html: >+ * fast/css-grid-layout/implicit-position-dynamic-change.html: >+ * fast/css-grid-layout/implicit-rows-auto-resolution.html: >+ * fast/css-grid-layout/minmax-max-content-resolution-columns.html: >+ * fast/css-grid-layout/minmax-max-content-resolution-rows.html: >+ * fast/css-grid-layout/minmax-min-content-column-resolution-columns.html: >+ * fast/css-grid-layout/minmax-min-content-column-resolution-rows.html: >+ Removed constrainedContainer definition as it was moved to grid.css. >+ > 2013-02-11 Joshua Bell <jsbell@chromium.org> > > IndexedDB: database connections don't close after versionchange transaction aborts >diff --git a/LayoutTests/fast/css-grid-layout/auto-content-resolution-columns.html b/LayoutTests/fast/css-grid-layout/auto-content-resolution-columns.html >index 7e32f2c0212641cee697c5f6fc8582c68a42b8b6..67f854ce420a428f1c793f877eb178d52e881194 100644 >--- a/LayoutTests/fast/css-grid-layout/auto-content-resolution-columns.html >+++ b/LayoutTests/fast/css-grid-layout/auto-content-resolution-columns.html >@@ -11,12 +11,6 @@ if (window.testRunner) > -webkit-grid-rows: 50px; > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/auto-content-resolution-rows.html b/LayoutTests/fast/css-grid-layout/auto-content-resolution-rows.html >index a8523c01a45e4375eb09e1f97d1a79bb0c2c0c84..cf163899692b52c31b22db83ed6eb70be8a46cae 100644 >--- a/LayoutTests/fast/css-grid-layout/auto-content-resolution-rows.html >+++ b/LayoutTests/fast/css-grid-layout/auto-content-resolution-rows.html >@@ -11,12 +11,6 @@ if (window.testRunner) > -webkit-grid-rows: auto; > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/grid-item-addition-track-breadth-update-expected.txt b/LayoutTests/fast/css-grid-layout/grid-item-addition-track-breadth-update-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..62768f081d1e47dc7c2fe33e6675b2f32d613381 >--- /dev/null >+++ b/LayoutTests/fast/css-grid-layout/grid-item-addition-track-breadth-update-expected.txt >@@ -0,0 +1,87 @@ >+This test checks that we properly recompute our grid tracks' sizes when we add more grid items. >+ >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+XXXX XXXX XXXX >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+XXXXXX XXXXXX >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >+PASS >diff --git a/LayoutTests/fast/css-grid-layout/grid-item-addition-track-breadth-update.html b/LayoutTests/fast/css-grid-layout/grid-item-addition-track-breadth-update.html >new file mode 100644 >index 0000000000000000000000000000000000000000..cc084c2779fc47830f37a8d87633bddd74d67d4a >--- /dev/null >+++ b/LayoutTests/fast/css-grid-layout/grid-item-addition-track-breadth-update.html >@@ -0,0 +1,107 @@ >+<!DOCTYPE html> >+<html> >+<script> >+if (window.testRunner) >+ testRunner.overridePreference("WebKitCSSGridLayoutEnabled", 1); >+</script> >+<link href="resources/grid.css" rel="stylesheet"> >+<style> >+.gridFixedContent { >+ -webkit-grid-columns: 50px minmax(-webkit-min-content, 50px) minmax(-webkit-max-content, 50px) minmax(50px, -webkit-min-content); >+ -webkit-grid-rows: 70px minmax(-webkit-max-content, 70px) minmax(50px, -webkit-min-content) minmax(65px, -webkit-max-content); >+} >+ >+.sizedToGridArea { >+ font: 10px/1 Ahem; >+ /* Make us fit our grid area. */ >+ width: 100%; >+ height: 100%; >+} >+</style> >+<script src="../../resources/check-layout.js"></script> >+<script> >+function testPosition(gridElementID, content, position, size) >+{ >+ var gridItem = document.createElement("div"); >+ gridItem.classList.add("sizedToGridArea"); >+ gridItem.innerHTML = content; >+ gridItem.style.webkitGridColumn = position.column; >+ gridItem.style.webkitGridRow = position.row; >+ gridItem.setAttribute("data-expected-width", size.width); >+ gridItem.setAttribute("data-expected-height", size.height); >+ var gridElement = document.getElementById(gridElementID); >+ gridElement.appendChild(gridItem); >+ checkLayout("#" + gridElementID); >+} >+ >+function updateImplicitGridColumn() >+{ >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '10', 'row': '15' }, { 'width': '40', 'height': '30' }); >+ >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '1', 'row': '1' }, { 'width': '50', 'height': '70' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '1', 'row': '2' }, { 'width': '50', 'height': '30' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '1', 'row': '3' }, { 'width': '50', 'height': '50' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '1', 'row': '4' }, { 'width': '50', 'height': '65' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '1', 'row': '5' }, { 'width': '50', 'height': '30' }); >+ >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '2', 'row': '1' }, { 'width': '40', 'height': '70' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '2', 'row': '2' }, { 'width': '40', 'height': '30' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '2', 'row': '3' }, { 'width': '40', 'height': '50' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '2', 'row': '4' }, { 'width': '40', 'height': '65' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '2', 'row': '5' }, { 'width': '40', 'height': '30' }); >+ >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '3', 'row': '1' }, { 'width': '140', 'height': '70' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '3', 'row': '2' }, { 'width': '140', 'height': '30' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '3', 'row': '3' }, { 'width': '140', 'height': '50' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '3', 'row': '4' }, { 'width': '140', 'height': '65' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '3', 'row': '5' }, { 'width': '140', 'height': '30' }); >+ >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '4', 'row': '1' }, { 'width': '50', 'height': '70' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '4', 'row': '2' }, { 'width': '50', 'height': '30' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '4', 'row': '3' }, { 'width': '50', 'height': '50' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '4', 'row': '4' }, { 'width': '50', 'height': '65' }); >+ testPosition("constrainedGrid", "XXXX XXXX XXXX", { 'column': '4', 'row': '5' }, { 'width': '50', 'height': '30' }); >+ >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '10', 'row': '15' }, { 'width': '130', 'height': '10' }); >+ >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '1', 'row': '1' }, { 'width': '50', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '2', 'row': '1' }, { 'width': '60', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '3', 'row': '1' }, { 'width': '130', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '4', 'row': '1' }, { 'width': '60', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '5', 'row': '1' }, { 'width': '130', 'height': '70' }); >+ >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '1', 'row': '2' }, { 'width': '50', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '2', 'row': '2' }, { 'width': '60', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '3', 'row': '2' }, { 'width': '130', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '4', 'row': '2' }, { 'width': '60', 'height': '70' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '5', 'row': '2' }, { 'width': '130', 'height': '70' }); >+ >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '1', 'row': '3' }, { 'width': '50', 'height': '50' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '2', 'row': '3' }, { 'width': '60', 'height': '50' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '3', 'row': '3' }, { 'width': '130', 'height': '50' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '4', 'row': '3' }, { 'width': '60', 'height': '50' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '5', 'row': '3' }, { 'width': '130', 'height': '50' }); >+ >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '1', 'row': '4' }, { 'width': '50', 'height': '65' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '2', 'row': '4' }, { 'width': '60', 'height': '65' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '3', 'row': '4' }, { 'width': '130', 'height': '65' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '4', 'row': '4' }, { 'width': '60', 'height': '65' }); >+ testPosition("unconstrainedGrid", "XXXXXX XXXXXX", { 'column': '5', 'row': '4' }, { 'width': '130', 'height': '65' }); >+} >+window.addEventListener("load", updateImplicitGridColumn, false); >+</script> >+<body> >+ >+<p>This test checks that we properly recompute our grid tracks' sizes when we add more grid items.</p> >+ >+<div class="constrainedContainer"> >+ <div class="grid gridFixedContent" id="constrainedGrid"></div> >+</div> >+ >+<!-- Allow the extra logical space distribution to occur. --> >+<div style="width: 1000px; height: 1000px"> >+ <div class="grid gridFixedContent" id="unconstrainedGrid"><div class="sizedToGridArea">XXXXXX XXXXXX</div></div> >+</div> >+ >+</body> >+</html> >diff --git a/LayoutTests/fast/css-grid-layout/grid-item-removal-track-breadth-update-expected.txt b/LayoutTests/fast/css-grid-layout/grid-item-removal-track-breadth-update-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..f7f4f5627cab92b7e7567a6733a302d2f5934017 >--- /dev/null >+++ b/LayoutTests/fast/css-grid-layout/grid-item-removal-track-breadth-update-expected.txt >@@ -0,0 +1,62 @@ >+This test checks that the tracks' breadth are recomputed after removing a grid item. >+ >+XXX XXX XXX >+PASS >+PASS >+PASS >+XXX XXX XXX >+PASS >+PASS >+PASS >+XXX XXX XXX >+PASS >+PASS >+PASS >+XXX XXX XXX >+PASS >+PASS >+PASS >+XXX XXX XXX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >+XX XX XX XX XX XX >+PASS >+PASS >+PASS >diff --git a/LayoutTests/fast/css-grid-layout/grid-item-removal-track-breadth-update.html b/LayoutTests/fast/css-grid-layout/grid-item-removal-track-breadth-update.html >new file mode 100644 >index 0000000000000000000000000000000000000000..1cd809024cff4d3260ee0398882a5cc7460353ee >--- /dev/null >+++ b/LayoutTests/fast/css-grid-layout/grid-item-removal-track-breadth-update.html >@@ -0,0 +1,224 @@ >+<!DOCTYPE html> >+<html> >+<script> >+if (window.testRunner) >+ testRunner.overridePreference("WebKitCSSGridLayoutEnabled", 1); >+</script> >+<link href="resources/grid.css" rel="stylesheet"> >+<style> >+.gridAutoContent { >+ -webkit-grid-columns: auto; >+ -webkit-grid-rows: auto; >+} >+ >+.gridMinContentFixed { >+ -webkit-grid-columns: minmax(-webkit-min-content, 100px); >+ -webkit-grid-rows: minmax(-webkit-min-content, 40px); >+} >+ >+.gridMaxContentFixed { >+ -webkit-grid-columns: minmax(-webkit-max-content, 150px); >+ -webkit-grid-rows: minmax(-webkit-max-content, 40px); >+} >+ >+.gridFixedMinContent { >+ -webkit-grid-columns: minmax(100px, -webkit-min-content); >+ -webkit-grid-rows: minmax(40px, -webkit-min-content); >+} >+ >+.gridFixedMaxContent { >+ -webkit-grid-columns: minmax(100px, -webkit-max-content); >+ -webkit-grid-rows: minmax(40px, -webkit-max-content); >+} >+ >+.lessConstrainedContainer { >+ width: 60px; >+ height: 20px; >+} >+ >+.firstRowFirstColumn { >+ font: 10px/1 Ahem; >+ /* Make us fit our grid area. */ >+ width: 100%; >+ height: 100%; >+} >+</style> >+<script src="../../resources/check-layout.js"></script> >+<script> >+function testRemoval(gridElementID, size1, size2, size3) >+{ >+ var gridElement = document.getElementById(gridElementID); >+ var gridItem1 = gridElement.firstChild.nextSibling; >+ var gridItem2 = gridItem1.nextSibling.nextSibling; >+ var gridItem3 = gridItem2.nextSibling.nextSibling; >+ gridItem1.setAttribute("data-expected-width", size1.width); >+ gridItem1.setAttribute("data-expected-height", size1.height); >+ gridItem2.setAttribute("data-expected-width", size1.width); >+ gridItem2.setAttribute("data-expected-height", size1.height); >+ gridItem3.setAttribute("data-expected-width", size1.width); >+ gridItem3.setAttribute("data-expected-height", size1.height); >+ checkLayout("#" + gridElementID); >+ >+ gridElement.removeChild(gridItem1); >+ gridItem2.setAttribute("data-expected-width", size2.width); >+ gridItem2.setAttribute("data-expected-height", size2.height); >+ gridItem3.setAttribute("data-expected-width", size2.width); >+ gridItem3.setAttribute("data-expected-height", size2.height); >+ checkLayout("#" + gridElementID); >+ >+ gridElement.removeChild(gridItem2); >+ gridItem3.setAttribute("data-expected-width", size3.width); >+ gridItem3.setAttribute("data-expected-height", size3.height); >+ checkLayout("#" + gridElementID); >+} >+ >+function testRemovals() >+{ >+ testRemoval("constrainedAutoGrid", { 'width': '50', 'height': '40' }, { 'width': '40', 'height': '40' }, { 'width': '30', 'height': '30' }); >+ testRemoval("constrainedMinContentFixedGrid", { 'width': '50', 'height': '40' }, { 'width': '40', 'height': '40' }, { 'width': '30', 'height': '30' }); >+ testRemoval("constrainedMaxContentFixedGrid", { 'width': '190', 'height': '10' }, { 'width': '190', 'height': '10' }, { 'width': '110', 'height': '10' }); >+ testRemoval("constrainedFixedMinContentGrid", { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }); >+ testRemoval("constrainedFixedMaxContentGrid", { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }); >+ >+ testRemoval("unconstrainedAutoGrid", { 'width': '390', 'height': '10' }, { 'width': '350', 'height': '10' }, { 'width': '170', 'height': '10' }); >+ testRemoval("unconstrainedMinContentFixedGrid", { 'width': '100', 'height': '60' }, { 'width': '100', 'height': '60' }, { 'width': '100', 'height': '40' }); >+ testRemoval("unconstrainedMaxContentFixedGrid", { 'width': '390', 'height': '40' }, { 'width': '350', 'height': '40' }, { 'width': '170', 'height': '40' }); >+ testRemoval("unconstrainedFixedMinContentGrid", { 'width': '100', 'height': '60' }, { 'width': '100', 'height': '60' }, { 'width': '100', 'height': '40' }); >+ testRemoval("unconstrainedFixedMaxContentGrid", { 'width': '390', 'height': '40' }, { 'width': '350', 'height': '40' }, { 'width': '170', 'height': '40' }); >+ >+ testRemoval("lessConstrainedAutoGrid", { 'width': '60', 'height': '90' }, { 'width': '60', 'height': '60' }, { 'width': '60', 'height': '30' }); >+ testRemoval("lessConstrainedMinContentFixedGrid", { 'width': '60', 'height': '90' }, { 'width': '60', 'height': '60' }, { 'width': '60', 'height': '30' }); >+ testRemoval("lessConstrainedMaxContentFixedGrid", { 'width': '350', 'height': '20' }, { 'width': '350', 'height': '20' }, { 'width': '170', 'height': '20' }); >+ testRemoval("lessConstrainedFixedMinContentGrid", { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }); >+ testRemoval("lessConstrainedFixedMaxContentGrid", { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }, { 'width': '100', 'height': '40' }); >+} >+window.addEventListener("load", testRemovals, false); >+</script> >+<body> >+ >+<p>This test checks that the tracks' breadth are recomputed after removing a grid item.</p> >+ >+<div class="constrainedContainer"> >+ <div class="grid gridAutoContent" id="constrainedAutoGrid"> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XXXX XXXX XXXX XXXX</div> >+ <div class="firstRowFirstColumn">XXX XXX XXX</div> >+ </div> >+</div> >+ >+<div class="constrainedContainer"> >+ <div class="grid gridMinContentFixed" id="constrainedMinContentFixedGrid"> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XXXX XXXX XXXX XXXX</div> >+ <div class="firstRowFirstColumn">XXX XXX XXX</div> >+ </div> >+</div> >+ >+<div class="constrainedContainer"> >+ <div class="grid gridMaxContentFixed" id="constrainedMaxContentFixedGrid"> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XXXX XXXX XXXX XXXX</div> >+ <div class="firstRowFirstColumn">XXX XXX XXX</div> >+ </div> >+</div> >+ >+<div class="constrainedContainer"> >+ <div class="grid gridFixedMinContent" id="constrainedFixedMinContentGrid"> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XXXX XXXX XXXX XXXX</div> >+ <div class="firstRowFirstColumn">XXX XXX XXX</div> >+ </div> >+</div> >+ >+<div class="constrainedContainer"> >+ <div class="grid gridFixedMaxContent" id="constrainedFixedMaxContentGrid"> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XXXX XXXX XXXX XXXX</div> >+ <div class="firstRowFirstColumn">XXX XXX XXX</div> >+ </div> >+</div> >+ >+<!-- The container is big enough to allow all the extra space distribution we want. --> >+<div class="unconstrainedContainer"> >+ <div class="grid gridAutoContent" id="unconstrainedAutoGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="unconstrainedContainer"> >+ <div class="grid gridMinContentFixed" id="unconstrainedMinContentFixedGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="unconstrainedContainer"> >+ <div class="grid gridMaxContentFixed" id="unconstrainedMaxContentFixedGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="unconstrainedContainer"> >+ <div class="grid gridFixedMinContent" id="unconstrainedFixedMinContentGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="unconstrainedContainer"> >+ <div class="grid gridFixedMaxContent" id="unconstrainedFixedMaxContentGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<!-- The container allows some expansion but also constrain the growth. --> >+<div class="lessConstrainedContainer"> >+ <div class="grid gridAutoContent" id="lessConstrainedAutoGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="lessConstrainedContainer"> >+ <div class="grid gridMinContentFixed" id="lessConstrainedMinContentFixedGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="lessConstrainedContainer"> >+ <div class="grid gridMaxContentFixed" id="lessConstrainedMaxContentFixedGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="lessConstrainedContainer"> >+ <div class="grid gridFixedMinContent" id="lessConstrainedFixedMinContentGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+<div class="lessConstrainedContainer"> >+ <div class="grid gridFixedMaxContent" id="lessConstrainedFixedMaxContentGrid"> >+ <div class="firstRowFirstColumn">XXX XXX XXX XXX XXX XXX XXX XXX XXX</div> >+ <div class="firstRowFirstColumn">XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX</div> >+ <div class="firstRowFirstColumn">XX XX XX XX XX XX</div> >+ </div> >+</div> >+ >+</body> >+</html> >diff --git a/LayoutTests/fast/css-grid-layout/implicit-columns-auto-resolution.html b/LayoutTests/fast/css-grid-layout/implicit-columns-auto-resolution.html >index ff73ef22ebaa48aaa92a3463fef22ac579b1804b..1564d19dc44b5f9578359ab81935266a5eb52a50 100644 >--- a/LayoutTests/fast/css-grid-layout/implicit-columns-auto-resolution.html >+++ b/LayoutTests/fast/css-grid-layout/implicit-columns-auto-resolution.html >@@ -11,12 +11,6 @@ if (window.testRunner) > -webkit-grid-rows: 50px; > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/implicit-position-dynamic-change.html b/LayoutTests/fast/css-grid-layout/implicit-position-dynamic-change.html >index b945fef3ea4fee397d8db630eb0082e99b72cd52..4b8dd5325f0958d557bfe59a0d9c05621e12dedd 100644 >--- a/LayoutTests/fast/css-grid-layout/implicit-position-dynamic-change.html >+++ b/LayoutTests/fast/css-grid-layout/implicit-position-dynamic-change.html >@@ -11,12 +11,6 @@ if (window.testRunner) > -webkit-grid-rows: 70px minmax(-webkit-max-content, 70px) minmax(50px, -webkit-min-content) minmax(65px, -webkit-max-content); > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .sizedToGridArea { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution.html b/LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution.html >index 2afd1ab6423003e5d69be513d717f60f12d46859..02ff48742c0500d2ebe32852f077b4d19747534e 100644 >--- a/LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution.html >+++ b/LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution.html >@@ -11,12 +11,6 @@ if (window.testRunner) > /* -webkit-grid-rows is left unset so that the grid item's row is implicit. */ > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-columns.html b/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-columns.html >index 1281c48f285c5c59c9debb768e8297279e8a62b6..0b4b2e3dbc424407a45f50f0ab632562b15d9e93 100644 >--- a/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-columns.html >+++ b/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-columns.html >@@ -16,12 +16,6 @@ if (window.testRunner) > -webkit-grid-rows: 20px; > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-rows.html b/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-rows.html >index 03f6e0083507320f7c2517326a97a3a5397ca68e..e5f563d349fa9c6cd563dc1a71344a72d3e691bf 100644 >--- a/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-rows.html >+++ b/LayoutTests/fast/css-grid-layout/minmax-max-content-resolution-rows.html >@@ -16,12 +16,6 @@ if (window.testRunner) > -webkit-grid-rows: minmax(30px, -webkit-max-content); > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-columns.html b/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-columns.html >index d5f47c6f5083ed926312f48dd07a3a538b8dcc62..f2bde5c0094e8338ca67e99fb968a993d0606361 100644 >--- a/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-columns.html >+++ b/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-columns.html >@@ -16,12 +16,6 @@ if (window.testRunner) > -webkit-grid-rows: 20px; > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-rows.html b/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-rows.html >index ce88ceb99397fa30ace4dec179560f857a496529..6107d6f5504ef6e9298d31926edaa3ea669f1772 100644 >--- a/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-rows.html >+++ b/LayoutTests/fast/css-grid-layout/minmax-min-content-column-resolution-rows.html >@@ -16,12 +16,6 @@ if (window.testRunner) > -webkit-grid-rows: minmax(30px, -webkit-min-content); > } > >-/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >-.constrainedContainer { >- width: 10px; >- height: 10px; >-} >- > .firstRowFirstColumn { > font: 10px/1 Ahem; > /* Make us fit our grid area. */ >diff --git a/LayoutTests/fast/css-grid-layout/resources/grid.css b/LayoutTests/fast/css-grid-layout/resources/grid.css >index d03c48dbaebb1e21f13e7cde427c7b4c63a3b753..a8d50c328dd41ef52bad5e907de8ad9f1ac01c82 100644 >--- a/LayoutTests/fast/css-grid-layout/resources/grid.css >+++ b/LayoutTests/fast/css-grid-layout/resources/grid.css >@@ -44,6 +44,17 @@ > -webkit-grid-auto-flow: row; > } > >+/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */ >+.constrainedContainer { >+ width: 10px; >+ height: 10px; >+} >+ >+.unconstrainedContainer { >+ width: 1000px; >+ height: 1000px; >+} >+ > .verticalRL { > -webkit-writing-mode: vertical-rl; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 109100
:
186944
|
187719
|
188130