📄 kjs_window.cpp
字号:
{
if (!m_selection)
const_cast<Window*>(this)->m_selection = new Selection(m_part);
return m_selection;
}
BarInfo *Window::locationbar(ExecState *exec) const
{
if (!m_locationbar)
const_cast<Window*>(this)->m_locationbar = new BarInfo(exec, m_part, BarInfo::Locationbar);
return m_locationbar;
}
BarInfo *Window::menubar(ExecState *exec) const
{
if (!m_menubar)
const_cast<Window*>(this)->m_menubar = new BarInfo(exec, m_part, BarInfo::Menubar);
return m_menubar;
}
BarInfo *Window::personalbar(ExecState *exec) const
{
if (!m_personalbar)
const_cast<Window*>(this)->m_personalbar = new BarInfo(exec, m_part, BarInfo::Personalbar);
return m_personalbar;
}
BarInfo *Window::statusbar(ExecState *exec) const
{
if (!m_statusbar)
const_cast<Window*>(this)->m_statusbar = new BarInfo(exec, m_part, BarInfo::Statusbar);
return m_statusbar;
}
BarInfo *Window::toolbar(ExecState *exec) const
{
if (!m_toolbar)
const_cast<Window*>(this)->m_toolbar = new BarInfo(exec, m_part, BarInfo::Toolbar);
return m_toolbar;
}
BarInfo *Window::scrollbars(ExecState *exec) const
{
if (!m_scrollbars)
const_cast<Window*>(this)->m_scrollbars = new BarInfo(exec, m_part, BarInfo::Scrollbars);
return m_scrollbars;
}
// reference our special objects during garbage collection
void Window::mark()
{
ObjectImp::mark();
if (screen && !screen->marked())
screen->mark();
if (history && !history->marked())
history->mark();
if (frames && !frames->marked())
frames->mark();
//kdDebug(6070) << "Window::mark " << this << " marking loc=" << loc << endl;
if (loc && !loc->marked())
loc->mark();
if (m_selection && !m_selection->marked())
m_selection->mark();
if (m_locationbar && !m_locationbar->marked())
m_locationbar->mark();
if (m_menubar && !m_menubar->marked())
m_menubar->mark();
if (m_personalbar && !m_personalbar->marked())
m_personalbar->mark();
if (m_scrollbars && !m_scrollbars->marked())
m_scrollbars->mark();
if (m_statusbar && !m_statusbar->marked())
m_statusbar->mark();
if (m_toolbar && !m_toolbar->marked())
m_toolbar->mark();
}
UString Window::toString(ExecState *) const
{
return "[object Window]";
}
Value Window::get(ExecState *exec, const Identifier &p) const
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "Window("<<this<<")::get " << p.qstring() << endl;
#endif
if ( p == "closed" )
return Boolean(m_part.isNull());
// we don't want any properties other than "closed" on a closed window
if (m_part.isNull())
return Undefined();
// Look for overrides first
ValueImp * val = ObjectImp::getDirect(p);
if (val) {
//kdDebug(6070) << "Window::get found dynamic property '" << p.ascii() << "'" << endl;
if (isSafeScript(exec))
return Value(val);
}
// Check for child frames by name before built-in properties to
// match behavior of other browsers.
KHTMLPart *childFrame = m_part->childFrameNamed(p.ustring().qstring());
if (childFrame)
return retrieve(childFrame);
const HashEntry* entry = Lookup::findEntry(&WindowTable, p);
if (entry)
{
//kdDebug(6070) << "token: " << entry->value << endl;
switch( entry->value ) {
case Crypto:
return Undefined(); // ###
case DefaultStatus:
return String(UString(m_part->jsDefaultStatusBarText()));
case Status:
return String(UString(m_part->jsStatusBarText()));
case Document:
if (isSafeScript(exec))
{
if (m_part->document().isNull()) {
#if APPLE_CHANGES
KWQ(m_part)->createEmptyDocument();
#endif
kdDebug(6070) << "Document.write: adding <HTML><BODY> to create document" << endl;
m_part->begin();
m_part->write("<HTML><BODY>");
m_part->end();
}
Value val = getDOMNode(exec,m_part->document());
return val;
}
else
return Undefined();
case Node:
return getNodeConstructor(exec);
case Range:
return getRangeConstructor(exec);
case NodeFilter:
return getNodeFilterConstructor(exec);
case DOMException:
return getDOMExceptionConstructor(exec);
case CSSRule:
return getCSSRuleConstructor(exec);
case EventCtor:
return getEventConstructor(exec);
case Frames:
return Value(frames ? frames :
(const_cast<Window*>(this)->frames = new FrameArray(exec,m_part)));
case _History:
return Value(history ? history :
(const_cast<Window*>(this)->history = new History(exec,m_part)));
case Event:
if (m_evt)
return getDOMEvent(exec,*m_evt);
else {
#ifdef KJS_VERBOSE
kdWarning(6070) << "window(" << this << "," << m_part->name() << ").event, no event!" << endl;
#endif
return Undefined();
}
case InnerHeight:
if (!m_part->view())
return Undefined();
updateLayout();
return Number(m_part->view()->visibleHeight());
case InnerWidth:
if (!m_part->view())
return Undefined();
updateLayout();
return Number(m_part->view()->visibleWidth());
case Length:
return Number(m_part->frames().count());
case _Location:
return Value(location());
case Name:
return String(m_part->name());
case _Navigator:
case ClientInformation: {
// Store the navigator in the object so we get the same one each time.
Navigator *n = new Navigator(exec, m_part);
const_cast<Window *>(this)->putDirect("navigator", n, DontDelete|ReadOnly);
const_cast<Window *>(this)->putDirect("clientInformation", n, DontDelete|ReadOnly);
return Value(n);
}
#ifdef Q_WS_QWS
case _Konqueror:
return Value(new Konqueror(m_part));
#endif
case Locationbar:
return Value(locationbar(exec));
case Menubar:
return Value(menubar(exec));
case OffscreenBuffering:
return Boolean(true);
case Opener:
if (!m_part->opener())
return Null(); // ### a null Window might be better, but == null
else // doesn't work yet
return retrieve(m_part->opener());
case OuterHeight:
case OuterWidth:
{
if (!m_part->view())
return Number(0);
KWin::Info inf = KWin::info(m_part->view()->topLevelWidget()->winId());
return Number(entry->value == OuterHeight ?
inf.geometry.height() : inf.geometry.width());
}
case PageXOffset:
if (!m_part->view())
return Undefined();
updateLayout();
return Number(m_part->view()->contentsX());
case PageYOffset:
if (!m_part->view())
return Undefined();
updateLayout();
return Number(m_part->view()->contentsY());
case Parent:
return Value(retrieve(m_part->parentPart() ? m_part->parentPart() : (KHTMLPart*)m_part));
case Personalbar:
return Value(personalbar(exec));
case ScreenLeft:
case ScreenX: {
if (!m_part->view())
return Undefined();
#if APPLE_CHANGES
// We want to use frameGeometry here instead of mapToGlobal because it goes through
// the windowFrame method of the WebKit's UI delegate. Also we don't want to try
// to do anything relative to the screen the window is on, so the code below is no
// good of us anyway.
return Number(m_part->view()->topLevelWidget()->frameGeometry().x());
#else
QRect sg = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(m_part->view()));
return Number(m_part->view()->mapToGlobal(QPoint(0,0)).x() + sg.x());
#endif
}
case ScreenTop:
case ScreenY: {
if (!m_part->view())
return Undefined();
#if APPLE_CHANGES
// See comment above in ScreenX.
return Number(m_part->view()->topLevelWidget()->frameGeometry().y());
#else
QRect sg = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(m_part->view()));
return Number(m_part->view()->mapToGlobal(QPoint(0,0)).y() + sg.y());
#endif
}
case ScrollX: {
if (!m_part->view())
return Undefined();
updateLayout();
return Number(m_part->view()->contentsX());
}
case ScrollY: {
if (!m_part->view())
return Undefined();
updateLayout();
return Number(m_part->view()->contentsY());
}
case Scrollbars:
return Value(scrollbars(exec));
case Statusbar:
return Value(statusbar(exec));
case Toolbar:
return Value(toolbar(exec));
case Self:
case _Window:
return Value(retrieve(m_part));
case Top: {
KHTMLPart *p = m_part;
while (p->parentPart())
p = p->parentPart();
return Value(retrieve(p));
}
case _Screen:
return Value(screen ? screen :
(const_cast<Window*>(this)->screen = new Screen(exec)));
case Image:
return Value(new ImageConstructorImp(exec, m_part->document()));
case Option:
return Value(new OptionConstructorImp(exec, m_part->document()));
case XMLHttpRequest:
return Value(new XMLHttpRequestConstructorImp(exec, m_part->document()));
case XMLSerializer:
return Value(new XMLSerializerConstructorImp(exec));
case Focus:
case Blur:
case Close:
return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr);
case Alert:
case Confirm:
case Prompt:
case Open:
#if APPLE_CHANGES
case Print:
#endif
case Scroll: // compatibility
case ScrollBy:
case ScrollTo:
case MoveBy:
case MoveTo:
case ResizeBy:
case ResizeTo:
case CaptureEvents:
case ReleaseEvents:
case AddEventListener:
case RemoveEventListener:
case SetTimeout:
case ClearTimeout:
case SetInterval:
case ClearInterval:
case GetSelection:
if (isSafeScript(exec))
return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr);
else
return Undefined();
case Onabort:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::ABORT_EVENT);
else
return Undefined();
case Onblur:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::BLUR_EVENT);
else
return Undefined();
case Onchange:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::CHANGE_EVENT);
else
return Undefined();
case Onclick:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KHTML_CLICK_EVENT);
else
return Undefined();
case Ondblclick:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KHTML_DBLCLICK_EVENT);
else
return Undefined();
case Ondragdrop:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT);
else
return Undefined();
case Onerror:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KHTML_ERROR_EVENT);
else
return Undefined();
case Onfocus:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::FOCUS_EVENT);
else
return Undefined();
case Onkeydown:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KEYDOWN_EVENT);
else
return Undefined();
case Onkeypress:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KEYPRESS_EVENT);
else
return Undefined();
case Onkeyup:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KEYUP_EVENT);
else
return Undefined();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -