#include "iframeschemehandler.h" #include IframeSchemeHandler::IframeSchemeHandler(QObject * parent):QWebEngineUrlSchemeHandler(parent){ } void IframeSchemeHandler::requestStarted(QWebEngineUrlRequestJob *requestJob) { QUrl url = requestJob->requestUrl(); // website dictionary iframe url url = QUrl( Utils::Url::queryItemValue( url, "url" ) ); QNetworkRequest request; request.setUrl( url ); request.setAttribute(QNetworkRequest::RedirectPolicyAttribute,QNetworkRequest::RedirectPolicy::NoLessSafeRedirectPolicy); QNetworkReply * reply = mgr.get( request ); auto finishAction = [ = ]() -> void { QByteArray contentType = "text/html;charset=UTF-8"; auto contentTypeHeader = reply->header( QNetworkRequest::ContentTypeHeader ); if( contentTypeHeader.isValid() ) contentType = contentTypeHeader.toByteArray(); QBuffer * buffer = new QBuffer( requestJob ); // Handle reply data if( reply->error() != QNetworkReply::NoError ) { QString emptyHtml = QString( "%1" ).arg( reply->errorString() ); buffer->setData( emptyHtml.toUtf8() ); requestJob->reply( contentType, buffer ); return; } QByteArray replyData = reply->readAll(); QString articleString; QTextCodec * codec = QTextCodec::codecForHtml( replyData, QTextCodec::codecForName( "UTF-8" ) ); articleString = codec->toUnicode( replyData ); // Change links from relative to absolute QString root = reply->url().scheme() + "://" + reply->url().host(); QString base = root + reply->url().path(); while( !base.isEmpty() && !base.endsWith( "/" ) ) base.chop( 1 ); QRegularExpression tags( "", QRegularExpression::CaseInsensitiveOption | QRegularExpression::DotMatchesEverythingOption ); QString baseTagHtml = ""; // remove existed base tag articleString.remove( tags ) ; qsizetype pos = articleString.indexOf( "" ); if( pos > -1 ) articleString.insert( pos + 6, baseTagHtml ); buffer->setData(codec->fromUnicode(articleString)); requestJob->reply(contentType , buffer ); }; connect( reply, &QNetworkReply::finished, requestJob, finishAction ); connect( requestJob, &QObject::destroyed, reply, &QObject::deleteLater ); }