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

📄 mghtml_part.cpp

📁 monqueror一个很具有参考价值的源玛
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// ---------------------------------------------------------------------------------------------#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 &params ){	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 &params ){	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 + -