2007-10-20 Rodney Dawes <dobey@wayofthemonkey.com>
[WebKit-https.git] / WebCore / bindings / js / kjs_dom.cpp
1 /*
2  *  Copyright (C) 2000 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2006 Jon Shier (jshier@iastate.edu)
4  *  Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 #include "config.h"
22 #include "kjs_dom.h"
23
24 #include "Document.h"
25 #include "EventTarget.h"
26 #include "Frame.h"
27 #include "HTMLNames.h"
28 #include "HTMLPlugInElement.h"
29 #include "JSAttr.h"
30 #include "JSNode.h"
31 #include "XMLHttpRequest.h"
32 #include "kjs_events.h"
33 #include "kjs_window.h"
34
35 #if ENABLE(SVG)
36 #include "JSSVGElementInstance.h"
37 #endif
38
39 #if USE(JAVASCRIPTCORE_BINDINGS)
40 #include <bindings/runtime_object.h>
41 #endif
42
43 namespace WebCore {
44
45 using namespace KJS;
46 using namespace HTMLNames;
47
48 Attr* toAttr(JSValue* val, bool& ok)
49 {
50     if (!val || !val->isObject(&JSAttr::info)) {
51         ok = false;
52         return 0;
53     }
54
55     ok = true;
56     return static_cast<Attr*>(static_cast<JSNode*>(val)->impl());
57 }
58
59 bool checkNodeSecurity(ExecState* exec, Node* n)
60 {
61   if (!n) 
62     return false;
63
64   // Check to see if the currently executing interpreter is allowed to access the specified node
65   KJS::Window* win = KJS::Window::retrieveWindow(n->document()->frame());
66   return win && win->isSafeScript(exec);
67 }
68
69 JSValue* toJS(ExecState* exec, EventTarget* target)
70 {
71     if (!target)
72         return jsNull();
73     
74 #if ENABLE(SVG)
75     // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node.
76     SVGElementInstance* instance = target->toSVGElementInstance();
77     if (instance)
78         return toJS(exec, instance);
79 #endif
80     
81     Node* node = target->toNode();
82     if (node)
83         return toJS(exec, node);
84
85     XMLHttpRequest* xhr = target->toXMLHttpRequest();
86     if (xhr) {
87         // XMLHttpRequest is always created via JS, so we don't need to use cacheDOMObject() here.
88         ScriptInterpreter* interp = static_cast<ScriptInterpreter*>(exec->dynamicInterpreter());
89         return interp->getDOMObject(xhr);
90     }
91
92     // There are two kinds of EventTargets: EventTargetNode and XMLHttpRequest.
93     // If SVG support is enabled, there is also SVGElementInstance.
94     ASSERT(0);
95     return jsNull();
96 }
97
98 JSValue* getRuntimeObject(ExecState* exec, Node* n)
99 {
100     if (!n)
101         return 0;
102
103 #if USE(JAVASCRIPTCORE_BINDINGS)
104     if (n->hasTagName(objectTag) || n->hasTagName(embedTag) || n->hasTagName(appletTag)) {
105         HTMLPlugInElement* plugInElement = static_cast<HTMLPlugInElement*>(n);
106         if (plugInElement->getInstance() && plugInElement->getInstance()->rootObject())
107             // The instance is owned by the PlugIn element.
108             return new RuntimeObjectImp(plugInElement->getInstance());
109     }
110 #endif
111
112     // If we don't have a runtime object return 0.
113     return 0;
114 }
115
116 } // namespace WebCore