2012-03-07 59 views
2

我想這取決於如CSS,腳本,IMG資源的類型來控制資源下載等webkitgtk如何控制資源加載取決於資源的類型?

我測試,從loacl加載HTML與WebkitGtk操作DOM的東西。 我可以通過WebkitGtk從本地文件加載html。

但是,如你所知,有像img,css或腳本下載的資源。我不想下載這些。 對於img和腳本,我可以通過設置WebKitWebSettings(WebkitGtk)來實現。

但是沒有辦法在WebKitWebSettings中阻止css。 所以我試圖通過掛鉤「資源請求開始」信號來完成。

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

我可以通過掛鉤阻止所有的網絡請求。 但我不想阻止所有資源下載。 我想阻止取決於類型(CSS,腳本,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。

如果您知道任何方式,請回復。 在此先感謝。

回答

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) 
+0

首先,感謝您的回答:)。我試過但我無法從web_resource獲取任何信息。沒有mime_type我可以得到。我正在使用webkit 1.6.1。我稱之爲'webkit_web_resource_get_mime_type(resource)'這個函數。我做錯了嗎? – Shukelton 2012-03-12 08:21:11

+1

我想釣魚不是所有男人的任務...... :) – stamat 2013-08-22 22:45:06

0

您可以連接到的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 
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)