2010-07-13 12 views
10

Digamos que quiero usar un WebKitWebView en GTK para mostrar algunas páginas HTML estáticas. Estas páginas usan un esquema de URL personalizado, llamémoslo custom://. Este esquema representa un archivo local cuya ubicación no se conoce de antemano, en el momento en que se genera el HTML. Lo que hago es conectar a la señal de la vista web navigation-requested, y hacer esto:¿Cómo manejar un esquema de URL personalizado en 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. */ 

Esto parece funcionar bien, a menos que el esquema se utiliza en una etiqueta <img>, por ejemplo: <img src="custom://myfile.png">, al parecer éstos no lo hacen pasar por la señal navigation-requested.

Me parece que debe haber alguna manera de registrar un controlador para el esquema de URL personalizado con Webkit. es posible?

Respuesta

5

estoy más familiarizado con el puerto de cromo de WebKit, pero creo que puede que tenga que utilizar webkit_web_resource_get_uri (ver webkitwebresource.h) para manejar los recursos, tales como imágenes.

+3

Gracias, esto fue el puntero en la dirección correcta que necesitaba. Para completar, la respuesta es conectarse a la señal 'resource-request-starting' de la vista web, y hacer la manipulación con' webkit_web_resource_get_uri() 'desde ese manejador. (Tenga en cuenta que esto solo funciona en 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

Esta es una respuesta mucho mejor. – clee

Cuestiones relacionadas