diff options
| -rw-r--r-- | spec/LuaRuntimeApiSpec.cpp | 4 | ||||
| -rw-r--r-- | src/EventQueue.cpp | 5 | ||||
| -rw-r--r-- | src/EventQueue.hpp | 5 | ||||
| -rw-r--r-- | src/LuaRuntimeApi.hpp | 3 | ||||
| -rw-r--r-- | src/events/Event.hpp | 19 | ||||
| -rw-r--r-- | src/events/EventHandlerRequest.hpp | 12 | ||||
| -rw-r--r-- | src/events/PermissionRequestedEvent.hpp (renamed from src/events.hpp) | 71 | ||||
| -rw-r--r-- | src/events/UrlChangedEvent.hpp | 28 | ||||
| -rw-r--r-- | src/widgets/WebViewStack.cpp | 7 |
9 files changed, 89 insertions, 65 deletions
diff --git a/spec/LuaRuntimeApiSpec.cpp b/spec/LuaRuntimeApiSpec.cpp index c340a03..fe29fcc 100644 --- a/spec/LuaRuntimeApiSpec.cpp +++ b/spec/LuaRuntimeApiSpec.cpp @@ -3,10 +3,10 @@ #include "LuaRuntime.hpp" #include "WindowActionRouter.hpp" -#include "events.hpp" +#include "events/Event.hpp" #include "testUtils.h" -class TestEvent1 : public BrowserEvent { +class TestEvent1 : public Event { public: int num; TestEvent1(int num) : num(num) { kind = "TestEvent1"; } diff --git a/src/EventQueue.cpp b/src/EventQueue.cpp index 9fef368..127d453 100644 --- a/src/EventQueue.cpp +++ b/src/EventQueue.cpp @@ -1,7 +1,10 @@ +#include <mutex> +#include <unordered_map> + #include "EventQueue.hpp" #include "LuaRuntime.hpp" -void EventQueue::dispatch_event(BrowserEvent *event) { +void EventQueue::dispatch_event(Event *event) { auto &runtime = LuaRuntime::instance(); runtime.queue_task([this, event]() { diff --git a/src/EventQueue.hpp b/src/EventQueue.hpp index c4a9f76..7bcbbf7 100644 --- a/src/EventQueue.hpp +++ b/src/EventQueue.hpp @@ -4,13 +4,14 @@ #include <mutex> #include <unordered_map> -#include "events.hpp" +#include "events/Event.hpp" +#include "events/EventHandlerRequest.hpp" class EventQueue { public: EventQueue() = default; - void dispatch_event(BrowserEvent *event); + void dispatch_event(Event *event); void register_event(const EventHandlerRequest &event); private: diff --git a/src/LuaRuntimeApi.hpp b/src/LuaRuntimeApi.hpp index 9994491..5ec72cc 100644 --- a/src/LuaRuntimeApi.hpp +++ b/src/LuaRuntimeApi.hpp @@ -4,6 +4,7 @@ #include "LuaRuntime.hpp" #include "WindowActionRouter.hpp" +#include "events/Event.hpp" int lua_api_view_set_url(lua_State *state) { const char *url = lua_tostring(state, 1); @@ -172,7 +173,7 @@ int lua_event_register(lua_State *state) { const int function_ref = luaL_ref(state, LUA_REGISTRYINDEX); event.function_ref = function_ref; // TODO: Delete ref on clear callback - event.handler = [state, function_ref](BrowserEvent *event) { + event.handler = [state, function_ref](Event *event) { preserve_top(state, { lua_rawgeti(state, LUA_REGISTRYINDEX, function_ref); event->lua_push(state); diff --git a/src/events/Event.hpp b/src/events/Event.hpp new file mode 100644 index 0000000..a0853d6 --- /dev/null +++ b/src/events/Event.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include <QtCore> +#include <lua.hpp> + +#define SET_FIELD(NAME, TYPE, VALUE) \ + lua_pushstring(state, NAME); \ + lua_push##TYPE(state, VALUE); \ + lua_settable(state, -3); + +class Event { +public: + QString kind = "-"; + + virtual void lua_push(lua_State *state) const { + lua_newtable(state); + SET_FIELD("type", string, kind.toStdString().c_str()) + }; +}; diff --git a/src/events/EventHandlerRequest.hpp b/src/events/EventHandlerRequest.hpp new file mode 100644 index 0000000..94f4afc --- /dev/null +++ b/src/events/EventHandlerRequest.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include <QtCore> + +#include "events/Event.hpp" + +struct EventHandlerRequest { + std::vector<QString> event_names; + std::vector<QString> patterns; + std::function<void(Event *)> handler; + int function_ref; +}; diff --git a/src/events.hpp b/src/events/PermissionRequestedEvent.hpp index f16c2a1..089cc99 100644 --- a/src/events.hpp +++ b/src/events/PermissionRequestedEvent.hpp @@ -1,52 +1,14 @@ #pragma once +#include <QWebEnginePermission> #include <QtCore> -#include <functional> #include <lua.hpp> -#include <memory> -#include <qwebenginepermission.h> -#include "LuaRuntime.hpp" -#include "lua.h" +#include "events/Event.hpp" #include "widgets/BrowserWindow.hpp" #include "widgets/WebViewStack.hpp" -#define SET_FIELD(NAME, TYPE, VALUE) \ - lua_pushstring(state, NAME); \ - lua_push##TYPE(state, VALUE); \ - lua_settable(state, -3); - -class BrowserEvent { -public: - QString kind = "-"; - - virtual void lua_push(lua_State *state) const { - lua_newtable(state); - SET_FIELD("type", string, kind.toStdString().c_str()) - }; -}; - -class UrlChangedEvent : public BrowserEvent { -public: - const QString &url; - const WebViewId webview_id; - const WindowId win_id; - - UrlChangedEvent(const QString &url, WebViewId webview_id, WindowId win_id) - : url(url), webview_id(webview_id), win_id(win_id) { - kind = "UrlChanged"; - } - - void lua_push(lua_State *state) const override { - lua_newtable(state); - SET_FIELD("type", string, kind.toStdString().c_str()) - SET_FIELD("view_id", integer, webview_id) - SET_FIELD("win_id", integer, win_id) - SET_FIELD("url", string, url.toStdString().c_str()) - } -}; - -class PermissionRequestEvent : public BrowserEvent { +class PermissionRequestedEvent : public Event { public: const QWebEnginePermission::PermissionType premission_type; const WebViewId webview_id; @@ -54,16 +16,18 @@ public: std::function<void()> accept_request; std::function<void()> reject_request; - PermissionRequestEvent(QWebEnginePermission::PermissionType type, - std::function<void()> accept_request, std::function<void()> reject_request, - WebViewId webview_id, WindowId win_id) + PermissionRequestedEvent(QWebEnginePermission::PermissionType type, + std::function<void()> accept_request, + std::function<void()> reject_request, WebViewId webview_id, + WindowId win_id) : premission_type(type), webview_id(webview_id), win_id(win_id), accept_request(std::move(accept_request)), reject_request(std::move(reject_request)) { kind = "PermissionRequested"; } - static PermissionRequestEvent *from_permission(std::shared_ptr<QWebEnginePermission> &permission, - WebViewId webview_id, WindowId win_id) { + static PermissionRequestedEvent * + from_permission(std::shared_ptr<QWebEnginePermission> &permission, WebViewId webview_id, + WindowId win_id) { auto accept = [permission]() { QMetaObject::invokeMethod(qApp, [=]() { permission->grant(); }, Qt::QueuedConnection); }; @@ -71,8 +35,8 @@ public: QMetaObject::invokeMethod(qApp, [=]() { permission->deny(); }, Qt::QueuedConnection); }; // TODO: Manage delete for permission object - return new PermissionRequestEvent(permission->permissionType(), accept, reject, webview_id, - win_id); + return new PermissionRequestedEvent(permission->permissionType(), accept, reject, webview_id, + win_id); } [[nodiscard]] const char *permission_type() const { @@ -115,7 +79,7 @@ public: state, [](lua_State *state) { void *userdata = lua_touserdata(state, lua_upvalueindex(1)); - auto *event = static_cast<PermissionRequestEvent *>(userdata); + auto *event = static_cast<PermissionRequestedEvent *>(userdata); event->accept_request(); lua_pushnil(state); return 1; @@ -129,7 +93,7 @@ public: state, [](lua_State *state) { void *userdata = lua_touserdata(state, lua_upvalueindex(1)); - auto *event = static_cast<PermissionRequestEvent *>(userdata); + auto *event = static_cast<PermissionRequestedEvent *>(userdata); event->reject_request(); lua_pushnil(state); return 1; @@ -138,10 +102,3 @@ public: lua_settable(state, -3); } }; - -struct EventHandlerRequest { - std::vector<QString> event_names; - std::vector<QString> patterns; - std::function<void(BrowserEvent *)> handler; - int function_ref; -}; diff --git a/src/events/UrlChangedEvent.hpp b/src/events/UrlChangedEvent.hpp new file mode 100644 index 0000000..1685c89 --- /dev/null +++ b/src/events/UrlChangedEvent.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include <QtCore> +#include <lua.hpp> + +#include "events/Event.hpp" +#include "widgets/BrowserWindow.hpp" +#include "widgets/WebViewStack.hpp" + +class UrlChangedEvent : public Event { +public: + const QString &url; + const WebViewId webview_id; + const WindowId win_id; + + UrlChangedEvent(const QString &url, WebViewId webview_id, WindowId win_id) + : url(url), webview_id(webview_id), win_id(win_id) { + kind = "UrlChanged"; + } + + void lua_push(lua_State *state) const override { + lua_newtable(state); + SET_FIELD("type", string, kind.toStdString().c_str()) + SET_FIELD("view_id", integer, webview_id) + SET_FIELD("win_id", integer, win_id) + SET_FIELD("url", string, url.toStdString().c_str()) + } +}; diff --git a/src/widgets/WebViewStack.cpp b/src/widgets/WebViewStack.cpp index 7fe9218..37e7dca 100644 --- a/src/widgets/WebViewStack.cpp +++ b/src/widgets/WebViewStack.cpp @@ -2,14 +2,17 @@ #include <QWebEngineFindTextResult> #include <QWebEngineHistory> #include <QWebEngineNewWindowRequest> +#include <QWebEngineNotification> #include <QWebEngineProfile> #include <cstdint> #include <cstdlib> #include <memory> +#include <qwebengineprofile.h> #include <vector> #include "WindowActionRouter.hpp" -#include "events.hpp" +#include "events/PermissionRequestedEvent.hpp" +#include "events/UrlChangedEvent.hpp" #include "widgets/WebViewStack.hpp" static WebViewId next_webview_id = 1; @@ -62,7 +65,7 @@ WebView *WebViewStack::create_new_webview(const QUrl &url, bool focus) { connect(page, &QWebEnginePage::permissionRequested, this, [webview](QWebEnginePermission perm) { auto permission = std::make_shared<QWebEnginePermission>(std::move(perm)); // TODO: Add windown id - auto *event = PermissionRequestEvent::from_permission(permission, webview->get_id(), 0); + auto *event = PermissionRequestedEvent::from_permission(permission, webview->get_id(), 0); WindowActionRouter::instance().dispatch_event(event); }); |
