📄 kjs_window.cpp
字号:
case Onload:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::LOAD_EVENT);
else
return Undefined();
case Onmousedown:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT);
else
return Undefined();
case Onmousemove:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT);
else
return Undefined();
case Onmouseout:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::MOUSEOUT_EVENT);
else
return Undefined();
case Onmouseover:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::MOUSEOVER_EVENT);
else
return Undefined();
case Onmouseup:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::MOUSEUP_EVENT);
else
return Undefined();
case Onmove:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT);
else
return Undefined();
case Onreset:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::RESET_EVENT);
else
return Undefined();
case Onresize:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::RESIZE_EVENT);
else
return Undefined();
case Onscroll:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::SCROLL_EVENT);
else
return Undefined();
#if APPLE_CHANGES
case Onsearch:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::SEARCH_EVENT);
else
return Undefined();
#endif
case Onselect:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::SELECT_EVENT);
else
return Undefined();
case Onsubmit:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::SUBMIT_EVENT);
else
return Undefined();
case Onunload:
if (isSafeScript(exec))
return getListener(exec,DOM::EventImpl::UNLOAD_EVENT);
else
return Undefined();
}
}
KHTMLPart *kp = m_part->findFrame( p.qstring() );
if (kp)
return Value(retrieve(kp));
// allow window[1] or parent[1] etc. (#56983)
bool ok;
unsigned int i = p.toArrayIndex(&ok);
if (ok) {
QPtrList<KParts::ReadOnlyPart> frames = m_part->frames();
unsigned int len = frames.count();
if (i < len) {
KParts::ReadOnlyPart* frame = frames.at(i);
if (frame && frame->inherits("KHTMLPart")) {
KHTMLPart *khtml = static_cast<KHTMLPart*>(frame);
return Window::retrieve(khtml);
}
}
}
// allow shortcuts like 'Image1' instead of document.images.Image1
if (isSafeScript(exec) &&
m_part->document().isHTMLDocument()) { // might be XML
DOM::HTMLCollection coll = m_part->htmlDocument().all();
DOM::HTMLElement element = coll.namedItem(p.string());
if (!element.isNull()) {
return getDOMNode(exec,element);
}
}
// This isn't necessarily a bug. Some code uses if(!window.blah) window.blah=1
// But it can also mean something isn't loaded or implemented, hence the WARNING to help grepping.
#ifdef KJS_VERBOSE
kdDebug(6070) << "WARNING: Window::get property not found: " << p.qstring() << endl;
#endif
if (isSafeScript(exec))
return ObjectImp::get(exec, p);
return Undefined();
}
bool Window::hasProperty(ExecState *exec, const Identifier &p) const
{
// matches logic in get function above, but no need to handle numeric values (frame indices)
if (m_part.isNull())
return p == "closed";
if (getDirect(p))
return true;
if (Lookup::findEntry(&WindowTable, p))
return true;
if (m_part->findFrame(p.qstring()))
return true;
if (!m_part->htmlDocument().all().namedItem(p.string()).isNull())
return true;
return false;
}
void Window::put(ExecState* exec, const Identifier &propertyName, const Value &value, int attr)
{
// Called by an internal KJS call (e.g. InterpreterImp's constructor) ?
// If yes, save time and jump directly to ObjectImp.
if ( (attr != None && attr != DontDelete)
// Same thing if we have a local override (e.g. "var location")
|| ( ObjectImp::getDirect(propertyName) && isSafeScript(exec)) )
{
ObjectImp::put( exec, propertyName, value, attr );
return;
}
const HashEntry* entry = Lookup::findEntry(&WindowTable, propertyName);
if (entry)
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "Window("<<this<<")::put " << propertyName.qstring() << endl;
#endif
switch( entry->value ) {
case Status: {
String s = value.toString(exec);
m_part->setJSStatusBarText(s.value().qstring());
return;
}
case DefaultStatus: {
String s = value.toString(exec);
m_part->setJSDefaultStatusBarText(s.value().qstring());
return;
}
case _Location: {
KHTMLPart* p = Window::retrieveActive(exec)->m_part;
if (p) {
QString dstUrl = p->htmlDocument().completeURL(value.toString(exec).string()).string();
if (!dstUrl.startsWith("javascript:", false) || isSafeScript(exec))
{
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
#if APPLE_CHANGES
// We want a new history item if this JS was called via a user gesture
m_part->scheduleLocationChange(dstUrl, p->referrer(), !userGesture, userGesture);
#else
m_part->scheduleLocationChange(dstUrl, p->referrer(), false /*don't lock history*/, userGesture);
#endif
}
}
return;
}
case Onabort:
if (isSafeScript(exec))
setListener(exec, DOM::EventImpl::ABORT_EVENT,value);
return;
case Onblur:
if (isSafeScript(exec))
setListener(exec, DOM::EventImpl::BLUR_EVENT,value);
return;
case Onchange:
if (isSafeScript(exec))
setListener(exec, DOM::EventImpl::CHANGE_EVENT,value);
return;
case Onclick:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KHTML_CLICK_EVENT,value);
return;
case Ondblclick:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KHTML_DBLCLICK_EVENT,value);
return;
case Ondragdrop:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT,value);
return;
case Onerror:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KHTML_ERROR_EVENT,value);
return;
case Onfocus:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::FOCUS_EVENT,value);
return;
case Onkeydown:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KEYDOWN_EVENT,value);
return;
case Onkeypress:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KEYPRESS_EVENT,value);
return;
case Onkeyup:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KEYUP_EVENT,value);
return;
case Onload:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::LOAD_EVENT,value);
return;
case Onmousedown:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT,value);
return;
case Onmousemove:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT,value);
return;
case Onmouseout:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::MOUSEOUT_EVENT,value);
return;
case Onmouseover:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::MOUSEOVER_EVENT,value);
return;
case Onmouseup:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::MOUSEUP_EVENT,value);
return;
case Onmove:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT,value);
return;
case Onreset:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::RESET_EVENT,value);
return;
case Onresize:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::RESIZE_EVENT,value);
return;
case Onscroll:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::SCROLL_EVENT,value);
return;
#if APPLE_CHANGES
case Onsearch:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::SEARCH_EVENT,value);
return;
#endif
case Onselect:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::SELECT_EVENT,value);
return;
case Onsubmit:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value);
return;
case Onunload:
if (isSafeScript(exec))
setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value);
return;
case Name:
if (isSafeScript(exec))
#if APPLE_CHANGES
m_part->setName( value.toString(exec).qstring() );
#else
m_part->setName( value.toString(exec).qstring().local8Bit().data() );
#endif
return;
default:
break;
}
}
if (isSafeScript(exec)) {
//kdDebug(6070) << "Window("<<this<<")::put storing " << propertyName.qstring() << endl;
ObjectImp::put(exec, propertyName, value, attr);
}
}
bool Window::toBoolean(ExecState *) const
{
return !m_part.isNull();
}
int Window::installTimeout(const UString &handler, int t, bool singleShot)
{
return winq->installTimeout(handler, t, singleShot);
}
int Window::installTimeout(const Value &function, List &args, int t, bool singleShot)
{
return winq->installTimeout(function, args, t, singleShot);
}
void Window::clearTimeout(int timerId)
{
winq->clearTimeout(timerId);
}
#if APPLE_CHANGES
bool Window::hasTimeouts()
{
return winq->hasTimeouts();
}
QMap<int, ScheduledAction*> *Window::pauseTimeouts(const void *key)
{
return winq->pauseTimeouts(key);
}
void Window::resumeTimeouts(QMap<int, ScheduledAction*> *sa, const void *key)
{
return winq->resumeTimeouts(sa, key);
}
#endif
void Window::scheduleClose()
{
kdDebug(6070) << "Window::scheduleClose window.close() " << m_part << endl;
Q_ASSERT(winq);
#if APPLE_CHANGES
KWQ(m_part)->scheduleClose();
#else
QTimer::singleShot( 0, winq, SLOT( timeoutClose() ) );
#endif
}
static bool shouldLoadAsEmptyDocument(const KURL &url)
{
return url.protocol().lower() == "about" || url.isEmpty();
}
bool Window::isSafeScript (const KJS::ScriptInterpreter *origin, const KJS::ScriptInterpreter *target)
{
if (origin == target)
return true;
KHTMLPart *originPart = origin->part();
KHTMLPart *targetPart = target->part();
// JS may be attempting to access the "window" object, which should be valid,
// even if the document hasn't been constructed yet. If the document doesn't
// exist yet allow JS to access the window object.
if (!targetPart->xmlDocImpl())
return true;
DOM::DocumentImpl *originDocument = originPart->xmlDocImpl();
DOM::DocumentImpl *targetDocument = targetPart->xmlDocImpl();
if (!targetDocument) {
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -