diff --git a/content/html/style/src/nsComputedDOMStyle.cpp b/content/html/style/src/nsComputedDOMStyle.cpp index e578344c6048..1377424eb13a 100644 --- a/content/html/style/src/nsComputedDOMStyle.cpp +++ b/content/html/style/src/nsComputedDOMStyle.cpp @@ -75,6 +75,7 @@ private: nsresult GetDisplay(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue); + nsresult GetBehavior(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue); nsCOMPtr mPresShell; nsCOMPtr mContent; nsString mPseudo; @@ -217,8 +218,18 @@ NS_IMETHODIMP nsComputedDOMStyle::GetPropertyValue(const nsString& aPropertyName, nsString& aReturn) { - // TBI - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + nsCOMPtr val; + + aReturn.Truncate(); + + nsresult rv = GetPropertyCSSValue(aPropertyName, getter_AddRefs(val)); + NS_ENSURE_SUCCESS(rv, rv); + + if (val) { + rv = val->GetCssText(aReturn); + } + + return rv; } @@ -238,6 +249,8 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsString& aPropertyName, nsCSSProperty prop = nsCSSProps::LookupProperty(aPropertyName); switch (prop) { + case eCSSProperty_behavior : + rv = GetBehavior(frame, *getter_AddRefs(val)); break; case eCSSProperty_display : rv = GetDisplay(frame, *getter_AddRefs(val)); break; case eCSSProperty_width : @@ -257,10 +270,10 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsString& aPropertyName, } if (val) { - val->QueryInterface(NS_GET_IID(nsIDOMCSSValue), (void **)aReturn); + rv = val->QueryInterface(NS_GET_IID(nsIDOMCSSValue), (void **)aReturn); } - return NS_OK; + return rv; } @@ -344,12 +357,48 @@ nsComputedDOMStyle::GetBackgroundRepeat(nsString& aBackgroundRepeat) return NS_ERROR_DOM_NOT_SUPPORTED_ERR; } -NS_IMETHODIMP -nsComputedDOMStyle::GetBehavior(nsString& aBehavior) +#endif + +nsresult +nsComputedDOMStyle::GetBehavior(nsIFrame *aFrame, + nsIDOMCSSPrimitiveValue*& aValue) { - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + nsISupports *tmp = NS_STATIC_CAST(nsIComputedDOMStyle *, this); + + nsROCSSPrimitiveValue *val = new nsROCSSPrimitiveValue(tmp, mT2P); + NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY); + + nsStyleUserInterface uiStyle; + const nsStyleUserInterface* ui = nsnull; + + if (aFrame) { + aFrame->GetStyleData(eStyleStruct_UserInterface, (const nsStyleStruct*&)ui); + } else { + nsCOMPtr presCtx; + mPresShell->GetPresContext(getter_AddRefs(presCtx)); + NS_ENSURE_TRUE(presCtx, NS_ERROR_FAILURE); + + nsCOMPtr styleCtx; + presCtx->ResolveStyleContextFor(mContent, nsnull, PR_FALSE, + getter_AddRefs(styleCtx)); + NS_ENSURE_TRUE(styleCtx, NS_ERROR_FAILURE); + + styleCtx->GetStyle(eStyleStruct_UserInterface, uiStyle); + ui = &uiStyle; + } + + if (ui) { + val->SetString(ui->mBehavior); + } else { + val->SetString(""); + } + + return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue), + (void **)&aValue); } +#if 0 + NS_IMETHODIMP nsComputedDOMStyle::GetBorder(nsString& aBorder) { diff --git a/content/html/style/src/nsROCSSPrimitiveValue.cpp b/content/html/style/src/nsROCSSPrimitiveValue.cpp index 26ee91a0e1af..0c669e8a9c60 100644 --- a/content/html/style/src/nsROCSSPrimitiveValue.cpp +++ b/content/html/style/src/nsROCSSPrimitiveValue.cpp @@ -24,10 +24,12 @@ #include "nsCOMPtr.h" #include "nsDOMError.h" +#include "prprf.h" nsROCSSPrimitiveValue::nsROCSSPrimitiveValue(nsISupports *aOwner, float aT2P) - : mType(0), mTwips(0), mString(), mOwner(aOwner), mT2P(aT2P), mScriptObject(nsnull) + : mType(CSS_PX), mTwips(0), mString(), mOwner(aOwner), mT2P(aT2P), + mScriptObject(nsnull) { NS_INIT_REFCNT(); } @@ -86,7 +88,77 @@ NS_IMETHODIMP nsROCSSPrimitiveValue::GetCssText(nsString& aCssText) { aCssText.Truncate(); - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + + switch (mType) { + case CSS_PX : + { + PRInt32 px = NSTwipsToIntPixels(mTwips, mT2P); + aCssText.AppendInt(px); + aCssText.AppendWithConversion("px"); + + break; + } + case CSS_CM : + { + float val = NS_TWIPS_TO_CENTIMETERS(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("cm"); + break; + } + case CSS_MM : + { + float val = NS_TWIPS_TO_MILLIMETERS(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("mm"); + break; + } + case CSS_IN : + { + float val = NS_TWIPS_TO_INCHES(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("in"); + break; + } + case CSS_PT : + { + float val = NSTwipsToFloatPoints(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("pt"); + break; + } + case CSS_STRING : + { + aCssText.Append(mString); + break; + } + case CSS_PC : + case CSS_UNKNOWN : + case CSS_NUMBER : + case CSS_PERCENTAGE : + case CSS_EMS : + case CSS_EXS : + case CSS_DEG : + case CSS_RAD : + case CSS_GRAD : + case CSS_MS : + case CSS_S : + case CSS_HZ : + case CSS_KHZ : + case CSS_DIMENSION : + case CSS_URI : + case CSS_IDENT : + case CSS_ATTR : + case CSS_COUNTER : + case CSS_RECT : + case CSS_RGBCOLOR : + return NS_ERROR_DOM_INVALID_ACCESS_ERR; + } + + return NS_OK; } diff --git a/content/html/style/src/nsROCSSPrimitiveValue.h b/content/html/style/src/nsROCSSPrimitiveValue.h index b82d677725ff..6fff2af2b283 100644 --- a/content/html/style/src/nsROCSSPrimitiveValue.h +++ b/content/html/style/src/nsROCSSPrimitiveValue.h @@ -63,6 +63,12 @@ public: mType = CSS_STRING; } + void SetString(const nsString& aString) + { + mString.Assign(aString); + mType = CSS_STRING; + } + private: PRUint16 mType; diff --git a/layout/html/style/src/nsComputedDOMStyle.cpp b/layout/html/style/src/nsComputedDOMStyle.cpp index e578344c6048..1377424eb13a 100644 --- a/layout/html/style/src/nsComputedDOMStyle.cpp +++ b/layout/html/style/src/nsComputedDOMStyle.cpp @@ -75,6 +75,7 @@ private: nsresult GetDisplay(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue); + nsresult GetBehavior(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue); nsCOMPtr mPresShell; nsCOMPtr mContent; nsString mPseudo; @@ -217,8 +218,18 @@ NS_IMETHODIMP nsComputedDOMStyle::GetPropertyValue(const nsString& aPropertyName, nsString& aReturn) { - // TBI - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + nsCOMPtr val; + + aReturn.Truncate(); + + nsresult rv = GetPropertyCSSValue(aPropertyName, getter_AddRefs(val)); + NS_ENSURE_SUCCESS(rv, rv); + + if (val) { + rv = val->GetCssText(aReturn); + } + + return rv; } @@ -238,6 +249,8 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsString& aPropertyName, nsCSSProperty prop = nsCSSProps::LookupProperty(aPropertyName); switch (prop) { + case eCSSProperty_behavior : + rv = GetBehavior(frame, *getter_AddRefs(val)); break; case eCSSProperty_display : rv = GetDisplay(frame, *getter_AddRefs(val)); break; case eCSSProperty_width : @@ -257,10 +270,10 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsString& aPropertyName, } if (val) { - val->QueryInterface(NS_GET_IID(nsIDOMCSSValue), (void **)aReturn); + rv = val->QueryInterface(NS_GET_IID(nsIDOMCSSValue), (void **)aReturn); } - return NS_OK; + return rv; } @@ -344,12 +357,48 @@ nsComputedDOMStyle::GetBackgroundRepeat(nsString& aBackgroundRepeat) return NS_ERROR_DOM_NOT_SUPPORTED_ERR; } -NS_IMETHODIMP -nsComputedDOMStyle::GetBehavior(nsString& aBehavior) +#endif + +nsresult +nsComputedDOMStyle::GetBehavior(nsIFrame *aFrame, + nsIDOMCSSPrimitiveValue*& aValue) { - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + nsISupports *tmp = NS_STATIC_CAST(nsIComputedDOMStyle *, this); + + nsROCSSPrimitiveValue *val = new nsROCSSPrimitiveValue(tmp, mT2P); + NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY); + + nsStyleUserInterface uiStyle; + const nsStyleUserInterface* ui = nsnull; + + if (aFrame) { + aFrame->GetStyleData(eStyleStruct_UserInterface, (const nsStyleStruct*&)ui); + } else { + nsCOMPtr presCtx; + mPresShell->GetPresContext(getter_AddRefs(presCtx)); + NS_ENSURE_TRUE(presCtx, NS_ERROR_FAILURE); + + nsCOMPtr styleCtx; + presCtx->ResolveStyleContextFor(mContent, nsnull, PR_FALSE, + getter_AddRefs(styleCtx)); + NS_ENSURE_TRUE(styleCtx, NS_ERROR_FAILURE); + + styleCtx->GetStyle(eStyleStruct_UserInterface, uiStyle); + ui = &uiStyle; + } + + if (ui) { + val->SetString(ui->mBehavior); + } else { + val->SetString(""); + } + + return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue), + (void **)&aValue); } +#if 0 + NS_IMETHODIMP nsComputedDOMStyle::GetBorder(nsString& aBorder) { diff --git a/layout/html/style/src/nsROCSSPrimitiveValue.cpp b/layout/html/style/src/nsROCSSPrimitiveValue.cpp index 26ee91a0e1af..0c669e8a9c60 100644 --- a/layout/html/style/src/nsROCSSPrimitiveValue.cpp +++ b/layout/html/style/src/nsROCSSPrimitiveValue.cpp @@ -24,10 +24,12 @@ #include "nsCOMPtr.h" #include "nsDOMError.h" +#include "prprf.h" nsROCSSPrimitiveValue::nsROCSSPrimitiveValue(nsISupports *aOwner, float aT2P) - : mType(0), mTwips(0), mString(), mOwner(aOwner), mT2P(aT2P), mScriptObject(nsnull) + : mType(CSS_PX), mTwips(0), mString(), mOwner(aOwner), mT2P(aT2P), + mScriptObject(nsnull) { NS_INIT_REFCNT(); } @@ -86,7 +88,77 @@ NS_IMETHODIMP nsROCSSPrimitiveValue::GetCssText(nsString& aCssText) { aCssText.Truncate(); - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + + switch (mType) { + case CSS_PX : + { + PRInt32 px = NSTwipsToIntPixels(mTwips, mT2P); + aCssText.AppendInt(px); + aCssText.AppendWithConversion("px"); + + break; + } + case CSS_CM : + { + float val = NS_TWIPS_TO_CENTIMETERS(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("cm"); + break; + } + case CSS_MM : + { + float val = NS_TWIPS_TO_MILLIMETERS(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("mm"); + break; + } + case CSS_IN : + { + float val = NS_TWIPS_TO_INCHES(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("in"); + break; + } + case CSS_PT : + { + float val = NSTwipsToFloatPoints(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("pt"); + break; + } + case CSS_STRING : + { + aCssText.Append(mString); + break; + } + case CSS_PC : + case CSS_UNKNOWN : + case CSS_NUMBER : + case CSS_PERCENTAGE : + case CSS_EMS : + case CSS_EXS : + case CSS_DEG : + case CSS_RAD : + case CSS_GRAD : + case CSS_MS : + case CSS_S : + case CSS_HZ : + case CSS_KHZ : + case CSS_DIMENSION : + case CSS_URI : + case CSS_IDENT : + case CSS_ATTR : + case CSS_COUNTER : + case CSS_RECT : + case CSS_RGBCOLOR : + return NS_ERROR_DOM_INVALID_ACCESS_ERR; + } + + return NS_OK; } diff --git a/layout/html/style/src/nsROCSSPrimitiveValue.h b/layout/html/style/src/nsROCSSPrimitiveValue.h index b82d677725ff..6fff2af2b283 100644 --- a/layout/html/style/src/nsROCSSPrimitiveValue.h +++ b/layout/html/style/src/nsROCSSPrimitiveValue.h @@ -63,6 +63,12 @@ public: mType = CSS_STRING; } + void SetString(const nsString& aString) + { + mString.Assign(aString); + mType = CSS_STRING; + } + private: PRUint16 mType; diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index e578344c6048..1377424eb13a 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -75,6 +75,7 @@ private: nsresult GetDisplay(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue); + nsresult GetBehavior(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue); nsCOMPtr mPresShell; nsCOMPtr mContent; nsString mPseudo; @@ -217,8 +218,18 @@ NS_IMETHODIMP nsComputedDOMStyle::GetPropertyValue(const nsString& aPropertyName, nsString& aReturn) { - // TBI - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + nsCOMPtr val; + + aReturn.Truncate(); + + nsresult rv = GetPropertyCSSValue(aPropertyName, getter_AddRefs(val)); + NS_ENSURE_SUCCESS(rv, rv); + + if (val) { + rv = val->GetCssText(aReturn); + } + + return rv; } @@ -238,6 +249,8 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsString& aPropertyName, nsCSSProperty prop = nsCSSProps::LookupProperty(aPropertyName); switch (prop) { + case eCSSProperty_behavior : + rv = GetBehavior(frame, *getter_AddRefs(val)); break; case eCSSProperty_display : rv = GetDisplay(frame, *getter_AddRefs(val)); break; case eCSSProperty_width : @@ -257,10 +270,10 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsString& aPropertyName, } if (val) { - val->QueryInterface(NS_GET_IID(nsIDOMCSSValue), (void **)aReturn); + rv = val->QueryInterface(NS_GET_IID(nsIDOMCSSValue), (void **)aReturn); } - return NS_OK; + return rv; } @@ -344,12 +357,48 @@ nsComputedDOMStyle::GetBackgroundRepeat(nsString& aBackgroundRepeat) return NS_ERROR_DOM_NOT_SUPPORTED_ERR; } -NS_IMETHODIMP -nsComputedDOMStyle::GetBehavior(nsString& aBehavior) +#endif + +nsresult +nsComputedDOMStyle::GetBehavior(nsIFrame *aFrame, + nsIDOMCSSPrimitiveValue*& aValue) { - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + nsISupports *tmp = NS_STATIC_CAST(nsIComputedDOMStyle *, this); + + nsROCSSPrimitiveValue *val = new nsROCSSPrimitiveValue(tmp, mT2P); + NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY); + + nsStyleUserInterface uiStyle; + const nsStyleUserInterface* ui = nsnull; + + if (aFrame) { + aFrame->GetStyleData(eStyleStruct_UserInterface, (const nsStyleStruct*&)ui); + } else { + nsCOMPtr presCtx; + mPresShell->GetPresContext(getter_AddRefs(presCtx)); + NS_ENSURE_TRUE(presCtx, NS_ERROR_FAILURE); + + nsCOMPtr styleCtx; + presCtx->ResolveStyleContextFor(mContent, nsnull, PR_FALSE, + getter_AddRefs(styleCtx)); + NS_ENSURE_TRUE(styleCtx, NS_ERROR_FAILURE); + + styleCtx->GetStyle(eStyleStruct_UserInterface, uiStyle); + ui = &uiStyle; + } + + if (ui) { + val->SetString(ui->mBehavior); + } else { + val->SetString(""); + } + + return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue), + (void **)&aValue); } +#if 0 + NS_IMETHODIMP nsComputedDOMStyle::GetBorder(nsString& aBorder) { diff --git a/layout/style/nsROCSSPrimitiveValue.cpp b/layout/style/nsROCSSPrimitiveValue.cpp index 26ee91a0e1af..0c669e8a9c60 100644 --- a/layout/style/nsROCSSPrimitiveValue.cpp +++ b/layout/style/nsROCSSPrimitiveValue.cpp @@ -24,10 +24,12 @@ #include "nsCOMPtr.h" #include "nsDOMError.h" +#include "prprf.h" nsROCSSPrimitiveValue::nsROCSSPrimitiveValue(nsISupports *aOwner, float aT2P) - : mType(0), mTwips(0), mString(), mOwner(aOwner), mT2P(aT2P), mScriptObject(nsnull) + : mType(CSS_PX), mTwips(0), mString(), mOwner(aOwner), mT2P(aT2P), + mScriptObject(nsnull) { NS_INIT_REFCNT(); } @@ -86,7 +88,77 @@ NS_IMETHODIMP nsROCSSPrimitiveValue::GetCssText(nsString& aCssText) { aCssText.Truncate(); - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + + switch (mType) { + case CSS_PX : + { + PRInt32 px = NSTwipsToIntPixels(mTwips, mT2P); + aCssText.AppendInt(px); + aCssText.AppendWithConversion("px"); + + break; + } + case CSS_CM : + { + float val = NS_TWIPS_TO_CENTIMETERS(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("cm"); + break; + } + case CSS_MM : + { + float val = NS_TWIPS_TO_MILLIMETERS(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("mm"); + break; + } + case CSS_IN : + { + float val = NS_TWIPS_TO_INCHES(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("in"); + break; + } + case CSS_PT : + { + float val = NSTwipsToFloatPoints(mTwips); + char buf[64]; + PR_snprintf(buf, 63, "%.2fcm", val); + aCssText.AppendWithConversion("pt"); + break; + } + case CSS_STRING : + { + aCssText.Append(mString); + break; + } + case CSS_PC : + case CSS_UNKNOWN : + case CSS_NUMBER : + case CSS_PERCENTAGE : + case CSS_EMS : + case CSS_EXS : + case CSS_DEG : + case CSS_RAD : + case CSS_GRAD : + case CSS_MS : + case CSS_S : + case CSS_HZ : + case CSS_KHZ : + case CSS_DIMENSION : + case CSS_URI : + case CSS_IDENT : + case CSS_ATTR : + case CSS_COUNTER : + case CSS_RECT : + case CSS_RGBCOLOR : + return NS_ERROR_DOM_INVALID_ACCESS_ERR; + } + + return NS_OK; } diff --git a/layout/style/nsROCSSPrimitiveValue.h b/layout/style/nsROCSSPrimitiveValue.h index b82d677725ff..6fff2af2b283 100644 --- a/layout/style/nsROCSSPrimitiveValue.h +++ b/layout/style/nsROCSSPrimitiveValue.h @@ -63,6 +63,12 @@ public: mType = CSS_STRING; } + void SetString(const nsString& aString) + { + mString.Assign(aString); + mType = CSS_STRING; + } + private: PRUint16 mType;