JSDOMWindowShell.cpp [plain text]
#include "config.h"
#include "JSDOMWindowShell.h"
#include "Frame.h"
#include "GCController.h"
#include "JSDOMWindow.h"
#include "DOMWindow.h"
#include "ScriptController.h"
#include <heap/StrongInlines.h>
#include <runtime/JSObject.h>
using namespace JSC;
namespace WebCore {
const ClassInfo JSDOMWindowShell::s_info = { "JSDOMWindowShell", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSDOMWindowShell) };
JSDOMWindowShell::JSDOMWindowShell(Structure* structure, DOMWrapperWorld* world)
: Base(*world->vm(), structure)
, m_world(world)
{
}
void JSDOMWindowShell::finishCreation(VM& vm, PassRefPtr<DOMWindow> window)
{
Base::finishCreation(vm);
ASSERT(inherits(&s_info));
setWindow(window);
}
void JSDOMWindowShell::destroy(JSCell* cell)
{
static_cast<JSDOMWindowShell*>(cell)->JSDOMWindowShell::~JSDOMWindowShell();
}
void JSDOMWindowShell::setWindow(JSC::VM& vm, JSDOMWindow* window)
{
ASSERT_ARG(window, window);
setTarget(vm, window);
structure()->setGlobalObject(*JSDOMWindow::commonVM(), window);
gcController().garbageCollectSoon();
}
void JSDOMWindowShell::setWindow(PassRefPtr<DOMWindow> domWindow)
{
ASSERT(!window() || domWindow.get() != window()->impl());
Structure* prototypeStructure = JSDOMWindowPrototype::createStructure(*JSDOMWindow::commonVM(), 0, jsNull());
Strong<JSDOMWindowPrototype> prototype(*JSDOMWindow::commonVM(), JSDOMWindowPrototype::create(*JSDOMWindow::commonVM(), 0, prototypeStructure));
Structure* structure = JSDOMWindow::createStructure(*JSDOMWindow::commonVM(), 0, prototype.get());
JSDOMWindow* jsDOMWindow = JSDOMWindow::create(*JSDOMWindow::commonVM(), structure, domWindow, this);
prototype->structure()->setGlobalObject(*JSDOMWindow::commonVM(), jsDOMWindow);
setWindow(*JSDOMWindow::commonVM(), jsDOMWindow);
ASSERT(jsDOMWindow->globalObject() == jsDOMWindow);
ASSERT(prototype->globalObject() == jsDOMWindow);
}
DOMWindow* JSDOMWindowShell::impl() const
{
return window()->impl();
}
JSValue toJS(ExecState* exec, Frame* frame)
{
if (!frame)
return jsNull();
return frame->script()->windowShell(currentWorld(exec));
}
JSDOMWindowShell* toJSDOMWindowShell(Frame* frame, DOMWrapperWorld* isolatedWorld)
{
if (!frame)
return 0;
return frame->script()->windowShell(isolatedWorld);
}
}