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