2010-07-13 12 views
10

Diciamo che voglio usare uno WebKitWebView in GTK per visualizzare alcune pagine HTML statiche. Queste pagine utilizzano uno schema URL personalizzato, chiamiamolo custom://. Questo schema rappresenta un file locale la cui posizione non è nota in anticipo, al momento della generazione dell'HTML. Quello che faccio è connettono al navigation-requested del segnale della WebView, e fanno questo:Come gestire uno schema URL personalizzato in 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. */ 

Questo sembra funzionare bene, a meno che il sistema viene utilizzato in un tag <img>, ad esempio: <img src="custom://myfile.png">, a quanto pare questi non lo fanno passare attraverso il segnale navigation-requested.

Mi sembra che ci debba essere un modo per registrare un gestore per lo schema URL personalizzato con Webkit. È possibile?

risposta

5

Sono più familiare con la porta Chromium di WebKit, ma credo che potrebbe essere necessario utilizzare webkit_web_resource_get_uri (vedere webkitwebresource.h) per gestire risorse come le immagini.

+3

Grazie, questo è stato il puntatore nella direzione giusta che mi serviva. Per completezza, la risposta è quella di connettersi al segnale 'resource-request-starting' della webview, e fare la manipolazione con' webkit_web_resource_get_uri() 'da quel gestore. (Nota che funziona solo su 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

Questa è una risposta molto migliore. – clee

Problemi correlati