-
This commit is contained in:
@@ -32,6 +32,22 @@ int main(int argc, char *argv[])
|
||||
rkt_webview_open_devtools(wv1);
|
||||
}
|
||||
|
||||
if (i == 3) {
|
||||
rkt_js_result_t *r = rkt_webview_call_js(wv1, "{ let a = 7 * 6; console.log('a = ' + a); return a; }");
|
||||
printf("rkt_js_result: %d: %s\n", r->result, r->value);
|
||||
}
|
||||
|
||||
if (i == 4) {
|
||||
rkt_js_result_t *r = rkt_webview_call_js(wv1, "let el = document.getElementById('hi');el.value = '10';");
|
||||
printf("rkt_js_result: %d: %s\n", r->result, r->value);
|
||||
}
|
||||
|
||||
if (i == 6) {
|
||||
rkt_js_result_t *r = rkt_webview_call_js(wv1, "document.body.innerHTML = '<h1>Hi!</h1>'; return document.body.innerHTML;");
|
||||
printf("rkt_js_result: %d: %s\n", r->result, r->value);
|
||||
}
|
||||
|
||||
|
||||
if (i == 10) {
|
||||
wv2 = rkt_webview_create(0, eventCb);
|
||||
}
|
||||
|
||||
@@ -15,4 +15,21 @@ public:
|
||||
|
||||
QString mkEventJson(const EventContainer &kv);
|
||||
|
||||
class Command
|
||||
{
|
||||
public:
|
||||
int cmd;
|
||||
QVector<QVariant> args;
|
||||
QVariant result;
|
||||
bool done;
|
||||
bool js_result_ok;
|
||||
public:
|
||||
Command(int _cmd) {
|
||||
cmd = _cmd;
|
||||
done = false;
|
||||
js_result_ok = true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -66,6 +66,14 @@ result_t rkt_webview_run_js(rktwebview_t wv, const char *js)
|
||||
return r;
|
||||
}
|
||||
|
||||
rkt_js_result_t *rkt_webview_call_js(rktwebview_t wv, const char *js)
|
||||
{
|
||||
rkt_webview_init();
|
||||
rkt_js_result_t *r = handler->rktCallJs(wv, js);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
|
||||
result_t rkt_webview_open_devtools(rktwebview_t wv)
|
||||
{
|
||||
@@ -95,6 +103,14 @@ result_t rkt_webview_destroy_event(rkt_event_t *e)
|
||||
return result_t::oke;
|
||||
}
|
||||
|
||||
result_t rkt_webview_destroy_js_result(rkt_js_result_t *r)
|
||||
{
|
||||
free(r->value);
|
||||
free(r);
|
||||
return result_t::oke;
|
||||
}
|
||||
|
||||
|
||||
result_t rkt_webview_move(rktwebview_t wv, int x, int y)
|
||||
{
|
||||
rkt_webview_init();
|
||||
@@ -118,3 +134,5 @@ bool rkt_webview_valid(rktwebview_t wv)
|
||||
rkt_webview_init();
|
||||
return handler->rktValid(wv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -32,6 +32,13 @@ typedef enum {
|
||||
resize_failed = 13
|
||||
} result_t;
|
||||
|
||||
typedef struct {
|
||||
result_t result;
|
||||
char *value;
|
||||
} rkt_js_result_t;
|
||||
|
||||
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_init();
|
||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
||||
|
||||
@@ -44,6 +51,9 @@ RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_url(rktwebview_t wv, const char *u
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_html(rktwebview_t wv, const char *html);
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_run_js(rktwebview_t wv, const char *js);
|
||||
RKTWEBVIEW_QT_EXPORT rkt_js_result_t *rkt_webview_call_js(rktwebview_t wv, const char *js);
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_js_result(rkt_js_result_t *r);
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_open_devtools(rktwebview_t wv);
|
||||
|
||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t *e);
|
||||
|
||||
@@ -18,20 +18,7 @@
|
||||
#define COMMAND_DEV_TOOLS 7
|
||||
#define COMMAND_MOVE 8
|
||||
#define COMMAND_RESIZE 9
|
||||
|
||||
class Command
|
||||
{
|
||||
public:
|
||||
int cmd;
|
||||
QVector<QVariant> args;
|
||||
QVariant result;
|
||||
bool done;
|
||||
public:
|
||||
Command(int _cmd) {
|
||||
cmd = _cmd;
|
||||
done = false;
|
||||
}
|
||||
};
|
||||
#define COMMAND_CALL_JS 10
|
||||
|
||||
void Rktwebview_qt::processCommands()
|
||||
{
|
||||
@@ -127,6 +114,19 @@ void Rktwebview_qt::processCommands()
|
||||
cmd->done = true;
|
||||
}
|
||||
break;
|
||||
case COMMAND_CALL_JS: {
|
||||
int wv = cmd->args[0].toInt();
|
||||
QString js = cmd->args[1].toString();
|
||||
if (_views.contains(wv)) {
|
||||
WebviewWindow *w = _views[wv];
|
||||
w->callJs(js, cmd);
|
||||
} else {
|
||||
cmd->result = false;
|
||||
cmd->js_result_ok = false;
|
||||
cmd->done = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case COMMAND_DEV_TOOLS: {
|
||||
int wv = cmd->args[0].toInt();
|
||||
if (_views.contains(wv)) {
|
||||
@@ -260,6 +260,22 @@ result_t Rktwebview_qt::rktSetHtml(rktwebview_t wv, const char *html)
|
||||
return r ? result_t::oke : result_t::set_navigate_failed;
|
||||
}
|
||||
|
||||
rkt_js_result_t *Rktwebview_qt::rktCallJs(rktwebview_t wv, const char *js)
|
||||
{
|
||||
Command c(COMMAND_CALL_JS);
|
||||
QString _js(js);
|
||||
c.args.push_back(wv);
|
||||
c.args.push_back(_js);
|
||||
_command_queue.enqueue(&c);
|
||||
while(!c.done) { doEvents(); }
|
||||
|
||||
rkt_js_result_t *r = static_cast<rkt_js_result_t *>(malloc(sizeof(rkt_js_result_t)));
|
||||
r->result = c.js_result_ok ? result_t::oke : result_t::eval_js_failed;
|
||||
r->value = strdup(c.result.toString().toUtf8());
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
result_t Rktwebview_qt::rktRunJs(rktwebview_t wv, const char *js)
|
||||
{
|
||||
Command c(COMMAND_RUN_JS);
|
||||
|
||||
@@ -57,6 +57,7 @@ public:
|
||||
result_t rktSetUrl(rktwebview_t wv, const char *url);
|
||||
result_t rktSetHtml(rktwebview_t wv, const char *html);
|
||||
result_t rktRunJs(rktwebview_t wv, const char *js);
|
||||
rkt_js_result_t *rktCallJs(rktwebview_t wv, const char *js);
|
||||
result_t rktMove(rktwebview_t wv, int x, int y);
|
||||
result_t rktResize(rktwebview_t wv, int w, int h);
|
||||
bool rktValid(rktwebview_t wv);
|
||||
|
||||
@@ -129,6 +129,31 @@ void WebviewWindow::runJs(const QString &js)
|
||||
p->runJavaScript(js);
|
||||
}
|
||||
|
||||
void WebviewWindow::callJs(const QString &js, Command *c)
|
||||
{
|
||||
QWebEnginePage *p = _view->page();
|
||||
QString _js = QString("{\n") +
|
||||
" let f = function() {\n" +
|
||||
" " + js + "\n" +
|
||||
" };\n" +
|
||||
" try {\n" +
|
||||
" let obj = { oke: true, result: f(), exn: false };\n" +
|
||||
" obj;\n" +
|
||||
" } catch(e) {\n" +
|
||||
" let obj = { oke: false, result: false, exn: e.message };\n" +
|
||||
" obj;\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
p->runJavaScript(_js, [c](const QVariant &v) {
|
||||
c->result = v;
|
||||
QJsonObject obj = v.toJsonObject();
|
||||
bool ok = obj["oke"].toBool();
|
||||
c->js_result_ok = ok;
|
||||
c->result = QString::fromUtf8(QJsonDocument(obj).toJson(QJsonDocument::JsonFormat::Compact));
|
||||
c->done = true;
|
||||
});
|
||||
}
|
||||
|
||||
void WebviewWindow::openDevTools()
|
||||
{
|
||||
_devtools = new QMainWindow(this);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
class WebViewQt;
|
||||
class Rktwebview_qt;
|
||||
class Command;
|
||||
|
||||
class WebviewWindow : public QMainWindow
|
||||
{
|
||||
@@ -39,6 +40,7 @@ public:
|
||||
|
||||
public:
|
||||
void runJs(const QString &js);
|
||||
void callJs(const QString &js, Command *c);
|
||||
void openDevTools();
|
||||
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user