⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kjs_window.cpp

📁 konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版本源码包.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -