Fixing nsbeta2+ bug 30249, the problem was that the type of various attributes (in the DOM spec) on image elements was string and not number (long), this broke backwards compatibility with 4.x and also compatibility with IE. r=vidur

This commit is contained in:
jst%netscape.com 2000-06-07 01:23:55 +00:00
parent eefb2d0950
commit 0f3586fdaf
8 changed files with 551 additions and 210 deletions

View File

@ -118,6 +118,16 @@ public:
NS_IMETHOD GetLowsrc(nsString& aLowsrc);
NS_IMETHOD SetLowsrc(const nsString& aLowsrc);
NS_IMETHOD GetComplete(PRBool* aComplete);
NS_IMETHOD GetBorder(PRInt32* aBorder);
NS_IMETHOD SetBorder(PRInt32 aBorder);
NS_IMETHOD GetHeight(PRInt32* aHeight);
NS_IMETHOD SetHeight(PRInt32 aHeight);
NS_IMETHOD GetHspace(PRInt32* aHspace);
NS_IMETHOD SetHspace(PRInt32 aHspace);
NS_IMETHOD GetVspace(PRInt32* aVspace);
NS_IMETHOD SetVspace(PRInt32 aVspace);
NS_IMETHOD GetWidth(PRInt32* aWidth);
NS_IMETHOD SetWidth(PRInt32 aWidth);
// nsIContent
@ -252,12 +262,15 @@ NS_IMPL_STRING_ATTR(nsHTMLImageElement, Name, name)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Align, align)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Alt, alt)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Border, border)
NS_IMPL_INT_ATTR(nsHTMLImageElement, Border, border)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Hspace, hspace)
NS_IMPL_INT_ATTR(nsHTMLImageElement, Hspace, hspace)
NS_IMPL_BOOL_ATTR(nsHTMLImageElement, IsMap, ismap)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, LongDesc, longdesc)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Lowsrc, lowsrc)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, UseMap, usemap)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Vspace, vspace)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Lowsrc, lowsrc)
NS_IMPL_INT_ATTR(nsHTMLImageElement, Vspace, vspace)
nsresult
nsHTMLImageElement::GetImageFrame(nsImageFrame** aImageFrame)
@ -327,16 +340,18 @@ nsHTMLImageElement::GetComplete(PRBool* aComplete)
NS_IMETHODIMP
nsHTMLImageElement::GetHeight(nsString& aValue)
{
nsresult result;
nsresult rv = mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::height,
aValue);
if (NS_CONTENT_ATTR_NOT_THERE == mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, aValue)) {
nsImageFrame* imageFrame;
result = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(result)) {
nsSize size;
imageFrame->GetIntrinsicImageSize(size);
aValue.AppendInt(size.height);
if (rv == NS_CONTENT_ATTR_NOT_THERE) {
PRInt32 height = 0;
aValue.Truncate();
// A zero height most likely means that the image is not loaded yet.
if (NS_SUCCEEDED(GetHeight(&height)) && height) {
aValue.AppendInt(height);
aValue.AppendWithConversion("px");
}
}
@ -346,22 +361,64 @@ nsHTMLImageElement::GetHeight(nsString& aValue)
NS_IMETHODIMP
nsHTMLImageElement::SetHeight(const nsString& aValue)
{
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, aValue, PR_TRUE);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, aValue,
PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::GetHeight(PRInt32* aHeight)
{
NS_ENSURE_ARG_POINTER(aHeight);
*aHeight = 0;
nsImageFrame* imageFrame;
nsresult rv = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(rv) && imageFrame) {
nsSize size;
imageFrame->GetSize(size);
nsCOMPtr<nsIPresContext> context;
rv = nsGenericHTMLElement::GetPresContext(this, getter_AddRefs(context));
if (NS_SUCCEEDED(rv) && context) {
float t2p;
context->GetTwipsToPixels(&t2p);
*aHeight = NSTwipsToIntPixels(size.height, t2p);
}
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLImageElement::SetHeight(PRInt32 aHeight)
{
nsAutoString val;
val.AppendInt(aHeight);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::height,
val, PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::GetWidth(nsString& aValue)
{
nsresult result;
nsresult rv = mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::width,
aValue);
if (NS_CONTENT_ATTR_NOT_THERE == mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, aValue)) {
nsImageFrame* imageFrame;
result = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(result)) {
nsSize size;
imageFrame->GetIntrinsicImageSize(size);
aValue.AppendInt(size.width);
if (rv == NS_CONTENT_ATTR_NOT_THERE) {
PRInt32 width = 0;
aValue.Truncate();
// A zero width most likely means that the image is not loaded yet.
if (NS_SUCCEEDED(GetWidth(&width)) && width) {
aValue.AppendInt(width);
aValue.AppendWithConversion("px");
}
}
@ -371,9 +428,48 @@ nsHTMLImageElement::GetWidth(nsString& aValue)
NS_IMETHODIMP
nsHTMLImageElement::SetWidth(const nsString& aValue)
{
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, aValue, PR_TRUE);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, aValue,
PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::GetWidth(PRInt32* aWidth)
{
NS_ENSURE_ARG_POINTER(aWidth);
*aWidth = 0;
nsImageFrame* imageFrame;
nsresult rv = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(rv) && imageFrame) {
nsSize size;
imageFrame->GetSize(size);
nsCOMPtr<nsIPresContext> context;
rv = nsGenericHTMLElement::GetPresContext(this, getter_AddRefs(context));
if (NS_SUCCEEDED(rv) && context) {
float t2p;
context->GetTwipsToPixels(&t2p);
*aWidth = NSTwipsToIntPixels(size.width, t2p);
}
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLImageElement::SetWidth(PRInt32 aWidth)
{
nsAutoString val;
val.AppendInt(aWidth);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width,
val, PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::StringToAttribute(nsIAtom* aAttribute,

View File

@ -68,14 +68,14 @@ public:
NS_IMETHOD GetSrc(nsString& aSrc)=0;
NS_IMETHOD SetSrc(const nsString& aSrc)=0;
NS_IMETHOD GetUseMap(nsString& aUseMap)=0;
NS_IMETHOD SetUseMap(const nsString& aUseMap)=0;
NS_IMETHOD GetVspace(nsString& aVspace)=0;
NS_IMETHOD SetVspace(const nsString& aVspace)=0;
NS_IMETHOD GetWidth(nsString& aWidth)=0;
NS_IMETHOD SetWidth(const nsString& aWidth)=0;
NS_IMETHOD GetUseMap(nsString& aUseMap)=0;
NS_IMETHOD SetUseMap(const nsString& aUseMap)=0;
};
@ -100,12 +100,12 @@ public:
NS_IMETHOD SetLongDesc(const nsString& aLongDesc); \
NS_IMETHOD GetSrc(nsString& aSrc); \
NS_IMETHOD SetSrc(const nsString& aSrc); \
NS_IMETHOD GetUseMap(nsString& aUseMap); \
NS_IMETHOD SetUseMap(const nsString& aUseMap); \
NS_IMETHOD GetVspace(nsString& aVspace); \
NS_IMETHOD SetVspace(const nsString& aVspace); \
NS_IMETHOD GetWidth(nsString& aWidth); \
NS_IMETHOD SetWidth(const nsString& aWidth); \
NS_IMETHOD GetUseMap(nsString& aUseMap); \
NS_IMETHOD SetUseMap(const nsString& aUseMap); \
@ -130,12 +130,12 @@ public:
NS_IMETHOD SetLongDesc(const nsString& aLongDesc) { return _to SetLongDesc(aLongDesc); } \
NS_IMETHOD GetSrc(nsString& aSrc) { return _to GetSrc(aSrc); } \
NS_IMETHOD SetSrc(const nsString& aSrc) { return _to SetSrc(aSrc); } \
NS_IMETHOD GetUseMap(nsString& aUseMap) { return _to GetUseMap(aUseMap); } \
NS_IMETHOD SetUseMap(const nsString& aUseMap) { return _to SetUseMap(aUseMap); } \
NS_IMETHOD GetVspace(nsString& aVspace) { return _to GetVspace(aVspace); } \
NS_IMETHOD SetVspace(const nsString& aVspace) { return _to SetVspace(aVspace); } \
NS_IMETHOD GetWidth(nsString& aWidth) { return _to GetWidth(aWidth); } \
NS_IMETHOD SetWidth(const nsString& aWidth) { return _to SetWidth(aWidth); } \
NS_IMETHOD GetUseMap(nsString& aUseMap) { return _to GetUseMap(aUseMap); } \
NS_IMETHOD SetUseMap(const nsString& aUseMap) { return _to SetUseMap(aUseMap); } \
extern "C" NS_DOM nsresult NS_InitHTMLImageElementClass(nsIScriptContext *aContext, void **aPrototype);

View File

@ -41,6 +41,21 @@ public:
NS_IMETHOD SetLowsrc(const nsString& aLowsrc)=0;
NS_IMETHOD GetComplete(PRBool* aComplete)=0;
NS_IMETHOD GetBorder(PRInt32* aBorder)=0;
NS_IMETHOD SetBorder(PRInt32 aBorder)=0;
NS_IMETHOD GetHeight(PRInt32* aHeight)=0;
NS_IMETHOD SetHeight(PRInt32 aHeight)=0;
NS_IMETHOD GetHspace(PRInt32* aHspace)=0;
NS_IMETHOD SetHspace(PRInt32 aHspace)=0;
NS_IMETHOD GetVspace(PRInt32* aVspace)=0;
NS_IMETHOD SetVspace(PRInt32 aVspace)=0;
NS_IMETHOD GetWidth(PRInt32* aWidth)=0;
NS_IMETHOD SetWidth(PRInt32 aWidth)=0;
};
@ -48,6 +63,16 @@ public:
NS_IMETHOD GetLowsrc(nsString& aLowsrc); \
NS_IMETHOD SetLowsrc(const nsString& aLowsrc); \
NS_IMETHOD GetComplete(PRBool* aComplete); \
NS_IMETHOD GetBorder(PRInt32* aBorder); \
NS_IMETHOD SetBorder(PRInt32 aBorder); \
NS_IMETHOD GetHeight(PRInt32* aHeight); \
NS_IMETHOD SetHeight(PRInt32 aHeight); \
NS_IMETHOD GetHspace(PRInt32* aHspace); \
NS_IMETHOD SetHspace(PRInt32 aHspace); \
NS_IMETHOD GetVspace(PRInt32* aVspace); \
NS_IMETHOD SetVspace(PRInt32 aVspace); \
NS_IMETHOD GetWidth(PRInt32* aWidth); \
NS_IMETHOD SetWidth(PRInt32 aWidth); \
@ -55,6 +80,16 @@ public:
NS_IMETHOD GetLowsrc(nsString& aLowsrc) { return _to GetLowsrc(aLowsrc); } \
NS_IMETHOD SetLowsrc(const nsString& aLowsrc) { return _to SetLowsrc(aLowsrc); } \
NS_IMETHOD GetComplete(PRBool* aComplete) { return _to GetComplete(aComplete); } \
NS_IMETHOD GetBorder(PRInt32* aBorder) { return _to GetBorder(aBorder); } \
NS_IMETHOD SetBorder(PRInt32 aBorder) { return _to SetBorder(aBorder); } \
NS_IMETHOD GetHeight(PRInt32* aHeight) { return _to GetHeight(aHeight); } \
NS_IMETHOD SetHeight(PRInt32 aHeight) { return _to SetHeight(aHeight); } \
NS_IMETHOD GetHspace(PRInt32* aHspace) { return _to GetHspace(aHspace); } \
NS_IMETHOD SetHspace(PRInt32 aHspace) { return _to SetHspace(aHspace); } \
NS_IMETHOD GetVspace(PRInt32* aVspace) { return _to GetVspace(aVspace); } \
NS_IMETHOD SetVspace(PRInt32 aVspace) { return _to SetVspace(aVspace); } \
NS_IMETHOD GetWidth(PRInt32* aWidth) { return _to GetWidth(aWidth); } \
NS_IMETHOD SetWidth(PRInt32 aWidth) { return _to SetWidth(aWidth); } \
#endif // nsIDOMImage_h__

View File

@ -1,8 +1,5 @@
interface HTMLImageElement : HTMLElement {
interface HTMLImageElement : HTMLElement {
/* IID: { 0xa6cf90ab, 0x15b3, 0x11d2, \
{ 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } } */
/* IID: { 0xa6cf90c8, 0x15b3, 0x11d2, \
{ 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } } */
void HTMLImageElement();
@ -11,22 +8,29 @@
attribute DOMString name;
attribute DOMString align;
attribute DOMString alt;
attribute DOMString border;
attribute DOMString height;
attribute DOMString hspace;
noscript attribute DOMString border;
noscript attribute DOMString height;
noscript attribute DOMString hspace;
attribute boolean isMap;
attribute DOMString longDesc;
noscript attribute DOMString src;
noscript attribute DOMString src;
noscript attribute DOMString vspace;
noscript attribute DOMString width;
attribute DOMString useMap;
attribute DOMString vspace;
attribute DOMString width;
};
};
interface Image {
interface Image {
/* IID: { 0xa6cf90c7, 0x15b3, 0x11d2, \
{ 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } } */
void Image();
attribute DOMString lowsrc;
readonly attribute boolean complete;
};
void Image();
attribute DOMString lowsrc;
readonly attribute boolean complete;
/* Needed for backwards compatibility */
attribute long border;
attribute long height;
attribute long hspace;
attribute long vspace;
attribute long width;
};

View File

@ -446,17 +446,12 @@ enum nsDOMProp {
NS_DOM_PROP_HTMLIFRAMEELEMENT_WIDTH,
NS_DOM_PROP_HTMLIMAGEELEMENT_ALIGN,
NS_DOM_PROP_HTMLIMAGEELEMENT_ALT,
NS_DOM_PROP_HTMLIMAGEELEMENT_BORDER,
NS_DOM_PROP_HTMLIMAGEELEMENT_HEIGHT,
NS_DOM_PROP_HTMLIMAGEELEMENT_HSPACE,
NS_DOM_PROP_HTMLIMAGEELEMENT_ISMAP,
NS_DOM_PROP_HTMLIMAGEELEMENT_LONGDESC,
NS_DOM_PROP_HTMLIMAGEELEMENT_LOWSRC,
NS_DOM_PROP_HTMLIMAGEELEMENT_NAME,
NS_DOM_PROP_HTMLIMAGEELEMENT_SRC,
NS_DOM_PROP_HTMLIMAGEELEMENT_USEMAP,
NS_DOM_PROP_HTMLIMAGEELEMENT_VSPACE,
NS_DOM_PROP_HTMLIMAGEELEMENT_WIDTH,
NS_DOM_PROP_HTMLINPUTELEMENT_ACCEPT,
NS_DOM_PROP_HTMLINPUTELEMENT_ACCESSKEY,
NS_DOM_PROP_HTMLINPUTELEMENT_ALIGN,
@ -659,8 +654,13 @@ enum nsDOMProp {
NS_DOM_PROP_HTMLTITLEELEMENT_TEXT,
NS_DOM_PROP_HTMLULISTELEMENT_COMPACT,
NS_DOM_PROP_HTMLULISTELEMENT_TYPE,
NS_DOM_PROP_IMAGE_BORDER,
NS_DOM_PROP_IMAGE_COMPLETE,
NS_DOM_PROP_IMAGE_HEIGHT,
NS_DOM_PROP_IMAGE_HSPACE,
NS_DOM_PROP_IMAGE_LOWSRC,
NS_DOM_PROP_IMAGE_VSPACE,
NS_DOM_PROP_IMAGE_WIDTH,
NS_DOM_PROP_JAVASCRIPT_ENABLED,
NS_DOM_PROP_KEYEVENT_ALTKEY,
NS_DOM_PROP_KEYEVENT_CHARCODE,

View File

@ -445,17 +445,12 @@
"htmliframeelement.width", \
"htmlimageelement.align", \
"htmlimageelement.alt", \
"htmlimageelement.border", \
"htmlimageelement.height", \
"htmlimageelement.hspace", \
"htmlimageelement.ismap", \
"htmlimageelement.longdesc", \
"htmlimageelement.lowsrc", \
"htmlimageelement.name", \
"htmlimageelement.src", \
"htmlimageelement.usemap", \
"htmlimageelement.vspace", \
"htmlimageelement.width", \
"htmlinputelement.accept", \
"htmlinputelement.accesskey", \
"htmlinputelement.align", \
@ -658,8 +653,13 @@
"htmltitleelement.text", \
"htmlulistelement.compact", \
"htmlulistelement.type", \
"image.border", \
"image.complete", \
"image.height", \
"image.hspace", \
"image.lowsrc", \
"image.vspace", \
"image.width", \
"javascript.enabled", \
"keyevent.altkey", \
"keyevent.charcode", \

View File

@ -56,16 +56,16 @@ enum HTMLImageElement_slots {
HTMLIMAGEELEMENT_NAME = -2,
HTMLIMAGEELEMENT_ALIGN = -3,
HTMLIMAGEELEMENT_ALT = -4,
HTMLIMAGEELEMENT_BORDER = -5,
HTMLIMAGEELEMENT_HEIGHT = -6,
HTMLIMAGEELEMENT_HSPACE = -7,
HTMLIMAGEELEMENT_ISMAP = -8,
HTMLIMAGEELEMENT_LONGDESC = -9,
HTMLIMAGEELEMENT_USEMAP = -10,
HTMLIMAGEELEMENT_VSPACE = -11,
HTMLIMAGEELEMENT_WIDTH = -12,
IMAGE_LOWSRC = -13,
IMAGE_COMPLETE = -14
HTMLIMAGEELEMENT_ISMAP = -5,
HTMLIMAGEELEMENT_LONGDESC = -6,
HTMLIMAGEELEMENT_USEMAP = -7,
IMAGE_LOWSRC = -8,
IMAGE_COMPLETE = -9,
IMAGE_BORDER = -10,
IMAGE_HEIGHT = -11,
IMAGE_HSPACE = -12,
IMAGE_VSPACE = -13,
IMAGE_WIDTH = -14
};
/***********************************************************************/
@ -136,42 +136,6 @@ GetHTMLImageElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case HTMLIMAGEELEMENT_BORDER:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_BORDER, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
rv = a->GetBorder(prop);
if (NS_SUCCEEDED(rv)) {
nsJSUtils::nsConvertStringToJSVal(prop, cx, vp);
}
}
break;
}
case HTMLIMAGEELEMENT_HEIGHT:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_HEIGHT, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
rv = a->GetHeight(prop);
if (NS_SUCCEEDED(rv)) {
nsJSUtils::nsConvertStringToJSVal(prop, cx, vp);
}
}
break;
}
case HTMLIMAGEELEMENT_HSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_HSPACE, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
rv = a->GetHspace(prop);
if (NS_SUCCEEDED(rv)) {
nsJSUtils::nsConvertStringToJSVal(prop, cx, vp);
}
}
break;
}
case HTMLIMAGEELEMENT_ISMAP:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_ISMAP, PR_FALSE);
@ -208,30 +172,6 @@ GetHTMLImageElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case HTMLIMAGEELEMENT_VSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_VSPACE, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
rv = a->GetVspace(prop);
if (NS_SUCCEEDED(rv)) {
nsJSUtils::nsConvertStringToJSVal(prop, cx, vp);
}
}
break;
}
case HTMLIMAGEELEMENT_WIDTH:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_WIDTH, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
rv = a->GetWidth(prop);
if (NS_SUCCEEDED(rv)) {
nsJSUtils::nsConvertStringToJSVal(prop, cx, vp);
}
}
break;
}
case IMAGE_LOWSRC:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_LOWSRC, PR_FALSE);
@ -270,6 +210,101 @@ GetHTMLImageElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case IMAGE_BORDER:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_BORDER, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
nsIDOMImage* b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
rv = b->GetBorder(&prop);
if(NS_SUCCEEDED(rv)) {
*vp = INT_TO_JSVAL(prop);
}
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_HEIGHT:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_HEIGHT, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
nsIDOMImage* b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
rv = b->GetHeight(&prop);
if(NS_SUCCEEDED(rv)) {
*vp = INT_TO_JSVAL(prop);
}
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_HSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_HSPACE, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
nsIDOMImage* b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
rv = b->GetHspace(&prop);
if(NS_SUCCEEDED(rv)) {
*vp = INT_TO_JSVAL(prop);
}
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_VSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_VSPACE, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
nsIDOMImage* b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
rv = b->GetVspace(&prop);
if(NS_SUCCEEDED(rv)) {
*vp = INT_TO_JSVAL(prop);
}
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_WIDTH:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_WIDTH, PR_FALSE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
nsIDOMImage* b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
rv = b->GetWidth(&prop);
if(NS_SUCCEEDED(rv)) {
*vp = INT_TO_JSVAL(prop);
}
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
default:
return nsJSUtils::nsCallJSScriptObjectGetProperty(a, cx, obj, id, vp);
}
@ -351,42 +386,6 @@ SetHTMLImageElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case HTMLIMAGEELEMENT_BORDER:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_BORDER, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
nsJSUtils::nsConvertJSValToString(prop, cx, *vp);
rv = a->SetBorder(prop);
}
break;
}
case HTMLIMAGEELEMENT_HEIGHT:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_HEIGHT, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
nsJSUtils::nsConvertJSValToString(prop, cx, *vp);
rv = a->SetHeight(prop);
}
break;
}
case HTMLIMAGEELEMENT_HSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_HSPACE, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
nsJSUtils::nsConvertJSValToString(prop, cx, *vp);
rv = a->SetHspace(prop);
}
break;
}
case HTMLIMAGEELEMENT_ISMAP:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_ISMAP, PR_TRUE);
@ -426,30 +425,6 @@ SetHTMLImageElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case HTMLIMAGEELEMENT_VSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_VSPACE, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
nsJSUtils::nsConvertJSValToString(prop, cx, *vp);
rv = a->SetVspace(prop);
}
break;
}
case HTMLIMAGEELEMENT_WIDTH:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_HTMLIMAGEELEMENT_WIDTH, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
nsAutoString prop;
nsJSUtils::nsConvertJSValToString(prop, cx, *vp);
rv = a->SetWidth(prop);
}
break;
}
case IMAGE_LOWSRC:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_LOWSRC, PR_TRUE);
@ -470,6 +445,141 @@ SetHTMLImageElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
case IMAGE_BORDER:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_BORDER, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
int32 temp;
if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
prop = (PRInt32)temp;
}
else {
rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
break;
}
nsIDOMImage *b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
b->SetBorder(prop);
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_HEIGHT:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_HEIGHT, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
int32 temp;
if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
prop = (PRInt32)temp;
}
else {
rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
break;
}
nsIDOMImage *b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
b->SetHeight(prop);
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_HSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_HSPACE, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
int32 temp;
if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
prop = (PRInt32)temp;
}
else {
rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
break;
}
nsIDOMImage *b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
b->SetHspace(prop);
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_VSPACE:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_VSPACE, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
int32 temp;
if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
prop = (PRInt32)temp;
}
else {
rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
break;
}
nsIDOMImage *b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
b->SetVspace(prop);
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
case IMAGE_WIDTH:
{
rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_IMAGE_WIDTH, PR_TRUE);
if (NS_SUCCEEDED(rv)) {
PRInt32 prop;
int32 temp;
if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
prop = (PRInt32)temp;
}
else {
rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
break;
}
nsIDOMImage *b;
if (NS_OK == a->QueryInterface(kIImageIID, (void **)&b)) {
b->SetWidth(prop);
NS_RELEASE(b);
}
else {
rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
}
}
break;
}
default:
return nsJSUtils::nsCallJSScriptObjectSetProperty(a, cx, obj, id, vp);
}
@ -543,16 +653,16 @@ static JSPropertySpec HTMLImageElementProperties[] =
{"name", HTMLIMAGEELEMENT_NAME, JSPROP_ENUMERATE},
{"align", HTMLIMAGEELEMENT_ALIGN, JSPROP_ENUMERATE},
{"alt", HTMLIMAGEELEMENT_ALT, JSPROP_ENUMERATE},
{"border", HTMLIMAGEELEMENT_BORDER, JSPROP_ENUMERATE},
{"height", HTMLIMAGEELEMENT_HEIGHT, JSPROP_ENUMERATE},
{"hspace", HTMLIMAGEELEMENT_HSPACE, JSPROP_ENUMERATE},
{"isMap", HTMLIMAGEELEMENT_ISMAP, JSPROP_ENUMERATE},
{"longDesc", HTMLIMAGEELEMENT_LONGDESC, JSPROP_ENUMERATE},
{"useMap", HTMLIMAGEELEMENT_USEMAP, JSPROP_ENUMERATE},
{"vspace", HTMLIMAGEELEMENT_VSPACE, JSPROP_ENUMERATE},
{"width", HTMLIMAGEELEMENT_WIDTH, JSPROP_ENUMERATE},
{"lowsrc", IMAGE_LOWSRC, JSPROP_ENUMERATE},
{"complete", IMAGE_COMPLETE, JSPROP_ENUMERATE | JSPROP_READONLY},
{"border", IMAGE_BORDER, JSPROP_ENUMERATE},
{"height", IMAGE_HEIGHT, JSPROP_ENUMERATE},
{"hspace", IMAGE_HSPACE, JSPROP_ENUMERATE},
{"vspace", IMAGE_VSPACE, JSPROP_ENUMERATE},
{"width", IMAGE_WIDTH, JSPROP_ENUMERATE},
{0}
};

