Changeset 165377 in webkit


Ignore:
Timestamp:
Mar 10, 2014 9:29:09 AM (10 years ago)
Author:
stavila@adobe.com
Message:

[CSS Regions] Scrolling regions with the mouse wheel only works properly if hovering over the region's padding
https://bugs.webkit.org/show_bug.cgi?id=129485

Reviewed by Andrei Bucur.

Source/WebCore:

When searching for the region under the mouse pointer (to identify which region to scroll),
the localToAbsolute method must be called on the region container, not the region itself.
Also, when calling the offsetFromContainer method on a named flow fragment,
it must only take into consideration the border and padding of the fragment container,
not its scrolled offset.

Test: fast/regions/wheel-scrollable-single-region.html

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::scroll):

  • rendering/RenderFlowThread.cpp:
  • rendering/RenderFlowThread.h:
  • rendering/RenderNamedFlowFragment.cpp:

(WebCore::RenderNamedFlowFragment::offsetFromContainer):

  • rendering/RenderNamedFlowFragment.h:
  • rendering/RenderNamedFlowThread.cpp:

(WebCore::RenderNamedFlowThread::fragmentFromAbsolutePointAndBox):

  • rendering/RenderNamedFlowThread.h:

LayoutTests:

Added layout tests for scrolling regions using the mouse wheel.

  • fast/regions/wheel-scrollable-single-region-expected.html: Added.
  • fast/regions/wheel-scrollable-single-region.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r165375 r165377  
     12014-03-10  Radu Stavila  <stavila@adobe.com>
     2
     3        [CSS Regions] Scrolling regions with the mouse wheel only works properly if hovering over the region's padding
     4        https://bugs.webkit.org/show_bug.cgi?id=129485
     5
     6        Reviewed by Andrei Bucur.
     7
     8        Added layout tests for scrolling regions using the mouse wheel.
     9
     10        * fast/regions/wheel-scrollable-single-region-expected.html: Added.
     11        * fast/regions/wheel-scrollable-single-region.html: Added.
     12
    1132014-03-10  Michał Pakuła vel Rutka  <m.pakula@samsung.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r165364 r165377  
     12014-03-10  Radu Stavila  <stavila@adobe.com>
     2
     3        [CSS Regions] Scrolling regions with the mouse wheel only works properly if hovering over the region's padding
     4        https://bugs.webkit.org/show_bug.cgi?id=129485
     5
     6        Reviewed by Andrei Bucur.
     7
     8        When searching for the region under the mouse pointer (to identify which region to scroll),
     9        the localToAbsolute method must be called on the region container, not the region itself.
     10        Also, when calling the offsetFromContainer method on a named flow fragment,
     11        it must only take into consideration the border and padding of the fragment container,
     12        not its scrolled offset.
     13
     14        Test: fast/regions/wheel-scrollable-single-region.html
     15
     16        * rendering/RenderBox.cpp:
     17        (WebCore::RenderBox::scroll):
     18        * rendering/RenderFlowThread.cpp:
     19        * rendering/RenderFlowThread.h:
     20        * rendering/RenderNamedFlowFragment.cpp:
     21        (WebCore::RenderNamedFlowFragment::offsetFromContainer):
     22        * rendering/RenderNamedFlowFragment.h:
     23        * rendering/RenderNamedFlowThread.cpp:
     24        (WebCore::RenderNamedFlowThread::fragmentFromAbsolutePointAndBox):
     25        * rendering/RenderNamedFlowThread.h:
     26
    1272014-03-10  Jinwoo Song  <jinwoo7.song@samsung.com>
    228
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r165346 r165377  
    4646#include "RenderBoxRegionInfo.h"
    4747#include "RenderFlexibleBox.h"
    48 #include "RenderFlowThread.h"
    4948#include "RenderGeometryMap.h"
    5049#include "RenderInline.h"
     
    5352#include "RenderLayerCompositor.h"
    5453#include "RenderNamedFlowFragment.h"
     54#include "RenderNamedFlowThread.h"
    5555#include "RenderTableCell.h"
    5656#include "RenderTheme.h"
     
    782782    if (nextScrollBlock && nextScrollBlock->isRenderNamedFlowThread()) {
    783783        ASSERT(startBox);
    784         nextScrollBlock = toRenderFlowThread(nextScrollBlock)->regionFromAbsolutePointAndBox(wheelEventAbsolutePoint, *startBox);
     784        nextScrollBlock = toRenderNamedFlowThread(nextScrollBlock)->fragmentFromAbsolutePointAndBox(wheelEventAbsolutePoint, *startBox);
    785785    }
    786786
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r164988 r165377  
    435435        return region;
    436436    return region ? clampBox->clampToStartAndEndRegions(region) : 0;
    437 }
    438 
    439 RenderRegion* RenderFlowThread::regionFromAbsolutePointAndBox(const IntPoint& absolutePoint, const RenderBox& flowedBox)
    440 {
    441     RenderRegion* startRegion = nullptr;
    442     RenderRegion* endRegion = nullptr;
    443     getRegionRangeForBox(&flowedBox, startRegion, endRegion);
    444 
    445     if (!startRegion)
    446         return nullptr;
    447 
    448     for (auto iter = m_regionList.find(startRegion), end = m_regionList.end(); iter != end; ++iter) {
    449         RenderRegion* region = *iter;
    450         IntRect regionAbsoluteRect(roundedIntPoint(region->localToAbsolute()), roundedIntSize(region->frameRect().size()));
    451         if (regionAbsoluteRect.contains(absolutePoint))
    452             return region;
    453 
    454         if (region == endRegion)
    455             break;
    456     }
    457 
    458     return nullptr;
    459437}
    460438
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r164988 r165377  
    105105    RenderRegion* regionAtBlockOffset(const RenderBox*, LayoutUnit, bool extendLastRegion = false, RegionAutoGenerationPolicy = AllowRegionAutoGeneration);
    106106
    107     RenderRegion* regionFromAbsolutePointAndBox(const IntPoint&, const RenderBox& flowedBox);
    108 
    109107    bool regionsHaveUniformLogicalWidth() const { return m_regionsHaveUniformLogicalWidth; }
    110108    bool regionsHaveUniformLogicalHeight() const { return m_regionsHaveUniformLogicalHeight; }
  • trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp

    r165130 r165377  
    253253    return isLastRegion() && (style().regionFragment() == BreakRegionFragment);
    254254}
     255   
     256LayoutSize RenderNamedFlowFragment::offsetFromContainer(RenderObject* o, const LayoutPoint&, bool*) const
     257{
     258    ASSERT(&fragmentContainer() == o);
     259    ASSERT(container() == o);
     260    UNUSED_PARAM(o);
     261    return topLeftLocationOffset();
     262}
    255263
    256264void RenderNamedFlowFragment::layoutBlock(bool relayoutChildren, LayoutUnit)
  • trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h

    r165130 r165377  
    6969   
    7070    virtual bool shouldClipFlowThreadContent() const override;
     71   
     72    virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&, bool* offsetDependsOnPoint = 0) const override;
    7173
    7274    bool isPseudoElementRegion() const { return parent() && parent()->isPseudoElement(); }
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp

    r165130 r165377  
    365365
    366366    return visualOverflowRect;
     367}
     368
     369RenderNamedFlowFragment* RenderNamedFlowThread::fragmentFromAbsolutePointAndBox(const IntPoint& absolutePoint, const RenderBox& flowedBox)
     370{
     371    RenderRegion* startRegion = nullptr;
     372    RenderRegion* endRegion = nullptr;
     373    getRegionRangeForBox(&flowedBox, startRegion, endRegion);
     374   
     375    if (!startRegion)
     376        return nullptr;
     377   
     378    for (auto iter = m_regionList.find(startRegion), end = m_regionList.end(); iter != end; ++iter) {
     379        RenderNamedFlowFragment* fragment = toRenderNamedFlowFragment(*iter);
     380        RenderBlockFlow& fragmentContainer = fragment->fragmentContainer();
     381        IntRect fragmentAbsoluteRect(roundedIntPoint(fragmentContainer.localToAbsolute()), roundedIntSize(fragmentContainer.paddingBoxRect().size()));
     382        if (fragmentAbsoluteRect.contains(absolutePoint))
     383            return fragment;
     384       
     385        if (fragment == endRegion)
     386            break;
     387    }
     388   
     389    return nullptr;
    367390}
    368391
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.h

    r164988 r165377  
    7070
    7171    LayoutRect decorationsClipRectForBoxInNamedFlowFragment(const RenderBox&, RenderNamedFlowFragment&) const;
     72
     73    RenderNamedFlowFragment* fragmentFromAbsolutePointAndBox(const IntPoint&, const RenderBox& flowedBox);
    7274
    7375    void registerNamedFlowContentElement(Element&);
Note: See TracChangeset for help on using the changeset viewer.