Как сообщить QWebPage
не загружать определенные ресурсы, такие как js, css или png?Как сообщить QWebPage не загружать определенные типы ресурсов?
ответ
Решение заключается в расширении класса QNetworkAccessManager
и переопределении его виртуального метода. QNetworkAccessManager::createRequest
В нашей реализации мы проверяем путь к запрашиваемому URL-адресу, и если это тот, который мы не хотим скачать, мы создаем и передаем пустой запрос вместо настоящий. Ниже приведен полный рабочий пример.
#include <QApplication>
#include <QUrl>
#include <QtWebKit/QWebPage>
#include <QtWebKit/QWebFrame>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QDebug>
class NAM : public QNetworkAccessManager {
Q_OBJECT
protected:
virtual QNetworkReply * createRequest(Operation op,
const QNetworkRequest & req,
QIODevice * outgoingData = 0) {
if (req.url().path().endsWith("css")) {
qDebug() << "skipping " << req.url();
return QNetworkAccessManager::createRequest(QNetworkAccessManager::GetOperation,
QNetworkRequest(QUrl()));
} else {
return QNetworkAccessManager::createRequest(op, req, outgoingData);
}
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWebPage page;
NAM nam;
page.setNetworkAccessManager(&nam);
page.mainFrame()->load(QUrl("http://google.com"));
app.exec();
}
#include "main.moc"
Если ваша цель состоит в том, чтобы предотвратить веб-страницы от изменения, вы можете посмотреть на
virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
в QWebPage. Вы можете проверить запрос и вернуть false
, если хотите предотвратить отправку запроса.
Это неверно по той же причине, что ответ hmuelner неверен. Из [docs] (http://developer.qt.nokia.com/doc/qt-4.8/qwebpage.html#acceptNavigationRequest) * Эта функция вызывается всякий раз, когда WebKit запрашивает ** перемещать ** кадр на ресурс, указанный в запрос с помощью указанного типа типа навигации. * –
Я действительно борюсь с той же проблемой, решение Piotr предполагает URL-адреса с расширениями файлов, к сожалению, это не всегда так.
можно получить mime-type, но только после того, как мы получим ответ ', и это отложено до конца.
мы пытались получить контекст элемента запрашивающего ресурсы, скажем, если это <img>
элемент или <link>
получить CSS, но req.originatingObject()
только дает нам QWebFrame. Я знаю, например, что это было возможно в коде Mozilla.
BTW, отключив JavaScript и изображения автоматической загрузки предотвратит загрузку изображений и скриптов.
Вы можете попробовать сделать запрос HEAD только для получения заголовков, чтобы вы могли проверить заголовок Content-Type и принять решение на основе его значения. –
Элегантное решение! – ismail
Есть ли способ проверить не по расширению, а по типу контента? – Zelid
@Zelid Да. См. 'QNetworkRequest :: header()' и 'QNetworkReply :: header()' –