Changeset 119690 in webkit


Ignore:
Timestamp:
Jun 6, 2012 11:57:19 PM (12 years ago)
Author:
wangxianzhu@chromium.org
Message:

Element.getBoundingClientRect() and Element.getClientRects() return incorrect values in frames in a scaled page
https://bugs.webkit.org/show_bug.cgi?id=88430

Source/WebCore:

Element.getBoudingClientRect() and Element.getClientRects() should not scale back the rects
if the element is in a frame because page scale only apply to elements in the main frame.

Reviewed by James Robinson.

Tests: fast/dom/Element/scale-page-bounding-client-rect-in-frame.html

fast/dom/Element/scale-page-client-rects-in-frame.html

  • dom/Document.cpp:

(WebCore):
(WebCore::Document::adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale): Extracted from Element.cpp and Range.cpp and fixed issue of pageScale in frames.
(WebCore::Document::adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale): Extracted from Element.cpp and fixed issue of pageScale in frames.

  • dom/Document.h:

(WebCore):
(Document):

  • dom/Element.cpp:

(WebCore::Element::getClientRects):
(WebCore::Element::getBoundingClientRect):

  • dom/Range.cpp:

(WebCore):
(WebCore::adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale): Moved into Document and fixed issue of pageScale in frames.
(WebCore::Range::getBorderAndTextQuads):

  • rendering/RenderObject.h: Removed adjustFloatQuadForPageScale and adjustFloatRectForPageScale because they seem unrelated to RenderObject.

(WebCore):

LayoutTests:

Reviewed by James Robinson.

  • fast/dom/Element/resources/client-rect-frame.html: Added.
  • fast/dom/Element/scale-page-bounding-client-rect-in-frame-expected.txt: Added.
  • fast/dom/Element/scale-page-bounding-client-rect-in-frame.html: Added.
  • fast/dom/Element/scale-page-client-rects-in-frame-expected.txt: Added.
  • fast/dom/Element/scale-page-client-rects-in-frame.html: Added.
Location:
trunk
Files:
5 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r119677 r119690  
     12012-06-06  Xianzhu Wang  <wangxianzhu@chromium.org>
     2
     3        Element.getBoundingClientRect() and Element.getClientRects() return incorrect values in frames in a scaled page
     4        https://bugs.webkit.org/show_bug.cgi?id=88430
     5
     6        Reviewed by James Robinson.
     7
     8        * fast/dom/Element/resources/client-rect-frame.html: Added.
     9        * fast/dom/Element/scale-page-bounding-client-rect-in-frame-expected.txt: Added.
     10        * fast/dom/Element/scale-page-bounding-client-rect-in-frame.html: Added.
     11        * fast/dom/Element/scale-page-client-rects-in-frame-expected.txt: Added.
     12        * fast/dom/Element/scale-page-client-rects-in-frame.html: Added.
     13
    1142012-06-06  Sheriff Bot  <webkit.review.bot@gmail.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r119689 r119690  
     12012-06-06  Xianzhu Wang  <wangxianzhu@chromium.org>
     2
     3        Element.getBoundingClientRect() and Element.getClientRects() return incorrect values in frames in a scaled page
     4        https://bugs.webkit.org/show_bug.cgi?id=88430
     5
     6        Element.getBoudingClientRect() and Element.getClientRects() should not scale back the rects
     7        if the element is in a frame because page scale only apply to elements in the main frame.
     8
     9        Reviewed by James Robinson.
     10
     11        Tests: fast/dom/Element/scale-page-bounding-client-rect-in-frame.html
     12               fast/dom/Element/scale-page-client-rects-in-frame.html
     13
     14        * dom/Document.cpp:
     15        (WebCore):
     16        (WebCore::Document::adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale): Extracted from Element.cpp and Range.cpp and fixed issue of pageScale in frames.
     17        (WebCore::Document::adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale): Extracted from Element.cpp and fixed issue of pageScale in frames.
     18        * dom/Document.h:
     19        (WebCore):
     20        (Document):
     21        * dom/Element.cpp:
     22        (WebCore::Element::getClientRects):
     23        (WebCore::Element::getBoundingClientRect):
     24        * dom/Range.cpp:
     25        (WebCore):
     26        (WebCore::adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale): Moved into Document and fixed issue of pageScale in frames.
     27        (WebCore::Range::getBorderAndTextQuads):
     28        * rendering/RenderObject.h: Removed adjustFloatQuadForPageScale and adjustFloatRectForPageScale because they seem unrelated to RenderObject.
     29        (WebCore):
     30
    1312012-06-06  Dana Jansens  <danakj@chromium.org>
    232
  • trunk/Source/WebCore/dom/Document.cpp

    r119452 r119690  
    60396039}
    60406040
     6041void Document::adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(Vector<FloatQuad>& quads, RenderObject* renderer)
     6042{
     6043    if (!view())
     6044        return;
     6045
     6046    float inverseFrameScale = 1;
     6047    if (frame())
     6048        inverseFrameScale = 1 / frame()->frameScaleFactor();
     6049
     6050    LayoutRect visibleContentRect = view()->visibleContentRect();
     6051    for (size_t i = 0; i < quads.size(); ++i) {
     6052        quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
     6053        adjustFloatQuadForAbsoluteZoom(quads[i], renderer);
     6054        if (inverseFrameScale != 1)
     6055            quads[i].scale(inverseFrameScale, inverseFrameScale);
     6056    }
     6057}
     6058
     6059void Document::adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(FloatRect& rect, RenderObject* renderer)
     6060{
     6061    if (!view())
     6062        return;
     6063
     6064    float inverseFrameScale = 1;
     6065    if (frame())
     6066        inverseFrameScale = 1 / frame()->frameScaleFactor();
     6067
     6068    LayoutRect visibleContentRect = view()->visibleContentRect();
     6069    rect.move(-visibleContentRect.x(), -visibleContentRect.y());
     6070    adjustFloatRectForAbsoluteZoom(rect, renderer);
     6071    if (inverseFrameScale != 1)
     6072        rect.scale(inverseFrameScale);
     6073}
     6074
    60416075} // namespace WebCore
  • trunk/Source/WebCore/dom/Document.h

    r119473 r119690  
    8484class Event;
    8585class EventListener;
     86class FloatRect;
     87class FloatQuad;
    8688class FontData;
    8789class FormAssociatedElement;
     
    11611163#endif
    11621164
     1165    void adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(Vector<FloatQuad>&, RenderObject*);
     1166    void adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(FloatRect&, RenderObject*);
     1167
    11631168protected:
    11641169    Document(Frame*, const KURL&, bool isXHTML, bool isHTML);
  • trunk/Source/WebCore/dom/Element.cpp

    r119426 r119690  
    558558    Vector<FloatQuad> quads;
    559559    renderBoxModelObject->absoluteQuads(quads);
    560 
    561     float pageScale = 1;
    562     if (Page* page = document()->page())
    563         pageScale = page->pageScaleFactor();
    564 
    565     if (FrameView* view = document()->view()) {
    566         LayoutRect visibleContentRect = view->visibleContentRect();
    567         for (size_t i = 0; i < quads.size(); ++i) {
    568             quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
    569             adjustFloatQuadForAbsoluteZoom(quads[i], renderBoxModelObject);
    570             if (pageScale != 1)
    571                 adjustFloatQuadForPageScale(quads[i], pageScale);
    572         }
    573     }
    574 
     560    document()->adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(quads, renderBoxModelObject);
    575561    return ClientRectList::create(quads);
    576562}
     
    603589        result.unite(quads[i].boundingBox());
    604590
    605     if (FrameView* view = document()->view()) {
    606         LayoutRect visibleContentRect = view->visibleContentRect();
    607         result.move(-visibleContentRect.x(), -visibleContentRect.y());
    608     }
    609 
    610     adjustFloatRectForAbsoluteZoom(result, renderer());
    611     if (Page* page = document()->page())
    612         adjustFloatRectForPageScale(result, page->pageScaleFactor());
    613 
     591    document()->adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(result, renderer());
    614592    return ClientRect::create(result);
    615593}
  • trunk/Source/WebCore/dom/Range.cpp

    r118570 r119690  
    19411941}
    19421942
    1943 static void adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale(Vector<FloatQuad>& quads, Document* document, RenderObject* renderer)
    1944 {
    1945     FrameView* view = document->view();
    1946     if (!view)
    1947         return;
    1948 
    1949     float pageScale = 1;
    1950     if (Page* page = document->page())
    1951         pageScale = page->pageScaleFactor();
    1952 
    1953     LayoutRect visibleContentRect = view->visibleContentRect();
    1954     for (size_t i = 0; i < quads.size(); ++i) {
    1955         quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
    1956         adjustFloatQuadForAbsoluteZoom(quads[i], renderer);
    1957         if (pageScale != 1)
    1958             adjustFloatQuadForPageScale(quads[i], pageScale);
    1959     }
    1960 }
    1961 
    19621943void Range::getBorderAndTextQuads(Vector<FloatQuad>& quads) const
    19631944{
     
    19781959                    Vector<FloatQuad> elementQuads;
    19791960                    renderBoxModelObject->absoluteQuads(elementQuads);
    1980                     adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale(elementQuads, m_ownerDocument.get(), renderBoxModelObject);
     1961                    m_ownerDocument->adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(elementQuads, renderBoxModelObject);
    19811962
    19821963                    quads.append(elementQuads);
     
    19911972                Vector<FloatQuad> textQuads;
    19921973                renderText->absoluteQuadsForRange(textQuads, startOffset, endOffset);
    1993                 adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale(textQuads, m_ownerDocument.get(), renderText);
     1974                m_ownerDocument->adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(textQuads, renderText);
    19941975
    19951976                quads.append(textQuads);
  • trunk/Source/WebCore/rendering/RenderObject.h

    r119110 r119690  
    12151215}
    12161216
    1217 inline void adjustFloatQuadForPageScale(FloatQuad& quad, float pageScale)
    1218 {
    1219     if (pageScale != 1)
    1220         quad.scale(1 / pageScale, 1 / pageScale);
    1221 }
    1222 
    1223 inline void adjustFloatRectForPageScale(FloatRect& rect, float pageScale)
    1224 {
    1225     if (pageScale != 1)
    1226         rect.scale(1 / pageScale, 1 / pageScale);
    1227 }
    1228 
    12291217} // namespace WebCore
    12301218
Note: See TracChangeset for help on using the changeset viewer.