blob: f816cbb3e0437fe034db2c7ba8f4e7532006dbc6 [file] [log] [blame]
/*
* This file is part of the KDE libraries
* Copyright (C) 2000 Harri Porten (porten@kde.org)
* Copyright (C) 2003 Apple Computer, Inc.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef KJS_WINDOW_H_
#define KJS_WINDOW_H_
#include "DeprecatedString.h"
#include "kjs_binding.h"
#include <wtf/HashMap.h>
namespace WebCore {
class AtomicString;
class DOMWindow;
class Frame;
class FrameView;
class JSDOMWindow;
class Node;
}
namespace KJS {
class BarInfo;
class FrameArray;
class History;
class JSEventListener;
class JSLazyEventListener;
class JSUnprotectedEventListener;
class Location;
class PausedTimeout;
class ScheduledAction;
class Selection;
class Window;
class WindowFunc;
class PausedTimeouts {
public:
PausedTimeouts(PausedTimeout *a, size_t length) : m_array(a), m_length(length) { }
~PausedTimeouts();
size_t numTimeouts() const { return m_length; }
PausedTimeout *takeTimeouts()
{ PausedTimeout *a = m_array; m_array = 0; return a; }
private:
PausedTimeout *m_array;
size_t m_length;
PausedTimeouts(const PausedTimeouts&);
PausedTimeouts& operator=(const PausedTimeouts&);
};
class DOMWindowTimer;
class Screen : public DOMObject {
public:
enum { Height, Width, ColorDepth, PixelDepth, AvailLeft, AvailTop, AvailHeight, AvailWidth };
virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
JSValue *getValueProperty(ExecState *exec, int token) const;
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
friend class Window;
Screen(ExecState*, WebCore::Frame*);
WebCore::Frame* m_frame;
};
class Window : public DOMObject {
friend class Location;
friend class WindowFunc;
friend class ScheduledAction;
protected:
Window(WebCore::DOMWindow*);
public:
~Window();
WebCore::DOMWindow* impl() const;
void disconnectFrame();
/**
* Returns and registers a window object. In case there's already a Window
* for the specified frame p this will be returned in order to have unique
* bindings.
*/
static JSValue* retrieve(WebCore::Frame*);
/**
* Returns the Window object for a given HTML frame
*/
static Window* retrieveWindow(WebCore::Frame*);
/**
* returns a pointer to the Window object this javascript interpreting instance
* was called from.
*/
static Window* retrieveActive(ExecState*);
WebCore::Frame* frame() const { return m_frame; }
virtual void mark();
virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
bool getOverridePropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
JSValue *getValueProperty(ExecState *exec, int token) const;
virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
virtual bool toBoolean(ExecState*) const;
int installTimeout(const UString& handler, int t, bool singleShot);
int installTimeout(JSValue* function, const List& args, int t, bool singleShot);
void clearTimeout(int timerId, bool delAction = true);
PausedTimeouts* pauseTimeouts();
void resumeTimeouts(PausedTimeouts*);
void timerFired(DOMWindowTimer*);
KJS::ScriptInterpreter *interpreter() const;
void scheduleClose();
bool isSafeScript(ExecState*) const;
static bool isSafeScript(const ScriptInterpreter *origin, const ScriptInterpreter *target);
Location *location() const;
Selection *selection() const;
BarInfo *locationbar(ExecState*) const;
BarInfo *menubar(ExecState*) const;
BarInfo *personalbar(ExecState*) const;
BarInfo *scrollbars(ExecState*) const;
BarInfo *statusbar(ExecState*) const;
BarInfo *toolbar(ExecState*) const;
JSEventListener *getJSEventListener(JSValue*, bool html = false);
JSUnprotectedEventListener *getJSUnprotectedEventListener(JSValue*, bool html = false);
void clear();
virtual UString toString(ExecState *) const;
// Set the current "event" object
void setCurrentEvent(WebCore::Event*);
// Set a place to put a dialog return value when the window is cleared.
void setReturnValueSlot(JSValue **slot) { m_returnValueSlot = slot; }
typedef HashMap<JSObject*, JSEventListener*> ListenersMap;
typedef HashMap<JSObject*, JSUnprotectedEventListener*> UnprotectedListenersMap;
ListenersMap jsEventListeners;
ListenersMap jsHTMLEventListeners;
UnprotectedListenersMap jsUnprotectedEventListeners;
UnprotectedListenersMap jsUnprotectedHTMLEventListeners;
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
enum { Closed, Crypto, DefaultStatus, Status, DOMException, Frames, History_, Event_, InnerHeight,
InnerWidth, Length, Location_, Locationbar, Name, Navigator_, ClientInformation,
Menubar, OffscreenBuffering, Opener, OuterHeight, OuterWidth, PageXOffset, PageYOffset,
Parent, Personalbar, ScreenX, ScreenY, Scrollbars, Scroll, ScrollBy,
ScreenTop, ScreenLeft,
ScrollTo, ScrollX, ScrollY, MoveBy, MoveTo, ResizeBy, ResizeTo, Self, Window_, Top, Screen_,
Image, Option, Alert, Confirm, Prompt, Open, Print, SetTimeout, ClearTimeout,
Focus, GetSelection, Blur, Close, SetInterval, ClearInterval, CaptureEvents,
ReleaseEvents, AddEventListener, RemoveEventListener,
XMLHttpRequest, XMLSerializer, DOMParser_, XSLTProcessor_,
Onabort, Onblur, Onchange, Onclick, Ondblclick, Ondragdrop, Onerror,
Onfocus, Onkeydown, Onkeypress, Onkeyup, Onload, Onmousedown, Onmousemove,
Onmouseout, Onmouseover, Onmouseup, OnWindowMouseWheel, Onmove, Onreset, Onresize, Onscroll, Onsearch,
Onselect, Onsubmit, Onunload, Onbeforeunload,
Statusbar, Toolbar, FrameElement, ShowModalDialog };
private:
JSValue* getListener(ExecState*, const WebCore::AtomicString& eventType) const;
void setListener(ExecState*, const WebCore::AtomicString& eventType, JSValue* func);
static JSValue *childFrameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
static JSValue *namedFrameGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
static JSValue *indexGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
static JSValue *namedItemGetter(ExecState *exec, JSObject *, const Identifier&, const PropertySlot& slot);
void updateLayout() const;
void clearAllTimeouts();
int installTimeout(ScheduledAction*, int interval, bool singleShot);
WebCore::Frame* m_frame;
mutable Screen* screen;
mutable History* history;
mutable FrameArray* frames;
mutable Location* loc;
mutable Selection* m_selection;
mutable BarInfo* m_locationbar;
mutable BarInfo* m_menubar;
mutable BarInfo* m_personalbar;
mutable BarInfo* m_scrollbars;
mutable BarInfo* m_statusbar;
mutable BarInfo* m_toolbar;
WebCore::Event *m_evt;
JSValue **m_returnValueSlot;
typedef HashMap<int, DOMWindowTimer*> TimeoutsMap;
TimeoutsMap m_timeouts;
};
/**
* An action (either function or string) to be executed after a specified
* time interval, either once or repeatedly. Used for window.setTimeout()
* and window.setInterval()
*/
class ScheduledAction {
public:
ScheduledAction(JSValue *func, const List& args)
: m_func(func), m_args(args) { }
ScheduledAction(const WebCore::DeprecatedString& code)
: m_code(code) { }
void execute(Window *);
private:
ProtectedPtr<JSValue> m_func;
List m_args;
WebCore::DeprecatedString m_code;
};
class Location : public DOMObject {
public:
virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
JSValue *getValueProperty(ExecState *exec, int token) const;
virtual void put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr = None);
virtual JSValue *toPrimitive(ExecState *exec, JSType preferred) const;
virtual UString toString(ExecState*) const;
enum { Hash, Href, Hostname, Host, Pathname, Port, Protocol, Search, EqualEqual,
Replace, Reload, ToString, Assign };
WebCore::Frame* frame() const { return m_frame; }
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
friend class Window;
Location(WebCore::Frame*);
WebCore::Frame* m_frame;
};
class Selection : public DOMObject {
public:
virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
JSValue *getValueProperty(ExecState *exec, int token) const;
virtual JSValue *toPrimitive(ExecState *exec, JSType preferred) const;
virtual UString toString(ExecState*) const;
enum { AnchorNode, AnchorOffset, FocusNode, FocusOffset, BaseNode, BaseOffset, ExtentNode, ExtentOffset,
IsCollapsed, _Type, EqualEqual, Collapse, CollapseToEnd, CollapseToStart, Empty, ToString,
SetBaseAndExtent, SetPosition, Modify, GetRangeAt };
WebCore::Frame* frame() const { return m_frame; }
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
friend class Window;
Selection(WebCore::Frame*);
WebCore::Frame* m_frame;
};
class BarInfo : public DOMObject {
public:
virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
JSValue *getValueProperty(ExecState *exec, int token) const;
enum { Visible };
enum Type { Locationbar, Menubar, Personalbar, Scrollbars, Statusbar, Toolbar };
WebCore::Frame* frame() const { return m_frame; }
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
friend class Window;
BarInfo(ExecState*, WebCore::Frame*, Type);
WebCore::Frame* m_frame;
Type m_type;
};
} // namespace
namespace WebCore {
KJS::JSValue* toJS(KJS::ExecState*, DOMWindow*);
DOMWindow* toDOMWindow(KJS::JSValue*);
} // namespace WebCore
#endif