forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			456 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			456 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- 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 mozilla.org code.
 | |
|  *
 | |
|  * The Initial Developer of the Original Code is
 | |
|  * Netscape Communications Corporation.
 | |
|  * Portions created by the Initial Developer are Copyright (C) 1998
 | |
|  * the Initial Developer. All Rights Reserved.
 | |
|  *
 | |
|  * Contributor(s):
 | |
|  *   Daniel Glazman <glazman@netscape.com>
 | |
|  *   Mats Palmgren <mats.palmgren@bredband.net>
 | |
|  *
 | |
|  * Alternatively, the contents of this file may be used under the terms of
 | |
|  * either of 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 ***** */
 | |
| 
 | |
| /*
 | |
|  * temporary (expanded) representation of the property-value pairs
 | |
|  * within a CSS declaration using during parsing and mutation, and
 | |
|  * representation of complex values for CSS properties
 | |
|  */
 | |
| 
 | |
| #include "nscore.h"
 | |
| #include "nsCSSStruct.h"
 | |
| #include "nsString.h"
 | |
| #include "nsIAtom.h"
 | |
| #include "nsUnicharUtils.h"
 | |
| #include "nsCRT.h"
 | |
| #include "nsCSSProps.h"
 | |
| #include "nsFont.h"
 | |
| 
 | |
| #include "nsStyleConsts.h"
 | |
| 
 | |
| #include "nsCOMPtr.h"
 | |
| #include "nsReadableUtils.h"
 | |
| #include "nsPrintfCString.h"
 | |
| 
 | |
| #define CSS_IF_DELETE(ptr)  if (nsnull != ptr)  { delete ptr; ptr = nsnull; }
 | |
| 
 | |
| // --- nsCSSFont -----------------
 | |
| 
 | |
| nsCSSFont::nsCSSFont(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSFont);
 | |
| }
 | |
| 
 | |
| nsCSSFont::~nsCSSFont(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSFont);
 | |
| }
 | |
| 
 | |
| // --- support -----------------
 | |
| 
 | |
| #define CSS_IF_COPY(val, type) \
 | |
|   if (aCopy.val) (val) = new type(*(aCopy.val));
 | |
| 
 | |
| nsCSSValueList::nsCSSValueList(void)
 | |
|   : mValue(),
 | |
|     mNext(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSValueList);
 | |
| }
 | |
| 
 | |
| nsCSSValueList::nsCSSValueList(const nsCSSValueList& aCopy)
 | |
|   : mValue(aCopy.mValue),
 | |
|     mNext(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSValueList);
 | |
|   CSS_IF_COPY(mNext, nsCSSValueList);
 | |
| }
 | |
| 
 | |
| nsCSSValueList::~nsCSSValueList(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSValueList);
 | |
|   CSS_IF_DELETE(mNext);
 | |
| }
 | |
| 
 | |
| /* static */ PRBool
 | |
| nsCSSValueList::Equal(nsCSSValueList* aList1, nsCSSValueList* aList2)
 | |
| {
 | |
|   if (aList1 == aList2)
 | |
|     return PR_TRUE;
 | |
|     
 | |
|   nsCSSValueList *p1 = aList1, *p2 = aList2;
 | |
|   for ( ; p1 && p2; p1 = p1->mNext, p2 = p2->mNext) {
 | |
|     if (p1->mValue != p2->mValue)
 | |
|       return PR_FALSE;
 | |
|   }
 | |
|   return !p1 && !p2; // true if same length, false otherwise
 | |
| }
 | |
| 
 | |
| // --- nsCSSColor -----------------
 | |
| 
 | |
| nsCSSColor::nsCSSColor(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSColor);
 | |
| }
 | |
| 
 | |
| nsCSSColor::~nsCSSColor(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSColor);
 | |
| }
 | |
| 
 | |
| // --- nsCSSText -----------------
 | |
| 
 | |
| nsCSSText::nsCSSText(void)
 | |
|   : mTextShadow(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSText);
 | |
| }
 | |
| 
 | |
| nsCSSText::~nsCSSText(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSText);
 | |
|   CSS_IF_DELETE(mTextShadow);
 | |
| }
 | |
| 
 | |
| // --- nsCSSRect -----------------
 | |
| 
 | |
| nsCSSRect::nsCSSRect(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSRect);
 | |
| }
 | |
| 
 | |
| nsCSSRect::nsCSSRect(const nsCSSRect& aCopy)
 | |
|   : mTop(aCopy.mTop),
 | |
|     mRight(aCopy.mRight),
 | |
|     mBottom(aCopy.mBottom),
 | |
|     mLeft(aCopy.mLeft)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSRect);
 | |
| }
 | |
| 
 | |
| nsCSSRect::~nsCSSRect()
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSRect);
 | |
| }
 | |
| 
 | |
| void nsCSSRect::SetAllSidesTo(const nsCSSValue& aValue)
 | |
| {
 | |
|   mTop = aValue;
 | |
|   mRight = aValue;
 | |
|   mBottom = aValue;
 | |
|   mLeft = aValue;
 | |
| }
 | |
| 
 | |
| #if (NS_SIDE_TOP != 0) || (NS_SIDE_RIGHT != 1) || (NS_SIDE_BOTTOM != 2) || (NS_SIDE_LEFT != 3)
 | |
| #error "Somebody changed the side constants."
 | |
| #endif
 | |
| 
 | |
| /* static */ const nsCSSRect::side_type nsCSSRect::sides[4] = {
 | |
|   &nsCSSRect::mTop,
 | |
|   &nsCSSRect::mRight,
 | |
|   &nsCSSRect::mBottom,
 | |
|   &nsCSSRect::mLeft,
 | |
| };
 | |
| 
 | |
| // --- nsCSSValueListRect -----------------
 | |
| 
 | |
| nsCSSValueListRect::nsCSSValueListRect(void)
 | |
|   : mTop(nsnull),
 | |
|     mRight(nsnull),
 | |
|     mBottom(nsnull),
 | |
|     mLeft(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSValueListRect);
 | |
| }
 | |
| 
 | |
| nsCSSValueListRect::nsCSSValueListRect(const nsCSSValueListRect& aCopy)
 | |
|   : mTop(aCopy.mTop),
 | |
|     mRight(aCopy.mRight),
 | |
|     mBottom(aCopy.mBottom),
 | |
|     mLeft(aCopy.mLeft)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSValueListRect);
 | |
| }
 | |
| 
 | |
| nsCSSValueListRect::~nsCSSValueListRect()
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSValueListRect);
 | |
| }
 | |
| 
 | |
| /* static */ const nsCSSValueListRect::side_type
 | |
| nsCSSValueListRect::sides[4] = {
 | |
|   &nsCSSValueListRect::mTop,
 | |
|   &nsCSSValueListRect::mRight,
 | |
|   &nsCSSValueListRect::mBottom,
 | |
|   &nsCSSValueListRect::mLeft,
 | |
| };
 | |
| 
 | |
| // --- nsCSSDisplay -----------------
 | |
| 
 | |
| nsCSSDisplay::nsCSSDisplay(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSDisplay);
 | |
| }
 | |
| 
 | |
| nsCSSDisplay::~nsCSSDisplay(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSDisplay);
 | |
| }
 | |
| 
 | |
| // --- nsCSSMargin -----------------
 | |
| 
 | |
| nsCSSMargin::nsCSSMargin(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSMargin);
 | |
| }
 | |
| 
 | |
| nsCSSMargin::~nsCSSMargin(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSMargin);
 | |
| }
 | |
| 
 | |
| // --- nsCSSPosition -----------------
 | |
| 
 | |
| nsCSSPosition::nsCSSPosition(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSPosition);
 | |
| }
 | |
| 
 | |
| nsCSSPosition::~nsCSSPosition(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSPosition);
 | |
| }
 | |
| 
 | |
| // --- nsCSSList -----------------
 | |
| 
 | |
| nsCSSList::nsCSSList(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSList);
 | |
| }
 | |
| 
 | |
| nsCSSList::~nsCSSList(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSList);
 | |
| }
 | |
| 
 | |
| // --- nsCSSTable -----------------
 | |
| 
 | |
| nsCSSTable::nsCSSTable(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSTable);
 | |
| }
 | |
| 
 | |
| nsCSSTable::~nsCSSTable(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSTable);
 | |
| }
 | |
| 
 | |
| // --- nsCSSBreaks -----------------
 | |
| 
 | |
| nsCSSBreaks::nsCSSBreaks(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSBreaks);
 | |
| }
 | |
| 
 | |
| nsCSSBreaks::~nsCSSBreaks(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSBreaks);
 | |
| }
 | |
| 
 | |
| // --- nsCSSPage -----------------
 | |
| 
 | |
| nsCSSPage::nsCSSPage(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSPage);
 | |
| }
 | |
| 
 | |
| nsCSSPage::~nsCSSPage(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSPage);
 | |
| }
 | |
| 
 | |
| // --- nsCSSContent support -----------------
 | |
| 
 | |
| nsCSSCounterData::nsCSSCounterData(void)
 | |
|   : mNext(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSCounterData);
 | |
| }
 | |
| 
 | |
| nsCSSCounterData::nsCSSCounterData(const nsCSSCounterData& aCopy)
 | |
|   : mCounter(aCopy.mCounter),
 | |
|     mValue(aCopy.mValue),
 | |
|     mNext(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSCounterData);
 | |
|   CSS_IF_COPY(mNext, nsCSSCounterData);
 | |
| }
 | |
| 
 | |
| nsCSSCounterData::~nsCSSCounterData(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSCounterData);
 | |
|   CSS_IF_DELETE(mNext);
 | |
| }
 | |
| 
 | |
