From 3342e265a7c2a64f535e01f04958eefa6dcd716b Mon Sep 17 00:00:00 2001 From: "longsonr%gmail.com" Date: Thu, 3 Jan 2008 14:30:03 +0000 Subject: [PATCH] Bug 409383 - Switch sometimes ends up with multiple child frames. r+sr=roc,a1.9=beltzner git-svn-id: svn://10.0.0.236/trunk@242298 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/base/src/nsGkAtomList.h | 1 + mozilla/layout/base/nsCSSFrameConstructor.cpp | 10 ++- mozilla/layout/svg/base/src/Makefile.in | 1 + .../layout/svg/base/src/nsSVGSwitchFrame.cpp | 87 +++++++++++++++++++ 4 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 mozilla/layout/svg/base/src/nsSVGSwitchFrame.cpp diff --git a/mozilla/content/base/src/nsGkAtomList.h b/mozilla/content/base/src/nsGkAtomList.h index 9ee8c1aa806..64fb212a342 100755 --- a/mozilla/content/base/src/nsGkAtomList.h +++ b/mozilla/content/base/src/nsGkAtomList.h @@ -1472,6 +1472,7 @@ GK_ATOM(svgPathGeometryFrame, "SVGPathGeometryFrame") GK_ATOM(svgPatternFrame, "SVGPatternFrame") GK_ATOM(svgRadialGradientFrame, "SVGRadialGradientFrame") GK_ATOM(svgStopFrame, "SVGStopFrame") +GK_ATOM(svgSwitchFrame, "SVGSwitchFrame") GK_ATOM(svgTextFrame, "SVGTextFrame") GK_ATOM(svgTextPathFrame, "SVGTextPathFrame") GK_ATOM(svgTSpanFrame, "SVGTSpanFrame") diff --git a/mozilla/layout/base/nsCSSFrameConstructor.cpp b/mozilla/layout/base/nsCSSFrameConstructor.cpp index 6cdd8902dbf..3cd80dfdb96 100644 --- a/mozilla/layout/base/nsCSSFrameConstructor.cpp +++ b/mozilla/layout/base/nsCSSFrameConstructor.cpp @@ -175,6 +175,8 @@ NS_NewSVGAFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsStyleContext* nsIFrame* NS_NewSVGGlyphFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsIFrame* parent, nsStyleContext* aContext); nsIFrame* +NS_NewSVGSwitchFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsStyleContext* aContext); +nsIFrame* NS_NewSVGTextFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsStyleContext* aContext); nsIFrame* NS_NewSVGTSpanFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsIFrame* parent, nsStyleContext* aContext); @@ -7347,7 +7349,7 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState, // Are we another child of a switch which already has a child if (aParentFrame && - aParentFrame->GetType() == nsGkAtoms::svgSwitch && + aParentFrame->GetType() == nsGkAtoms::svgSwitchFrame && aParentFrame->GetFirstChild(nsnull)) { *aHaltProcessing = PR_TRUE; return NS_OK; @@ -7396,10 +7398,12 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState, newFrame = NS_NewSVGInnerSVGFrame(mPresShell, aContent, aStyleContext); } } - else if (aTag == nsGkAtoms::g || - aTag == nsGkAtoms::svgSwitch) { + else if (aTag == nsGkAtoms::g) { newFrame = NS_NewSVGGFrame(mPresShell, aContent, aStyleContext); } + else if (aTag == nsGkAtoms::svgSwitch) { + newFrame = NS_NewSVGSwitchFrame(mPresShell, aContent, aStyleContext); + } else if (aTag == nsGkAtoms::polygon || aTag == nsGkAtoms::polyline || aTag == nsGkAtoms::circle || diff --git a/mozilla/layout/svg/base/src/Makefile.in b/mozilla/layout/svg/base/src/Makefile.in index f85e592fffb..38cb5582821 100644 --- a/mozilla/layout/svg/base/src/Makefile.in +++ b/mozilla/layout/svg/base/src/Makefile.in @@ -87,6 +87,7 @@ CPPSRCS = \ nsSVGPathGeometryFrame.cpp \ nsSVGPatternFrame.cpp \ nsSVGStopFrame.cpp \ + nsSVGSwitchFrame.cpp \ nsSVGTextContainerFrame.cpp \ nsSVGTextFrame.cpp \ nsSVGTextPathFrame.cpp \ diff --git a/mozilla/layout/svg/base/src/nsSVGSwitchFrame.cpp b/mozilla/layout/svg/base/src/nsSVGSwitchFrame.cpp new file mode 100644 index 00000000000..6d2e0622811 --- /dev/null +++ b/mozilla/layout/svg/base/src/nsSVGSwitchFrame.cpp @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Mozilla SVG project. + * + * The Initial Developer of the Original Code is + * Robert Longson + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Robert Longson (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSVGGFrame.h" +#include "nsIDOMSVGSwitchElement.h" + +typedef nsSVGGFrame nsSVGGSwitchFrameBase; + +class nsSVGSwitchFrame : public nsSVGGSwitchFrameBase +{ + friend nsIFrame* + NS_NewSVGSwitchFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsStyleContext* aContext); +protected: + nsSVGSwitchFrame(nsStyleContext* aContext) : + nsSVGGSwitchFrameBase(aContext) {} + +public: + /** + * Get the "type" of the frame + * + * @see nsGkAtoms::svgSwitchFrame + */ + virtual nsIAtom* GetType() const; + +#ifdef DEBUG + NS_IMETHOD GetFrameName(nsAString& aResult) const + { + return MakeFrameName(NS_LITERAL_STRING("SVGSwitch"), aResult); + } +#endif +}; + +//---------------------------------------------------------------------- +// Implementation + +nsIFrame* +NS_NewSVGSwitchFrame(nsIPresShell* aPresShell, nsIContent* aContent, nsStyleContext* aContext) +{ + nsCOMPtr svgSwitch = do_QueryInterface(aContent); + if (!svgSwitch) { + NS_ERROR("Can't create frame. Content is not an SVG switch\n"); + return nsnull; + } + + return new (aPresShell) nsSVGSwitchFrame(aContext); +} + +nsIAtom * +nsSVGSwitchFrame::GetType() const +{ + return nsGkAtoms::svgSwitchFrame; +}