📄 mghtml_part.cpp
字号:
// ---------------------------------------------------------------------------------------------#include "../render/render_interface.h"#include "../dom/dom_string.h"#include "../dom/dom_element.h"#include "../html/html_documentimpl.h"#include "../html/html_miscimpl.h"#include "../html/html_inlineimpl.h"#include "../render/render_text.h"#include "../render/render_image.h"#include "../misc/htmltags.h"#include "../xml/dom_textimpl.h"#include "mghtmlview.h"#include "mghtml_part.h" #include "mghtml_settings.h"#include "../render/render_frames.h"#include <sys/types.h>#include <assert.h>#include <unistd.h>#include <qstring.h>#include <mgmessage.h>#define DEBUG_BY_XHTANG 0extern MGHTMLSettings *MG_Settings;extern MGHTMLView * frametopview;extern void Cancel_net_thread();extern BOOL Start_net_thread();using namespace DOM;namespace khtml{ struct ChildFrame // store some feature of a frame. { ChildFrame() { m_view = 0L; m_bCompleted = false; m_frame = 0L; m_bPreloaded = false; m_bFrame = true; m_bNotify = false; } RenderPart *m_frame; MGHTMLView *m_view; // add new pointer to the frame view. QString m_serviceName; QString m_serviceType; QStringList m_services; bool m_bCompleted; QString m_name; bool m_bPreloaded; KURL m_workingURL; bool m_bFrame; QStringList m_params; bool m_bNotify; };};class FrameList : public QValueList<khtml::ChildFrame>{public: Iterator find( const QString &name );};typedef FrameList::ConstIterator ConstFrameIt;typedef FrameList::Iterator FrameIt;class MGHTMLPartPrivate{public: MGHTMLPartPrivate() { m_doc = 0L; // document //m_job = 0L; // !!!!! use our m_job structure. m_bComplete = true; // translate complete m_bParsing = false; // whether parsed m_bReloading = false; m_settings = new MGHTMLSettings; // no, get setting from global.!!!!! m_bClearing = false; m_bCleared = false; m_userSheet = QString::null; // use css m_fontBase = 0; m_bDnd = true; // ????? m_loadedImages = 0; m_totalImageCount = 0; m_userHeaders = QString::null; keepCharset = false; m_ssl_in_use = false; m_frameNameId = 1; m_bJScriptForce = false; m_bJScriptOverride = false; m_parentpart = 0L; } ~MGHTMLPartPrivate() { delete m_settings; if(m_doc != NULL) delete m_doc; } FrameList m_frames; QValueList<khtml::ChildFrame> m_objects; MGHTMLView * m_view; MGHTMLPart * m_parentpart; // for recursive find. DOM::HTMLDocumentImpl *m_doc; QString scheduledScript; // DOM::Node scheduledScriptNode; DOM::HTMLElementImpl* scheduledScriptNode; bool m_bJScriptEnabled; //bool m_bJavaEnabled; bool m_bJScriptForce; bool m_bJScriptOverride; //bool m_bJavaForce; //bool m_bJavaOverride; int m_frameNameId; bool keepCharset; MGHTMLSettings *m_settings; //KIO::TransferJob * m_job; // !!!!! bool m_ssl_in_use; QString m_ssl_peer_cert_subject, m_ssl_peer_cert_issuer, m_ssl_peer_ip, m_ssl_cipher, m_ssl_cipher_desc, m_ssl_cipher_version, m_ssl_cipher_used_bits, m_ssl_cipher_bits, m_ssl_cert_state, m_ssl_good_from, m_ssl_good_until; bool m_bComplete; bool m_bParsing; bool m_bReloading; KURL m_workingURL; KURL m_baseURL; QString m_baseTarget; bool m_bClearing; bool m_bCleared; DOM::DOMString m_userSheet; DOM::DOMString m_userSheetUrl; int m_fontBase; QString m_strSelectedURL; bool m_bMousePressed; DOM::Node m_mousePressNode; QString m_overURL; bool m_bDnd; HCURSOR m_linkCursor; // get form khtml_setting!!!!! unsigned long m_loadedImages; unsigned long m_totalImageCount; QString m_userHeaders;};//namespace khtml {// class PartStyleSheetLoader : public CachedObjectClient// {// public:// PartStyleSheetLoader(KHTMLPartPrivate *part, DOM::DOMString url, DocLoader *docLoader)// {// m_part = part;// if (docLoader)// docLoader->requestStyleSheet(url, DOMString());// else// Cache::requestStyleSheet(url, DOMString(),false);// }//// virtual void setStyleSheet(const DOM::DOMString &url, const DOM::DOMString &sheet)// {// m_part->m_userSheet = sheet;// m_part->m_userSheetUrl = url;// delete this;// }// KHTMLPartPrivate *m_part;// };//};FrameList::Iterator FrameList::find( const QString &name ){ Iterator it = begin(); Iterator e = end(); for (; it!=e; ++it ) if ( (*it).m_name==name ) break; return it;}static QString splitUrlTarget(const QString &url, QString *target=0){ QString result = url; if(url.left(7) == "target:") { KURL u(url); result = u.ref(); if (target) *target = u.host(); } return result;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// KHTMLPart class ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////MGHTMLPart::MGHTMLPart( MGHTMLView *view ){ FontPair* fontpair = new FontPair; m_fontpool.append (fontpair); d = NULL; //init(view); d = new MGHTMLPartPrivate; d->m_view = view; //d->m_paLoadImages = 0; //autoloadImages( KHTMLFactory::defaultHTMLSettings()->autoLoadImages() );//!!!!! from settings d->m_frameNameId = 0x100; //d->m_settings = // get from global settings. // d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(); //=================== Pay Attention to these functions ============================================= // connect( this, SIGNAL( completed() ), this, SLOT( updateActions() ) ); // connect( khtml::Cache::loader(), SIGNAL( requestDone( const DOM::DOMString &, khtml::CachedObject *) ), // this, SLOT( slotLoaderRequestDone( const DOM::DOMString &, khtml::CachedObject *) ) );#ifdef JAVASCRIPT_ENABLE d->m_bJScriptEnabled = TRUE; d->m_bJScriptForce = FALSE; d->m_bJScriptOverride = FALSE;#endif}MGHTMLPart::~MGHTMLPart(){ FontPair* fp; clear(); for (unsigned int i = 0; i < m_fontpool.count(); i++ ) { fp = m_fontpool [i]; if (fp->logfont) ::DestroyLogFont (fp->logfont); delete fp; } //if ( d->m_job ) // !!!!! must do it ourselves // d->m_job->kill(); // !!!!! clear all job belonged to this view delete d;}bool MGHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName, const QStringList ¶ms ){ if (url.isEmpty()) return false; FrameIt it = d->m_frames.find( frameName ); if ( it == d->m_frames.end() ) { khtml::ChildFrame child; child.m_name = frameName; it = d->m_frames.append( child ); } (*it).m_frame = frame; (*it).m_params = params; return requestObject(&(*it), completeURL( url ) );}MGString MGHTMLPart::requestFrameName(){ return MGString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);}bool MGHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType, const QStringList ¶ms ){ if (url.isEmpty()) return false; khtml::ChildFrame child; QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child ); (*it).m_frame = frame; (*it).m_bFrame = false; (*it).m_params = params; return requestObject(&(*it), completeURL( url ));}bool MGHTMLPart::requestObject( khtml::ChildFrame *child, const KURL &url){ if ( child->m_bPreloaded ) { if ( child->m_frame && child->m_view ) child->m_frame->setWidget(child->m_view); child->m_bPreloaded = false; return true; } child->m_serviceName = QString::null; return processObjectRequest( child, url);}bool MGHTMLPart::processObjectRequest( khtml::ChildFrame *child, const KURL &_url ){ KURL url( _url ); if (child->m_bNotify) { child->m_bNotify = false; // whether modify the status bar. } if (child->m_view == NULL) { MGHTMLView *view = new MGHTMLView(); if( !view->createView( 0, 0, 0, 0, false, d->m_view->getHwnd() ) ) { delete view; return false; } child->m_view = view; if ( child->m_frame ){ child->m_frame->setWidget(view); } } child->m_view->part()->setParentPart(this); //if ( child->m_bFrame ) //{ // connect( part, SIGNAL( started( KIO::Job *) ),this, SLOT( slotChildStarted( KIO::Job *) ) ); // connect( part, SIGNAL( completed() ), this, SLOT( slotChildCompleted() ) ); // connect( part, SIGNAL( setStatusBarText( const QString &)), this, SIGNAL(setStatusBarText(const QString &))); //} if ( child->m_bPreloaded ) { // if ( child->m_frame && child->m_part ) // child->m_frame->setWidget( child->m_part->widget() ); // child->m_bPreloaded = false; return true; } //child->m_bCompleted = false; //return child->m_view->openURL((const char *)( url.url(0)) ); KURL u ( d->m_baseURL, url.url() ); child->m_view->setURL((const char *)( u.url(0))); SendNotifyMessage(child->m_view->getHwnd(), MSG_OPENURL, 0 ,0); return true;}/*void MGHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args ){ khtml::ChildFrame *child = frame( sender()->parent() ); QString urlStr = url.url(); if ( urlStr.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) { executeScript( urlStr.right( urlStr.length() - 11) ); return; } if ( child ) { child->m_bNotify = true; requestObject( child, url, args ); } //else if ( frameName==QString::fromLatin1("_self") ) // this is for embedded objects (via <object>) which want to replace the current document //{ // KParts::URLArgs newArgs( args ); // newArgs.frameName = QString::null; // emit d->m_extension->openURLRequest( url, newArgs ); //}}*/void MGHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target ){ bool hasTarget = false; QString target = _target; if (target.isEmpty() ) target = d->m_baseTarget; if (!target.isEmpty() ) hasTarget = true; if (url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {// executeScript( url.right( url.length() - 11) ); return; } KURL cURL = completeURL( url ); if (!vlinks.contains( cURL ) ) vlinks.append( cURL ); if ( url.isEmpty() ) return; //if (!checkLinkSecurity(cURL)) // !!!!! // return; if (hasTarget ) { MGHTMLView *myview = recursiveFrameRequest( cURL, target, false ); if (myview ) { //if(myview->part()->parentPart() == NULL) //{ Cancel_net_thread(); Start_net_thread(); //} myview->setURL((const char *)( cURL.url(0))); SendNotifyMessage(myview->getHwnd(), MSG_OPENURL, 0 ,0); return; } } //if ( !d->m_bComplete && !hasTarget ) // closeURL(); if(urlcmp( cURL.url(), m_url.url(), true, true)) { openURL(cURL); } else { // New URL.// emit d->m_extension->openURLRequest( cURL, args ); //slotChildURLRequet(CURL); // !!!!! change d->m_view->setURL((const char *)( cURL.url(0))); SendNotifyMessage(d->m_view->getHwnd(), MSG_OPENURL, 0 ,0); }}KURL MGHTMLPart::getBaseURL(){ return d->m_baseURL;}MGHTMLView *MGHTMLPart::recursiveFrameRequest( const KURL &url, QString frameName, bool callParent ){ frameName = frameName.lower(); if ( !frameName.isEmpty() ) { if ( frameName == QString::fromLatin1("top") || frameName == QString::fromLatin1("_top")) return frametopview; else if (frameName == QString::fromLatin1("blank") || frameName == QString::fromLatin1("_blank") ) return frametopview; else if (frameName == QString::fromLatin1("parent") || frameName == QString::fromLatin1("_parent")) { if(parentPart() == NULL) return frametopview; else return parentPart()->view(); } else if (frameName != QString::fromLatin1("self") || frameName != QString::fromLatin1("_self")) // khtml::ChildFrame *_frame = recursiveFrameRequest( url, args ); return view(); } else return view(); FrameIt it = d->m_frames.find( frameName ); if ( it != d->m_frames.end() ) return ((*it).m_view); else return view();/* it = d->m_frames.begin(); FrameIt end = d->m_frames.end(); for (; it != end; ++it ) if ( (*it).m_part && (*it).m_part->inherits( "KHTMLPart" ) ) { KHTMLPart *childPart = (KHTMLPart *)(KParts::ReadOnlyPart *)(*it).m_part; khtml::ChildFrame *res = childPart->recursiveFrameRequest( url, args, false ); if ( !res ) continue; childPart->requestObject( res, url, args ); return 0L; } if ( parentPart() && callParent ) { khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( url, args ); if ( res ) parentPart()->requestObject( res, url, args ); return 0L; } return 0L;*/}bool MGHTMLPart::IsNewURL(const KURL url){ if ( d->m_frames.count() == 0 && (m_isMoved | (url.htmlRef() != m_url.htmlRef())) && urlcmp( url.url(), m_url.url(), true, true) ) //&& args.postData.size() == 0 && !args.reload ) return true; else return false;} void MGHTMLPart::setURL(const KURL url){ m_url = url;}bool MGHTMLPart::openURL(const KURL &url){ if (!vlinks.contains(url)) // store all urls in this view vlinks.append(url); // if not visit it, append it to list if ( d->m_frames.count() == 0 && (m_isMoved | (url.htmlRef() != m_url.htmlRef())) && urlcmp( url.url(), m_url.url(), true, true)) //&& args.postData.size() == 0 && !args.reload ) { m_isMoved = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -