Changeset 89753 in webkit


Ignore:
Timestamp:
Jun 25, 2011 4:01:15 PM (13 years ago)
Author:
Joseph Pecoraro
Message:

2011-06-25 Joseph Pecoraro <Joseph Pecoraro>

Reviewed by Simon Fraser.

Inspector highlight rect is wrong for contents of transformed iframes
https://bugs.webkit.org/show_bug.cgi?id=53627

Part 1: Provide FloatQuad versions of convertFromRenderer,
convertToContainingView, and convertChildToSelf, so that we
can get the fully transformed quad of a renderer all the
way up to the root widget.

  • page/FrameView.cpp: (WebCore::FrameView::convertFromRenderer): (WebCore::FrameView::convertToContainingView):
  • page/FrameView.h:
  • platform/ScrollView.h: (WebCore::ScrollView::convertChildToSelf):
  • platform/Widget.h:
  • platform/Widget.cpp: (WebCore::Widget::convertToContainingView): Provide FloatQuad versions of these already existing functions.

(WebCore::Widget::convertToRootContainingView):
Provide a helper conversion function to recursively
convert a given FloatQuad up to the root widget.

  • inspector/DOMNodeHighlighter.cpp: (WebCore::DOMNodeHighlighter::DrawNodeHighlight): Use the new methods to convert the FloatQuad for the highlighted node to the root container, without losing transformation information. Add a FIXME for SVG, which is still broken.
  • WebCore.exp.in: Export the new Widget functions so WebKit can link properly.
Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r89752 r89753  
     12011-06-25  Joseph Pecoraro  <joepeck@webkit.org>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Inspector highlight rect is wrong for contents of transformed iframes
     6        https://bugs.webkit.org/show_bug.cgi?id=53627
     7
     8        Part 1: Provide FloatQuad versions of convertFromRenderer,
     9        convertToContainingView, and convertChildToSelf, so that we
     10        can get the fully transformed quad of a renderer all the
     11        way up to the root widget.
     12
     13        * page/FrameView.cpp:
     14        (WebCore::FrameView::convertFromRenderer):
     15        (WebCore::FrameView::convertToContainingView):
     16        * page/FrameView.h:
     17        * platform/ScrollView.h:
     18        (WebCore::ScrollView::convertChildToSelf):
     19        * platform/Widget.h:
     20        * platform/Widget.cpp:
     21        (WebCore::Widget::convertToContainingView):
     22        Provide FloatQuad versions of these already existing functions.
     23
     24        (WebCore::Widget::convertToRootContainingView):
     25        Provide a helper conversion function to recursively
     26        convert a given FloatQuad up to the root widget.
     27
     28        * inspector/DOMNodeHighlighter.cpp:
     29        (WebCore::DOMNodeHighlighter::DrawNodeHighlight):
     30        Use the new methods to convert the FloatQuad for the highlighted
     31        node to the root container, without losing transformation
     32        information. Add a FIXME for SVG, which is still broken.
     33
     34        * WebCore.exp.in:
     35        Export the new Widget functions so WebKit can link properly.
     36
    1372011-06-25  Dirk Schulze  <krit@webkit.org>
    238
  • trunk/Source/WebCore/WebCore.exp.in

    r89733 r89753  
    12751275__ZNK7WebCore6Widget23convertToContainingViewERKNS_7IntRectE
    12761276__ZNK7WebCore6Widget23convertToContainingViewERKNS_8IntPointE
     1277__ZNK7WebCore6Widget23convertToContainingViewERKNS_9FloatQuadE
    12771278__ZNK7WebCore6Widget25convertFromContainingViewERKNS_7IntRectE
    12781279__ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE
    12791280__ZNK7WebCore6Widget25convertToContainingWindowERKNS_7IntRectE
    12801281__ZNK7WebCore6Widget25convertToContainingWindowERKNS_8IntPointE
     1282__ZNK7WebCore6Widget27convertToRootContainingViewERKNS_9FloatQuadE
    12811283__ZNK7WebCore6Widget9frameRectEv
    12821284__ZNK7WebCore7Element10screenRectEv
  • trunk/Source/WebCore/inspector/DOMNodeHighlighter.cpp

    r88691 r89753  
    268268                          borderBox.width() + renderBox->marginLeft() + renderBox->marginRight(), borderBox.height() + renderBox->marginTop() + renderBox->marginBottom());
    269269
    270 
    271         FloatQuad absContentQuad = renderBox->localToAbsoluteQuad(FloatRect(contentBox));
    272         FloatQuad absPaddingQuad = renderBox->localToAbsoluteQuad(FloatRect(paddingBox));
    273         FloatQuad absBorderQuad = renderBox->localToAbsoluteQuad(FloatRect(borderBox));
    274         FloatQuad absMarginQuad = renderBox->localToAbsoluteQuad(FloatRect(marginBox));
    275 
    276         absContentQuad.move(mainFrameOffset);
    277         absPaddingQuad.move(mainFrameOffset);
    278         absBorderQuad.move(mainFrameOffset);
    279         absMarginQuad.move(mainFrameOffset);
     270        FrameView* containingView = containingFrame->view();
     271        FloatQuad absContentQuad = containingView->convertFromRenderer(renderer, FloatRect(contentBox));
     272        FloatQuad absPaddingQuad = containingView->convertFromRenderer(renderer, FloatRect(paddingBox));
     273        FloatQuad absBorderQuad = containingView->convertFromRenderer(renderer, FloatRect(borderBox));
     274        FloatQuad absMarginQuad = containingView->convertFromRenderer(renderer, FloatRect(marginBox));
     275
     276        absContentQuad = containingView->convertToRootContainingView(absContentQuad);
     277        absPaddingQuad = containingView->convertToRootContainingView(absPaddingQuad);
     278        absBorderQuad = containingView->convertToRootContainingView(absBorderQuad);
     279        absMarginQuad = containingView->convertToRootContainingView(absMarginQuad);
    280280
    281281        titleAnchorBox = absMarginQuad.enclosingBoundingBox();
     
    283283        drawHighlightForBox(context, absContentQuad, absPaddingQuad, absBorderQuad, absMarginQuad, mode);
    284284    } else if (renderer->isRenderInline() || isSVGRenderer) {
     285        // FIXME: Does not handle transformed content correctly.
    285286        // FIXME: We should show margins/padding/border for inlines.
    286287        Vector<FloatQuad> lineBoxQuads;
  • trunk/Source/WebCore/page/FrameView.cpp

    r89745 r89753  
    28072807}
    28082808
     2809FloatQuad FrameView::convertFromRenderer(const RenderObject* renderer, const FloatQuad& rendererQuad) const
     2810{
     2811    FloatQuad quad = renderer->localToAbsoluteQuad(rendererQuad);
     2812
     2813    IntPoint scroll = scrollPosition();
     2814    quad.move(-scroll.x(), -scroll.y());
     2815
     2816    return quad;
     2817}
     2818
     2819FloatQuad FrameView::convertToContainingView(const FloatQuad& localQuad) const
     2820{
     2821    if (const ScrollView* parentScrollView = parent()) {
     2822        if (parentScrollView->isFrameView()) {
     2823            const FrameView* parentView = static_cast<const FrameView*>(parentScrollView);
     2824
     2825            // Get our renderer in the parent view.
     2826            RenderPart* renderer = m_frame->ownerRenderer();
     2827            if (!renderer)
     2828                return localQuad;
     2829
     2830            // Add borders and padding.
     2831            FloatQuad quad(localQuad);
     2832            quad.move(renderer->borderLeft() + renderer->paddingLeft(),
     2833                      renderer->borderTop() + renderer->paddingTop());
     2834
     2835            // Apply the parent's transforms and scroll offset.
     2836            return parentView->convertFromRenderer(renderer, quad);
     2837        }
     2838
     2839        return Widget::convertToContainingView(localQuad);
     2840    }
     2841
     2842    return localQuad;
     2843}
     2844
    28092845// Normal delay
    28102846void FrameView::setRepaintThrottlingDeferredRepaintDelay(double p)
  • trunk/Source/WebCore/page/FrameView.h

    r89316 r89753  
    261261    virtual IntPoint convertToRenderer(const RenderObject*, const IntPoint&) const;
    262262
     263    // Conversion with FloatQuads, to keep transformed coordinates.
     264    virtual FloatQuad convertFromRenderer(const RenderObject*, const FloatQuad&) const;
     265    virtual FloatQuad convertToContainingView(const FloatQuad&) const;
     266
    263267    bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
    264268
  • trunk/Source/WebCore/platform/ScrollView.h

    r88877 r89753  
    2828#define ScrollView_h
    2929
     30#include "FloatQuad.h"
    3031#include "IntRect.h"
    3132#include "Scrollbar.h"
     
    255256        newPoint.move(-child->location());
    256257        return newPoint;
     258    }
     259
     260    FloatQuad convertChildToSelf(const Widget* child, const FloatQuad& quad) const
     261    {
     262        IntPoint point = quad.enclosingBoundingBox().location();
     263        IntPoint newPoint = convertChildToSelf(child, point);
     264
     265        FloatQuad newQuad = quad;
     266        newQuad.move(newPoint.x(), newPoint.y());
     267        return newQuad;
    257268    }
    258269
  • trunk/Source/WebCore/platform/Widget.cpp

    r75897 r89753  
    169169}
    170170
     171FloatQuad Widget::convertToContainingView(const FloatQuad& localQuad) const
     172{
     173    if (const ScrollView* parentScrollView = parent())
     174        return parentScrollView->convertChildToSelf(this, localQuad);
     175
     176    return localQuad;
     177}
     178
     179FloatQuad Widget::convertToRootContainingView(const FloatQuad& localQuad) const
     180{
     181    if (!parent())
     182        return localQuad;
     183
     184    FloatQuad containingQuad = convertToContainingView(localQuad);
     185    return parent()->convertToRootContainingView(containingQuad);
     186}
     187
    171188#if !PLATFORM(EFL)
    172189void Widget::frameRectsChanged()
  • trunk/Source/WebCore/platform/Widget.h

    r86433 r89753  
    2828#define Widget_h
    2929
     30#include "FloatQuad.h"
    3031#include "IntRect.h"
    3132#include <wtf/Forward.h>
     
    254255    virtual IntPoint convertFromContainingView(const IntPoint&) const;
    255256
     257    // Conversion with FloatQuads, to keep transformed coordinates.
     258    virtual FloatQuad convertToContainingView(const FloatQuad&) const;
     259    virtual FloatQuad convertToRootContainingView(const FloatQuad&) const;
     260
    256261    // A means to access the AX cache when this object can get a pointer to it.
    257262    virtual AXObjectCache* axObjectCache() const { return 0; }
Note: See TracChangeset for help on using the changeset viewer.