// FIXME: You can get these properties, and set them (see customPut below), // but you should also be able to enumerate them. JSValue JSCSSStyleDeclaration::nameGetter(ExecState* exec, const Identifier& propertyName, const PropertySlot& slot) { JSCSSStyleDeclaration* thisObj = static_cast<JSCSSStyleDeclaration*>(asObject(slot.slotBase())); // 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 FIXME: IMPLEMENT THAT (Dirk) bool pixelOrPos; String prop = cssPropertyName(propertyName, &pixelOrPos); RefPtr<CSSValue> v = thisObj->impl()->getPropertyCSSValue(prop); if (v) { if (pixelOrPos && v->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE) return jsNumber(exec, static_pointer_cast<CSSPrimitiveValue>(v)->getFloatValue(CSSPrimitiveValue::CSS_PX)); return jsStringOrNull(exec, v->cssText()); } // If the property is a shorthand property (such as "padding"), // it can only be accessed using getPropertyValue. // Make the SVG 'filter' attribute undetectable, to avoid confusion with the IE 'filter' attribute. if (propertyName == "filter") return StringObjectThatMasqueradesAsUndefined::create(exec, thisObj->impl()->getPropertyValue(prop)); return jsString(exec, thisObj->impl()->getPropertyValue(prop)); }
void DOMCSSStyleDeclaration::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr ) { #ifdef KJS_VERBOSE kdDebug(6070) << "DOMCSSStyleDeclaration::tryPut " << propertyName.qstring() << endl; #endif if (propertyName == "cssText") { styleDecl.setCssText(value.toString(exec).string()); } else { bool pxSuffix; QString prop = cssPropertyName(propertyName, pxSuffix); QString propvalue = value.toString(exec).qstring(); if (pxSuffix) propvalue += "px"; #ifdef KJS_VERBOSE kdDebug(6070) << "DOMCSSStyleDeclaration: prop=" << prop << " propvalue=" << propvalue << endl; #endif // Look whether the property is known.d In that case add it as a CSS property. if (DOM::getPropertyID(prop.latin1(), prop.length())) { if (propvalue.isEmpty()) styleDecl.removeProperty(prop); else { int important = propvalue.find("!important", 0, false); if (important == -1) styleDecl.setProperty(prop, DOM::DOMString(propvalue), ""); else styleDecl.setProperty(prop, DOM::DOMString(propvalue.left(important - 1)), "important"); } } else // otherwise add it as a JS property DOMObject::tryPut( exec, propertyName, value, attr ); } }
Value DOMCSSStyleDeclaration::tryGet(ExecState *exec, const Identifier &propertyName) const { #ifdef KJS_VERBOSE kdDebug(6070) << "DOMCSSStyleDeclaration::tryGet " << propertyName.qstring() << endl; #endif const HashEntry *entry = Lookup::findEntry(&DOMCSSStyleDeclarationTable, propertyName); if(entry) switch(entry->value) { case CssText: return String(styleDecl.cssText()); case Length: return Number(styleDecl.length()); case ParentRule: return getDOMCSSRule(exec, styleDecl.parentRule()); default: break; } // Look in the prototype (for functions) before assuming it's a name Object proto = Object::dynamicCast(prototype()); if(proto.isValid() && proto.hasProperty(exec, propertyName)) return proto.get(exec, propertyName); bool ok; long unsigned int u = propertyName.toULong(&ok); if(ok) return String(DOM::CSSStyleDeclaration(styleDecl).item(u)); // 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) bool asNumber; QString p = cssPropertyName(propertyName, asNumber); #ifdef KJS_VERBOSE kdDebug(6070) << "DOMCSSStyleDeclaration: converting to css property name: " << p << (asNumber ? "px" : "") << endl; #endif if(asNumber) { DOM::CSSValue v = styleDecl.getPropertyCSSValue(p); if(!v.isNull() && v.cssValueType() == DOM::CSSValue::CSS_PRIMITIVE_VALUE) return Number(static_cast< DOM::CSSPrimitiveValue >(v).getFloatValue(DOM::CSSPrimitiveValue::CSS_PX)); } DOM::DOMString str = const_cast< DOM::CSSStyleDeclaration & >(styleDecl).getPropertyValue(p); if(!str.isNull()) return String(str); // see if we know this css property, return empty then if(DOM::getPropertyID(p.latin1(), p.length())) return String(DOM::DOMString("")); return DOMObject::tryGet(exec, propertyName); }
bool DOMCSSStyleDeclaration::hasProperty(ExecState *exec, const Identifier &p) const { bool hadPixelPrefix; QString cssprop = cssPropertyName(p, hadPixelPrefix); if(DOM::getPropertyID(cssprop.latin1(), cssprop.length())) return true; return ObjectImp::hasProperty(exec, p); }
bool JSCSSStyleDeclaration::customPut(ExecState* exec, const Identifier& propertyName, JSValue* value) { if (!isCSSPropertyName(propertyName)) return false; DOMExceptionTranslator exception(exec); bool pixelOrPos; String prop = cssPropertyName(propertyName, &pixelOrPos); String propValue = valueToStringWithNullCheck(exec, value); if (pixelOrPos) propValue += "px"; impl()->setProperty(prop, propValue, exception); return true; }
bool JSCSSStyleDeclaration::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot&) { bool pixelOrPos; String prop = cssPropertyName(propertyName, &pixelOrPos); if (!cssPropertyID(prop)) return false; String propValue = valueToStringWithNullCheck(exec, value); if (pixelOrPos) propValue += "px"; ExceptionCode ec = 0; impl()->setProperty(prop, propValue, emptyString(), ec); setDOMException(exec, ec); return true; }
JSValue JSCSSStyleDeclaration::nameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) { JSCSSStyleDeclaration* thisObj = static_cast<JSCSSStyleDeclaration*>(asObject(slotBase)); // 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 FIXME: IMPLEMENT THAT (Dirk) bool pixelOrPos; String prop = cssPropertyName(propertyName, &pixelOrPos); RefPtr<CSSValue> v = thisObj->impl()->getPropertyCSSValue(prop); if (v) { if (pixelOrPos && v->isPrimitiveValue()) return jsNumber(static_pointer_cast<CSSPrimitiveValue>(v)->getFloatValue(CSSPrimitiveValue::CSS_PX)); return jsStringOrNull(exec, v->cssText()); } // If the property is a shorthand property (such as "padding"), // it can only be accessed using getPropertyValue. return jsString(exec, thisObj->impl()->getPropertyValue(prop)); }
static bool isCSSPropertyName(const Identifier& propertyName) { return CSSStyleDeclaration::isPropertyName(cssPropertyName(propertyName)); }
static bool isCSSPropertyName(const Identifier& propertyIdentifier) { return cssPropertyID(cssPropertyName(propertyIdentifier)); }
static bool isCSSPropertyName(const Identifier& propertyIdentifier) { // FIXME: This mallocs a string for the property name and then throws it // away. This shows up on peacekeeper's domDynamicCreationCreateElement. return CSSStyleDeclaration::isPropertyName(cssPropertyName(propertyIdentifier)); }