[webkit-gtk] Help with Webkit crash in application

Carlos Garcia Campos cgarcia at igalia.com
Sun Jul 13 02:00:49 PDT 2014


El sáb, 12-07-2014 a las 11:38 +0530, Avishkar Gupta escribió:
> Hi,
> 
> 
> I'm trying to write an application to open epub files with the GTK
> framework and webkigtk being my best option I chose to go with it.
> I have to provide dual libarary support for both GTK2 and GTK3,

I guess you mean at build time? do you build two versions of the
application.

>  and so I wrote thumbnailer code which uses an offscreen window to
> render the epub and get cairo surfaces as screenshots from it.

In WebKit2 API there's a method to get "screenshots" of the current web
view contents, see
http://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebView.html#webkit-web-view-get-snapshot

>  The reason I'm including that code is because I think that might have
> something to do with this as because that's when the problem actually
> started.
> 
> 
> Here is the crash report(segfault) code for the crash, and even though
> frame #27 is from my code, that is the call to GTK main, and because
> of that from this error report I cannot make out which part of the
> code is faulting, so I request you guys to please help me with this.
> 
> 
> #0  0x00007ffff0e0851c in WTFCrash ()
> at ../Source/WTF/wtf/Assertions.cpp:333
> #1  0x00007ffff0ccd525 in JSC::evaluate
> (exec=exec at entry=0x7fff8810f9b0, source=..., thisValue=..., 
>     returnedException=returnedException at entry=0x7fffffffd3a0)
> at ../Source/JavaScriptCore/runtime/Completion.cpp:65
> #2  0x00007ffff51abc88 in evaluate (exception=0x7fffffffd3a0,
> thisValue=..., source=..., exec=0x7fff8810f9b0)
>     at ../Source/WebCore/bindings/js/JSMainThreadExecState.h:62
> #3  WebCore::ScriptController::evaluateInWorld
> (this=this at entry=0x7fff7800a670, sourceCode=..., world=...)
>     at ../Source/WebCore/bindings/js/ScriptController.cpp:147
> #4  0x00007ffff51abf5c in WebCore::ScriptController::evaluate
> (this=0x7fff7800a670, sourceCode=...)
>     at ../Source/WebCore/bindings/js/ScriptController.cpp:163
> #5  0x00007ffff535c025 in WebCore::ScriptElement::executeScript
> (this=0x7fffe410d960, sourceCode=...)
> at ../Source/WebCore/dom/ScriptElement.cpp:310
> #6  0x00007ffff535c2f4 in WebCore::ScriptElement::prepareScript
> (this=this at entry=0x7fffe410d960, scriptStartPosition=..., 
> 
> supportLegacyTypes=supportLegacyTypes at entry=WebCore::ScriptElement::DisallowLegacyTypeInTypeAttribute)
>     at ../Source/WebCore/dom/ScriptElement.cpp:241
> #7  0x00007ffff550670f in WebCore::HTMLScriptRunner::runScript
> (this=this at entry=0x7fffe415cae0, script=0x7fffe410d900,
> scriptStartPosition=...)
>     at ../Source/WebCore/html/parser/HTMLScriptRunner.cpp:302
> #8  0x00007ffff5506f30 in WebCore::HTMLScriptRunner::execute
> (this=0x7fffe415cae0, scriptElement=..., scriptStartPosition=...)
>     at ../Source/WebCore/html/parser/HTMLScriptRunner.cpp:175
> #9  0x00007ffff54ef853 in
> WebCore::HTMLDocumentParser::runScriptsForPausedTreeBuilder
> (this=this at entry=0x7fffe415f600)
>     at ../Source/WebCore/html/parser/HTMLDocumentParser.cpp:218
> ---Type <return> to continue, or q <return> to quit---
> #10 0x00007ffff54ef914 in
> WebCore::HTMLDocumentParser::canTakeNextToken
> (this=this at entry=0x7fffe415f600, 
>     mode=mode at entry=WebCore::HTMLDocumentParser::AllowYield,
> session=...)
> at ../Source/WebCore/html/parser/HTMLDocumentParser.cpp:237
> #11 0x00007ffff54f2ce2 in WebCore::HTMLDocumentParser::pumpTokenizer
> (this=0x7fffe415f600, mode=WebCore::HTMLDocumentParser::AllowYield)
>     at ../Source/WebCore/html/parser/HTMLDocumentParser.cpp:293
> #12 0x00007ffff54f3992 in WebCore::HTMLDocumentParser::append
> (this=0x7fffe415f600, inputSource=...)
>     at ../Source/WebCore/html/parser/HTMLDocumentParser.cpp:428
> #13 0x00007ffff52e869e in
> WebCore::DecodedDataDocumentParser::appendBytes (this=0x7fffe415f600,
> writer=..., 
>     data=0x7fffe4152400 "<html>\n<head>\n<title>Error</title>\n<style
> type=\"text/css\">\nbody {\n background-color: #fff;\n margin: 0;\n
> padding: 0;\n}\n\n#errorContainer {\n background: #fff;\n min-width:
> 35em;\n max-width: 35em;\n positio"..., length=975)
>     at ../Source/WebCore/dom/DecodedDataDocumentParser.cpp:50
> #14 0x00007ffff561f594 in WebCore::DocumentLoader::commitData
> (this=this at entry=0x7fffe4125b00, 
>     bytes=bytes at entry=0x7fffe4152400
> "<html>\n<head>\n<title>Error</title>\n<style type=\"text/css\">\nbody
> {\n background-color: #fff;\n margin: 0;\n padding: 0;\n}\n
> \n#errorContainer {\n background: #fff;\n min-width: 35em;\n
> max-width: 35em;\n positio"..., length=length at entry=975)
>     at ../Source/WebCore/loader/DocumentLoader.cpp:843
> #15 0x00007ffff4ff83f6 in WebKit::FrameLoaderClient::committedLoad
> (this=0x7fff78007230, loader=0x7fffe4125b00, 
>     data=0x7fffe4152400 "<html>\n<head>\n<title>Error</title>\n<style
> type=\"text/css\">\nbody {\n background-color: #fff;\n margin: 0;\n
> padding: 0;\n}\n\n#errorContainer {\n background: #fff;\n min-width:
> 35em;\n max-width: 35em;\n positio"..., length=975)
> 
> at ../Source/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp:165
> #16 0x00007ffff561e08f in WebCore::DocumentLoader::commitLoad
> (this=0x7fffe4125b00, 
>     data=0x7fffe4152400 "<html>\n<head>\n<title>Error</title>\n<style
> type=\"text/css\">\nbody {\n background-color: #fff;\n margin: 0;\n
> padding: 0;\n}\n\n#errorContainer {\n background: #fff;\n min-width:
> 35em;\n max-width: 35em;\n positio"..., length=975)
>     at ../Source/WebCore/loader/DocumentLoader.cpp:773
> #17 0x00007ffff56212b0 in
> WebCore::DocumentLoader::continueAfterContentPolicy
> (this=this at entry=0x7fffe4125b00, 
>     policy=policy at entry=WebCore::PolicyUse)
> at ../Source/WebCore/loader/DocumentLoader.cpp:752
> #18 0x00007ffff5624688 in WebCore::DocumentLoader::responseReceived
> (this=0x7fffe4125b00, resource=<optimized out>, response=...)
>     at ../Source/WebCore/loader/DocumentLoader.cpp:655
> #19 0x00007ffff561d9ff in
> WebCore::DocumentLoader::handleSubstituteDataLoadNow
> (this=0x7fffe4125b00)
>     at ../Source/WebCore/loader/DocumentLoader.cpp:475
> #20 0x00007ffff50fb1b1 in
> WebCore::ThreadTimers::sharedTimerFiredInternal (this=0x7fffe4123f50)
> at ../Source/WebCore/platform/ThreadTimers.cpp:132
> #21 0x00007ffff5110b82 in WebCore::sharedTimerTimeoutCallback ()
> at ../Source/WebCore/platform/gtk/SharedTimerGtk.cpp:49
> #22 0x00007ffff3300703 in ?? ()
> from /lib/x86_64-linux-gnu/libglib-2.0.so.0
> #23 0x00007ffff32ffce5 in g_main_context_dispatch ()
> from /lib/x86_64-linux-gnu/libglib-2.0.so.0
> #24 0x00007ffff3300048 in ?? ()
> from /lib/x86_64-linux-gnu/libglib-2.0.so.0
> #25 0x00007ffff330030a in g_main_loop_run ()
> from /lib/x86_64-linux-gnu/libglib-2.0.so.0
> #26 0x00007ffff46ae447 in IA__gtk_main () at /build/buildd/gtk
> +2.0-2.24.23/gtk/gtkmain.c:1271
> #27 0x00000000004458d9 in main (argc=1, argv=0x7fffffffe1e8)
> at /home/rootavish/BETA/shell/main.c:324
> 

hmm, it's difficult to say, it might be a threading issue. Does it
happen with any epub document?

> Here is the thumbnailer code I was talking about:
> 
> 
> I would really appreciate if somebody could help me with this crash, I
> tried asking people on the webkitgtk IRC, but didn't get help. Please
> I request you to point out the reason for the crash.
> 
> 
> static cairo_surface_t* surface = NULL ;
> static gboolean completed = FALSE;
> static GdkPixbuf *thumbnail=NULL ;
> 
> 
> static void
> epub_webkit_render(EpubDocument *document,const char* uri);
> 
> 
> //code that calls epub_webkit_render
> static GdkPixbuf *
> epub_document_thumbnails_get_thumbnail (EvDocumentThumbnails
> *document,
>                       EvRenderContext      *rc,
>                       gboolean              border)
> {
>     gchar* uri = (gchar*) rc->page->backend_page;
>     EpubDocument *epub_document = EPUB_DOCUMENT(document);
>     completed = FALSE ;
>     thumbnail=NULL;
>     if (surface) {
>         cairo_surface_destroy (surface);
>         surface=NULL;
>     }
>     epub_webkit_render (epub_document,uri);
> 
> 
>     while (completed != TRUE ) {
>         /*Wait for the job to complete*/
>     }

This is not correct. Is this method called in the evince worker thread?
I don't think you can use webkit from the evince worker thread, because
you might be using gtk/gdk from both threads at the same time. I think
you should use main thread evince jobs, to use the async webkit API in
the main thread.

> 
>     if (thumbnail) {
>         return thumbnail;
>     }
>     else {
>         return NULL;
>     }
> }
> 
> 
> static void 
> webkit_render_cb(GtkWidget *web_view,
>                  GParamSpec *specification,
>                  gpointer data)
> {
>     WebKitLoadStatus status = webkit_web_view_get_load_status
> (WEBKIT_WEB_VIEW(web_view));
> 
> 
>     if ( status == WEBKIT_LOAD_FINISHED )
>     {
>         surface = webkit_web_view_get_snapshot
> (WEBKIT_WEB_VIEW(web_view));

I didn't remember we had snapshot API in WebKit1 too. 

>         thumbnail = ev_document_misc_pixbuf_from_surface(surface);
>         completed=TRUE;
>     }
> }
> 
> 
> static void epub_webkit_render(EpubDocument *epub_document,const char*
> uri)
> {
> 
> webkit_web_view_load_uri(WEBKIT_WEB_VIEW(epub_document->webview),uri);
> }
> 
> 
> static WebKitWebView*
> offscreen_webview_init() 
> {
>     GtkWidget *offscreen_window = gtk_offscreen_window_new();
>     gtk_window_set_default_size(GTK_WINDOW(offscreen_window),800,600);
> 
> 
>     GtkWidget* scroll_view = gtk_scrolled_window_new (NULL,NULL);
>     gtk_scrolled_window_set_policy
> (GTK_SCROLLED_WINDOW(scroll_view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
>     GtkWidget* web_view = webkit_web_view_new ();
>     WebKitWebSettings *webviewsettings = webkit_web_settings_new ();
>     g_object_set (G_OBJECT(webviewsettings), "enable-plugins", FALSE,
> NULL);
>     webkit_web_view_set_settings
> (WEBKIT_WEB_VIEW(web_view),webviewsettings);
> 
> g_signal_connect(WEBKIT_WEB_VIEW(web_view),"notify::load-status",G_CALLBACK(webkit_render_cb),NULL);
>     gtk_container_add(GTK_CONTAINER(scroll_view),web_view);
>     gtk_container_add(GTK_CONTAINER(offscreen_window),scroll_view);
>     gtk_widget_show_all (offscreen_window);
>     return WEBKIT_WEB_VIEW(web_view);
> }
> 
> 
> I please request you to help me with my code. I tried searching online
> but could not find any conclusive answers.

Note that WebKit1 API is currently deprecated, please consider using the
new WebKit2 API for newly written code, it will work better and you will
get better support.

> 
> Regards,
> Avishkar Gupta
> _______________________________________________
> webkit-gtk mailing list
> webkit-gtk at lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-gtk

-- 
Carlos Garcia Campos
http://pgp.rediris.es:11371/pks/lookup?op=get&search=0xF3D322D0EC4582C3
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part
URL: <https://lists.webkit.org/pipermail/webkit-gtk/attachments/20140713/bdead6a2/attachment.sig>


More information about the webkit-gtk mailing list