--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/bindings/js/kjs_css.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,210 @@
+// -*- c-basic-offset: 2 -*-
+/*
+ * This file is part of the KDE libraries
+ * Copyright (C) 2000 Harri Porten (porten@kde.org)
+ * Copyright (C) 2001 Peter Kelly (pmk@post.com)
+ * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 James G. Speth (speth@end.com)
+ * Copyright (C) 2006 Samuel Weinig (sam@webkit.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "kjs_css.h"
+
+#include "CSSRule.h"
+#include "CSSRuleList.h"
+#include "Document.h"
+#include "HTMLNames.h"
+#include "HTMLStyleElement.h"
+#include "JSCSSPrimitiveValue.h"
+#include "JSCSSRule.h"
+#include "JSCSSRuleList.h"
+#include "JSStyleSheet.h"
+#include "StyleSheetList.h"
+#include "kjs_dom.h"
+
+#include "kjs_css.lut.h"
+
+namespace WebCore {
+
+using namespace KJS;
+using namespace HTMLNames;
+
+const ClassInfo JSStyleSheetList::info = { "StyleSheetList", 0, &JSStyleSheetListTable, 0 };
+
+/*
+@begin JSStyleSheetListTable 2
+ length WebCore::JSStyleSheetList::Length DontDelete|ReadOnly
+ item WebCore::JSStyleSheetList::Item DontDelete|Function 1
+@end
+*/
+
+KJS_IMPLEMENT_PROTOTYPE_FUNCTION(JSStyleSheetListFunc) // not really a prototype, but doesn't matter
+
+JSStyleSheetList::JSStyleSheetList(ExecState* exec, StyleSheetList* styleSheetList, Document* doc)
+ : m_impl(styleSheetList)
+ , m_doc(doc)
+{
+ setPrototype(exec->lexicalInterpreter()->builtinObjectPrototype());
+}
+
+JSStyleSheetList::~JSStyleSheetList()
+{
+ ScriptInterpreter::forgetDOMObject(m_impl.get());
+}
+
+JSValue* JSStyleSheetList::getValueProperty(ExecState* exec, int token) const
+{
+ switch (token) {
+ case Length:
+ return jsNumber(m_impl->length());
+ default:
+ ASSERT_NOT_REACHED();
+ return jsUndefined();
+ }
+}
+
+JSValue* JSStyleSheetList::indexGetter(ExecState* exec, JSObject* originalObject, const Identifier& propertyName, const PropertySlot& slot)
+{
+ JSStyleSheetList* thisObj = static_cast<JSStyleSheetList*>(slot.slotBase());
+ return toJS(exec, thisObj->m_impl->item(slot.index()));
+}
+
+JSValue* JSStyleSheetList::nameGetter(ExecState* exec, JSObject* originalObject, const Identifier& propertyName, const PropertySlot& slot)
+{
+ JSStyleSheetList* thisObj = static_cast<JSStyleSheetList*>(slot.slotBase());
+ Element* element = thisObj->m_doc->getElementById(propertyName);
+ return toJS(exec, static_cast<HTMLStyleElement*>(element)->sheet());
+}
+
+bool JSStyleSheetList::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ const HashEntry* entry = Lookup::findEntry(&JSStyleSheetListTable, propertyName);
+
+ if (entry) {
+ switch(entry->value) {
+ case Length:
+ slot.setStaticEntry(this, entry, staticValueGetter<JSStyleSheetList>);
+ return true;
+ case Item:
+ slot.setStaticEntry(this, entry, staticFunctionGetter<JSStyleSheetListFunc>);
+ return true;
+ }
+ }
+
+ StyleSheetList* styleSheetList = m_impl.get();
+
+ // Retrieve stylesheet by index
+ bool ok;
+ unsigned u = propertyName.toUInt32(&ok);
+ if (ok && u < styleSheetList->length()) {
+ slot.setCustomIndex(this, u, indexGetter);
+ return true;
+ }
+
+ // IE also supports retrieving a stylesheet by name, using the name/id of the <style> tag
+ // (this is consistent with all the other collections)
+ // ### Bad implementation because returns a single element (are IDs always unique?)
+ // and doesn't look for name attribute (see implementation above).
+ // But unicity of stylesheet ids is good practice anyway ;)
+ Element* element = m_doc->getElementById(propertyName);
+ if (element && element->hasTagName(styleTag)) {
+ slot.setCustom(this, nameGetter);
+ return true;
+ }
+
+ return DOMObject::getOwnPropertySlot(exec, propertyName, slot);
+}
+
+JSValue* toJS(ExecState* exec, StyleSheetList* styleSheetList, Document* doc)
+{
+ // Can't use the cacheDOMObject macro because of the doc argument
+ if (!styleSheetList)
+ return jsNull();
+
+ ScriptInterpreter* interp = static_cast<ScriptInterpreter*>(exec->dynamicInterpreter());
+ DOMObject* ret = interp->getDOMObject(styleSheetList);
+ if (ret)
+ return ret;
+
+ ret = new JSStyleSheetList(exec, styleSheetList, doc);
+ interp->putDOMObject(styleSheetList, ret);
+ return ret;
+}
+
+JSValue* JSStyleSheetListFunc::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args)
+{
+ if (!thisObj->inherits(&JSStyleSheetList::info))
+ return throwError(exec, TypeError);
+
+ StyleSheetList* styleSheetList = static_cast<JSStyleSheetList*>(thisObj)->impl();
+ if (id == JSStyleSheetList::Item)
+ return toJS(exec, styleSheetList->item(args[0]->toInt32(exec)));
+ return jsUndefined();
+}
+
+// -------------------------------------------------------------------------
+
+const ClassInfo JSRGBColor::info = { "RGBColor", 0, &JSRGBColorTable, 0 };
+
+/*
+@begin JSRGBColorTable 3
+ red WebCore::JSRGBColor::Red DontDelete|ReadOnly
+ green WebCore::JSRGBColor::Green DontDelete|ReadOnly
+ blue WebCore::JSRGBColor::Blue DontDelete|ReadOnly
+@end
+*/
+
+JSRGBColor::JSRGBColor(ExecState* exec, unsigned color)
+ : m_color(color)
+{
+ setPrototype(exec->lexicalInterpreter()->builtinObjectPrototype());
+}
+
+JSRGBColor::~JSRGBColor()
+{
+}
+
+bool JSRGBColor::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticValueSlot<JSRGBColor, DOMObject>(exec, &JSRGBColorTable, this, propertyName, slot);
+}
+
+JSValue* JSRGBColor::getValueProperty(ExecState* exec, int token) const
+{
+ int color = m_color;
+ switch (token) {
+ case Red:
+ color >>= 8;
+ // fall through
+ case Green:
+ color >>= 8;
+ // fall through
+ case Blue:
+ return toJS(exec, new CSSPrimitiveValue(color & 0xFF, CSSPrimitiveValue::CSS_NUMBER));
+ default:
+ return 0;
+ }
+}
+
+JSValue* getJSRGBColor(ExecState* exec, unsigned color)
+{
+ // FIXME: implement equals for RGBColor since they're not refcounted objects
+ return new JSRGBColor(exec, color);
+}
+
+} // namespace WebCore