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

时间:2012-03-07 02:42:59

标签: webkit gtk

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

我正在测试从loacl加载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。

如果您知道任何方法,请回复。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

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

您需要遵循WebKitGtk+ documentation

中描述的resource-request-starting信号处理程序原型
void user_function (WebKitWebView *webView,
                    WebKitWebFrame        *web_frame,
                    WebKitWebResource     *web_resource,
                    WebKitNetworkRequest  *request,
                    ebKitNetworkResponse *response,
                    gpointer user_data) 

答案 1 :(得分:0)

您可以连接到WebView的“mime-type-policy-decision-requested”信号。

在回调中,检查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

答案 2 :(得分:0)

正如善良的eagleoneraptor所说,你需要遵循resource-request-starting信号,但我想你需要一个完整的解决方案。主要想法是在发送之前获取请求,并通过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)