Как отлаживать расширения WebKit2GTK + - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь заставить работать расширения WebKit2GTK +, это простое расширение, которое будет просто выводиться на консоль при создании страницы.Вот моя структура проекта:

-bin
-images
-include
-lib
--webextension
---libwebextension.so
---libwebextension.so.1
---libwebextension.so.1.0
---webextension.cpp
-src
--gtk
---gtk_manager.cpp
--main.cpp

В файлах gtk_manager.cpp есть реализация файла заголовка, только функция init () будет иметь значение (дойдет до этого чуть позже)

webextension.cpp

#include <webkit2/webkit-web-extension.h>
#include <iostream>

void
web_page_created_callback (WebKitWebExtension *extension,
                           WebKitWebPage      *web_page,
                           gpointer            user_data)
{
    g_print ("Page %d created for %s\n",
             webkit_web_page_get_id (web_page),
             webkit_web_page_get_uri (web_page));
}

G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
    std::cout << "extension hi\n";
    g_signal_connect (extension, "page-created",
                      G_CALLBACK (web_page_created_callback),
                      NULL);
}

void hi()
{
  g_print("hi");
}

Экспорт и динамическое связывание во время работы, как я могу назвать hi() из метода init() gtk_manager.cpp.webkit_web_extension_initialize() не показывает никаких признаков работы / вызова, потому что "extension hi" не выводится на консоль.

gtk_manager.cpp (gtk / gtk.h, glib.h и webkit2 / webkit2.h включается из gtk_manager.h в папку include)

#include "gtk/gtk_manager.h"
#include <iostream>

void initialize_web_extensions(WebKitWebContext*, gpointer);

void GTKManager::init(int argc, char* args[])
{
  g_signal_connect(webkit_web_context_get_default(), "initialize-web-extensions", G_CALLBACK(initialize_web_extensions), NULL);
  gtk_init(&argc, &args);
  /* other code */
}

/* other methods / functions */

void initialize_web_extensions(WebKitWebContext* context, gpointer userData)
{
  static guint uniqueId = 0;
  webkit_web_context_set_web_extensions_directory(context, "/abs/path/to/app/lib/webextension");
  webkit_web_context_set_web_extensions_initialization_user_data(context, g_variant_new_uint32(uniqueId++));
  hi(); // This is from webextension.cpp, it is called successfully
}

Я отредактирую этот вопрос, если потребуется дополнительная информация, чтобы найти решение.

Это ресурсы, которые я использую:

1 Ответ

1 голос
/ 28 сентября 2019

Поскольку это C ++, это может быть связано с искажением имен.Попробуйте добавить префикс функции webkit_web_extension_initialize к внешнему «C».Например:

extern "C" G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
    std::cout << "extension hi\n";
    /* your code */
}

Вы можете использовать readelf или objdump, чтобы вывести список всех экспортированных символов и посмотреть, имеют ли они искаженные имена.

...