summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp')
-rw-r--r--WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp b/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp
new file mode 100644
index 0000000..0723410
--- /dev/null
+++ b/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "JSCSSStyleDeclaration.h"
+
+#include "AtomicString.h"
+#include "CSSPrimitiveValue.h"
+#include "CSSStyleDeclaration.h"
+#include "CSSValue.h"
+#include "PlatformString.h"
+#include <kjs/string_object.h>
+#include <wtf/ASCIICType.h>
+
+using namespace KJS;
+using namespace WTF;
+
+namespace WebCore {
+
+// Check for a CSS prefix.
+// Passed prefix is all lowercase.
+// First characters of property name may be upper or lowercase.
+// Other characters in the prefix within the property name must be lowercase.
+// The prefix within the property name must be followed by a capital letter.
+static bool hasCSSPropertyNamePrefix(const Identifier& propertyName, const char* prefix)
+{
+#ifndef NDEBUG
+ ASSERT(*prefix);
+ for (const char* p = prefix; *p; ++p)
+ ASSERT(isASCIILower(*p));
+#endif
+
+ unsigned length = propertyName.size();
+ ASSERT(length);
+
+ if (toASCIILower(propertyName.data()[0].unicode()) != prefix[0])
+ return false;
+
+ for (unsigned i = 1; i < length; ++i) {
+ if (!prefix[i])
+ return isASCIIUpper(propertyName.data()[i].unicode());
+ if (propertyName.data()[0].unicode() != prefix[0])
+ return false;
+ }
+ return false;
+}
+
+static String cssPropertyName(const Identifier& propertyName, bool* hadPixelOrPosPrefix = 0)
+{
+ if (hadPixelOrPosPrefix)
+ *hadPixelOrPosPrefix = false;
+
+ unsigned length = propertyName.size();
+ if (!length)
+ return String();
+
+ Vector< ::UChar> name;
+ name.reserveCapacity(length);
+
+ unsigned i = 0;
+
+ if (hasCSSPropertyNamePrefix(propertyName, "css"))
+ i += 3;
+ else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) {
+ i += 5;
+ if (hadPixelOrPosPrefix)
+ *hadPixelOrPosPrefix = true;
+ } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) {
+ i += 3;
+ if (hadPixelOrPosPrefix)
+ *hadPixelOrPosPrefix = true;
+ } else if (hasCSSPropertyNamePrefix(propertyName, "webkit")
+ || hasCSSPropertyNamePrefix(propertyName, "khtml")
+ || hasCSSPropertyNamePrefix(propertyName, "apple"))
+ name.append('-');
+
+ name.append(toASCIILower(propertyName.data()[i++].unicode()));
+
+ for (; i < length; ++i) {
+ ::UChar c = propertyName.data()[i].unicode();
+ if (!isASCIIUpper(c))
+ name.append(c);
+ else {
+ name.append('-');
+ name.append(toASCIILower(c));
+ }
+ }
+
+ return String::adopt(name);
+}
+
+static bool isCSSPropertyName(const Identifier& propertyName)
+{
+ return CSSStyleDeclaration::isPropertyName(cssPropertyName(propertyName));
+}
+
+bool JSCSSStyleDeclaration::canGetItemsForName(ExecState*, CSSStyleDeclaration*, const Identifier& propertyName)
+{
+ return isCSSPropertyName(propertyName);
+}
+
+// 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, JSObject* originalObject,
+ const Identifier& propertyName, const PropertySlot& slot)
+{
+ JSCSSStyleDeclaration* thisObj = static_cast<JSCSSStyleDeclaration*>(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(static_pointer_cast<CSSPrimitiveValue>(v)->getFloatValue(CSSPrimitiveValue::CSS_PX));
+ return jsStringOrNull(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 new StringInstanceThatMasqueradesAsUndefined(exec->lexicalGlobalObject()->stringPrototype(),
+ thisObj->impl()->getPropertyValue(prop));
+
+ return jsString(thisObj->impl()->getPropertyValue(prop));
+}
+
+
+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;
+}
+
+} // namespace WebCore