我想根据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
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)