2010-07-13 8 views
10

Supposons que je souhaite utiliser un WebKitWebView dans GTK pour afficher des pages HTML statiques. Ces pages utilisent un schéma d'URL personnalisé, appelons-le custom://. Ce schéma représente un fichier local dont l'emplacement n'est pas connu à l'avance, au moment où le code HTML est généré. Ce que je fais est de connecter au signal navigation-requested du WebView, et le font:Comment gérer un schéma d'URL personnalisé dans Webkit GTK?

const gchar *uri = webkit_network_request_get_uri(request); 
gchar *scheme = g_uri_parse_scheme(uri); 

if(strcmp(scheme, "custom") == 0) { 
    /* DO FILE LOCATING MAGIC HERE */ 
    webkit_web_view_open(webview, real_location_of_file); 
    return WEBKIT_NAVIGATION_RESPONSE_IGNORE; 
} 
/* etc. */ 

Cela semble fonctionner très bien, à moins que le système est utilisé dans une balise <img>, par exemple: <img src="custom://myfile.png">, apparemment ceux-ci ne passer par le signal navigation-requested.

Il me semble qu'il devrait y avoir un moyen d'enregistrer un gestionnaire pour le schéma d'URL personnalisé avec Webkit. Est-ce possible?

Répondre

5

Je suis plus familier avec le port Chromium de WebKit, mais je crois que vous devrez peut-être utiliser webkit_web_resource_get_uri (voir webkitwebresource.h) pour gérer des ressources telles que des images.

+3

Merci, cela a été le pointeur dans la bonne direction que je avais besoin. Pour être complet, la réponse est de se connecter au signal 'resource-request-starting' de la webview, et de faire la manipulation avec' webkit_web_resource_get_uri() 'depuis ce gestionnaire. (Notez que cela ne fonctionne que sur webkit> = 1.1.14.) – ptomato

2

In WebKit GTK 2, there is a more official route for this:

WebKitWebContext *context = webkit_web_context_get_default(); 
webkit_web_context_register_uri_scheme(context, "custom", 
    (WebKitURISchemeRequestCallback)handle_custom, 
    NULL, NULL); 

/* ... */ 

static void 
handle_custom(WebKitURISchemeRequest *request) 
{ 
    /* DO FILE LOCATING MAGIC HERE */ 
    GFile *file = g_file_new_for_path(real_location_of_file); 
    GFileInputStream *stream = g_file_read(file, NULL, NULL); 
    g_object_unref(file); 

    webkit_uri_scheme_request_finish(request, stream, -1, NULL); 
    g_object_unref(stream); 
} 
+0

C'est une bien meilleure réponse. – clee