Changeset 31257 in webkit


Ignore:
Timestamp:
Mar 24, 2008 3:51:26 PM (16 years ago)
Author:
hyatt@apple.com
Message:

2008-03-24 David Hyatt <hyatt@apple.com>

Fix for bug 18009. Make sure the IE offset/client/scroll* extensions respect full page zoom.

Reviewed by Beth

  • dom/Element.cpp: (WebCore::localZoomForRenderer): (WebCore::adjustForLocalZoom): (WebCore::adjustForAbsoluteZoom): (WebCore::Element::offsetLeft): (WebCore::Element::offsetTop): (WebCore::Element::offsetWidth): (WebCore::Element::offsetHeight): (WebCore::Element::clientLeft): (WebCore::Element::clientTop): (WebCore::Element::clientWidth): (WebCore::Element::clientHeight): (WebCore::Element::scrollLeft): (WebCore::Element::scrollTop): (WebCore::Element::setScrollLeft): (WebCore::Element::setScrollTop): (WebCore::Element::scrollWidth): (WebCore::Element::scrollHeight):
  • rendering/RenderBox.cpp: (WebCore::RenderBox::setStyle):
  • rendering/RenderObject.cpp: (WebCore::RenderObject::offsetParent):
  • rendering/RenderObject.h:
Location:
trunk/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r31251 r31257  
     12008-03-24  David Hyatt  <hyatt@apple.com>
     2
     3        Fix for bug 18009. Make sure the IE offset/client/scroll*** extensions respect full page zoom.
     4
     5        Reviewed by Beth
     6
     7        * dom/Element.cpp:
     8        (WebCore::localZoomForRenderer):
     9        (WebCore::adjustForLocalZoom):
     10        (WebCore::adjustForAbsoluteZoom):
     11        (WebCore::Element::offsetLeft):
     12        (WebCore::Element::offsetTop):
     13        (WebCore::Element::offsetWidth):
     14        (WebCore::Element::offsetHeight):
     15        (WebCore::Element::clientLeft):
     16        (WebCore::Element::clientTop):
     17        (WebCore::Element::clientWidth):
     18        (WebCore::Element::clientHeight):
     19        (WebCore::Element::scrollLeft):
     20        (WebCore::Element::scrollTop):
     21        (WebCore::Element::setScrollLeft):
     22        (WebCore::Element::setScrollTop):
     23        (WebCore::Element::scrollWidth):
     24        (WebCore::Element::scrollHeight):
     25        * rendering/RenderBox.cpp:
     26        (WebCore::RenderBox::setStyle):
     27        * rendering/RenderObject.cpp:
     28        (WebCore::RenderObject::offsetParent):
     29        * rendering/RenderObject.h:
     30
    1312008-03-24  Brady Eidson  <beidson@apple.com>
    232
  • trunk/WebCore/dom/Element.cpp

    r31231 r31257  
    281281}
    282282
     283static float localZoomForRenderer(RenderObject* renderer)
     284{
     285    // FIXME: This does the wrong thing if two opposing zooms are in effect and canceled each
     286    // other out, but the alternative is that we'd have to crawl up the whole render tree every
     287    // time (or store an additional bit in the RenderStyle to indicate that a zoom was specified).
     288    float zoomFactor = 1.0f;
     289    if (renderer->style()->effectiveZoom() != 1.0f) {
     290        // Need to find the nearest enclosing RenderObject that set up
     291        // a differing zoom, and then we divide our result by it to eliminate the zoom.
     292        RenderObject* prev = renderer;
     293        for (RenderObject* curr = prev->parent(); curr; curr = curr->parent()) {
     294            if (curr->style()->effectiveZoom() != prev->style()->effectiveZoom()) {
     295                zoomFactor = prev->style()->zoom();
     296                break;
     297            }
     298            prev = curr;
     299        }
     300        if (prev->isRenderView())
     301            zoomFactor = prev->style()->zoom();
     302    }
     303    return zoomFactor;
     304}
     305
     306static int adjustForLocalZoom(int value, RenderObject* renderer)
     307{
     308    float zoomFactor = localZoomForRenderer(renderer);
     309    if (zoomFactor == 1.0f)
     310        return value;
     311    return value / zoomFactor;
     312}
     313
     314static int adjustForAbsoluteZoom(int value, RenderObject* renderer)
     315{
     316    float zoomFactor = renderer->style()->effectiveZoom();
     317    if (zoomFactor == 1.0f)
     318        return value;
     319    return value / zoomFactor;
     320}
     321
    283322int Element::offsetLeft()
    284323{
    285324    document()->updateLayoutIgnorePendingStylesheets();
    286325    if (RenderObject* rend = renderer())
    287         return rend->offsetLeft();
     326        return adjustForLocalZoom(rend->offsetLeft(), rend);
    288327    return 0;
    289328}
     
    293332    document()->updateLayoutIgnorePendingStylesheets();
    294333    if (RenderObject* rend = renderer())
    295         return rend->offsetTop();
     334        return adjustForLocalZoom(rend->offsetTop(), rend);
    296335    return 0;
    297336}
     
    301340    document()->updateLayoutIgnorePendingStylesheets();
    302341    if (RenderObject* rend = renderer())
    303         return rend->offsetWidth();
     342        return adjustForAbsoluteZoom(rend->offsetWidth(), rend);
    304343    return 0;
    305344}
     
    309348    document()->updateLayoutIgnorePendingStylesheets();
    310349    if (RenderObject* rend = renderer())
    311         return rend->offsetHeight();
     350        return adjustForAbsoluteZoom(rend->offsetHeight(), rend);
    312351    return 0;
    313352}
     
    327366
    328367    if (RenderObject* rend = renderer())
    329         return rend->clientLeft();
     368        return adjustForAbsoluteZoom(rend->clientLeft(), rend);
    330369    return 0;
    331370}
     
    336375
    337376    if (RenderObject* rend = renderer())
    338         return rend->clientTop();
     377        return adjustForAbsoluteZoom(rend->clientTop(), rend);
    339378    return 0;
    340379}
     
    355394
    356395    if (RenderObject* rend = renderer())
    357         return rend->clientWidth();
     396        return adjustForAbsoluteZoom(rend->clientWidth(), rend);
    358397    return 0;
    359398}
     
    374413   
    375414    if (RenderObject* rend = renderer())
    376         return rend->clientHeight();
     415        return adjustForAbsoluteZoom(rend->clientHeight(), rend);
    377416    return 0;
    378417}
     
    382421    document()->updateLayoutIgnorePendingStylesheets();
    383422    if (RenderObject* rend = renderer())
    384         return rend->scrollLeft();
     423        return adjustForAbsoluteZoom(rend->scrollLeft(), rend);
    385424    return 0;
    386425}
     
    390429    document()->updateLayoutIgnorePendingStylesheets();
    391430    if (RenderObject* rend = renderer())
    392         return rend->scrollTop();
     431        return adjustForAbsoluteZoom(rend->scrollTop(), rend);
    393432    return 0;
    394433}
     
    398437    document()->updateLayoutIgnorePendingStylesheets();
    399438    if (RenderObject *rend = renderer())
    400         rend->setScrollLeft(newLeft);
     439        rend->setScrollLeft(newLeft * rend->style()->effectiveZoom());
    401440}
    402441
     
    405444    document()->updateLayoutIgnorePendingStylesheets();
    406445    if (RenderObject *rend = renderer())
    407         rend->setScrollTop(newTop);
     446        rend->setScrollTop(newTop * rend->style()->effectiveZoom());
    408447}
    409448
     
    412451    document()->updateLayoutIgnorePendingStylesheets();
    413452    if (RenderObject* rend = renderer())
    414         return rend->scrollWidth();
     453        return adjustForAbsoluteZoom(rend->scrollWidth(), rend);
    415454    return 0;
    416455}
     
    420459    document()->updateLayoutIgnorePendingStylesheets();
    421460    if (RenderObject* rend = renderer())
    422         return rend->scrollHeight();
     461        return adjustForAbsoluteZoom(rend->scrollHeight(), rend);
    423462    return 0;
    424463}
  • trunk/WebCore/rendering/RenderBox.cpp

    r31200 r31257  
    137137        if (wasFloating && isFloating())
    138138            setChildNeedsLayout(true);
     139    }
     140
     141    // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the
     142    // new zoomed coordinate space.
     143    if (hasOverflowClip() && oldStyle && style() && oldStyle->effectiveZoom() != style()->effectiveZoom()) {
     144        int left = scrollLeft();
     145        if (left) {
     146            left = (left / oldStyle->effectiveZoom()) * style()->effectiveZoom();
     147            setScrollLeft(left);
     148        }
     149        int top = scrollTop();
     150        if (top) {
     151            top = (top / oldStyle->effectiveZoom()) * style()->effectiveZoom();
     152            setScrollTop(top);
     153        }
    139154    }
    140155
  • trunk/WebCore/rendering/RenderObject.cpp

    r31155 r31257  
    557557
    558558    bool skipTables = isPositioned() || isRelPositioned();
     559    float currZoom = style()->effectiveZoom();
    559560    RenderObject* curr = parent();
    560561    while (curr && (!curr->element() ||
     
    563564                                               curr->element()->hasTagName(tdTag) || curr->element()->hasTagName(thTag)))
    564565            break;
     566        float newZoom = curr->style()->effectiveZoom();
     567        if (currZoom != newZoom)
     568            break;
     569        currZoom = newZoom;
    565570        curr = curr->parent();
    566571    }
  • trunk/WebCore/rendering/RenderObject.h

    r31200 r31257  
    603603
    604604    // IE extensions. Used to calculate offsetWidth/Height.  Overridden by inlines (RenderFlow)
    605     // to return the remaining width on a given line (and the height of a single line). -dwh
     605    // to return the remaining width on a given line (and the height of a single line).
    606606    virtual int offsetWidth() const { return width(); }
    607607    virtual int offsetHeight() const { return height() + borderTopExtra() + borderBottomExtra(); }
Note: See TracChangeset for help on using the changeset viewer.