webengine/osswebengine/WebCore/bindings/js/kjs_html.cpp
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/bindings/js/kjs_html.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,141 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ *  This file is part of the KDE libraries
+ *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
+ *  Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ *
+ *  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_html.h"
+
+#include "Frame.h"
+#include "FrameLoader.h"
+#include "JSHTMLElement.h"
+#include "HTMLDocument.h"
+#include "HTMLImageElement.h"
+#include "kjs_proxy.h"
+
+namespace WebCore {
+
+using namespace KJS;
+
+ImageConstructorImp::ImageConstructorImp(ExecState* exec, Document* doc)
+    : m_doc(doc)
+{
+    setPrototype(exec->lexicalInterpreter()->builtinObjectPrototype());
+}
+
+JSObject* ImageConstructorImp::construct(ExecState*  exec, const List& list)
+{
+    bool widthSet = false;
+    bool heightSet = false;
+    int width = 0;
+    int height = 0;
+
+    if (list.size() > 0) {
+        widthSet = true;
+        JSValue* w = list.at(0);
+        width = w->toInt32(exec);
+    }
+
+    if (list.size() > 1) {
+        heightSet = true;
+        JSValue* h = list.at(1);
+        height = h->toInt32(exec);
+    }
+
+    HTMLImageElement* image = new HTMLImageElement(m_doc.get());
+    JSObject* result = static_cast<JSObject*>(toJS(exec, image));
+
+    if (widthSet)
+        image->setWidth(width);
+    if (heightSet)
+        image->setHeight(height);
+
+    return result;
+}
+
+// -------------------------------------------------------------------------
+
+// Runtime object support code for JSHTMLAppletElement, JSHTMLEmbedElement and JSHTMLObjectElement.
+
+JSValue* runtimeObjectGetter(ExecState* exec, JSObject* originalObject, const Identifier& propertyName, const PropertySlot& slot)
+{
+    JSHTMLElement* thisObj = static_cast<JSHTMLElement*>(slot.slotBase());
+    HTMLElement* element = static_cast<HTMLElement*>(thisObj->impl());
+
+    return getRuntimeObject(exec, element);
+}
+
+JSValue* runtimeObjectPropertyGetter(ExecState* exec, JSObject* originalObject, const Identifier& propertyName, const PropertySlot& slot)
+{
+    JSHTMLElement* thisObj = static_cast<JSHTMLElement*>(slot.slotBase());
+    HTMLElement* element = static_cast<HTMLElement*>(thisObj->impl());
+
+    if (JSValue* runtimeObject = getRuntimeObject(exec, element))
+        return static_cast<JSObject*>(runtimeObject)->get(exec, propertyName);
+    return jsUndefined();
+}
+
+bool runtimeObjectCustomGetOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot, WebCore::JSHTMLElement* originalObj, HTMLElement* thisImp)
+{
+    JSValue* runtimeObject = getRuntimeObject(exec, thisImp);
+    if (runtimeObject) {
+        JSObject* imp = static_cast<JSObject*>(runtimeObject);
+        if (imp->hasProperty(exec, propertyName)) {
+            slot.setCustom(originalObj, runtimeObjectPropertyGetter);
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool runtimeObjectCustomPut(ExecState* exec, const Identifier& propertyName, JSValue* value, int /*attr*/, HTMLElement* thisImp)
+{
+    if (JSValue* runtimeObject = getRuntimeObject(exec, thisImp)) {
+        JSObject* imp = static_cast<JSObject*>(runtimeObject);
+        if (imp->canPut(exec, propertyName)) {
+            imp->put(exec, propertyName, value);
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool runtimeObjectImplementsCall(HTMLElement* thisImp)
+{
+    Frame* frame = thisImp->document()->frame();
+    if (!frame)
+        return false;
+    KJSProxy* proxy = frame->scriptProxy();
+    ExecState* exec = proxy->interpreter()->globalExec();
+    if (JSValue* runtimeObject = getRuntimeObject(exec, thisImp))
+        return static_cast<JSObject*>(runtimeObject)->implementsCall();
+
+    return false;
+}
+
+JSValue* runtimeObjectCallAsFunction(ExecState* exec, JSObject* thisObj, const List& args, HTMLElement* thisImp)
+{
+    if (JSValue* runtimeObject = getRuntimeObject(exec, thisImp))
+        return static_cast<JSObject*>(runtimeObject)->call(exec, thisObj, args);
+    return jsUndefined();
+}
+
+} // namespace WebCore