webkitgtk如何控制资源加载取决于资源的类型



我想根据css、script、img等资源类型控制资源下载。

我正在测试从locl加载html并使用WebkitGtk操作DOM的东西。我可以通过WebkitGtk从本地文件加载html。

但正如您所知,有一些资源可以下载,比如img、css或脚本。我根本不想下载这些。对于img和脚本,我可以通过设置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>

我不会阻拦。

我试图从WebKitWebRequest的SoupMessage中获取任何信息。但我没有得到任何信息,但没有得到uri。

如果你知道怎么做,请回复。提前谢谢。

resource-request-starting信号接受多个参数,其中一个参数对您非常有用:WebKitWebResource类的对象,该类具有方法webkit_web_resource_get_mime_type

您需要遵循WebKitGtk+文档中描述的resource-request-starting信号处理程序原型:

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

您可以连接到WebView的"mime类型策略决策请求"信号。

在回调中,检查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
正如好人eagleonaptor所说,你需要遵循resource-request-starting信号,但我想你需要一个完整的解决方案。其主要思想是在发送请求之前获取请求,并通过WebKitNetworkRequest.set_uri(str)将其uri设置为您想要的内容或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)

最新更新