📄 kjs_window.cpp
字号:
case Onkeydown: return getListener(exec,DOM::EventImpl::KEYDOWN_EVENT); case Onkeypress: return getListener(exec,DOM::EventImpl::KEYPRESS_EVENT); case Onkeyup: return getListener(exec,DOM::EventImpl::KEYUP_EVENT); case Onload: return getListener(exec,DOM::EventImpl::LOAD_EVENT); case Onmousedown: return getListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT); case Onmousemove: return getListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT); case Onmouseout: return getListener(exec,DOM::EventImpl::MOUSEOUT_EVENT); case Onmouseover: return getListener(exec,DOM::EventImpl::MOUSEOVER_EVENT); case Onmouseup: return getListener(exec,DOM::EventImpl::MOUSEUP_EVENT); case Onmove: return getListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT); case Onreset: return getListener(exec,DOM::EventImpl::RESET_EVENT); case Onresize: return getListener(exec,DOM::EventImpl::RESIZE_EVENT); case Onselect: return getListener(exec,DOM::EventImpl::SELECT_EVENT); case Onsubmit: return getListener(exec,DOM::EventImpl::SUBMIT_EVENT); case Onunload: return getListener(exec,DOM::EventImpl::UNLOAD_EVENT); } } // doing the remainder of ObjectImp::get() that is not covered by // the getDirect() call above. // #### guessed position. move further up or down? Object proto = Object::dynamicCast(prototype()); assert(proto.isValid()); if (p == specialPrototypePropertyName) return isSafeScript(exec) ? Value(proto) : Undefined(); Value val2 = proto.get(exec, p); if (!val2.isA(UndefinedType)) { return isSafeScript(exec) ? val2 : Undefined(); } KParts::ReadOnlyPart *rop = part->findFramePart( p.qstring() ); if (rop) return retrieve(rop); // allow window[1] or parent[1] etc. (#56983) bool ok; unsigned int i = p.toArrayIndex(&ok); if (ok) { QPtrList<KParts::ReadOnlyPart> frames = part->frames(); unsigned int len = frames.count(); if (i < len) { KParts::ReadOnlyPart* frame = frames.at(i); if (frame) return Window::retrieve(frame); } } //Check for images, forms, objects, etc. if (isSafeScript(exec) && part->document().isHTMLDocument()) { // might be XML DOM::DocumentImpl* docImpl = part->xmlDocImpl(); DOM::ElementMappingCache::ItemInfo* info = docImpl->underDocNamedCache().get(p.qstring()); if (info) { //May be a false positive, but we can try to avoid doing it the hard way in //simpler cases. The trickiness here is that the cache is kept under both //name and id, but we sometimes ignore id for IE compat DOM::DOMString propertyDOMString = p.string(); if (info->nd && DOM::HTMLMappedNameCollectionImpl::matchesName(info->nd, DOM::HTMLCollectionImpl::WINDOW_NAMED_ITEMS, propertyDOMString)) { return getDOMNode(exec, info->nd); } else { //Can't tell it just like that, so better go through collection and count stuff. This is the slow path... DOM::HTMLMappedNameCollection coll(docImpl, DOM::HTMLCollectionImpl::WINDOW_NAMED_ITEMS, propertyDOMString); if (coll.length() == 1) return getDOMNode(exec, coll.firstItem()); else if (coll.length() > 1) return getHTMLCollection(exec, coll); } } DOM::Element element = part->document().getElementById(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 return Undefined();}void Window::put(ExecState* exec, const Identifier &propertyName, const Value &value, int attr){ // we don't want any operations on a closed window if (m_frame.isNull() || m_frame->m_part.isNull()) { // ### throw exception? allow setting of some props like location? return; } // 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") ( isSafeScript( exec ) && ObjectImp::getDirect(propertyName) ) ) { ObjectImp::put( exec, propertyName, value, attr ); return; } const HashEntry* entry = Lookup::findEntry(&WindowTable, propertyName); if (entry && !m_frame.isNull() && !m_frame->m_part.isNull()) {#ifdef KJS_VERBOSE kdDebug(6070) << "Window("<<this<<")::put " << propertyName.qstring() << endl;#endif switch( entry->value) { case _Location: goURL(exec, value.toString(exec).qstring(), false /*don't lock history*/); return; default: break; } KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (part) { switch( entry->value ) { case Status: { if (isSafeScript(exec) && part->settings()->windowStatusPolicy(part->url().host()) == KHTMLSettings::KJSWindowStatusAllow) { String s = value.toString(exec); part->setJSStatusBarText(s.value().qstring()); } return; } case DefaultStatus: { if (isSafeScript(exec) && part->settings()->windowStatusPolicy(part->url().host()) == KHTMLSettings::KJSWindowStatusAllow) { String s = value.toString(exec); part->setJSDefaultStatusBarText(s.value().qstring()); } 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_ECMA_CLICK_EVENT,value); return; case Ondblclick: if (isSafeScript(exec)) setListener(exec,DOM::EventImpl::KHTML_ECMA_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 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)) part->setName( value.toString(exec).qstring().local8Bit().data() ); return; default: break; } } } if (m_frame->m_liveconnect && isSafeScript(exec) && m_frame->m_liveconnect->put(0, propertyName.qstring(), value.toString(exec).qstring())) return; 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_frame.isNull() && !m_frame->m_part.isNull();}DOM::AbstractView Window::toAbstractView() const{ KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (!part) return DOM::AbstractView(); return part->document().defaultView();}void Window::scheduleClose(){ kdDebug(6070) << "Window::scheduleClose window.close() " << m_frame << endl; Q_ASSERT(winq); QTimer::singleShot( 0, winq, SLOT( timeoutClose() ) );}void Window::closeNow(){ if (m_frame.isNull() || m_frame->m_part.isNull()) { kdDebug(6070) << k_funcinfo << "part is deleted already" << endl; } else { KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (!part) { kdDebug(6070) << "closeNow on non KHTML part" << endl; } else { //kdDebug(6070) << k_funcinfo << " -> closing window" << endl; // We want to make sure that window.open won't find this part by name. part->setName( 0 ); part->deleteLater(); part = 0; } }}void Window::afterScriptExecution(){ DOM::DocumentImpl::updateDocumentsRendering(); QValueList<DelayedAction> delayedActions = m_delayed; m_delayed.clear(); QValueList<DelayedAction>::Iterator it = delayedActions.begin(); for ( ; it != delayedActions.end() ; ++it ) { switch ((*it).actionId) { case DelayedClose: scheduleClose(); return; // stop here, in case of multiple actions case DelayedGoHistory: goHistory( (*it).param.toInt() ); break; case NullAction: // FIXME: anything needs to be done here? This is warning anyways. break; }; }}bool Window::checkIsSafeScript(KParts::ReadOnlyPart *activePart) const{ if (m_frame.isNull() || m_frame->m_part.isNull()) { // part deleted ? can't grant access kdDebug(6070) << "Window::isSafeScript: accessing deleted part !" << endl; return false; } if (!activePart) { kdDebug(6070) << "Window::isSafeScript: current interpreter's part is 0L!" << endl; return false; } if ( activePart == m_frame->m_part ) // Not calling from another frame, no problem. return true; KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (!part) return true; // not a KHTMLPart if ( part->document().isNull() ) return true; // allow to access a window that was just created (e.g. with window.open("about:blank")) DOM::HTMLDocument thisDocument = part->htmlDocument(); if ( thisDocument.isNull() ) { kdDebug(6070) << "Window::isSafeScript: trying to access an XML document !?" << endl; return false; } KHTMLPart *activeKHTMLPart = ::qt_cast<KHTMLPart *>(activePart); if (!activeKHTMLPart) return true; // not a KHTMLPart DOM::HTMLDocument actDocument = activeKHTMLPart->htmlDocument(); if ( actDocument.isNull() ) { kdDebug(6070) << "Window::isSafeScript: active part has no document!" << endl; return false; } DOM::DOMString actDomain = actDocument.domain(); DOM::DOMString thisDomain = thisDocument.domain(); if ( actDomain == thisDomain ) {#ifdef KJS_VERBOSE //kdDebug(6070) << "JavaScript: access granted, domain is '" << actDomain.string() << "'" << endl;#endif return true; } kdDebug(6070) << "WARNING: JavaScript: access denied for current frame '" << actDomain.string() << "' to frame '" << thisDomain.string() << "'" << endl; // TODO after 3.1: throw security exception (exec->setException()) return false;}void Window::setListener(ExecState *exec, int eventId, Value func){ KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (!part || !isSafeScript(exec)) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -