Changeset 292559 in webkit


Ignore:
Timestamp:
Apr 7, 2022 1:26:01 PM (3 months ago)
Author:
ntim@apple.com
Message:

[CSS resize property] Correct minimum size computation to allow resizing below initial size
https://bugs.webkit.org/show_bug.cgi?id=135335

Reviewed by Simon Fraser.

Source/WebCore:

Tests:

  • LayoutTests/fast/css/resize-above-min-size-and-below-initial-size.html
  • LayoutTests/fast/css/resize-below-min-intrinsic-size.html
  • LayoutTests/fast/css/resize-below-min-intrinsic-size-large-scrollbars.html
  • LayoutTests/fast/css/resize-below-min-size-zoomed.html
  • LayoutTests/fast/css/resize-below-min-size.html
  • LayoutTests/fast/css/resize-orthogonal-containing-block.html

Ports the relevant Chromium changeset with a few tweaks: https://chromium-review.googlesource.com/c/chromium/src/+/545395/

The previous minimum size used to be whatever size was there before the first resize, which is wrong, and does not allow
resizing below the initial size. It is now based on the min-width/height properties and the scroll corner size.

It is no longer stored in ElementRareData since it is no longer fixed to the initial element size, but depends on the container
on the element style.

  • dom/Element.cpp:

(WebCore::Element::minimumSizeForResizing const): Deleted.
(WebCore::Element::setMinimumSizeForResizing): Deleted.

  • dom/Element.h:
  • dom/ElementRareData.cpp:
  • dom/ElementRareData.h:

(WebCore::ElementRareData::useTypes const):
(WebCore::ElementRareData::ElementRareData):
(WebCore::defaultMinimumSizeForResizing): Deleted.
(WebCore::ElementRareData::minimumSizeForResizing const): Deleted.
(WebCore::ElementRareData::setMinimumSizeForResizing): Deleted.

  • dom/NodeRareData.h:
  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::minimumSizeForResizing const):
(WebCore::RenderLayer::resize):

  • rendering/RenderLayer.h:

LayoutTests:

Tests ported from the Chromium changeset: https://chromium-review.googlesource.com/c/chromium/src/+/545395/
They've been tweaked to:

  • not rely on <textarea>
  • use WPT harness instead of Chrome specific methods
  • use async functions instead of callbacks
  • fast/css/resize-above-min-size-and-below-initial-size-expected.txt: Added.
  • fast/css/resize-above-min-size-and-below-initial-size.html: Added.
  • fast/css/resize-below-min-intrinsic-size-large-scrollbars-expected.txt: Added.
  • fast/css/resize-below-min-intrinsic-size-large-scrollbars.html: Added.
  • fast/css/resize-below-min-intrinsic-size-expected.txt: Added.
  • fast/css/resize-below-min-intrinsic-size.html: Added.
  • fast/css/resize-below-min-size-expected.txt: Added.
  • fast/css/resize-below-min-size-zoomed-expected.txt: Added.
  • fast/css/resize-below-min-size-zoomed.html: Added.
  • fast/css/resize-below-min-size.html: Added.
  • fast/css/resize-orthogonal-containing-block-expected.txt: Added.
  • fast/css/resize-orthogonal-containing-block.html: Added.
Location:
trunk
Files:
12 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r292553 r292559  
     12022-04-07  Tim Nguyen  <ntim@apple.com>
     2
     3        [CSS resize property] Correct minimum size computation to allow resizing below initial size
     4        https://bugs.webkit.org/show_bug.cgi?id=135335
     5
     6        Reviewed by Simon Fraser.
     7
     8        Tests ported from the Chromium changeset: https://chromium-review.googlesource.com/c/chromium/src/+/545395/
     9        They've been tweaked to:
     10        - not rely on <textarea>
     11        - use WPT harness instead of Chrome specific methods
     12        - use async functions instead of callbacks
     13
     14        * fast/css/resize-above-min-size-and-below-initial-size-expected.txt: Added.
     15        * fast/css/resize-above-min-size-and-below-initial-size.html: Added.
     16        * fast/css/resize-below-min-intrinsic-size-large-scrollbars-expected.txt: Added.
     17        * fast/css/resize-below-min-intrinsic-size-large-scrollbars.html: Added.
     18        * fast/css/resize-below-min-intrinsic-size-expected.txt: Added.
     19        * fast/css/resize-below-min-intrinsic-size.html: Added.
     20        * fast/css/resize-below-min-size-expected.txt: Added.
     21        * fast/css/resize-below-min-size-zoomed-expected.txt: Added.
     22        * fast/css/resize-below-min-size-zoomed.html: Added.
     23        * fast/css/resize-below-min-size.html: Added.
     24        * fast/css/resize-orthogonal-containing-block-expected.txt: Added.
     25        * fast/css/resize-orthogonal-containing-block.html: Added.
     26
    1272022-04-07  Matteo Flores  <matteo_flores@apple.com>
    228
  • trunk/Source/WebCore/ChangeLog

    r292557 r292559  
     12022-04-07  Tim Nguyen  <ntim@apple.com>
     2
     3        [CSS resize property] Correct minimum size computation to allow resizing below initial size
     4        https://bugs.webkit.org/show_bug.cgi?id=135335
     5
     6        Reviewed by Simon Fraser.
     7
     8        Tests:
     9        - LayoutTests/fast/css/resize-above-min-size-and-below-initial-size.html
     10        - LayoutTests/fast/css/resize-below-min-intrinsic-size.html
     11        - LayoutTests/fast/css/resize-below-min-intrinsic-size-large-scrollbars.html
     12        - LayoutTests/fast/css/resize-below-min-size-zoomed.html
     13        - LayoutTests/fast/css/resize-below-min-size.html
     14        - LayoutTests/fast/css/resize-orthogonal-containing-block.html
     15
     16        Ports the relevant Chromium changeset with a few tweaks: https://chromium-review.googlesource.com/c/chromium/src/+/545395/
     17
     18        The previous minimum size used to be whatever size was there before the first resize, which is wrong, and does not allow
     19        resizing below the initial size. It is now based on the min-width/height properties and the scroll corner size.
     20
     21        It is no longer stored in ElementRareData since it is no longer fixed to the initial element size, but depends on the container
     22        on the element style.
     23
     24        * dom/Element.cpp:
     25        (WebCore::Element::minimumSizeForResizing const): Deleted.
     26        (WebCore::Element::setMinimumSizeForResizing): Deleted.
     27        * dom/Element.h:
     28        * dom/ElementRareData.cpp:
     29        * dom/ElementRareData.h:
     30        (WebCore::ElementRareData::useTypes const):
     31        (WebCore::ElementRareData::ElementRareData):
     32        (WebCore::defaultMinimumSizeForResizing): Deleted.
     33        (WebCore::ElementRareData::minimumSizeForResizing const): Deleted.
     34        (WebCore::ElementRareData::setMinimumSizeForResizing): Deleted.
     35        * dom/NodeRareData.h:
     36        * rendering/RenderLayer.cpp:
     37        (WebCore::RenderLayer::minimumSizeForResizing const):
     38        (WebCore::RenderLayer::resize):
     39        * rendering/RenderLayer.h:
     40
    1412022-04-07  Simon Fraser  <simon.fraser@apple.com>
    242
  • trunk/Source/WebCore/dom/Element.cpp

    r292370 r292559  
    33763376}
    33773377
    3378 LayoutSize Element::minimumSizeForResizing() const
    3379 {
    3380     return hasRareData() ? elementRareData()->minimumSizeForResizing() : defaultMinimumSizeForResizing();
    3381 }
    3382 
    3383 void Element::setMinimumSizeForResizing(const LayoutSize& size)
    3384 {
    3385     if (!hasRareData() && size == defaultMinimumSizeForResizing())
    3386         return;
    3387     ensureElementRareData().setMinimumSizeForResizing(size);
    3388 }
    3389 
    33903378void Element::willBecomeFullscreenElement()
    33913379{
  • trunk/Source/WebCore/dom/Element.h

    r292210 r292559  
    448448    WEBCORE_EXPORT void setPseudo(const AtomString&);
    449449
    450     LayoutSize minimumSizeForResizing() const;
    451     void setMinimumSizeForResizing(const LayoutSize&);
    452 
    453450    // Use Document::registerForDocumentActivationCallbacks() to subscribe to these
    454451    virtual void prepareForDocumentSuspension() { }
  • trunk/Source/WebCore/dom/ElementRareData.cpp

    r292210 r292559  
    3535
    3636struct SameSizeAsElementRareData : NodeRareData {
    37     LayoutSize sizeForResizing;
    3837    IntPoint savedLayerScrollPosition;
    3938    Vector<std::unique_ptr<ElementAnimationRareData>> animationRareData;
  • trunk/Source/WebCore/dom/ElementRareData.h

    r292210 r292559  
    4040namespace WebCore {
    4141
    42 inline IntSize defaultMinimumSizeForResizing()
    43 {
    44     return IntSize(LayoutUnit::max(), LayoutUnit::max());
    45 }
    46 
    4742class ElementRareData : public NodeRareData {
    4843public:
     
    8378    DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
    8479    void setDataset(std::unique_ptr<DatasetDOMStringMap> dataset) { m_dataset = WTFMove(dataset); }
    85 
    86     LayoutSize minimumSizeForResizing() const { return m_minimumSizeForResizing; }
    87     void setMinimumSizeForResizing(LayoutSize size) { m_minimumSizeForResizing = size; }
    8880
    8981    IntPoint savedLayerScrollPosition() const { return m_savedLayerScrollPosition; }
     
    122114        if (m_unusualTabIndex)
    123115            result.add(UseType::TabIndex);
    124         if (m_minimumSizeForResizing != defaultMinimumSizeForResizing())
    125             result.add(UseType::MinimumSize);
    126116        if (!m_savedLayerScrollPosition.isZero())
    127117            result.add(UseType::ScrollingPosition);
     
    163153
    164154private:
    165     LayoutSize m_minimumSizeForResizing;
    166155    IntPoint m_savedLayerScrollPosition;
    167156    std::unique_ptr<RenderStyle> m_computedStyle;
     
    197186inline ElementRareData::ElementRareData()
    198187    : NodeRareData(Type::Element)
    199     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
    200188{
    201189}
  • trunk/Source/WebCore/dom/NodeRareData.h

    r292210 r292559  
    249249        MutationObserver = 1 << 1,
    250250        TabIndex = 1 << 2,
    251         MinimumSize = 1 << 3,
    252         ScrollingPosition = 1 << 4,
    253         ComputedStyle = 1 << 5,
    254         Dataset = 1 << 6,
    255         ClassList = 1 << 7,
    256         ShadowRoot = 1 << 8,
    257         CustomElementQueue = 1 << 9,
    258         AttributeMap = 1 << 10,
    259         InteractionObserver = 1 << 11,
    260         ResizeObserver = 1 << 12,
    261         Animations = 1 << 13,
    262         PseudoElements = 1 << 14,
    263         StyleMap = 1 << 15,
    264         PartList = 1 << 16,
    265         PartNames = 1 << 17,
    266         Nonce = 1 << 18,
    267         ComputedStyleMap = 1 << 19,
     251        ScrollingPosition = 1 << 3,
     252        ComputedStyle = 1 << 4,
     253        Dataset = 1 << 5,
     254        ClassList = 1 << 6,
     255        ShadowRoot = 1 << 7,
     256        CustomElementQueue = 1 << 8,
     257        AttributeMap = 1 << 9,
     258        InteractionObserver = 1 << 10,
     259        ResizeObserver = 1 << 11,
     260        Animations = 1 << 12,
     261        PseudoElements = 1 << 13,
     262        StyleMap = 1 << 14,
     263        PartList = 1 << 15,
     264        PartNames = 1 << 16,
     265        Nonce = 1 << 17,
     266        ComputedStyleMap = 1 << 18,
    268267    };
    269268#endif
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r292525 r292559  
    27452745}
    27462746
     2747LayoutSize RenderLayer::minimumSizeForResizing(float zoomFactor) const
     2748{
     2749    // Use the resizer size as the strict minimum size
     2750    auto resizerRect = overflowControlsRects().resizer;
     2751    LayoutUnit minWidth = minimumValueForLength(renderer().style().minWidth(), renderer().containingBlock()->width());
     2752    LayoutUnit minHeight = minimumValueForLength(renderer().style().minHeight(), renderer().containingBlock()->height());
     2753    minWidth = std::max(LayoutUnit(minWidth / zoomFactor), LayoutUnit(resizerRect.width()));
     2754    minHeight = std::max(LayoutUnit(minHeight / zoomFactor), LayoutUnit(resizerRect.height()));
     2755    return LayoutSize(minWidth, minHeight);
     2756}
     2757
    27472758void RenderLayer::resize(const PlatformMouseEvent& evt, const LayoutSize& oldOffset)
    27482759{
     
    27682779    newOffset.setWidth(newOffset.width() / zoomFactor);
    27692780    newOffset.setHeight(newOffset.height() / zoomFactor);
    2770    
     2781
    27712782    LayoutSize currentSize = LayoutSize(renderer->width() / zoomFactor, renderer->height() / zoomFactor);
    2772     LayoutSize minimumSize = element->minimumSizeForResizing().shrunkTo(currentSize);
    2773     element->setMinimumSizeForResizing(minimumSize);
    2774    
     2783
    27752784    LayoutSize adjustedOldOffset = LayoutSize(oldOffset.width() / zoomFactor, oldOffset.height() / zoomFactor);
    27762785    if (renderer->shouldPlaceVerticalScrollbarOnLeft()) {
     
    27782787        adjustedOldOffset.setWidth(-adjustedOldOffset.width());
    27792788    }
    2780    
    2781     LayoutSize difference = (currentSize + newOffset - adjustedOldOffset).expandedTo(minimumSize) - currentSize;
     2789
     2790    LayoutSize difference = (currentSize + newOffset - adjustedOldOffset).expandedTo(minimumSizeForResizing(zoomFactor)) - currentSize;
    27822791
    27832792    StyledElement* styledElement = downcast<StyledElement>(element);
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r292525 r292559  
    479479
    480480    bool canResize() const;
     481    LayoutSize minimumSizeForResizing(float zoomFactor) const;
    481482    void resize(const PlatformMouseEvent&, const LayoutSize&);
    482483    bool inResizeMode() const { return m_inResizeMode; }
Note: See TracChangeset for help on using the changeset viewer.