View File

@ -118,6 +118,16 @@ public:
NS_IMETHOD GetLowsrc(nsString& aLowsrc);
NS_IMETHOD SetLowsrc(const nsString& aLowsrc);
NS_IMETHOD GetComplete(PRBool* aComplete);
NS_IMETHOD GetBorder(PRInt32* aBorder);
NS_IMETHOD SetBorder(PRInt32 aBorder);
NS_IMETHOD GetHeight(PRInt32* aHeight);
NS_IMETHOD SetHeight(PRInt32 aHeight);
NS_IMETHOD GetHspace(PRInt32* aHspace);
NS_IMETHOD SetHspace(PRInt32 aHspace);
NS_IMETHOD GetVspace(PRInt32* aVspace);
NS_IMETHOD SetVspace(PRInt32 aVspace);
NS_IMETHOD GetWidth(PRInt32* aWidth);
NS_IMETHOD SetWidth(PRInt32 aWidth);
// nsIContent
@ -252,12 +262,15 @@ NS_IMPL_STRING_ATTR(nsHTMLImageElement, Name, name)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Align, align)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Alt, alt)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Border, border)
NS_IMPL_INT_ATTR(nsHTMLImageElement, Border, border)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Hspace, hspace)
NS_IMPL_INT_ATTR(nsHTMLImageElement, Hspace, hspace)
NS_IMPL_BOOL_ATTR(nsHTMLImageElement, IsMap, ismap)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, LongDesc, longdesc)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Lowsrc, lowsrc)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, UseMap, usemap)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Vspace, vspace)
NS_IMPL_STRING_ATTR(nsHTMLImageElement, Lowsrc, lowsrc)
NS_IMPL_INT_ATTR(nsHTMLImageElement, Vspace, vspace)
nsresult
nsHTMLImageElement::GetImageFrame(nsImageFrame** aImageFrame)
@ -327,16 +340,18 @@ nsHTMLImageElement::GetComplete(PRBool* aComplete)
NS_IMETHODIMP
nsHTMLImageElement::GetHeight(nsString& aValue)
{
nsresult result;
nsresult rv = mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::height,
aValue);
if (NS_CONTENT_ATTR_NOT_THERE == mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, aValue)) {
nsImageFrame* imageFrame;
result = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(result)) {
nsSize size;
imageFrame->GetIntrinsicImageSize(size);
aValue.AppendInt(size.height);
if (rv == NS_CONTENT_ATTR_NOT_THERE) {
PRInt32 height = 0;
aValue.Truncate();
// A zero height most likely means that the image is not loaded yet.
if (NS_SUCCEEDED(GetHeight(&height)) && height) {
aValue.AppendInt(height);
aValue.AppendWithConversion("px");
}
}
@ -346,22 +361,64 @@ nsHTMLImageElement::GetHeight(nsString& aValue)
NS_IMETHODIMP
nsHTMLImageElement::SetHeight(const nsString& aValue)
{
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, aValue, PR_TRUE);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, aValue,
PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::GetHeight(PRInt32* aHeight)
{
NS_ENSURE_ARG_POINTER(aHeight);
*aHeight = 0;
nsImageFrame* imageFrame;
nsresult rv = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(rv) && imageFrame) {
nsSize size;
imageFrame->GetSize(size);
nsCOMPtr<nsIPresContext> context;
rv = nsGenericHTMLElement::GetPresContext(this, getter_AddRefs(context));
if (NS_SUCCEEDED(rv) && context) {
float t2p;
context->GetTwipsToPixels(&t2p);
*aHeight = NSTwipsToIntPixels(size.height, t2p);
}
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLImageElement::SetHeight(PRInt32 aHeight)
{
nsAutoString val;
val.AppendInt(aHeight);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::height,
val, PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::GetWidth(nsString& aValue)
{
nsresult result;
nsresult rv = mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::width,
aValue);
if (NS_CONTENT_ATTR_NOT_THERE == mInner.GetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, aValue)) {
nsImageFrame* imageFrame;
result = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(result)) {
nsSize size;
imageFrame->GetIntrinsicImageSize(size);
aValue.AppendInt(size.width);
if (rv == NS_CONTENT_ATTR_NOT_THERE) {
PRInt32 width = 0;
aValue.Truncate();
// A zero width most likely means that the image is not loaded yet.
if (NS_SUCCEEDED(GetWidth(&width)) && width) {
aValue.AppendInt(width);
aValue.AppendWithConversion("px");
}
}
@ -371,9 +428,48 @@ nsHTMLImageElement::GetWidth(nsString& aValue)
NS_IMETHODIMP
nsHTMLImageElement::SetWidth(const nsString& aValue)
{
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, aValue, PR_TRUE);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, aValue,
PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::GetWidth(PRInt32* aWidth)
{
NS_ENSURE_ARG_POINTER(aWidth);
*aWidth = 0;
nsImageFrame* imageFrame;
nsresult rv = GetImageFrame(&imageFrame);
if (NS_SUCCEEDED(rv) && imageFrame) {
nsSize size;
imageFrame->GetSize(size);
nsCOMPtr<nsIPresContext> context;
rv = nsGenericHTMLElement::GetPresContext(this, getter_AddRefs(context));
if (NS_SUCCEEDED(rv) && context) {
float t2p;
context->GetTwipsToPixels(&t2p);
*aWidth = NSTwipsToIntPixels(size.width, t2p);
}
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLImageElement::SetWidth(PRInt32 aWidth)
{
nsAutoString val;
val.AppendInt(aWidth);
return mInner.SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width,
val, PR_TRUE);
}
NS_IMETHODIMP
nsHTMLImageElement::StringToAttribute(nsIAtom* aAttribute,