diff --git a/content/base/src/nsStyleContext.cpp b/content/base/src/nsStyleContext.cpp index 068c2ed1c13..1d2c47db000 100644 --- a/content/base/src/nsStyleContext.cpp +++ b/content/base/src/nsStyleContext.cpp @@ -35,14 +35,14 @@ static PRBool gsDebug = PR_FALSE; static const PRBool gsDebug = PR_FALSE; #endif - static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID); static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID); static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID); static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID); static NS_DEFINE_IID(kStyleListSID, NS_STYLELIST_SID); static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID); -static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID); +static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID); +static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID); static NS_DEFINE_IID(kIStyleContextIID, NS_ISTYLECONTEXT_IID); @@ -85,6 +85,9 @@ void StyleFontImpl::InheritFrom(const nsStyleFont& aCopy) // -------------------- // nsStyleColor // +nsStyleColor::nsStyleColor() { } +nsStyleColor::~nsStyleColor() { } + struct StyleColorImpl: public nsStyleColor { StyleColorImpl(void) { @@ -93,6 +96,7 @@ struct StyleColorImpl: public nsStyleColor { mBackgroundRepeat = NS_STYLE_BG_REPEAT_OFF; mBackgroundColor = NS_RGB(192,192,192); + mCursor = NS_STYLE_CURSOR_INHERIT; } ~StyleColorImpl(void) @@ -110,8 +114,8 @@ private: // These are not allowed void StyleColorImpl::InheritFrom(const nsStyleColor& aCopy) { - mColor = aCopy.mColor; - + mColor = aCopy.mColor; + mCursor = NS_STYLE_CURSOR_INHERIT;/* XXX right? */ mBackgroundFlags = NS_STYLE_BG_COLOR_TRANSPARENT; } @@ -187,6 +191,9 @@ void StyleBorderImpl::InheritFrom(const nsStyleBorder& aCopy) // -------------------- // nsStyleList // +nsStyleList::nsStyleList() { } +nsStyleList::~nsStyleList() { } + struct StyleListImpl: public nsStyleList { StyleListImpl(void) { @@ -214,6 +221,9 @@ void StyleListImpl::InheritFrom(const nsStyleList& aCopy) // -------------------- // nsStylePosition // +nsStylePosition::nsStylePosition() { } +nsStylePosition::~nsStylePosition() { } + struct StylePositionImpl: public nsStylePosition { StylePositionImpl(void) { @@ -248,47 +258,79 @@ void StylePositionImpl::InheritFrom(const nsStylePosition& aCopy) // positioning values not inherited } - // -------------------- -// nsStyleMolecule +// nsStyleText // -nsStyleMolecule::nsStyleMolecule() -{ -} -nsStyleMolecule::~nsStyleMolecule() -{ -} +nsStyleText::nsStyleText() { } +nsStyleText::~nsStyleText() { } -struct StyleMoleculeImpl : public nsStyleMolecule { - StyleMoleculeImpl(void) - {} - ~StyleMoleculeImpl(void) - {} +struct StyleTextImpl: public nsStyleText { + StyleTextImpl() { + mTextAlign = NS_STYLE_TEXT_ALIGN_LEFT; + mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE; + mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE; + mVerticalAlign = NS_STYLE_VERTICAL_ALIGN_BASELINE; + mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL; + mLetterSpacing = 0; + mLineHeight = 0; + mTextIndent = 0; + mWordSpacing = 0; + } + ~StyleTextImpl() { + } - virtual const nsID& GetID(void) - { return kStyleMoleculeSID; } + virtual const nsID& GetID() { + return kStyleTextSID; + } - virtual void InheritFrom(const nsStyleMolecule& aCopy); - -private: // These are not allowed - StyleMoleculeImpl(const StyleMoleculeImpl& aOther); - StyleMoleculeImpl& operator=(const StyleMoleculeImpl& aOther); + virtual void InheritFrom(const nsStyleText& aCopy); }; -void StyleMoleculeImpl::InheritFrom(const nsStyleMolecule& aCopy) +void StyleTextImpl::InheritFrom(const nsStyleText& aCopy) { - cursor = aCopy.cursor; - direction = aCopy.direction; + // Properties not listed here are not inherited: mVerticalAlign, + // mTextDecoration + mTextAlign = aCopy.mTextAlign; + mTextTransform = aCopy.mTextTransform; + mWhiteSpace = aCopy.mWhiteSpace; - textDecoration = aCopy.textDecoration; - - textAlign = aCopy.textAlign; - whiteSpace = aCopy.whiteSpace; - -// lineHeight = aCopy.lineHeight; + mLetterSpacing = aCopy.mLetterSpacing; + mLineHeight = aCopy.mLineHeight; + mTextIndent = aCopy.mTextIndent; + mWordSpacing = aCopy.mWordSpacing; } +// -------------------- +// nsStyleDisplay +// + +nsStyleDisplay::nsStyleDisplay() { } +nsStyleDisplay::~nsStyleDisplay() { } + +struct StyleDisplayImpl: public nsStyleDisplay { + StyleDisplayImpl() { + mDirection = NS_STYLE_DIRECTION_LTR; + mDisplay = NS_STYLE_DISPLAY_INLINE; + mFloats = NS_STYLE_FLOAT_NONE; + mBreakType = NS_STYLE_CLEAR_NONE; + mBreakBefore = PR_FALSE; + mBreakAfter = PR_FALSE; + } + ~StyleDisplayImpl() { + } + + virtual const nsID& GetID() { + return kStyleDisplaySID; + } + + virtual void InheritFrom(const nsStyleDisplay& aCopy); +}; + +void StyleDisplayImpl::InheritFrom(const nsStyleDisplay& aCopy) +{ + mDirection = aCopy.mDirection; +} //---------------------------------------------------------------------- @@ -316,10 +358,6 @@ public: virtual void InheritFrom(const StyleContextImpl& aParent); virtual void PostProcessData(void); - virtual void HackStyleFor(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aFrame); - nsIStyleContext* mParent; PRUint32 mHashValid: 1; PRUint32 mHashValue: 31; @@ -332,15 +370,16 @@ public: StyleBorderImpl mBorder; StyleListImpl mList; StylePositionImpl mPosition; -// xxx backward support hack - StyleMoleculeImpl mMolecule; + StyleTextImpl mText; + StyleDisplayImpl mDisplay; }; #ifdef DEBUG_REFS static PRInt32 gInstanceCount; #endif -StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* aRules, +StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, + nsISupportsArray* aRules, nsIPresContext* aPresContext) : mParent(aParent), // weak ref mRules(aRules), @@ -349,7 +388,9 @@ StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* a mSpacing(), mBorder(), mList(), - mMolecule() + mPosition(), + mText(), + mDisplay() { NS_INIT_REFCNT(); NS_IF_ADDREF(mRules); @@ -457,8 +498,11 @@ nsStyleStruct* StyleContextImpl::GetData(const nsIID& aSID) if (aSID.Equals(kStylePositionSID)) { return &mPosition; } - if (aSID.Equals(kStyleMoleculeSID)) { - return &mMolecule; + if (aSID.Equals(kStyleTextSID)) { + return &mText; + } + if (aSID.Equals(kStyleDisplaySID)) { + return &mDisplay; } return nsnull; } @@ -470,7 +514,9 @@ void StyleContextImpl::InheritFrom(const StyleContextImpl& aParent) mSpacing.InheritFrom(aParent.mSpacing); mBorder.InheritFrom(aParent.mBorder); mList.InheritFrom(aParent.mList); - mMolecule.InheritFrom(aParent.mMolecule); + mText.InheritFrom(aParent.mText); + mPosition.InheritFrom(aParent.mPosition); + mDisplay.InheritFrom(aParent.mDisplay); } static void CalcBorderSize(nscoord& aSize, PRUint8 aFlag) @@ -494,240 +540,6 @@ void StyleContextImpl::PostProcessData(void) mSpacing.mBorder = mBorder.mSize; mSpacing.mBorderPadding = mSpacing.mPadding; mSpacing.mBorderPadding += mBorder.mSize; - - // XXX hack fill in molecule - mMolecule.border = mBorder.mSize; - mMolecule.margin = mSpacing.mMargin; - mMolecule.borderPadding = mSpacing.mBorderPadding; -} - -void StyleContextImpl::HackStyleFor(nsIPresContext* aPresContext, - nsIContent* aContent, - nsIFrame* aParentFrame) -{ - - mMolecule.display = NS_STYLE_DISPLAY_BLOCK; - mMolecule.whiteSpace = NS_STYLE_WHITESPACE_NORMAL; - mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_BASELINE; - mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_LEFT; - - mMolecule.floats = 0; - - // XXX If it's a B guy then make it inline - nsIAtom* tag = aContent->GetTag(); - nsAutoString buf; - if (tag != nsnull) { - tag->ToString(buf); - NS_RELEASE(tag); - if (buf.EqualsIgnoreCase("B")) { -// float p2t = aPresContext->GetPixelsToTwips(); - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("A")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - mMolecule.cursor = NS_STYLE_CURSOR_HAND; - } else if (buf.EqualsIgnoreCase("BR")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - nsString align("CLEAR"); - nsString value; - if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) { - if (0 == value.Compare("left", PR_TRUE)) { - mMolecule.clear = NS_STYLE_CLEAR_LEFT; - } else if (0 == value.Compare("right", PR_TRUE)) { - mMolecule.clear = NS_STYLE_CLEAR_RIGHT; - } else if (0 == value.Compare("all", PR_TRUE)) { - mMolecule.clear = NS_STYLE_CLEAR_BOTH; - } - } - } else if (buf.EqualsIgnoreCase("SPACER")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("WBR")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("INPUT")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("I")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("S")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("PRE")) { - mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE; - mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(3); - mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(3); - } else if (buf.EqualsIgnoreCase("U")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("FONT")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("THREED")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - mFont.mThreeD = 1; - } else if (buf.EqualsIgnoreCase("TT")) { - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - } else if (buf.EqualsIgnoreCase("IMG")) { - float p2t = aPresContext->GetPixelsToTwips(); - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - mSpacing.mPadding.top = nscoord(2 * p2t); - mSpacing.mPadding.right = nscoord(2 * p2t); - mSpacing.mPadding.bottom = nscoord(2 * p2t); - mSpacing.mPadding.left = nscoord(2 * p2t); - nsString align("ALIGN"); - nsString value; - if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) { - if (0 == value.Compare("left", PR_TRUE)) { - mMolecule.floats = NS_STYLE_FLOAT_LEFT; - } else if (0 == value.Compare("right", PR_TRUE)) { - mMolecule.floats = NS_STYLE_FLOAT_RIGHT; - } - } - } else if (buf.EqualsIgnoreCase("P")) { - nsString align("align"); - nsString value; - if (eContentAttr_NotThere != aContent->GetAttribute(align, value)) { - if (0 == value.Compare("center", PR_TRUE)) { - mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_CENTER; - } - if (0 == value.Compare("right", PR_TRUE)) { - mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_RIGHT; - } - } -// mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(2); -// mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(2); - } else if (buf.EqualsIgnoreCase("BODY")) { - float p2t = aPresContext->GetPixelsToTwips(); - mSpacing.mPadding.top = nscoord(5 * p2t); - mSpacing.mPadding.right = nscoord(5 * p2t); - mSpacing.mPadding.bottom = nscoord(5 * p2t); - mSpacing.mPadding.left = nscoord(5 * p2t); - mBorder.mSize.top = nscoord(1 * p2t); - mBorder.mSize.right = nscoord(1 * p2t); - mBorder.mSize.bottom = nscoord(1 * p2t); - mBorder.mSize.left = nscoord(1 * p2t); - for (int i = 0; i < 4; i++) { - mBorder.mStyle[i] = NS_STYLE_BORDER_STYLE_SOLID; - mBorder.mColor[i] = NS_RGB(0, 255, 0); - } - } else if (buf.EqualsIgnoreCase("LI")) { - mMolecule.display = NS_STYLE_DISPLAY_LIST_ITEM; - } else if (buf.EqualsIgnoreCase("UL") || buf.EqualsIgnoreCase("OL")) { - float p2t = aPresContext->GetPixelsToTwips(); - mSpacing.mPadding.left = nscoord(40 * p2t); - mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(5); - mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(5); - } else if (buf.EqualsIgnoreCase("TABLE")) { // TABLE - mBorder.mSize.top = NS_POINTS_TO_TWIPS_INT(1); - mBorder.mSize.bottom = NS_POINTS_TO_TWIPS_INT(1); - mBorder.mSize.right = NS_POINTS_TO_TWIPS_INT(1); - mBorder.mSize.left = NS_POINTS_TO_TWIPS_INT(1); - mBorder.mStyle[0] = mBorder.mStyle[1] = - mBorder.mStyle[2] = mBorder.mStyle[3] = NS_STYLE_BORDER_STYLE_SOLID; - mMolecule.fixedWidth = -1; - mMolecule.proportionalWidth = -1; - nsString align("ALIGN"); - nsString value; - if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) { - if (0 == value.Compare("left", PR_TRUE)) { - mMolecule.floats = NS_STYLE_FLOAT_LEFT; - } else if (0 == value.Compare("right", PR_TRUE)) { - mMolecule.floats = NS_STYLE_FLOAT_RIGHT; - } - } - } else if (buf.EqualsIgnoreCase("CAPTION")) { // table captions - mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_TOP; - } else if (buf.EqualsIgnoreCase("TBODY") || - buf.EqualsIgnoreCase("THEAD") || - buf.EqualsIgnoreCase("TFOOT") ) { // table rowgroups - mMolecule.padding.top = NS_POINTS_TO_TWIPS_INT(0); - mMolecule.padding.bottom = NS_POINTS_TO_TWIPS_INT(0); - mMolecule.padding.right = NS_POINTS_TO_TWIPS_INT(0); - mMolecule.padding.left = NS_POINTS_TO_TWIPS_INT(0); - } else if (buf.EqualsIgnoreCase("TR")) { // table rows - mMolecule.padding.top = NS_POINTS_TO_TWIPS_INT(0); - mMolecule.padding.bottom = NS_POINTS_TO_TWIPS_INT(0); - mMolecule.padding.right = NS_POINTS_TO_TWIPS_INT(0); - mMolecule.padding.left = NS_POINTS_TO_TWIPS_INT(0); - } else if (buf.EqualsIgnoreCase("TD") || - buf.EqualsIgnoreCase("TH")) { // table cells - float p2t = aPresContext->GetPixelsToTwips(); - - - // Set padding to twenty for testing purposes - int cellPadding = 1; - if (gsDebug==PR_TRUE) - cellPadding = 20; - mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_MIDDLE; - - mSpacing.mPadding.top = NS_POINTS_TO_TWIPS_INT(cellPadding); - mSpacing.mPadding.bottom = NS_POINTS_TO_TWIPS_INT(cellPadding); - mSpacing.mPadding.right = NS_POINTS_TO_TWIPS_INT(cellPadding); - mSpacing.mPadding.left = NS_POINTS_TO_TWIPS_INT(cellPadding); - mBorder.mSize.top = nscoord(1 * p2t); - mBorder.mSize.right = nscoord(1 * p2t); - mBorder.mSize.bottom = nscoord(1 * p2t); - mBorder.mSize.left = nscoord(1 * p2t); - for (int i = 0; i < 4; i++) { - mBorder.mStyle[i] = NS_STYLE_BORDER_STYLE_SOLID; - mBorder.mColor[i] = NS_RGB(128, 128, 128); - } - mMolecule.fixedWidth = -1; - mMolecule.proportionalWidth = -1; - mMolecule.fixedHeight = -1; - mMolecule.proportionalHeight = -1; - - } else if (buf.EqualsIgnoreCase("COL")) { - mMolecule.fixedWidth = -1; - mMolecule.proportionalWidth = -1; - mMolecule.fixedHeight = -1; - mMolecule.proportionalHeight = -1; - } - } else { - // It's text (!) - mMolecule.display = NS_STYLE_DISPLAY_INLINE; - mMolecule.cursor = NS_STYLE_CURSOR_IBEAM; - nsIContent* content; - - aParentFrame->GetContent(content); - nsIAtom* parentTag = content->GetTag(); - parentTag->ToString(buf); - NS_RELEASE(content); - NS_RELEASE(parentTag); - if (buf.EqualsIgnoreCase("B")) { - } else if (buf.EqualsIgnoreCase("A")) { - // This simulates a
text inheritance rule
-      // Check the parent of the A
-      nsIFrame* parentParentFrame;
-       
-      aParentFrame->GetGeometricParent(parentParentFrame);
-      if (nsnull != parentParentFrame) {
-        nsIContent* parentParentContent;
-         
-        parentParentFrame->GetContent(parentParentContent);
-        nsIAtom* parentParentTag = parentParentContent->GetTag();
-        parentParentTag->ToString(buf);
-        NS_RELEASE(parentParentTag);
-        NS_RELEASE(parentParentContent);
-        if (buf.EqualsIgnoreCase("PRE")) {
-          mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("THREED")) {
-      mFont.mThreeD = 1;
-    } else if (buf.EqualsIgnoreCase("I")) {
-    } else if (buf.EqualsIgnoreCase("BLINK")) {
-    } else if (buf.EqualsIgnoreCase("TT")) {
-    } else if (buf.EqualsIgnoreCase("S")) {
-    } else if (buf.EqualsIgnoreCase("U")) {
-    } else if (buf.EqualsIgnoreCase("PRE")) {
-      mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-    }
-  }
-
-#if 0
-  if ((NS_STYLE_DISPLAY_BLOCK == mMolecule.display) ||
-      (NS_STYLE_DISPLAY_LIST_ITEM == mMolecule.display)) {
-    // Always justify text (take that ie)
-    mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_JUSTIFY;
-  }
-#endif
-
-
 }
 
 NS_LAYOUT nsresult
