blob: 0f8c61694ff95e9b499c7c74afe0e981382e6d19 [file] [log] [blame]
/*
* 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* node)
{
return node && allowsAccessFromFrame(exec, node->document()->frame());
}
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);
if (XMLHttpRequest* xhr = target->toXMLHttpRequest())
// XMLHttpRequest is always created via JS, so we don't need to use cacheDOMObject() here.
return ScriptInterpreter::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 KJS::Bindings::Instance::createRuntimeObject(plugInElement->getInstance());
}
#endif
// If we don't have a runtime object return 0.
return 0;
}
} // namespace WebCore