📄 kjs_window.cpp
字号:
Value Window::retrieve(KParts::ReadOnlyPart *p){ assert(p); KHTMLPart * part = ::qt_cast<KHTMLPart *>(p); KJSProxy *proxy = 0L; if (!part) { part = ::qt_cast<KHTMLPart *>(p->parent()); if (part) proxy = part->framejScript(p); } else proxy = part->jScript(); if (proxy) {#ifdef KJS_VERBOSE kdDebug(6070) << "Window::retrieve part=" << part << " '" << part->name() << "' interpreter=" << proxy->interpreter() << " window=" << proxy->interpreter()->globalObject().imp() << endl;#endif return proxy->interpreter()->globalObject(); // the Global object is the "window" } else {#ifdef KJS_VERBOSE kdDebug(6070) << "Window::retrieve part=" << p << " '" << p->name() << "' no jsproxy." << endl;#endif return Undefined(); // This can happen with JS disabled on the domain of that window }}Location *Window::location() const{ if (!loc) const_cast<Window*>(this)->loc = new Location(m_frame); return loc;}ObjectImp* Window::frames( ExecState* exec ) const{ KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (part) return m_frames ? m_frames : (const_cast<Window*>(this)->m_frames = new FrameArray(exec, part)); return 0L;}// reference our special objects during garbage collectionvoid Window::mark(){ ObjectImp::mark(); if (screen && !screen->marked()) screen->mark(); if (history && !history->marked()) history->mark(); if (external && !external->marked()) external->mark(); if (m_frames && !m_frames->marked()) m_frames->mark(); //kdDebug(6070) << "Window::mark " << this << " marking loc=" << loc << endl; if (loc && !loc->marked()) loc->mark(); if (winq) winq->mark();}bool Window::hasProperty(ExecState *exec, const Identifier &p) const{ // we don't want any operations on a closed window if (m_frame.isNull() || m_frame->m_part.isNull()) return ( p == "closed" ); if (ObjectImp::hasProperty(exec, p)) return true; if (Lookup::findEntry(&WindowTable, p)) return true; KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); if (!part) return false; QString q = p.qstring(); if (part->findFramePart(p.qstring())) return true; // 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) return true; } // allow shortcuts like 'Image1' instead of document.images.Image1 if (part->document().isHTMLDocument()) { // might be XML DOM::HTMLDocument doc = part->htmlDocument(); // Keep in sync with tryGet if (static_cast<DOM::DocumentImpl*>(doc.handle())->underDocNamedCache().get(p.qstring())) return true; return !doc.getElementById(p.string()).isNull(); } return false;}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 // we don't want any operations on a closed window if (m_frame.isNull() || m_frame->m_part.isNull()) { if ( p == "closed" ) return Boolean( true ); return Undefined(); } // Look for overrides first ValueImp *val = getDirect(p); if (val) { //kdDebug(6070) << "Window::get found dynamic property '" << p.ascii() << "'" << endl; return isSafeScript(exec) ? Value(val) : Undefined(); } const HashEntry* entry = Lookup::findEntry(&WindowTable, p); KHTMLPart *part = ::qt_cast<KHTMLPart *>(m_frame->m_part); // properties that work on all windows if (entry) { // ReadOnlyPart first switch(entry->value) { case Closed: return Boolean( false ); case _Location: // No isSafeScript test here, we must be able to _set_ location.href (#49819) return Value(location()); case _Window: case Self: return retrieve(m_frame->m_part); default: break; } if (!part) return Undefined(); // KHTMLPart next switch(entry->value) { case Frames: return Value(frames(exec)); case Opener: if (!part->opener()) return Null(); // ### a null Window might be better, but == null else // doesn't work yet return retrieve(part->opener()); case Parent: return retrieve(part->parentPart() ? part->parentPart() : (KHTMLPart*)part); case Top: { KHTMLPart *p = part; while (p->parentPart()) p = p->parentPart(); return retrieve(p); } case Alert: case Confirm: case Prompt: case Open: case Close: case Focus: case Blur: case AToB: case BToA: case GetComputedStyle: return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); default: break; } } else if (!part) { // not a KHTMLPart QString rvalue; KParts::LiveConnectExtension::Type rtype; unsigned long robjid; if (m_frame->m_liveconnect && isSafeScript(exec) && m_frame->m_liveconnect->get(0, p.qstring(), rtype, robjid, rvalue)) return getLiveConnectValue(m_frame->m_liveconnect, p.qstring(), rtype, rvalue, robjid); return Undefined(); } // properties that only work on safe windows if (isSafeScript(exec) && entry) { //kdDebug(6070) << "token: " << entry->value << endl; switch( entry->value ) { case Crypto: return Undefined(); // ### case DefaultStatus: return String(UString(part->jsDefaultStatusBarText())); case Status: return String(UString(part->jsStatusBarText())); case Document: if (part->document().isNull()) { kdDebug(6070) << "Document.write: adding <HTML><BODY> to create document" << endl; part->begin(); part->write("<HTML><BODY>"); part->end(); } return getDOMNode(exec,part->document()); case FrameElement: if (m_frame->m_frame) return getDOMNode(exec,m_frame->m_frame->element()); 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 _History: return Value(history ? history : (const_cast<Window*>(this)->history = new History(exec,part))); case _External: return Value(external ? external : (const_cast<Window*>(this)->external = new External(exec,part))); case Event: if (m_evt) return getDOMEvent(exec,*m_evt); else {#ifdef KJS_VERBOSE kdDebug(6070) << "WARNING: window(" << this << "," << part->name() << ").event, no event!" << endl;#endif return Undefined(); } case InnerHeight: if (!part->view()) return Undefined(); khtml::RenderWidget::flushWidgetResizes(); // make sure frames have their final size return Number(part->view()->visibleHeight()); case InnerWidth: if (!part->view()) return Undefined(); khtml::RenderWidget::flushWidgetResizes(); // make sure frames have their final size return Number(part->view()->visibleWidth()); case Length: return Number(part->frames().count()); case Name: return String(part->name()); case SideBar: return Value(new MozillaSidebarExtension(exec, part)); case _Navigator: case ClientInformation: { // Store the navigator in the object so we get the same one each time. Value nav( new Navigator(exec, part) ); const_cast<Window *>(this)->put(exec, "navigator", nav, DontDelete|ReadOnly|Internal); const_cast<Window *>(this)->put(exec, "clientInformation", nav, DontDelete|ReadOnly|Internal); return nav; }#ifdef Q_WS_QWS case _Konqueror: { Value k( new Konqueror(part) ); const_cast<Window *>(this)->put(exec, "konqueror", k, DontDelete|ReadOnly|Internal); return k; }#endif case OffscreenBuffering: return Boolean(true); case OuterHeight: case OuterWidth: {#if defined Q_WS_X11 && ! defined K_WS_QTONLY if (!part->widget()) return Number(0); KWin::WindowInfo inf = KWin::windowInfo(part->widget()->topLevelWidget()->winId()); return Number(entry->value == OuterHeight ? inf.geometry().height() : inf.geometry().width());#else return Number(entry->value == OuterHeight ? part->view()->height() : part->view()->width());#endif } case PageXOffset: return Number(part->view()->contentsX()); case PageYOffset: return Number(part->view()->contentsY()); case Personalbar: return Undefined(); // ### case ScreenLeft: case ScreenX: { if (!part->view()) return Undefined(); QRect sg = KGlobalSettings::desktopGeometry(part->view()); return Number(part->view()->mapToGlobal(QPoint(0,0)).x() + sg.x()); } case ScreenTop: case ScreenY: { if (!part->view()) return Undefined(); QRect sg = KGlobalSettings::desktopGeometry(part->view()); return Number(part->view()->mapToGlobal(QPoint(0,0)).y() + sg.y()); } case ScrollX: { if (!part->view()) return Undefined(); return Number(part->view()->contentsX()); } case ScrollY: { if (!part->view()) return Undefined(); return Number(part->view()->contentsY()); } case Scrollbars: return Undefined(); // ### case _Screen: return Value(screen ? screen : (const_cast<Window*>(this)->screen = new Screen(exec))); case Image: return Value(new ImageConstructorImp(exec, part->document())); case Option: return Value(new OptionConstructorImp(exec, part->document())); case XMLHttpRequest: return Value(new XMLHttpRequestConstructorImp(exec, part->document())); case XMLSerializer: return Value(new XMLSerializerConstructorImp(exec)); case DOMParser: return Value(new DOMParserConstructorImp(exec, part->xmlDocImpl())); 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 Print: return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); // IE extension case Navigate: // Disabled in NS-compat mode. Supported by default - can't hurt, unless someone uses // if (navigate) to test for IE (unlikely). if ( exec->interpreter()->compatMode() == Interpreter::NetscapeCompat ) return Undefined(); return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); case Onabort: return getListener(exec,DOM::EventImpl::ABORT_EVENT); case Onblur: return getListener(exec,DOM::EventImpl::BLUR_EVENT); case Onchange: return getListener(exec,DOM::EventImpl::CHANGE_EVENT); case Onclick: return getListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT); case Ondblclick: return getListener(exec,DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT); case Ondragdrop: return getListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT); case Onerror: return getListener(exec,DOM::EventImpl::KHTML_ERROR_EVENT); case Onfocus: return getListener(exec,DOM::EventImpl::FOCUS_EVENT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -