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