| /* static */ PRBool
 | |
| nsCSSCounterData::Equal(nsCSSCounterData* aList1, nsCSSCounterData* aList2)
 | |
| {
 | |
|   if (aList1 == aList2)
 | |
|     return PR_TRUE;
 | |
| 
 | |
|   nsCSSCounterData *p1 = aList1, *p2 = aList2;
 | |
|   for ( ; p1 && p2; p1 = p1->mNext, p2 = p2->mNext) {
 | |
|     if (p1->mCounter != p2->mCounter ||
 | |
|         p1->mValue != p2->mValue)
 | |
|       return PR_FALSE;
 | |
|   }
 | |
|   return !p1 && !p2; // true if same length, false otherwise
 | |
| }
 | |
| 
 | |
| nsCSSQuotes::nsCSSQuotes(void)
 | |
|   : mNext(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSQuotes);
 | |
| }
 | |
| 
 | |
| nsCSSQuotes::nsCSSQuotes(const nsCSSQuotes& aCopy)
 | |
|   : mOpen(aCopy.mOpen),
 | |
|     mClose(aCopy.mClose),
 | |
|     mNext(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSQuotes);
 | |
|   CSS_IF_COPY(mNext, nsCSSQuotes);
 | |
| }
 | |
| 
 | |
| nsCSSQuotes::~nsCSSQuotes(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSQuotes);
 | |
|   CSS_IF_DELETE(mNext);
 | |
| }
 | |
| 
 | |
| /* static */ PRBool
 | |
| nsCSSQuotes::Equal(nsCSSQuotes* aList1, nsCSSQuotes* aList2)
 | |
| {
 | |
|   if (aList1 == aList2)
 | |
|     return PR_TRUE;
 | |
| 
 | |
|   nsCSSQuotes *p1 = aList1, *p2 = aList2;
 | |
|   for ( ; p1 && p2; p1 = p1->mNext, p2 = p2->mNext) {
 | |
|     if (p1->mOpen != p2->mOpen ||
 | |
|         p1->mClose != p2->mClose)
 | |
|       return PR_FALSE;
 | |
|   }
 | |
|   return !p1 && !p2; // true if same length, false otherwise
 | |
| }
 | |
| 
 | |
| // --- nsCSSContent -----------------
 | |
| 
 | |
| nsCSSContent::nsCSSContent(void)
 | |
|   : mContent(nsnull),
 | |
|     mCounterIncrement(nsnull),
 | |
|     mCounterReset(nsnull),
 | |
|     mQuotes(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSContent);
 | |
| }
 | |
| 
 | |
| nsCSSContent::~nsCSSContent(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSContent);
 | |
|   CSS_IF_DELETE(mContent);
 | |
|   CSS_IF_DELETE(mCounterIncrement);
 | |
|   CSS_IF_DELETE(mCounterReset);
 | |
|   CSS_IF_DELETE(mQuotes);
 | |
| }
 | |
| 
 | |
| // --- nsCSSUserInterface -----------------
 | |
| 
 | |
| nsCSSUserInterface::nsCSSUserInterface(void)
 | |
|   : mCursor(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSUserInterface);
 | |
| }
 | |
| 
 | |
| nsCSSUserInterface::~nsCSSUserInterface(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSUserInterface);
 | |
|   CSS_IF_DELETE(mCursor);
 | |
| }
 | |
| 
 | |
| // --- nsCSSAural -----------------
 | |
| 
 | |
| nsCSSAural::nsCSSAural(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSAural);
 | |
| }
 | |
| 
 | |
| nsCSSAural::~nsCSSAural(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSAural);
 | |
| }
 | |
| 
 | |
| // --- nsCSSXUL -----------------
 | |
| 
 | |
| nsCSSXUL::nsCSSXUL(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSXUL);
 | |
| }
 | |
| 
 | |
| nsCSSXUL::~nsCSSXUL(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSXUL);
 | |
| }
 | |
| 
 | |
| // --- nsCSSColumn -----------------
 | |
| 
 | |
| nsCSSColumn::nsCSSColumn(void)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSColumn);
 | |
| }
 | |
| 
 | |
| nsCSSColumn::~nsCSSColumn(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSColumn);
 | |
| }
 | |
| 
 | |
| #ifdef MOZ_SVG
 | |
| // --- nsCSSSVG -----------------
 | |
| 
 | |
| nsCSSSVG::nsCSSSVG(void) : mStrokeDasharray(nsnull)
 | |
| {
 | |
|   MOZ_COUNT_CTOR(nsCSSSVG);
 | |
| }
 | |
| 
 | |
| nsCSSSVG::~nsCSSSVG(void)
 | |
| {
 | |
|   MOZ_COUNT_DTOR(nsCSSSVG);
 | |
|   CSS_IF_DELETE(mStrokeDasharray);
 | |
| }
 | |
| 
 | |
| #endif // MOZ_SVG
 | 
