webengine/osswebengine/WebCore/bindings/js/kjs_dom.cpp
changeset 0 dd21522fd290
child 68 92a765b5b3e7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/bindings/js/kjs_dom.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,116 @@
+/*
+ *  Copyright (C) 2000 Harri Porten (porten@kde.org)
+ *  Copyright (C) 2006 Jon Shier (jshier@iastate.edu)
+ *  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_dom.h"
+
+#include "Document.h"
+#include "EventTarget.h"
+#include "Frame.h"
+#include "HTMLNames.h"
+#include "HTMLPlugInElement.h"
+#include "JSAttr.h"
+#include "JSNode.h"
+#include "XMLHttpRequest.h"
+#include "kjs_events.h"
+#include "kjs_window.h"
+
+#if ENABLE(SVG)
+#include "JSSVGElementInstance.h"
+#endif
+
+#if USE(JAVASCRIPTCORE_BINDINGS)
+#include <bindings/runtime_object.h>
+#endif
+
+namespace WebCore {
+
+using namespace KJS;
+using namespace HTMLNames;
+
+Attr* toAttr(JSValue* val, bool& ok)
+{
+    if (!val || !val->isObject(&JSAttr::info)) {
+        ok = false;
+        return 0;
+    }
+
+    ok = true;
+    return static_cast<Attr*>(static_cast<JSNode*>(val)->impl());
+}
+
+bool checkNodeSecurity(ExecState* exec, Node* n)
+{
+  if (!n) 
+    return false;
+
+  // Check to see if the currently executing interpreter is allowed to access the specified node
+  Window* win = Window::retrieveWindow(n->document()->frame());
+  return win && win->isSafeScript(exec);
+}
+
+JSValue* toJS(ExecState* exec, EventTarget* target)
+{
+    if (!target)
+        return jsNull();
+    
+#if ENABLE(SVG)
+    // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node.
+    SVGElementInstance* instance = target->toSVGElementInstance();
+    if (instance)
+        return toJS(exec, instance);
+#endif
+    
+    Node* node = target->toNode();
+    if (node)
+        return toJS(exec, node);
+
+    XMLHttpRequest* xhr = target->toXMLHttpRequest();
+    if (xhr) {
+        // XMLHttpRequest is always created via JS, so we don't need to use cacheDOMObject() here.
+        ScriptInterpreter* interp = static_cast<ScriptInterpreter*>(exec->dynamicInterpreter());
+        return interp->getDOMObject(xhr);
+    }
+
+    // There are two kinds of EventTargets: EventTargetNode and XMLHttpRequest.
+    // If SVG support is enabled, there is also SVGElementInstance.
+    ASSERT(0);
+    return jsNull();
+}
+
+JSValue* getRuntimeObject(ExecState* exec, Node* n)
+{
+    if (!n)
+        return 0;
+
+#if USE(JAVASCRIPTCORE_BINDINGS)
+    if (n->hasTagName(objectTag) || n->hasTagName(embedTag) || n->hasTagName(appletTag)) {
+        HTMLPlugInElement* plugInElement = static_cast<HTMLPlugInElement*>(n);
+        if (plugInElement->getInstance() && plugInElement->getInstance()->rootObject())
+            // The instance is owned by the PlugIn element.
+            return new RuntimeObjectImp(plugInElement->getInstance());
+    }
+#endif
+
+    // If we don't have a runtime object return 0.
+    return 0;
+}
+
+} // namespace WebCore