webkitgtk, как контролировать загрузку ресурса, зависит от типа ресурса? - PullRequest
2 голосов
/ 07 марта 2012

Я хочу контролировать загрузку ресурсов в зависимости от типа ресурса, такого как css, script, img и т. Д.

Я тестирую то, что загружает html из loacl и манипулирует DOM с помощью WebkitGtk. Я мог загрузить HTML из локального файла через WebkitGtk.

Но, как вы знаете, есть ресурсы для загрузки, такие как img, css или script. Я не хочу загружать их вообще. Для img и script я мог бы сделать это с настройкой WebKitWebSettings (из WebkitGtk).

Но в WebKitWebSettings нет способа заблокировать css. Поэтому я попытался сделать это, перехватив сигнал «запрос ресурсов».

static void loadStatusCb(WebKitWebView *web_view, GParamSpec *pspec, void* context);

Я мог заблокировать все сетевые запросы, подключившись. Но я не хочу блокировать загрузку всех ресурсов. Я хочу, чтобы блокировка зависит от типа (css, script, img, ...)

Например, если запрос test_file пришел от

<link type="text/css" rel="stylesheet" href="http://test.com/test_file">

Я бы заблокировал. Потому что это CSS.

Но с

<script type="text/javascript" src="http://test.com/test_file"></script>

Я бы не стал блокировать.

Я пытался получить любую информацию из SoupMessage из WebKitWebRequest. Но я не смог получить никакой информации, кроме Ури.

Если вы знаете какой-либо способ сделать это, пожалуйста, ответьте. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 21 июня 2012

Вы можете подключиться к сигналу "mime-type-policy-Принимаются решения" в WebView.

В обратном вызове проверьте, не является ли mimetype нежелательным, затем установите для политики решение IGNORE, а затем верните TRUE, что означает, что вы обработали сигнал. У меня под рукой есть решение на python:

def __mime_type_policy_cb(self, webview, frame, request, mimetype,
                          policy_decision):
    """Handle downloads and PDF files."""
    if mimetype == 'application/pdf':
        self.emit('open-pdf', request.get_uri())
        policy_decision.ignore()
        return True
0 голосов
/ 23 августа 2013

Как сказал хороший человек, орелонераптор, вам нужно следовать сигналу resource-request-starting, но я думаю, вам нужно полное решение. Основная идея состоит в том, чтобы получить запрос перед отправкой и установить его URI через WebKitNetworkRequest.set_uri(str) на то, что вы хотите, или на about:blank. Вот как это выглядит:

    def test(web_view, frame, web_resource, request, response):
        print request.get_uri()
        if (YOUR_CONDITION_BASED_ON_URI):
            request.set_uri('about:blank')

    web_view.connect('resource-request-starting', test)
0 голосов
/ 11 марта 2012

Сигнал resource-request-starting принимает несколько параметров, один из которых может быть очень полезен для вас: объект класса WebKitWebResource, этот класс имеет метод webkit_web_resource_get_mime_type.

Вам необходимо следоватьresource-request-starting прототип обработчика сигнала, описанный в документации WebKitGtk + :

void user_function (WebKitWebView *webView,
                    WebKitWebFrame        *web_frame,
                    WebKitWebResource     *web_resource,
                    WebKitNetworkRequest  *request,
                    ebKitNetworkResponse *response,
                    gpointer user_data) 
...