15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2007, 2008 Rob Buis <buis@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google, Inc.  All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGContainer.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/frame/Settings.h"
2919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "core/rendering/GraphicsContextAnnotator.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
31d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/rendering/svg/SVGRenderSupport.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGRenderingContext.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResources.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/SVGResourcesCache.h"
3507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "platform/graphics/GraphicsContextCullSaver.h"
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContextStateSaver.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)RenderSVGContainer::RenderSVGContainer(SVGElement* node)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : RenderSVGModelObject(node)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_objectBoundingBoxValid(false)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_needsBoundariesUpdate(true)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderSVGContainer::~RenderSVGContainer()
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderSVGContainer::trace(Visitor* visitor)
52e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
53e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    visitor->trace(m_children);
54e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RenderSVGModelObject::trace(visitor);
55e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
56e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGContainer::layout()
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(needsLayout());
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Allow RenderSVGViewportContainer to update its viewport.
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    calcViewport();
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Allow RenderSVGTransformableContainer to update its transform.
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool updatedTransform = calculateLocalTransform();
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // RenderSVGViewportContainer needs to set the 'layout size changed' flag.
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    determineIfLayoutSizeChanged();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGRenderSupport::layoutChildren(this, selfNeedsLayout() || SVGRenderSupport::filtersForceContainerLayout(this));
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invalidate all resources of this client if our layout changed.
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (everHadLayout() && needsLayout())
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGResourcesCache::clientLayoutChanged(this);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_needsBoundariesUpdate || updatedTransform) {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateCachedBoundaries();
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_needsBoundariesUpdate = false;
7902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If our bounds changed, notify the parents.
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderSVGModelObject::setNeedsBoundariesUpdate();
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
843c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    clearNeedsLayout();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGContainer::addChild(RenderObject* child, RenderObject* beforeChild)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGModelObject::addChild(child, beforeChild);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCache::clientWasAddedToTree(child, child->style());
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGContainer::removeChild(RenderObject* child)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResourcesCache::clientWillBeRemovedFromTree(child);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSVGModelObject::removeChild(child);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderSVGContainer::selfWillPaint()
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(this);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resources && resources->filter();
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGContainer::paint(PaintInfo& paintInfo, const LayoutPoint&)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this);
1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Spec: groups w/o children still may render filter content.
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!firstChild() && !selfWillPaint())
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
114e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    FloatRect paintInvalidationRect = paintInvalidationRectInLocalCoordinates();
115e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!SVGRenderSupport::paintInfoIntersectsPaintInvalidationRect(paintInvalidationRect, localToParentTransform(), paintInfo))
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PaintInfo childPaintInfo(paintInfo);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GraphicsContextStateSaver stateSaver(*childPaintInfo.context);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Let the RenderSVGViewportContainer subclass clip if necessary
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        applyViewportClip(childPaintInfo);
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        childPaintInfo.applyTransform(localToParentTransform());
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGRenderingContext renderingContext;
12807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        GraphicsContextCullSaver cullSaver(*childPaintInfo.context);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool continueRendering = true;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (childPaintInfo.phase == PaintPhaseForeground) {
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderingContext.prepareToRenderSVGContent(this, childPaintInfo);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continueRendering = renderingContext.isRenderingPrepared();
13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            if (continueRendering && document().settings()->containerCullingEnabled())
1355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                cullSaver.cull(paintInvalidationRectInLocalCoordinates());
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (continueRendering) {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            childPaintInfo.updatePaintingRootForChildren(this);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (RenderObject* child = firstChild(); child; child = child->nextSibling())
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                child->paint(childPaintInfo, IntPoint());
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This really should be drawn from local coordinates, but currently we hack it
146d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // to avoid our clip killing our outline rect. Thus we translate our
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // outline rect into parent coords before drawing.
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This means our focus ring won't share our rotation like it should.
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We should instead disable our clip during PaintPhaseOutline
150d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (paintInfo.phase == PaintPhaseForeground && style()->outlineWidth() && style()->visibility() == VISIBLE) {
151e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        IntRect paintRectInParent = enclosingIntRect(localToParentTransform().mapRect(paintInvalidationRect));
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paintOutline(paintInfo, paintRectInParent);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// addFocusRingRects is called from paintOutline and needs to be in the same coordinates as the paintOuline call
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderSVGContainer::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint&, const RenderLayerModelObject*) const
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutRect paintRectInParent = LayoutRect(localToParentTransform().mapRect(paintInvalidationRectInLocalCoordinates()));
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!paintRectInParent.isEmpty())
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rects.append(paintRectInParent);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderSVGContainer::updateCachedBoundaries()
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
166e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    SVGRenderSupport::computeContainerBoundingBoxes(this, m_objectBoundingBox, m_objectBoundingBoxValid, m_strokeBoundingBox, m_paintInvalidationBoundingBox);
167e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    SVGRenderSupport::intersectPaintInvalidationRectWithResources(this, m_paintInvalidationBoundingBox);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderSVGContainer::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Give RenderSVGViewportContainer a chance to apply its viewport clip
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!pointIsInsideViewportClip(pointInParent))
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FloatPoint localPoint;
177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!SVGRenderSupport::transformToUserSpaceAndCheckClipping(this, localToParentTransform(), pointInParent, localPoint))
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderObject* child = lastChild(); child; child = child->previousSibling()) {
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child->nodeAtFloatPoint(request, result, localPoint, hitTestAction)) {
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updateHitTestResult(result, roundedLayoutPoint(localPoint));
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // pointer-events=boundingBox makes it possible for containers to be direct targets
188a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (style()->pointerEvents() == PE_BOUNDINGBOX) {
189a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(isObjectBoundingBoxValid());
190a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (objectBoundingBox().contains(localPoint)) {
191a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            updateHitTestResult(result, roundedLayoutPoint(localPoint));
192a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return true;
193a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 16.4: "If there are no graphics elements whose relevant graphics content is under the pointer (i.e., there is no target element), the event is not dispatched."
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
200