Как сказать QWebPage не загружать определенный тип ресурсов? - PullRequest
17 голосов
/ 01 января 2011

Как сказать QWebPage не загружать ресурсы определенного типа, такие как js, css или png?

Ответы [ 3 ]

31 голосов
/ 03 января 2011

Решение состоит в том, чтобы расширить 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"
0 голосов
/ 23 марта 2014

Я на самом деле борюсь с той же проблемой, решение Piotr предполагает URL-адреса с расширениями файлов, к сожалению, это не всегда так.

можно получить пантомиму, но только после того, как мы получим ответ ', и это слишком поздно.

мы пытались получить контекст элемента, запрашивающий ресурсы, скажем, если это элемент <img> или <link> для получения CSS, но req.originatingObject() только дает нам QWebFrame . я знаю, например, что это было возможно в коде Mozilla.

Кстати, отключение javascript и автоматической загрузки изображений предотвратит загрузку изображений и сценариев.

0 голосов
/ 30 января 2012

Если ваша цель - предотвратить изменение веб-страницы, вы можете посмотреть на

virtual bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);

в QWebPage. Вы можете проверить запрос и вернуть false, если хотите запретить отправку запроса.

...