@@ -753,7 +565,6 @@ NS_NewStyleContext(nsIStyleContext** aInstancePtrResult,
   if (nsnull == context) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
-  context->HackStyleFor(aPresContext, aContent, aParentFrame);
   context->PostProcessData();
 
   return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult);
diff --git a/layout/base/src/nsStyleContext.cpp b/layout/base/src/nsStyleContext.cpp
index 068c2ed1c13..1d2c47db000 100644
--- a/layout/base/src/nsStyleContext.cpp
+++ b/layout/base/src/nsStyleContext.cpp
@@ -35,14 +35,14 @@ static PRBool gsDebug = PR_FALSE;
 static const PRBool gsDebug = PR_FALSE;
 #endif
 
-
 static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
 static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
 static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
 static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
 static NS_DEFINE_IID(kStyleListSID, NS_STYLELIST_SID);
 static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
-static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
+static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
+static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
 
 static NS_DEFINE_IID(kIStyleContextIID, NS_ISTYLECONTEXT_IID);
 
@@ -85,6 +85,9 @@ void StyleFontImpl::InheritFrom(const nsStyleFont& aCopy)
 // --------------------
 // nsStyleColor
 //
+nsStyleColor::nsStyleColor() { }
+nsStyleColor::~nsStyleColor() { }
+
 struct StyleColorImpl: public nsStyleColor {
   StyleColorImpl(void)
   {
@@ -93,6 +96,7 @@ struct StyleColorImpl: public nsStyleColor {
     mBackgroundRepeat = NS_STYLE_BG_REPEAT_OFF;
 
     mBackgroundColor = NS_RGB(192,192,192);
+    mCursor = NS_STYLE_CURSOR_INHERIT;
   }
 
   ~StyleColorImpl(void)
@@ -110,8 +114,8 @@ private:  // These are not allowed
 
 void StyleColorImpl::InheritFrom(const nsStyleColor& aCopy)
 {
-  mColor  = aCopy.mColor;
-
+  mColor = aCopy.mColor;
+  mCursor = NS_STYLE_CURSOR_INHERIT;/* XXX right? */
   mBackgroundFlags = NS_STYLE_BG_COLOR_TRANSPARENT;
 }
 
@@ -187,6 +191,9 @@ void StyleBorderImpl::InheritFrom(const nsStyleBorder& aCopy)
 // --------------------
 // nsStyleList
 //
+nsStyleList::nsStyleList() { }
+nsStyleList::~nsStyleList() { }
+
 struct StyleListImpl: public nsStyleList {
   StyleListImpl(void)
   {
@@ -214,6 +221,9 @@ void StyleListImpl::InheritFrom(const nsStyleList& aCopy)
 // --------------------
 // nsStylePosition
 //
+nsStylePosition::nsStylePosition() { }
+nsStylePosition::~nsStylePosition() { }
+
 struct StylePositionImpl: public nsStylePosition {
   StylePositionImpl(void)
   {
@@ -248,47 +258,79 @@ void StylePositionImpl::InheritFrom(const nsStylePosition& aCopy)
   // positioning values not inherited
 }
 
-
 // --------------------
-// nsStyleMolecule
+// nsStyleText
 //
-nsStyleMolecule::nsStyleMolecule()
-{
-}
 
-nsStyleMolecule::~nsStyleMolecule()
-{
-}
+nsStyleText::nsStyleText() { }
+nsStyleText::~nsStyleText() { }
 
-struct StyleMoleculeImpl : public nsStyleMolecule {
-  StyleMoleculeImpl(void)
-  {}
-  ~StyleMoleculeImpl(void)
-  {}
+struct StyleTextImpl: public nsStyleText {
+  StyleTextImpl() {
+    mTextAlign = NS_STYLE_TEXT_ALIGN_LEFT;
+    mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE;
+    mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE;
+    mVerticalAlign = NS_STYLE_VERTICAL_ALIGN_BASELINE;
+    mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL;
+    mLetterSpacing = 0;
+    mLineHeight = 0;
+    mTextIndent = 0;
+    mWordSpacing = 0;
+  }
+  ~StyleTextImpl() {
+  }
 
-  virtual const nsID& GetID(void)
-  { return kStyleMoleculeSID;  }
+  virtual const nsID& GetID() {
+    return kStyleTextSID;
+  }
 
-  virtual void InheritFrom(const nsStyleMolecule& aCopy);
-
-private:  // These are not allowed
-  StyleMoleculeImpl(const StyleMoleculeImpl& aOther);
-  StyleMoleculeImpl& operator=(const StyleMoleculeImpl& aOther);
+  virtual void InheritFrom(const nsStyleText& aCopy);
 };
 
-void StyleMoleculeImpl::InheritFrom(const nsStyleMolecule& aCopy)
+void StyleTextImpl::InheritFrom(const nsStyleText& aCopy)
 {
-  cursor            = aCopy.cursor;
-  direction         = aCopy.direction;
+  // Properties not listed here are not inherited: mVerticalAlign,
+  // mTextDecoration
+  mTextAlign = aCopy.mTextAlign;
+  mTextTransform = aCopy.mTextTransform;
+  mWhiteSpace = aCopy.mWhiteSpace;
 
-  textDecoration    = aCopy.textDecoration;
-
-  textAlign         = aCopy.textAlign;
-  whiteSpace        = aCopy.whiteSpace;
-
-//  lineHeight        = aCopy.lineHeight;
+  mLetterSpacing = aCopy.mLetterSpacing;
+  mLineHeight = aCopy.mLineHeight;
+  mTextIndent = aCopy.mTextIndent;
+  mWordSpacing = aCopy.mWordSpacing;
 }
 
+// --------------------
+// nsStyleDisplay
+//
+
+nsStyleDisplay::nsStyleDisplay() { }
+nsStyleDisplay::~nsStyleDisplay() { }
+
+struct StyleDisplayImpl: public nsStyleDisplay {
+  StyleDisplayImpl() {
+    mDirection = NS_STYLE_DIRECTION_LTR;
+    mDisplay = NS_STYLE_DISPLAY_INLINE;
+    mFloats = NS_STYLE_FLOAT_NONE;
+    mBreakType = NS_STYLE_CLEAR_NONE;
+    mBreakBefore = PR_FALSE;
+    mBreakAfter = PR_FALSE;
+  }
+  ~StyleDisplayImpl() {
+  }
+
+  virtual const nsID& GetID() {
+    return kStyleDisplaySID;
+  }
+
+  virtual void InheritFrom(const nsStyleDisplay& aCopy);
+};
+
+void StyleDisplayImpl::InheritFrom(const nsStyleDisplay& aCopy)
+{
+  mDirection = aCopy.mDirection;
+}
 
 //----------------------------------------------------------------------
 
@@ -316,10 +358,6 @@ public:
   virtual void InheritFrom(const StyleContextImpl& aParent);
   virtual void PostProcessData(void);
 
-  virtual void HackStyleFor(nsIPresContext* aPresContext,
-                            nsIContent* aContent,
-                            nsIFrame* aFrame);
-
   nsIStyleContext*  mParent;
   PRUint32          mHashValid: 1;
   PRUint32          mHashValue: 31;
@@ -332,15 +370,16 @@ public:
   StyleBorderImpl   mBorder;
   StyleListImpl     mList;
   StylePositionImpl mPosition;
-// xxx backward support hack
-  StyleMoleculeImpl mMolecule;
+  StyleTextImpl     mText;
+  StyleDisplayImpl  mDisplay;
 };
 
 #ifdef DEBUG_REFS
 static PRInt32 gInstanceCount;
 #endif
 
-StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* aRules, 
+StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent,
+                                   nsISupportsArray* aRules, 
                                    nsIPresContext* aPresContext)
   : mParent(aParent), // weak ref
     mRules(aRules),
@@ -349,7 +388,9 @@ StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* a
     mSpacing(),
     mBorder(),
     mList(),
-    mMolecule()
+    mPosition(),
+    mText(),
+    mDisplay()
 {
   NS_INIT_REFCNT();
   NS_IF_ADDREF(mRules);
@@ -457,8 +498,11 @@ nsStyleStruct* StyleContextImpl::GetData(const nsIID& aSID)
   if (aSID.Equals(kStylePositionSID)) {
     return &mPosition;
   }
-  if (aSID.Equals(kStyleMoleculeSID)) {
-    return &mMolecule;
+  if (aSID.Equals(kStyleTextSID)) {
+    return &mText;
+  }
+  if (aSID.Equals(kStyleDisplaySID)) {
+    return &mDisplay;
   }
   return nsnull;
 }
@@ -470,7 +514,9 @@ void StyleContextImpl::InheritFrom(const StyleContextImpl& aParent)
   mSpacing.InheritFrom(aParent.mSpacing);
   mBorder.InheritFrom(aParent.mBorder);
   mList.InheritFrom(aParent.mList);
-  mMolecule.InheritFrom(aParent.mMolecule);
+  mText.InheritFrom(aParent.mText);
+  mPosition.InheritFrom(aParent.mPosition);
+  mDisplay.InheritFrom(aParent.mDisplay);
 }
 
 static void CalcBorderSize(nscoord& aSize, PRUint8 aFlag)
@@ -494,240 +540,6 @@ void StyleContextImpl::PostProcessData(void)
   mSpacing.mBorder = mBorder.mSize;
   mSpacing.mBorderPadding = mSpacing.mPadding;
   mSpacing.mBorderPadding += mBorder.mSize;
-
-  // XXX hack fill in molecule
-  mMolecule.border = mBorder.mSize;
-  mMolecule.margin = mSpacing.mMargin;
-  mMolecule.borderPadding = mSpacing.mBorderPadding;
-}
-
-void StyleContextImpl::HackStyleFor(nsIPresContext* aPresContext,
-                                    nsIContent* aContent,
-                                    nsIFrame* aParentFrame)
-{
-
-  mMolecule.display = NS_STYLE_DISPLAY_BLOCK;
-  mMolecule.whiteSpace = NS_STYLE_WHITESPACE_NORMAL;
-  mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_BASELINE;
-  mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_LEFT;
-
-  mMolecule.floats = 0;
-
-  // XXX If it's a B guy then make it inline
-  nsIAtom* tag = aContent->GetTag();
-  nsAutoString buf;
-  if (tag != nsnull) {
-    tag->ToString(buf);
-    NS_RELEASE(tag);
-    if (buf.EqualsIgnoreCase("B")) {
-//      float p2t = aPresContext->GetPixelsToTwips();
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("A")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      mMolecule.cursor = NS_STYLE_CURSOR_HAND;
-    } else if (buf.EqualsIgnoreCase("BR")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      nsString  align("CLEAR");
-      nsString  value;
-      if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("left", PR_TRUE)) {
-          mMolecule.clear = NS_STYLE_CLEAR_LEFT;
-        } else if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.clear = NS_STYLE_CLEAR_RIGHT;
-        } else if (0 == value.Compare("all", PR_TRUE)) {
-          mMolecule.clear = NS_STYLE_CLEAR_BOTH;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("SPACER")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("WBR")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("INPUT")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("I")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("S")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("PRE")) {
-      mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-      mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(3);
-      mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(3);
-    } else if (buf.EqualsIgnoreCase("U")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("FONT")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("THREED")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      mFont.mThreeD = 1;
-    } else if (buf.EqualsIgnoreCase("TT")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("IMG")) {
-      float p2t = aPresContext->GetPixelsToTwips();
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      mSpacing.mPadding.top = nscoord(2 * p2t);
-      mSpacing.mPadding.right = nscoord(2 * p2t);
-      mSpacing.mPadding.bottom = nscoord(2 * p2t);
-      mSpacing.mPadding.left = nscoord(2 * p2t);
-      nsString  align("ALIGN");
-      nsString  value;
-      if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("left", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_LEFT;
-        } else if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_RIGHT;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("P")) {
-      nsString align("align");
-      nsString value;
-      if (eContentAttr_NotThere != aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("center", PR_TRUE)) {
-          mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_CENTER;
-        }
-        if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_RIGHT;
-        }
-      }
-//      mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(2);
-//      mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(2);
-    } else if (buf.EqualsIgnoreCase("BODY")) {
-      float p2t = aPresContext->GetPixelsToTwips();
-      mSpacing.mPadding.top = nscoord(5 * p2t);
-      mSpacing.mPadding.right = nscoord(5 * p2t);
-      mSpacing.mPadding.bottom = nscoord(5 * p2t);
-      mSpacing.mPadding.left = nscoord(5 * p2t);
-      mBorder.mSize.top = nscoord(1 * p2t);
-      mBorder.mSize.right = nscoord(1 * p2t);
-      mBorder.mSize.bottom = nscoord(1 * p2t);
-      mBorder.mSize.left = nscoord(1 * p2t);
-      for (int i = 0; i < 4; i++) {
-        mBorder.mStyle[i] = NS_STYLE_BORDER_STYLE_SOLID;
-        mBorder.mColor[i] = NS_RGB(0, 255, 0);
-      }
-    } else if (buf.EqualsIgnoreCase("LI")) {
-      mMolecule.display = NS_STYLE_DISPLAY_LIST_ITEM;
-    } else if (buf.EqualsIgnoreCase("UL") || buf.EqualsIgnoreCase("OL")) {
-      float p2t = aPresContext->GetPixelsToTwips();
-      mSpacing.mPadding.left = nscoord(40 * p2t);
-      mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(5);
-      mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(5);
-    } else if (buf.EqualsIgnoreCase("TABLE")) {                     // TABLE
-      mBorder.mSize.top = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mSize.bottom = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mSize.right = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mSize.left = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mStyle[0] = mBorder.mStyle[1] =
-      mBorder.mStyle[2] = mBorder.mStyle[3] = NS_STYLE_BORDER_STYLE_SOLID;
-      mMolecule.fixedWidth = -1;
-      mMolecule.proportionalWidth = -1;
-      nsString  align("ALIGN");
-      nsString  value;
-      if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("left", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_LEFT;
-        } else if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_RIGHT;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("CAPTION")) {                   // table captions
-      mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_TOP;
-    } else if (buf.EqualsIgnoreCase("TBODY") ||
-               buf.EqualsIgnoreCase("THEAD") ||
-               buf.EqualsIgnoreCase("TFOOT") ) {                    // table rowgroups
-      mMolecule.padding.top = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.bottom = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.right = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.left = NS_POINTS_TO_TWIPS_INT(0);
-    } else if (buf.EqualsIgnoreCase("TR")) {                        // table rows
-      mMolecule.padding.top = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.bottom = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.right = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.left = NS_POINTS_TO_TWIPS_INT(0);
-    } else if (buf.EqualsIgnoreCase("TD") ||
-               buf.EqualsIgnoreCase("TH")) {                        // table cells
-      float p2t = aPresContext->GetPixelsToTwips();
-      
-      
-      // Set padding to twenty for testing purposes
-      int cellPadding = 1;
-      if (gsDebug==PR_TRUE)
-        cellPadding = 20;
-      mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_MIDDLE;
-        
-      mSpacing.mPadding.top = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mSpacing.mPadding.bottom = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mSpacing.mPadding.right = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mSpacing.mPadding.left = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mBorder.mSize.top = nscoord(1 * p2t);
-      mBorder.mSize.right = nscoord(1 * p2t);
-      mBorder.mSize.bottom = nscoord(1 * p2t);
-      mBorder.mSize.left = nscoord(1 * p2t);
-      for (int i = 0; i < 4; i++) {
-        mBorder.mStyle[i] = NS_STYLE_BORDER_STYLE_SOLID;
-        mBorder.mColor[i] = NS_RGB(128, 128, 128);
-      }
-      mMolecule.fixedWidth = -1;
-      mMolecule.proportionalWidth = -1;
-      mMolecule.fixedHeight = -1;
-      mMolecule.proportionalHeight = -1;
-
-    } else if (buf.EqualsIgnoreCase("COL")) {
-      mMolecule.fixedWidth = -1;
-      mMolecule.proportionalWidth = -1;
-      mMolecule.fixedHeight = -1;
-      mMolecule.proportionalHeight = -1;
-    }
-  } else {
-    // It's text (!)
-    mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    mMolecule.cursor = NS_STYLE_CURSOR_IBEAM;
-    nsIContent* content;
-     
-    aParentFrame->GetContent(content);
-    nsIAtom* parentTag = content->GetTag();
-    parentTag->ToString(buf);
-    NS_RELEASE(content);
-    NS_RELEASE(parentTag);
-    if (buf.EqualsIgnoreCase("B")) {
-    } else if (buf.EqualsIgnoreCase("A")) {
-      // This simulates a 
text inheritance rule
-      // Check the parent of the A
-      nsIFrame* parentParentFrame;
-       
-      aParentFrame->GetGeometricParent(parentParentFrame);
-      if (nsnull != parentParentFrame) {
-        nsIContent* parentParentContent;
-         
-        parentParentFrame->GetContent(parentParentContent);
-        nsIAtom* parentParentTag = parentParentContent->GetTag();
-        parentParentTag->ToString(buf);
-        NS_RELEASE(parentParentTag);
-        NS_RELEASE(parentParentContent);
-        if (buf.EqualsIgnoreCase("PRE")) {
-          mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("THREED")) {
-      mFont.mThreeD = 1;
-    } else if (buf.EqualsIgnoreCase("I")) {
-    } else if (buf.EqualsIgnoreCase("BLINK")) {
-    } else if (buf.EqualsIgnoreCase("TT")) {
-    } else if (buf.EqualsIgnoreCase("S")) {
-    } else if (buf.EqualsIgnoreCase("U")) {
-    } else if (buf.EqualsIgnoreCase("PRE")) {
-      mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-    }
-  }
-
-#if 0
-  if ((NS_STYLE_DISPLAY_BLOCK == mMolecule.display) ||
-      (NS_STYLE_DISPLAY_LIST_ITEM == mMolecule.display)) {
-    // Always justify text (take that ie)
-    mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_JUSTIFY;
-  }
-#endif
-
-
 }
 
 NS_LAYOUT nsresult
@@ -753,7 +565,6 @@ NS_NewStyleContext(nsIStyleContext** aInstancePtrResult,
   if (nsnull == context) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
-  context->HackStyleFor(aPresContext, aContent, aParentFrame);
   context->PostProcessData();
 
   return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult);
diff --git a/layout/style/nsStyleContext.cpp b/layout/style/nsStyleContext.cpp
index 068c2ed1c13..1d2c47db000 100644
--- a/layout/style/nsStyleContext.cpp
+++ b/layout/style/nsStyleContext.cpp
@@ -35,14 +35,14 @@ static PRBool gsDebug = PR_FALSE;
 static const PRBool gsDebug = PR_FALSE;
 #endif
 
-
 static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
 static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
 static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
 static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
 static NS_DEFINE_IID(kStyleListSID, NS_STYLELIST_SID);
 static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
-static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
+static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
+static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
 
 static NS_DEFINE_IID(kIStyleContextIID, NS_ISTYLECONTEXT_IID);
 
@@ -85,6 +85,9 @@ void StyleFontImpl::InheritFrom(const nsStyleFont& aCopy)
 // --------------------
 // nsStyleColor
 //
+nsStyleColor::nsStyleColor() { }
+nsStyleColor::~nsStyleColor() { }
+
 struct StyleColorImpl: public nsStyleColor {
   StyleColorImpl(void)
   {
@@ -93,6 +96,7 @@ struct StyleColorImpl: public nsStyleColor {
     mBackgroundRepeat = NS_STYLE_BG_REPEAT_OFF;
 
     mBackgroundColor = NS_RGB(192,192,192);
+    mCursor = NS_STYLE_CURSOR_INHERIT;
   }
 
   ~StyleColorImpl(void)
@@ -110,8 +114,8 @@ private:  // These are not allowed
 
 void StyleColorImpl::InheritFrom(const nsStyleColor& aCopy)
 {
-  mColor  = aCopy.mColor;
-
+  mColor = aCopy.mColor;
+  mCursor = NS_STYLE_CURSOR_INHERIT;/* XXX right? */
   mBackgroundFlags = NS_STYLE_BG_COLOR_TRANSPARENT;
 }
 
@@ -187,6 +191,9 @@ void StyleBorderImpl::InheritFrom(const nsStyleBorder& aCopy)
 // --------------------
 // nsStyleList
 //
+nsStyleList::nsStyleList() { }
+nsStyleList::~nsStyleList() { }
+
 struct StyleListImpl: public nsStyleList {
   StyleListImpl(void)
   {
@@ -214,6 +221,9 @@ void StyleListImpl::InheritFrom(const nsStyleList& aCopy)
 // --------------------
 // nsStylePosition
 //
+nsStylePosition::nsStylePosition() { }
+nsStylePosition::~nsStylePosition() { }
+
 struct StylePositionImpl: public nsStylePosition {
   StylePositionImpl(void)
   {
@@ -248,47 +258,79 @@ void StylePositionImpl::InheritFrom(const nsStylePosition& aCopy)
   // positioning values not inherited
 }
 
-
 // --------------------
-// nsStyleMolecule
+// nsStyleText
 //
-nsStyleMolecule::nsStyleMolecule()
-{
-}
 
-nsStyleMolecule::~nsStyleMolecule()
-{
-}
+nsStyleText::nsStyleText() { }
+nsStyleText::~nsStyleText() { }
 
-struct StyleMoleculeImpl : public nsStyleMolecule {
-  StyleMoleculeImpl(void)
-  {}
-  ~StyleMoleculeImpl(void)
-  {}
+struct StyleTextImpl: public nsStyleText {
+  StyleTextImpl() {
+    mTextAlign = NS_STYLE_TEXT_ALIGN_LEFT;
+    mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE;
+    mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE;
+    mVerticalAlign = NS_STYLE_VERTICAL_ALIGN_BASELINE;
+    mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL;
+    mLetterSpacing = 0;
+    mLineHeight = 0;
+    mTextIndent = 0;
+    mWordSpacing = 0;
+  }
+  ~StyleTextImpl() {
+  }
 
-  virtual const nsID& GetID(void)
-  { return kStyleMoleculeSID;  }
+  virtual const nsID& GetID() {
+    return kStyleTextSID;
+  }
 
-  virtual void InheritFrom(const nsStyleMolecule& aCopy);
-
-private:  // These are not allowed
-  StyleMoleculeImpl(const StyleMoleculeImpl& aOther);
-  StyleMoleculeImpl& operator=(const StyleMoleculeImpl& aOther);
+  virtual void InheritFrom(const nsStyleText& aCopy);
 };
 
-void StyleMoleculeImpl::InheritFrom(const nsStyleMolecule& aCopy)
+void StyleTextImpl::InheritFrom(const nsStyleText& aCopy)
 {
-  cursor            = aCopy.cursor;
-  direction         = aCopy.direction;
+  // Properties not listed here are not inherited: mVerticalAlign,
+  // mTextDecoration
+  mTextAlign = aCopy.mTextAlign;
+  mTextTransform = aCopy.mTextTransform;
+  mWhiteSpace = aCopy.mWhiteSpace;
 
-  textDecoration    = aCopy.textDecoration;
-
-  textAlign         = aCopy.textAlign;
-  whiteSpace        = aCopy.whiteSpace;
-
-//  lineHeight        = aCopy.lineHeight;
+  mLetterSpacing = aCopy.mLetterSpacing;
+  mLineHeight = aCopy.mLineHeight;
+  mTextIndent = aCopy.mTextIndent;
+  mWordSpacing = aCopy.mWordSpacing;
 }
 
+// --------------------
+// nsStyleDisplay
+//
+
+nsStyleDisplay::nsStyleDisplay() { }
+nsStyleDisplay::~nsStyleDisplay() { }
+
+struct StyleDisplayImpl: public nsStyleDisplay {
+  StyleDisplayImpl() {
+    mDirection = NS_STYLE_DIRECTION_LTR;
+    mDisplay = NS_STYLE_DISPLAY_INLINE;
+    mFloats = NS_STYLE_FLOAT_NONE;
+    mBreakType = NS_STYLE_CLEAR_NONE;
+    mBreakBefore = PR_FALSE;
+    mBreakAfter = PR_FALSE;
+  }
+  ~StyleDisplayImpl() {
+  }
+
+  virtual const nsID& GetID() {
+    return kStyleDisplaySID;
+  }
+
+  virtual void InheritFrom(const nsStyleDisplay& aCopy);
+};
+
+void StyleDisplayImpl::InheritFrom(const nsStyleDisplay& aCopy)
+{
+  mDirection = aCopy.mDirection;
+}
 
 //----------------------------------------------------------------------
 
@@ -316,10 +358,6 @@ public:
   virtual void InheritFrom(const StyleContextImpl& aParent);
   virtual void PostProcessData(void);
 
-  virtual void HackStyleFor(nsIPresContext* aPresContext,
-                            nsIContent* aContent,
-                            nsIFrame* aFrame);
-
   nsIStyleContext*  mParent;
   PRUint32          mHashValid: 1;
   PRUint32          mHashValue: 31;
@@ -332,15 +370,16 @@ public:
   StyleBorderImpl   mBorder;
   StyleListImpl     mList;
   StylePositionImpl mPosition;
-// xxx backward support hack
-  StyleMoleculeImpl mMolecule;
+  StyleTextImpl     mText;
+  StyleDisplayImpl  mDisplay;
 };
 
 #ifdef DEBUG_REFS
 static PRInt32 gInstanceCount;
 #endif
 
-StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* aRules, 
+StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent,
+                                   nsISupportsArray* aRules, 
                                    nsIPresContext* aPresContext)
   : mParent(aParent), // weak ref
     mRules(aRules),
@@ -349,7 +388,9 @@ StyleContextImpl::StyleContextImpl(nsIStyleContext* aParent, nsISupportsArray* a
     mSpacing(),
     mBorder(),
     mList(),
-    mMolecule()
+    mPosition(),
+    mText(),
+    mDisplay()
 {
   NS_INIT_REFCNT();
   NS_IF_ADDREF(mRules);
@@ -457,8 +498,11 @@ nsStyleStruct* StyleContextImpl::GetData(const nsIID& aSID)
   if (aSID.Equals(kStylePositionSID)) {
     return &mPosition;
   }
-  if (aSID.Equals(kStyleMoleculeSID)) {
-    return &mMolecule;
+  if (aSID.Equals(kStyleTextSID)) {
+    return &mText;
+  }
+  if (aSID.Equals(kStyleDisplaySID)) {
+    return &mDisplay;
   }
   return nsnull;
 }
@@ -470,7 +514,9 @@ void StyleContextImpl::InheritFrom(const StyleContextImpl& aParent)
   mSpacing.InheritFrom(aParent.mSpacing);
   mBorder.InheritFrom(aParent.mBorder);
   mList.InheritFrom(aParent.mList);
-  mMolecule.InheritFrom(aParent.mMolecule);
+  mText.InheritFrom(aParent.mText);
+  mPosition.InheritFrom(aParent.mPosition);
+  mDisplay.InheritFrom(aParent.mDisplay);
 }
 
 static void CalcBorderSize(nscoord& aSize, PRUint8 aFlag)
@@ -494,240 +540,6 @@ void StyleContextImpl::PostProcessData(void)
   mSpacing.mBorder = mBorder.mSize;
   mSpacing.mBorderPadding = mSpacing.mPadding;
   mSpacing.mBorderPadding += mBorder.mSize;
-
-  // XXX hack fill in molecule
-  mMolecule.border = mBorder.mSize;
-  mMolecule.margin = mSpacing.mMargin;
-  mMolecule.borderPadding = mSpacing.mBorderPadding;
-}
-
-void StyleContextImpl::HackStyleFor(nsIPresContext* aPresContext,
-                                    nsIContent* aContent,
-                                    nsIFrame* aParentFrame)
-{
-
-  mMolecule.display = NS_STYLE_DISPLAY_BLOCK;
-  mMolecule.whiteSpace = NS_STYLE_WHITESPACE_NORMAL;
-  mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_BASELINE;
-  mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_LEFT;
-
-  mMolecule.floats = 0;
-
-  // XXX If it's a B guy then make it inline
-  nsIAtom* tag = aContent->GetTag();
-  nsAutoString buf;
-  if (tag != nsnull) {
-    tag->ToString(buf);
-    NS_RELEASE(tag);
-    if (buf.EqualsIgnoreCase("B")) {
-//      float p2t = aPresContext->GetPixelsToTwips();
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("A")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      mMolecule.cursor = NS_STYLE_CURSOR_HAND;
-    } else if (buf.EqualsIgnoreCase("BR")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      nsString  align("CLEAR");
-      nsString  value;
-      if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("left", PR_TRUE)) {
-          mMolecule.clear = NS_STYLE_CLEAR_LEFT;
-        } else if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.clear = NS_STYLE_CLEAR_RIGHT;
-        } else if (0 == value.Compare("all", PR_TRUE)) {
-          mMolecule.clear = NS_STYLE_CLEAR_BOTH;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("SPACER")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("WBR")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("INPUT")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("I")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("S")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("PRE")) {
-      mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-      mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(3);
-      mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(3);
-    } else if (buf.EqualsIgnoreCase("U")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("FONT")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("THREED")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      mFont.mThreeD = 1;
-    } else if (buf.EqualsIgnoreCase("TT")) {
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    } else if (buf.EqualsIgnoreCase("IMG")) {
-      float p2t = aPresContext->GetPixelsToTwips();
-      mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-      mSpacing.mPadding.top = nscoord(2 * p2t);
-      mSpacing.mPadding.right = nscoord(2 * p2t);
-      mSpacing.mPadding.bottom = nscoord(2 * p2t);
-      mSpacing.mPadding.left = nscoord(2 * p2t);
-      nsString  align("ALIGN");
-      nsString  value;
-      if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("left", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_LEFT;
-        } else if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_RIGHT;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("P")) {
-      nsString align("align");
-      nsString value;
-      if (eContentAttr_NotThere != aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("center", PR_TRUE)) {
-          mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_CENTER;
-        }
-        if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_RIGHT;
-        }
-      }
-//      mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(2);
-//      mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(2);
-    } else if (buf.EqualsIgnoreCase("BODY")) {
-      float p2t = aPresContext->GetPixelsToTwips();
-      mSpacing.mPadding.top = nscoord(5 * p2t);
-      mSpacing.mPadding.right = nscoord(5 * p2t);
-      mSpacing.mPadding.bottom = nscoord(5 * p2t);
-      mSpacing.mPadding.left = nscoord(5 * p2t);
-      mBorder.mSize.top = nscoord(1 * p2t);
-      mBorder.mSize.right = nscoord(1 * p2t);
-      mBorder.mSize.bottom = nscoord(1 * p2t);
-      mBorder.mSize.left = nscoord(1 * p2t);
-      for (int i = 0; i < 4; i++) {
-        mBorder.mStyle[i] = NS_STYLE_BORDER_STYLE_SOLID;
-        mBorder.mColor[i] = NS_RGB(0, 255, 0);
-      }
-    } else if (buf.EqualsIgnoreCase("LI")) {
-      mMolecule.display = NS_STYLE_DISPLAY_LIST_ITEM;
-    } else if (buf.EqualsIgnoreCase("UL") || buf.EqualsIgnoreCase("OL")) {
-      float p2t = aPresContext->GetPixelsToTwips();
-      mSpacing.mPadding.left = nscoord(40 * p2t);
-      mSpacing.mMargin.top = NS_POINTS_TO_TWIPS_INT(5);
-      mSpacing.mMargin.bottom = NS_POINTS_TO_TWIPS_INT(5);
-    } else if (buf.EqualsIgnoreCase("TABLE")) {                     // TABLE
-      mBorder.mSize.top = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mSize.bottom = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mSize.right = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mSize.left = NS_POINTS_TO_TWIPS_INT(1);
-      mBorder.mStyle[0] = mBorder.mStyle[1] =
-      mBorder.mStyle[2] = mBorder.mStyle[3] = NS_STYLE_BORDER_STYLE_SOLID;
-      mMolecule.fixedWidth = -1;
-      mMolecule.proportionalWidth = -1;
-      nsString  align("ALIGN");
-      nsString  value;
-      if (eContentAttr_HasValue == aContent->GetAttribute(align, value)) {
-        if (0 == value.Compare("left", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_LEFT;
-        } else if (0 == value.Compare("right", PR_TRUE)) {
-          mMolecule.floats = NS_STYLE_FLOAT_RIGHT;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("CAPTION")) {                   // table captions
-      mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_TOP;
-    } else if (buf.EqualsIgnoreCase("TBODY") ||
-               buf.EqualsIgnoreCase("THEAD") ||
-               buf.EqualsIgnoreCase("TFOOT") ) {                    // table rowgroups
-      mMolecule.padding.top = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.bottom = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.right = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.left = NS_POINTS_TO_TWIPS_INT(0);
-    } else if (buf.EqualsIgnoreCase("TR")) {                        // table rows
-      mMolecule.padding.top = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.bottom = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.right = NS_POINTS_TO_TWIPS_INT(0);
-      mMolecule.padding.left = NS_POINTS_TO_TWIPS_INT(0);
-    } else if (buf.EqualsIgnoreCase("TD") ||
-               buf.EqualsIgnoreCase("TH")) {                        // table cells
-      float p2t = aPresContext->GetPixelsToTwips();
-      
-      
-      // Set padding to twenty for testing purposes
-      int cellPadding = 1;
-      if (gsDebug==PR_TRUE)
-        cellPadding = 20;
-      mMolecule.verticalAlign = NS_STYLE_VERTICAL_ALIGN_MIDDLE;
-        
-      mSpacing.mPadding.top = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mSpacing.mPadding.bottom = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mSpacing.mPadding.right = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mSpacing.mPadding.left = NS_POINTS_TO_TWIPS_INT(cellPadding);
-      mBorder.mSize.top = nscoord(1 * p2t);
-      mBorder.mSize.right = nscoord(1 * p2t);
-      mBorder.mSize.bottom = nscoord(1 * p2t);
-      mBorder.mSize.left = nscoord(1 * p2t);
-      for (int i = 0; i < 4; i++) {
-        mBorder.mStyle[i] = NS_STYLE_BORDER_STYLE_SOLID;
-        mBorder.mColor[i] = NS_RGB(128, 128, 128);
-      }
-      mMolecule.fixedWidth = -1;
-      mMolecule.proportionalWidth = -1;
-      mMolecule.fixedHeight = -1;
-      mMolecule.proportionalHeight = -1;
-
-    } else if (buf.EqualsIgnoreCase("COL")) {
-      mMolecule.fixedWidth = -1;
-      mMolecule.proportionalWidth = -1;
-      mMolecule.fixedHeight = -1;
-      mMolecule.proportionalHeight = -1;
-    }
-  } else {
-    // It's text (!)
-    mMolecule.display = NS_STYLE_DISPLAY_INLINE;
-    mMolecule.cursor = NS_STYLE_CURSOR_IBEAM;
-    nsIContent* content;
-     
-    aParentFrame->GetContent(content);
-    nsIAtom* parentTag = content->GetTag();
-    parentTag->ToString(buf);
-    NS_RELEASE(content);
-    NS_RELEASE(parentTag);
-    if (buf.EqualsIgnoreCase("B")) {
-    } else if (buf.EqualsIgnoreCase("A")) {
-      // This simulates a 
text inheritance rule
-      // Check the parent of the A
-      nsIFrame* parentParentFrame;
-       
-      aParentFrame->GetGeometricParent(parentParentFrame);
-      if (nsnull != parentParentFrame) {
-        nsIContent* parentParentContent;
-         
-        parentParentFrame->GetContent(parentParentContent);
-        nsIAtom* parentParentTag = parentParentContent->GetTag();
-        parentParentTag->ToString(buf);
-        NS_RELEASE(parentParentTag);
-        NS_RELEASE(parentParentContent);
-        if (buf.EqualsIgnoreCase("PRE")) {
-          mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-        }
-      }
-    } else if (buf.EqualsIgnoreCase("THREED")) {
-      mFont.mThreeD = 1;
-    } else if (buf.EqualsIgnoreCase("I")) {
-    } else if (buf.EqualsIgnoreCase("BLINK")) {
-    } else if (buf.EqualsIgnoreCase("TT")) {
-    } else if (buf.EqualsIgnoreCase("S")) {
-    } else if (buf.EqualsIgnoreCase("U")) {
-    } else if (buf.EqualsIgnoreCase("PRE")) {
-      mMolecule.whiteSpace = NS_STYLE_WHITESPACE_PRE;
-    }
-  }
-
-#if 0
-  if ((NS_STYLE_DISPLAY_BLOCK == mMolecule.display) ||
-      (NS_STYLE_DISPLAY_LIST_ITEM == mMolecule.display)) {
-    // Always justify text (take that ie)
-    mMolecule.textAlign = NS_STYLE_TEXT_ALIGN_JUSTIFY;
-  }
-#endif
-
-
 }
 
 NS_LAYOUT nsresult
@@ -753,7 +565,6 @@ NS_NewStyleContext(nsIStyleContext** aInstancePtrResult,
   if (nsnull == context) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
-  context->HackStyleFor(aPresContext, aContent, aParentFrame);
   context->PostProcessData();
 
   return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult);