15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Computer, Inc.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google, Inc.
402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * Copyright (C) Research In Motion Limited 2010. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGForeignObject.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/LayoutRepainter.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
2993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/rendering/svg/SVGRenderSupport.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGRenderingContext.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResourcesCache.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGForeignObjectElement.h"
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContextStateSaver.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3702772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochRenderSVGForeignObject::RenderSVGForeignObject(SVGForeignObjectElement* node)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : RenderSVGBlock(node)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_needsTransformUpdate(true)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderSVGForeignObject::~RenderSVGForeignObject()
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderSVGForeignObject::isChildAllowed(RenderObject* child, RenderStyle* style) const
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Disallow arbitary SVG content. Only allow proper <svg xmlns="svgNS"> subdocuments.
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return !child->isSVG() || child->isSVGRoot();
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGForeignObject::paint(PaintInfo& paintInfo, const LayoutPoint&)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (paintInfo.context->paintingDisabled()
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseSelection))
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PaintInfo childPaintInfo(paintInfo);
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GraphicsContextStateSaver stateSaver(*childPaintInfo.context);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    childPaintInfo.applyTransform(localTransform());
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (SVGRenderSupport::isOverflowHidden(this))
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        childPaintInfo.context->clip(m_viewport);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGRenderingContext renderingContext;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool continueRendering = true;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (paintInfo.phase == PaintPhaseForeground) {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        renderingContext.prepareToRenderSVGContent(this, childPaintInfo);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        continueRendering = renderingContext.isRenderingPrepared();
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (continueRendering) {
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Paint all phases of FO elements atomically, as though the FO element established its
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // own stacking context.
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool preservePhase = paintInfo.phase == PaintPhaseSelection || paintInfo.phase == PaintPhaseTextClip;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutPoint childPoint = IntPoint();
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        childPaintInfo.phase = preservePhase ? paintInfo.phase : PaintPhaseBlockBackground;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderBlock::paint(childPaintInfo, IntPoint());
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!preservePhase) {
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            childPaintInfo.phase = PaintPhaseChildBlockBackgrounds;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderBlock::paint(childPaintInfo, childPoint);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            childPaintInfo.phase = PaintPhaseFloat;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderBlock::paint(childPaintInfo, childPoint);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            childPaintInfo.phase = PaintPhaseForeground;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderBlock::paint(childPaintInfo, childPoint);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            childPaintInfo.phase = PaintPhaseOutline;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderBlock::paint(childPaintInfo, childPoint);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AffineTransform& RenderSVGForeignObject::localToParentTransform() const
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_localToParentTransform = localTransform();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_localToParentTransform.translate(m_viewport.x(), m_viewport.y());
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_localToParentTransform;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGForeignObject::updateLogicalWidth()
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Investigate in size rounding issues
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Remove unnecessary rounding when layout is off ints: webkit.org/b/63656
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setWidth(static_cast<int>(roundf(m_viewport.width())));
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGForeignObject::computeLogicalHeight(LayoutUnit, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Investigate in size rounding issues
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Remove unnecessary rounding when layout is off ints: webkit.org/b/63656
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Is this correct for vertical writing mode?
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    computedValues.m_extent = static_cast<int>(roundf(m_viewport.height()));
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    computedValues.m_position = logicalTop;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGForeignObject::layout()
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(needsLayout());
1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ASSERT(!view()->layoutStateCachedOffsetsEnabled()); // RenderSVGRoot disables layoutState for the SVG rendering tree.
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRepainter repainter(*this, SVGRenderSupport::checkForSVGRepaintDuringLayout(this));
12206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    SVGForeignObjectElement* foreign = toSVGForeignObjectElement(node());
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool updateCachedBoundariesInParents = false;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_needsTransformUpdate) {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_localTransform = foreign->animatedLocalTransform();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_needsTransformUpdate = false;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCachedBoundariesInParents = true;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect oldViewport = m_viewport;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Cache viewport boundaries
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLengthContext lengthContext(foreign);
13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatPoint viewportLocation(foreign->x()->currentValue()->value(lengthContext), foreign->y()->currentValue()->value(lengthContext));
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_viewport = FloatRect(viewportLocation, FloatSize(foreign->width()->currentValue()->value(lengthContext), foreign->height()->currentValue()->value(lengthContext)));
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!updateCachedBoundariesInParents)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCachedBoundariesInParents = oldViewport != m_viewport;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set box origin to the foreignObject x/y translation, so positioned objects in XHTML content get correct
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // positions. A regular RenderBoxModelObject would pull this information from RenderStyle - in SVG those
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // properties are ignored for non <svg> elements, so we mimic what happens when specifying them through CSS.
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Investigate in location rounding issues - only affects RenderSVGForeignObject & RenderSVGText
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setLocation(roundedIntPoint(viewportLocation));
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool layoutChanged = everHadLayout() && selfNeedsLayout();
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBlock::layout();
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsLayout());
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our bounds changed, notify the parents.
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (updateCachedBoundariesInParents)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderSVGBlock::setNeedsBoundariesUpdate();
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invalidate all resources of this client if our layout changed.
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (layoutChanged)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGResourcesCache::clientLayoutChanged(this);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    repainter.repaintAfterLayout();
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void RenderSVGForeignObject::mapRectToPaintInvalidationBacking(const RenderLayerModelObject* paintInvalidationContainer,
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    LayoutRect& rect, bool fixed) const
16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatRect r(rect);
1665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    SVGRenderSupport::computeFloatRectForRepaint(this, paintInvalidationContainer, r, fixed);
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    rect = enclosingLayoutRect(r);
16809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderSVGForeignObject::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Embedded content is drawn in the foreground phase.
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hitTestAction != HitTestForeground)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint localPoint = localTransform().inverse().mapPoint(pointInParent);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Early exit if local point is not contained in clipped viewport area
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (SVGRenderSupport::isOverflowHidden(this) && !m_viewport.contains(localPoint))
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FOs establish a stacking context, so we need to hit-test all layers.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HitTestLocation hitTestLocation(roundedLayoutPoint(localPoint));
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return RenderBlock::nodeAtPoint(request, result, hitTestLocation, LayoutPoint(), HitTestForeground)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || RenderBlock::nodeAtPoint(request, result, hitTestLocation, LayoutPoint(), HitTestFloat)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || RenderBlock::nodeAtPoint(request, result, hitTestLocation, LayoutPoint(), HitTestChildBlockBackgrounds);
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
190