#include "config.h"
#include "kjs_proxy.h"
#include "kjs_events.h"
#include "kjs_window.h"
#include "Frame.h"
#include "JSDOMWindow.h"
#if SVG_SUPPORT
#include "JSSVGLazyEventListener.h"
#endif
using namespace KJS;
namespace WebCore {
KJSProxy::KJSProxy(Frame* frame)
{
m_frame = frame;
m_handlerLineno = 0;
}
KJSProxy::~KJSProxy()
{
JSLock lock;
Collector::collect();
}
JSValue* KJSProxy::evaluate(const String& filename, int baseLine, const String& str, Node* n)
{
initScriptIfNeeded();
bool inlineCode = filename.isNull();
m_script->setInlineCode(inlineCode);
JSLock lock;
JSValue* thisNode = n ? Window::retrieve(m_frame) : toJS(m_script->globalExec(), n);
m_script->startTimeoutCheck();
Completion comp = m_script->evaluate(filename, baseLine, reinterpret_cast<const KJS::UChar*>(str.characters()), str.length(), thisNode);
m_script->stopTimeoutCheck();
if (comp.complType() == Normal || comp.complType() == ReturnValue)
return comp.value();
if (comp.complType() == Throw) {
UString errorMessage = comp.value()->toString(m_script->globalExec());
int lineNumber = comp.value()->toObject(m_script->globalExec())->get(m_script->globalExec(), "line")->toInt32(m_script->globalExec());
UString sourceURL = comp.value()->toObject(m_script->globalExec())->get(m_script->globalExec(), "sourceURL")->toString(m_script->globalExec());
m_frame->addMessageToConsole(errorMessage, lineNumber, sourceURL);
}
return 0;
}
void KJSProxy::clear() {
if (m_script) {
Window *win = Window::retrieveWindow(m_frame);
if (win)
win->clear();
}
}
EventListener* KJSProxy::createHTMLEventHandler(const String& functionName, const String& code, Node* node)
{
initScriptIfNeeded();
JSLock lock;
return new JSLazyEventListener(functionName, code, Window::retrieveWindow(m_frame), node, m_handlerLineno);
}
#if SVG_SUPPORT
EventListener* KJSProxy::createSVGEventHandler(const String& functionName, const String& code, Node* node)
{
initScriptIfNeeded();
JSLock lock;
return new JSSVGLazyEventListener(functionName, code, Window::retrieveWindow(m_frame), node, m_handlerLineno);
}
#endif
void KJSProxy::finishedWithEvent(Event* event)
{
m_script->forgetDOMObject(event);
}
ScriptInterpreter* KJSProxy::interpreter()
{
initScriptIfNeeded();
assert(m_script);
return m_script.get();
}
void KJSProxy::initScriptIfNeeded()
{
if (m_script)
return;
JSLock lock;
JSObject* globalObject = new JSDOMWindow(m_frame->domWindow());
m_script = new ScriptInterpreter(globalObject, m_frame);
String userAgent = m_frame->userAgent();
if (userAgent.find("Microsoft") >= 0 || userAgent.find("MSIE") >= 0)
m_script->setCompatMode(Interpreter::IECompat);
else
if (userAgent.find("Mozilla") >= 0 && userAgent.find("compatible") == -1)
m_script->setCompatMode(Interpreter::NetscapeCompat);
}
}