QtWebKit прекращает анализ после блокировки скрипта

У меня проблемы с QWebFrame::setContentпохоже, что он не может разобрать HTML из qt-project.org пока я не уберу следующий блок из <header> (он просто останавливается и игнорирует все остальное):

<script type="text/javascript">

function imgFitOnLoad(imgId)
{var maxWidth=720;var img=imgId;var width=img.clientWidth;if(width>maxWidth)
{var sized=maxWidth/width;var height=img.clientHeight*sized;img.width=maxWidth;img.height=height;}}

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-42656244-1']);
_gaq.push (['_gat._anonymizeIp']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
})();

</script>

Я протестировал несколько других сайтов (Google, Wikipedia, Youtube, GNU, …), но не смог воспроизвести проблему. Минимальный (не) рабочий пример:

// MainWindow.cpp
#include "MainWindow.hpp"
#include <QDebug>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QWebPage>
#include <QWebFrame>
#include <QWebElementCollection>

MainWindow::MainWindow(QWidget *parent) :
QWidget(parent), mgr{}
{
connect(&mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(test(QNetworkReply*)));

// unmodified -> assert fails
mgr.get(QNetworkRequest{QUrl{"http://qt-project.org/"}});

// modified -> assert passes
//    mgr.get(QNetworkRequest{QUrl{"https://gs93.de/tmp/qtprojectdump-mod.html"}});
}

void MainWindow::test(QNetworkReply* reply)
{
qDebug() << __PRETTY_FUNCTION__;
Q_ASSERT(reply->error() == QNetworkReply::NoError); // just to be sureauto data = reply->readAll();

QFile file("orig.html");
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QTextStream stream(&file);
stream << QString{data};
}

QWebPage page;
page.mainFrame()->setContent(
data,
reply->header(QNetworkRequest::QNetworkRequest::ContentTypeHeader).toString());

QFile file2("page.html");
if (file2.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QTextStream stream(&file2);
stream << page.mainFrame()->toHtml();
}

Q_ASSERT(page.mainFrame()->findAllElements("a").count() > 0); // unmodified version fails here
}

MainWindow::~MainWindow()
{
}

а также

// MainWindow.hpp
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QWidget>
#include <QNetworkAccessManager>

class QNetworkReply;
class MainWindow : public QWidget
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
QNetworkAccessManager mgr;

public slots:
void test(QNetworkReply* reply);
};

#endif // MAINWINDOW_HPP

составлено с

QT     += webkitwidgets
CONFIG += c++11

Я использую Qt 5.2.1. Это ошибка на моей стороне или на стороне QtWebKit?

4

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]