patch for 'cssFloat'
David Hyatt
hyatt at apple.com
Wed Oct 1 14:34:09 CEST 2003
hasProperty and tryGet didn't do the right thing for 'cssFloat' in the
Safari tree. Because hasProperty is called when you try to set using a
with clause, e.g.,
with (elt.style) {
cssFloat = 'right';
}
the DHTML menus on aa.com mispositioned their arrow images (this also
affects tivocommunity.com, bfcu.com, and anyone else who uses
webreference's HierMenus DHTML framework).
I also added support for mapping "-khtml-" properties so that they
could be set/retrieved from JS. If you guys are still using "-konq-",
watch out for that code and do what you think is best.
dave
Index: khtml/ecma/kjs_css.cpp
===================================================================
RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/ecma/kjs_css.cpp,v
retrieving revision 1.12
diff -u -p -r1.12 khtml/ecma/kjs_css.cpp
--- khtml/ecma/kjs_css.cpp 2003/05/23 00:04:31 1.12
+++ khtml/ecma/kjs_css.cpp 2003/10/01 20:26:37
@@ -31,18 +31,37 @@
using namespace KJS;
#include <kdebug.h>
-static QString jsNameToProp( const Identifier &p )
+static QString cssPropertyName(const Identifier &p, bool
*hadPixelOrPosPrefix = 0)
{
QString prop = p.qstring();
+
int i = prop.length();
- while( --i ) {
+ while (--i) {
char c = prop[i].latin1();
- if ( c < 'A' || c > 'Z' )
- continue;
- prop.insert( i, '-' );
+ if (c >= 'A' && c <= 'Z')
+ prop.insert(i, '-');
}
+
+ prop = prop.lower();
- return prop.lower();
+ if (hadPixelOrPosPrefix)
+ *hadPixelOrPosPrefix = false;
+
+ if (prop.startsWith("css-")) {
+ prop = prop.mid(4);
+ } else if (prop.startsWith("pixel-")) {
+ prop = prop.mid(6);
+ if (hadPixelOrPosPrefix)
+ *hadPixelOrPosPrefix = true;
+ } else if (prop.startsWith("pos-")) {
+ prop = prop.mid(4);
+ if (hadPixelOrPosPrefix)
+ *hadPixelOrPosPrefix = true;
+ } else if (prop.startsWith("khtml-")) {
+ prop.insert(0, '-');
+ }
+
+ return prop;
}
/*
@@ -77,9 +96,11 @@ DOMCSSStyleDeclaration::~DOMCSSStyleDecl
bool DOMCSSStyleDeclaration::hasProperty(ExecState *exec, const
Identifier &p) const
{
- DOM::DOMString cssprop = jsNameToProp(p);
- // strip pos- / pixel- prefix here?
- if (DOM::getPropertyID(cssprop.string().ascii(), cssprop.length()))
+ if (p == "cssText")
+ return true;
+
+ QString prop = cssPropertyName(p);
+ if (DOM::getPropertyID(prop.ascii(), prop.length()))
return true;
return ObjectImp::hasProperty(exec, p);
@@ -114,26 +135,21 @@ Value DOMCSSStyleDeclaration::tryGet(Exe
return
getStringOrNull(DOM::CSSStyleDeclaration(styleDecl).item(u));
#ifdef KJS_VERBOSE
- kdDebug(6070) << "DOMCSSStyleDeclaration: converting to css property
name: " << jsNameToProp(propertyName) << endl;
+ kdDebug(6070) << "DOMCSSStyleDeclaration: converting to css property
name: " << cssPropertyName(propertyName) << endl;
#endif
DOM::CSSStyleDeclaration styleDecl2 = styleDecl;
- DOM::DOMString p = jsNameToProp(propertyName);
- bool asNumber = false;
+
+ // Set up pixelOrPos boolean to handle the fact that
// pixelTop returns "CSS Top" as number value in unit pixels
// posTop returns "CSS top" as number value in unit pixels _if_ its a
// positioned element. if it is not a positioned element, return 0
// from MSIE documentation ### IMPLEMENT THAT (Dirk)
- {
- QString prop = p.string();
- if(prop.startsWith( "pixel-") || prop.startsWith( "pos-" ) ) {
- p = prop.mid(prop.find( '-' )+1);
- asNumber = true;
- }
- }
+ bool pixelOrPos;
+ DOM::DOMString p = cssPropertyName(propertyName, &pixelOrPos);
DOM::CSSValue v = styleDecl2.getPropertyCSSValue(p);
if (!v.isNull()) {
- if (asNumber && v.cssValueType() ==
DOM::CSSValue::CSS_PRIMITIVE_VALUE)
+ if (pixelOrPos && v.cssValueType() ==
DOM::CSSValue::CSS_PRIMITIVE_VALUE)
return
Number(static_cast<DOM::CSSPrimitiveValue>(v).getFloatValue(DOM::
CSSPrimitiveValue::CSS_PX));
return getStringOrNull(v.cssText());
@@ -148,10 +164,8 @@ Value DOMCSSStyleDeclaration::tryGet(Exe
}
-void DOMCSSStyleDeclaration::tryPut(ExecState *exec, const Identifier
&pName, const Value& value, int )
+void DOMCSSStyleDeclaration::tryPut(ExecState *exec, const Identifier
&propertyName, const Value& value, int )
{
- Identifier propertyName = pName;
-
#ifdef KJS_VERBOSE
kdDebug(6070) << "DOMCSSStyleDeclaration::tryPut " <<
propertyName.qstring() << endl;
#endif
@@ -159,16 +173,11 @@ void DOMCSSStyleDeclaration::tryPut(Exec
styleDecl.setCssText(value.toString(exec).string());
}
else {
- QString prop = jsNameToProp(propertyName);
+ bool pixelOrPos;
+ QString prop = cssPropertyName(propertyName, &pixelOrPos);
QString propvalue = value.toString(exec).qstring();
-
- if(prop.left(4) == "css-")
- prop = prop.mid(4);
-
- if(prop.startsWith( "pixel-") || prop.startsWith( "pos-" ) ) {
- prop = prop.mid(prop.find( '-' )+1);
+ if (pixelOrPos)
propvalue += "px";
- }
#ifdef KJS_VERBOSE
kdDebug(6070) << "DOMCSSStyleDeclaration: prop=" << prop << "
propvalue=" << propvalue << endl;
#endif
More information about the Khtml-devel
mailing list