Better profile support, only 1 web server per context, multiple windows per context
This commit is contained in:
Binary file not shown.
@@ -16,6 +16,7 @@
|
|||||||
(provide rkt-wv
|
(provide rkt-wv
|
||||||
rkt-wv-win
|
rkt-wv-win
|
||||||
|
|
||||||
|
rkt-webview-new-context
|
||||||
rkt-webview-create
|
rkt-webview-create
|
||||||
rkt-webview-close
|
rkt-webview-close
|
||||||
rkt-webview-set-ou-token
|
rkt-webview-set-ou-token
|
||||||
@@ -256,6 +257,11 @@
|
|||||||
(define-rktwebview rkt_webview_init
|
(define-rktwebview rkt_webview_init
|
||||||
(_fun -> _void))
|
(_fun -> _void))
|
||||||
|
|
||||||
|
;RKTWEBVIEW_QT_EXPORT rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js,
|
||||||
|
; const char *optional_server_cert_pem);
|
||||||
|
(define-rktwebview rkt_webview_new_context
|
||||||
|
(_fun _string/utf-8 _bytes -> _int))
|
||||||
|
|
||||||
;RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
;RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
||||||
(define-rktwebview rkt_webview_process_events
|
(define-rktwebview rkt_webview_process_events
|
||||||
(_fun _int -> _void))
|
(_fun _int -> _void))
|
||||||
@@ -268,14 +274,13 @@
|
|||||||
(define-rktwebview rkt_webview_version
|
(define-rktwebview rkt_webview_version
|
||||||
(_fun -> _rkt_data_t-pointer))
|
(_fun -> _rkt_data_t-pointer))
|
||||||
|
|
||||||
;RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rktwebview_t parent,
|
; RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rkt_wv_context_t context,
|
||||||
; event_cb_t js_event_cb,
|
; rktwebview_t parent,
|
||||||
; const char *optional_server_cert_pem);
|
; event_cb_t js_event_cb);
|
||||||
(define-rktwebview rkt_webview_create
|
(define-rktwebview rkt_webview_create
|
||||||
(_fun _int
|
(_fun _int _int
|
||||||
(_fun #:keep callback-box #:async-apply applier
|
(_fun #:keep callback-box #:async-apply applier
|
||||||
_rkt_data_t-pointer -> _void)
|
_rkt_data_t-pointer -> _void)
|
||||||
_bytes
|
|
||||||
-> _int))
|
-> _int))
|
||||||
|
|
||||||
;RKTWEBVIEW_QT_EXPORT void rkt_webview_close(int wv);
|
;RKTWEBVIEW_QT_EXPORT void rkt_webview_close(int wv);
|
||||||
@@ -415,14 +420,18 @@
|
|||||||
)
|
)
|
||||||
'done))
|
'done))
|
||||||
|
|
||||||
(define (rkt-webview-create parent evt-callback close-callback server-cert)
|
|
||||||
|
(define (rkt-webview-new-context boilerplate-js server-cert)
|
||||||
|
(rkt_webview_new_context boilerplate-js server-cert))
|
||||||
|
|
||||||
|
|
||||||
|
(define (rkt-webview-create context parent evt-callback close-callback)
|
||||||
(let* ((evt-queue (make-queue))
|
(let* ((evt-queue (make-queue))
|
||||||
(parent-win (if (eq? parent #f) 0 (rkt-wv-win parent)))
|
(parent-win (if (eq? parent #f) 0 (rkt-wv-win parent)))
|
||||||
)
|
)
|
||||||
(let ((wv (rkt_webview_create parent-win
|
(let ((wv (rkt_webview_create context parent-win
|
||||||
(λ (rkt-evt)
|
(λ (rkt-evt)
|
||||||
(enqueue! evt-queue rkt-evt))
|
(enqueue! evt-queue rkt-evt)))))
|
||||||
server-cert)))
|
|
||||||
(let ((handle (make-rkt-wv wv evt-queue evt-callback #t close-callback)))
|
(let ((handle (make-rkt-wv wv evt-queue evt-callback #t close-callback)))
|
||||||
(thread (λ ()
|
(thread (λ ()
|
||||||
(sleep 1)
|
(sleep 1)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
"utils.rkt"
|
"utils.rkt"
|
||||||
"mimetypes.rkt"
|
"mimetypes.rkt"
|
||||||
"rgba.rkt"
|
"rgba.rkt"
|
||||||
|
finalizer
|
||||||
racket/async-channel
|
racket/async-channel
|
||||||
web-server/http
|
web-server/http
|
||||||
web-server/servlet-dispatch
|
web-server/servlet-dispatch
|
||||||
@@ -28,7 +29,8 @@
|
|||||||
racket-self-signed-cert
|
racket-self-signed-cert
|
||||||
)
|
)
|
||||||
|
|
||||||
(provide webview-create
|
(provide webview-new-context
|
||||||
|
webview-create
|
||||||
webview-devtools
|
webview-devtools
|
||||||
webview-close
|
webview-close
|
||||||
|
|
||||||
@@ -102,8 +104,8 @@
|
|||||||
|
|
||||||
webview-version
|
webview-version
|
||||||
|
|
||||||
wv-base-url
|
wv-context-base-url
|
||||||
wv-window-nr
|
wv-win-window-nr
|
||||||
|
|
||||||
test
|
test
|
||||||
)
|
)
|
||||||
@@ -118,32 +120,38 @@
|
|||||||
(let ((file (build-path js-path "boilerplate.js")))
|
(let ((file (build-path js-path "boilerplate.js")))
|
||||||
(file->string file)))
|
(file->string file)))
|
||||||
|
|
||||||
(define-struct wv
|
(define-struct wv-context
|
||||||
([handle #:mutable]
|
([context #:mutable]
|
||||||
[port #:mutable]
|
[port #:mutable]
|
||||||
[window-nr #:mutable]
|
|
||||||
[file-getter #:mutable]
|
[file-getter #:mutable]
|
||||||
[boilerplate-js #:mutable]
|
|
||||||
[webserver-thread #:mutable]
|
[webserver-thread #:mutable]
|
||||||
[base-url #:mutable]
|
[base-url #:mutable]
|
||||||
[request-count #:mutable]
|
[request-count #:mutable]
|
||||||
[sec-token-cache #:mutable]
|
[sec-token-cache #:mutable]
|
||||||
[cert-ou-token #:mutable]
|
[cert-ou-token #:mutable]
|
||||||
|
)
|
||||||
|
#:transparent
|
||||||
|
)
|
||||||
|
|
||||||
|
(define-struct wv-win
|
||||||
|
([handle #:mutable]
|
||||||
[context #:mutable]
|
[context #:mutable]
|
||||||
|
[window-nr #:mutable]
|
||||||
)
|
)
|
||||||
#:transparent)
|
#:transparent)
|
||||||
|
|
||||||
(define (process-html wv-handle path out)
|
(define (process-html context path out)
|
||||||
(let ((html (file->string path))
|
(let ((html (file->string path)))
|
||||||
(boilerplate-js ((wv-boilerplate-js wv-handle))))
|
|
||||||
(set! html (string-replace html "<head>"
|
|
||||||
(string-append "<head>" "\n"
|
|
||||||
"<script>" "\n"
|
|
||||||
boilerplate-js "\n"
|
|
||||||
"</script>" "\n")))
|
|
||||||
(display html out)))
|
(display html out)))
|
||||||
|
; (boilerplate-js ((wv-context-boilerplate-js wv-win-handle))))
|
||||||
|
; (set! html (string-replace html "<head>"
|
||||||
|
; (string-append "<head>" "\n"
|
||||||
|
; "<script>" "\n"
|
||||||
|
; boilerplate-js "\n"
|
||||||
|
; "</script>" "\n")))
|
||||||
|
; (display html out)))
|
||||||
|
|
||||||
(define (process-file wv-handle ext path out)
|
(define (process-file context ext path out)
|
||||||
(let ((content (file->bytes path)))
|
(let ((content (file->bytes path)))
|
||||||
(display content out)))
|
(display content out)))
|
||||||
|
|
||||||
@@ -185,11 +193,11 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
(define (web-serve wv-handle req)
|
(define (web-serve context req)
|
||||||
(let* ((path (url->string (request-uri req)))
|
(let* ((path (url->string (request-uri req)))
|
||||||
(file-getter (wv-file-getter wv-handle))
|
(file-getter (wv-context-file-getter context))
|
||||||
(token (get-security-token req))
|
(token (get-security-token req))
|
||||||
(sec-cache (wv-sec-token-cache wv-handle))
|
(sec-cache (wv-context-sec-token-cache context))
|
||||||
(cache-empty? (lru-empty? sec-cache))
|
(cache-empty? (lru-empty? sec-cache))
|
||||||
(token-in-cache? (not (or (eq? token #f)
|
(token-in-cache? (not (or (eq? token #f)
|
||||||
(eq? (lru-has? sec-cache token) #f))))
|
(eq? (lru-has? sec-cache token) #f))))
|
||||||
@@ -212,8 +220,8 @@
|
|||||||
#:headers (list (make-sec-header sec-cache))
|
#:headers (list (make-sec-header sec-cache))
|
||||||
(λ (out)
|
(λ (out)
|
||||||
(if (or (eq? ext 'html) (eq? ext 'htm))
|
(if (or (eq? ext 'html) (eq? ext 'htm))
|
||||||
(process-html wv-handle file-to-serve out)
|
(process-html context file-to-serve out)
|
||||||
(process-file wv-handle ext file-to-serve out))
|
(process-file context ext file-to-serve out))
|
||||||
))
|
))
|
||||||
(response/output
|
(response/output
|
||||||
#:code 404
|
#:code 404
|
||||||
@@ -238,12 +246,16 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(let* ((cert-path (let ((p (build-path (find-system-path 'pref-dir) "racket-webview" (wv-context h))))
|
(let* ((cert-path (let* ((context-nr (wv-context-context h))
|
||||||
|
(p (build-path (find-system-path 'pref-dir)
|
||||||
|
"racket-webview"
|
||||||
|
(format "context-~a" context-nr)))
|
||||||
|
)
|
||||||
(make-directory* p)
|
(make-directory* p)
|
||||||
p))
|
p))
|
||||||
(window-nr (wv-window-nr h))
|
(context-nr (wv-context-context h))
|
||||||
(f1 (build-path cert-path (format "self-signed-~a.cert" window-nr)))
|
(f1 (build-path cert-path (format "self-signed-~a.cert" context-nr)))
|
||||||
(f2 (build-path cert-path (format "self-signed-~a.key" window-nr)))
|
(f2 (build-path cert-path (format "self-signed-~a.key" context-nr)))
|
||||||
(fh1 (open-output-file f1 #:exists 'replace #:permissions #o600))
|
(fh1 (open-output-file f1 #:exists 'replace #:permissions #o600))
|
||||||
(fh2 (open-output-file f2 #:exists 'replace #:permissions #o600)))
|
(fh2 (open-output-file f2 #:exists 'replace #:permissions #o600)))
|
||||||
(display (certificate cert) fh1)
|
(display (certificate cert) fh1)
|
||||||
@@ -266,12 +278,12 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define (remove-cert-files h)
|
(define (remove-cert-files h)
|
||||||
(let* ((cert-path (build-path (find-system-path 'pref-dir)
|
(let* ((context-nr (wv-context-context h))
|
||||||
|
(cert-path (build-path (find-system-path 'pref-dir)
|
||||||
"racket-webview"
|
"racket-webview"
|
||||||
(wv-context h)))
|
(format "context-~a" context-nr)))
|
||||||
(window-nr (wv-window-nr h))
|
(f1 (build-path cert-path (format "self-signed-~a.cert" context-nr)))
|
||||||
(f1 (build-path cert-path (format "self-signed-~a.cert" window-nr)))
|
(f2 (build-path cert-path (format "self-signed-~a.key" context-nr)))
|
||||||
(f2 (build-path cert-path (format "self-signed-~a.key" window-nr)))
|
|
||||||
)
|
)
|
||||||
(when (file-exists? f1)
|
(when (file-exists? f1)
|
||||||
(delete-file f1))
|
(delete-file f1))
|
||||||
@@ -388,67 +400,95 @@
|
|||||||
;; Webview functions
|
;; Webview functions
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(define/contract (webview-create context file-getter event-callback
|
(define/contract (webview-new-context file-getter
|
||||||
#:boilerplate-js [bj (λ () (default-boilerplate-js))]
|
#:boilerplate-js [bj (default-boilerplate-js)])
|
||||||
#:parent [p #f])
|
(->* (procedure?) (#:boilerplate-js string?) wv-context?)
|
||||||
(->* ((or/c symbol? string?) procedure? procedure?)
|
(let* ((h (make-wv-context 0 0 file-getter #f #f 0
|
||||||
(#:boilerplate-js procedure? #:parent (or/c wv? #f))
|
(make-lru 250 #:cmp eq?)
|
||||||
wv?)
|
(symbol->string (make-security-token))
|
||||||
(let* ((h (make-wv #f 0 -1 file-getter bj #f #f 0 (make-lru 250 #:cmp eq?)
|
))
|
||||||
(symbol->string (make-security-token)) (symbol->string context)))
|
|
||||||
(cert (generate-self-signed-cert 2048 365 '("127.0.0.1" "localhost")
|
(cert (generate-self-signed-cert 2048 365 '("127.0.0.1" "localhost")
|
||||||
"NL" "Dijkema"
|
"NL" "Dijkema"
|
||||||
#:ou (wv-cert-ou-token h)))
|
#:ou (wv-context-cert-ou-token h)))
|
||||||
(server-cert (certificate cert))
|
(server-cert (certificate cert))
|
||||||
(event-processor (λ (wv evt)
|
|
||||||
(event-callback h (util-parse-event evt))))
|
|
||||||
(close-callback (λ ()
|
|
||||||
(remove-cert-files h)))
|
|
||||||
(ph (if (wv? p) (wv-handle p) #f))
|
|
||||||
(wv (let ((internal-handle (rkt-webview-create ph event-processor close-callback server-cert)))
|
|
||||||
(set-wv-handle! h internal-handle)
|
|
||||||
(set-wv-window-nr! h (rkt-wv-win internal-handle))
|
|
||||||
internal-handle))
|
|
||||||
(channel (make-async-channel))
|
(channel (make-async-channel))
|
||||||
(server (let ((s (start-web-server h channel cert)))
|
(server (let ((s (start-web-server h channel cert)))
|
||||||
(sleep 1) ;;; TODO: Check if web server is up.
|
(sleep 1) ;;; ToDO Check if server is up
|
||||||
s))
|
s))
|
||||||
(port-nr (let ((pn (async-channel-get channel)))
|
(port-nr (let ((pn (async-channel-get channel)))
|
||||||
(set-wv-port! h pn)
|
(set-wv-context-port! h pn)
|
||||||
pn))
|
pn))
|
||||||
(base-req (format "https://127.0.0.1:~a" (wv-port h)))
|
(base-req (format "https://127.0.0.1:~a" (wv-context-port h)))
|
||||||
)
|
)
|
||||||
(set-wv-webserver-thread! h server)
|
(set-wv-context-context! h (rkt-webview-new-context bj server-cert))
|
||||||
(set-wv-base-url! h base-req)
|
(set-wv-context-webserver-thread! h server)
|
||||||
(rkt-webview-set-ou-token (wv-handle h) (wv-cert-ou-token h))
|
(set-wv-context-base-url! h base-req)
|
||||||
(rkt-webview-set-url! (wv-handle h) base-req)
|
(register-finalizer h (λ (h) (remove-cert-files h)))
|
||||||
|
h))
|
||||||
|
|
||||||
|
;([context #:mutable]
|
||||||
|
; [port #:mutable]
|
||||||
|
; [file-getter #:mutable]
|
||||||
|
; [webserver-thread #:mutable]
|
||||||
|
; [base-url #:mutable]
|
||||||
|
; [request-count #:mutable]
|
||||||
|
; [sec-token-cache #:mutable]
|
||||||
|
; [cert-ou-token #:mutable]
|
||||||
|
|
||||||
|
|
||||||
|
;(define-struct wv
|
||||||
|
; ([handle #:mutable]
|
||||||
|
; [context #:mutable]
|
||||||
|
; [window-nr #:mutable]
|
||||||
|
; )
|
||||||
|
; #:transparent)
|
||||||
|
|
||||||
|
(define/contract (webview-create context url-path event-callback
|
||||||
|
#:parent [p #f])
|
||||||
|
(->* (wv-context? string? procedure?)
|
||||||
|
(#:parent (or/c wv-win? #f))
|
||||||
|
wv-win?)
|
||||||
|
(let* ((h (make-wv-win #f context -1))
|
||||||
|
(event-processor (λ (wv evt)
|
||||||
|
(event-callback h (util-parse-event evt))))
|
||||||
|
(close-callback (λ () #t))
|
||||||
|
(ph (if (wv-win? p) (wv-win-handle p) #f))
|
||||||
|
(context-nr (wv-context-context context))
|
||||||
|
(wv (let ((internal-handle (rkt-webview-create context-nr ph event-processor close-callback)))
|
||||||
|
(set-wv-win-handle! h internal-handle)
|
||||||
|
(set-wv-win-window-nr! h (rkt-wv-win internal-handle))
|
||||||
|
internal-handle))
|
||||||
|
)
|
||||||
|
(rkt-webview-set-ou-token (wv-win-handle h) (wv-context-cert-ou-token context))
|
||||||
|
(webview-set-url! h url-path)
|
||||||
h)
|
h)
|
||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-devtools wv)
|
(define/contract (webview-devtools wv)
|
||||||
(-> wv? symbol?)
|
(-> wv-win? symbol?)
|
||||||
(rkt-webview-open-devtools (wv-handle wv)))
|
(rkt-webview-open-devtools (wv-win-handle wv)))
|
||||||
|
|
||||||
(define/contract (webview-move wv x y)
|
(define/contract (webview-move wv x y)
|
||||||
(-> wv? number? number? symbol?)
|
(-> wv-win? number? number? symbol?)
|
||||||
(rkt-webview-move (wv-handle wv) x y))
|
(rkt-webview-move (wv-win-handle wv) x y))
|
||||||
|
|
||||||
(define/contract (webview-resize wv w h)
|
(define/contract (webview-resize wv w h)
|
||||||
(-> wv? number? number? symbol?)
|
(-> wv-win? number? number? symbol?)
|
||||||
(rkt-webview-resize (wv-handle wv) w h))
|
(rkt-webview-resize (wv-win-handle wv) w h))
|
||||||
|
|
||||||
(define/contract (webview-set-html! wv html)
|
(define/contract (webview-set-html! wv html)
|
||||||
(-> wv? (or/c string? xexpr?) symbol?)
|
(-> wv-win? (or/c string? xexpr?) symbol?)
|
||||||
(if (string? html)
|
(if (string? html)
|
||||||
(rkt-webview-set-html! (wv-handle wv) html)
|
(rkt-webview-set-html! (wv-win-handle wv) html)
|
||||||
(rkt-webview-set-html! (wv-handle wv) (xexpr->string html))
|
(rkt-webview-set-html! (wv-win-handle wv) (xexpr->string html))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-set-url! wv url)
|
(define/contract (webview-set-url! wv url)
|
||||||
(-> wv? (or/c string? url?) symbol?)
|
(-> wv-win? (or/c string? url?) symbol?)
|
||||||
(let ((u (if (string? url) (string->url url) url))
|
(let* ((u (if (string? url) (string->url url) url))
|
||||||
(bu (string->url (wv-base-url wv))))
|
(c (wv-win-context wv))
|
||||||
|
(bu (string->url (wv-context-base-url c))))
|
||||||
(when (or (eq? (url-scheme u) #f) (eq? (url-host u) #f))
|
(when (or (eq? (url-scheme u) #f) (eq? (url-host u) #f))
|
||||||
(set-url-host! u (url-host bu))
|
(set-url-host! u (url-host bu))
|
||||||
(set-url-port! u (url-port bu))
|
(set-url-port! u (url-port bu))
|
||||||
@@ -457,27 +497,27 @@
|
|||||||
)
|
)
|
||||||
(when (eq? (url-scheme u) #f)
|
(when (eq? (url-scheme u) #f)
|
||||||
(set-url-scheme! (url-scheme bu)))
|
(set-url-scheme! (url-scheme bu)))
|
||||||
(rkt-webview-set-url! (wv-handle wv) (url->string u))
|
(rkt-webview-set-url! (wv-win-handle wv) (url->string u))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-navigate! wv place)
|
(define/contract (webview-navigate! wv place)
|
||||||
(-> wv? string? symbol?)
|
(-> wv-win? string? symbol?)
|
||||||
(webview-run-js wv
|
(webview-run-js wv
|
||||||
(format "window.location = '~a';"
|
(format "window.location = '~a';"
|
||||||
(esc-quote place))))
|
(esc-quote place))))
|
||||||
|
|
||||||
(define/contract (webview-base-url wv)
|
(define/contract (webview-base-url wv)
|
||||||
(-> wv? url?)
|
(-> wv-win? url?)
|
||||||
(string->url (wv-base-url wv)))
|
(string->url (wv-context-base-url (wv-win-context wv))))
|
||||||
|
|
||||||
|
|
||||||
(define-syntax def-win-func
|
(define-syntax def-win-func
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_ name name-to-wrap)
|
((_ name name-to-wrap)
|
||||||
(define/contract (name wv)
|
(define/contract (name wv)
|
||||||
(-> wv? symbol?)
|
(-> wv-win? symbol?)
|
||||||
(name-to-wrap (wv-handle wv))))))
|
(name-to-wrap (wv-win-handle wv))))))
|
||||||
|
|
||||||
(def-win-func webview-show rkt-webview-show)
|
(def-win-func webview-show rkt-webview-show)
|
||||||
(def-win-func webview-hide rkt-webview-hide)
|
(def-win-func webview-hide rkt-webview-hide)
|
||||||
@@ -488,9 +528,9 @@
|
|||||||
(def-win-func webview-window-state rkt-webview-window-state)
|
(def-win-func webview-window-state rkt-webview-window-state)
|
||||||
|
|
||||||
(define/contract (webview-choose-dir wv title base-dir)
|
(define/contract (webview-choose-dir wv title base-dir)
|
||||||
(-> wv? string? (or/c path? string?) (or/c hash? boolean?))
|
(-> wv-win? string? (or/c path? string?) (or/c hash? boolean?))
|
||||||
(let ((bd (if (path? base-dir) (path->string base-dir) base-dir)))
|
(let ((bd (if (path? base-dir) (path->string base-dir) base-dir)))
|
||||||
(let ((res (rkt-webview-choose-dir (wv-handle wv) title bd)))
|
(let ((res (rkt-webview-choose-dir (wv-win-handle wv) title bd)))
|
||||||
(if (eq? res #f)
|
(if (eq? res #f)
|
||||||
#f
|
#f
|
||||||
(cond ((eq? (car res) 'oke)
|
(cond ((eq? (car res) 'oke)
|
||||||
@@ -506,7 +546,7 @@
|
|||||||
(define (file-open-save wv title base-dir permitted-exts open-save-f)
|
(define (file-open-save wv title base-dir permitted-exts open-save-f)
|
||||||
(let* ((bd (if (path? base-dir) (path->string base-dir) base-dir))
|
(let* ((bd (if (path? base-dir) (path->string base-dir) base-dir))
|
||||||
(ext-filter (make-exts-filter permitted-exts)))
|
(ext-filter (make-exts-filter permitted-exts)))
|
||||||
(let ((res (open-save-f (wv-handle wv) title bd ext-filter)))
|
(let ((res (open-save-f (wv-win-handle wv) title bd ext-filter)))
|
||||||
(if (eq? res #f)
|
(if (eq? res #f)
|
||||||
#f
|
#f
|
||||||
(cond ((eq? (car res) 'oke)
|
(cond ((eq? (car res) 'oke)
|
||||||
@@ -522,30 +562,29 @@
|
|||||||
|
|
||||||
|
|
||||||
(define/contract (webview-file-open wv title base-dir permitted-exts)
|
(define/contract (webview-file-open wv title base-dir permitted-exts)
|
||||||
(-> wv? string? (or/c path? string?) (or/c wv-permitted-exts? wv-list-of-permitted-exts?)
|
(-> wv-win? string? (or/c path? string?) (or/c wv-permitted-exts? wv-list-of-permitted-exts?)
|
||||||
(or/c hash? boolean?))
|
(or/c hash? boolean?))
|
||||||
(file-open-save wv title base-dir permitted-exts rkt-webview-file-open))
|
(file-open-save wv title base-dir permitted-exts rkt-webview-file-open))
|
||||||
|
|
||||||
(define/contract (webview-file-save wv title base-dir permitted-exts)
|
(define/contract (webview-file-save wv title base-dir permitted-exts)
|
||||||
(-> wv? string? (or/c path? string?) (or/c wv-permitted-exts? wv-list-of-permitted-exts?)
|
(-> wv-win? string? (or/c path? string?) (or/c wv-permitted-exts? wv-list-of-permitted-exts?)
|
||||||
(or/c hash? boolean?))
|
(or/c hash? boolean?))
|
||||||
(file-open-save wv title base-dir permitted-exts rkt-webview-file-save))
|
(file-open-save wv title base-dir permitted-exts rkt-webview-file-save))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define/contract (webview-set-title! wv title)
|
(define/contract (webview-set-title! wv title)
|
||||||
(-> wv? string? symbol?)
|
(-> wv-win? string? symbol?)
|
||||||
(rkt-webview-set-title! (wv-handle wv) title))
|
(rkt-webview-set-title! (wv-win-handle wv) title))
|
||||||
|
|
||||||
(define/contract (webview-close wv)
|
(define/contract (webview-close wv)
|
||||||
(-> wv? symbol?)
|
(-> wv-win? symbol?)
|
||||||
(begin
|
(begin
|
||||||
(rkt-webview-close (wv-handle wv))
|
(rkt-webview-close (wv-win-handle wv))
|
||||||
(kill-thread (wv-webserver-thread wv))
|
|
||||||
'oke))
|
'oke))
|
||||||
|
|
||||||
(define/contract (webview-bind! wv selector event)
|
(define/contract (webview-bind! wv selector event)
|
||||||
(-> wv? (or/c symbol? string?) (or/c symbol? list-of-symbol?) list?)
|
(-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) list?)
|
||||||
(let* ((sel (if (symbol? selector)
|
(let* ((sel (if (symbol? selector)
|
||||||
(format "#~a" selector)
|
(format "#~a" selector)
|
||||||
selector))
|
selector))
|
||||||
@@ -555,13 +594,13 @@
|
|||||||
)
|
)
|
||||||
(let ((r (webview-call-js wv
|
(let ((r (webview-call-js wv
|
||||||
(format "return window.rkt_bind_evt_ids(~a, '~a', ~a)"
|
(format "return window.rkt_bind_evt_ids(~a, '~a', ~a)"
|
||||||
(wv-window-nr wv) sel evt))))
|
(wv-win-window-nr wv) sel evt))))
|
||||||
(map (λ (el)
|
(map (λ (el)
|
||||||
(list (string->symbol (car el)) (cadr el) (caddr el)))
|
(list (string->symbol (car el)) (cadr el) (caddr el)))
|
||||||
r))))
|
r))))
|
||||||
|
|
||||||
(define/contract (webview-unbind! wv selector event)
|
(define/contract (webview-unbind! wv selector event)
|
||||||
(-> wv? (or/c symbol? string?) (or/c symbol? list-of-symbol?) list?)
|
(-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) list?)
|
||||||
(let* ((sel (if (symbol? selector)
|
(let* ((sel (if (symbol? selector)
|
||||||
(format "#~a" selector)
|
(format "#~a" selector)
|
||||||
selector))
|
selector))
|
||||||
@@ -571,14 +610,14 @@
|
|||||||
)
|
)
|
||||||
(let ((r (webview-call-js wv
|
(let ((r (webview-call-js wv
|
||||||
(format "return window.rkt_unbind_evt_ids(~a, '~a', ~a)"
|
(format "return window.rkt_unbind_evt_ids(~a, '~a', ~a)"
|
||||||
(wv-window-nr wv) sel evt))))
|
(wv-win-window-nr wv) sel evt))))
|
||||||
(map (λ (el)
|
(map (λ (el)
|
||||||
(list (string->symbol (car el)) (cadr el) (caddr el)))
|
(list (string->symbol (car el)) (cadr el) (caddr el)))
|
||||||
r))))
|
r))))
|
||||||
|
|
||||||
(define/contract (webview-run-js wv js)
|
(define/contract (webview-run-js wv js)
|
||||||
(-> wv? string? symbol?)
|
(-> wv-win? string? symbol?)
|
||||||
(rkt-webview-run-js (wv-handle wv) js))
|
(rkt-webview-run-js (wv-win-handle wv) js))
|
||||||
|
|
||||||
(define (webview-standard-file-getter base-path
|
(define (webview-standard-file-getter base-path
|
||||||
#:not-exist [on-not-exist (λ (file base-path path) path)]
|
#:not-exist [on-not-exist (λ (file base-path path) path)]
|
||||||
@@ -594,8 +633,8 @@
|
|||||||
|
|
||||||
|
|
||||||
(define (webview-call-js wv js)
|
(define (webview-call-js wv js)
|
||||||
(-> wv? string? (or/c string? list? boolean? hash?))
|
(-> wv-win? string? (or/c string? list? boolean? hash?))
|
||||||
(let ((result (rkt-webview-call-js (wv-handle wv) js)))
|
(let ((result (rkt-webview-call-js (wv-win-handle wv) js)))
|
||||||
(if (webview-call-js-result? result)
|
(if (webview-call-js-result? result)
|
||||||
(if (eq? (car result) 'oke)
|
(if (eq? (car result) 'oke)
|
||||||
(hash-ref (fromJson (cadr result)) 'result #f)
|
(hash-ref (fromJson (cadr result)) 'result #f)
|
||||||
@@ -614,7 +653,7 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(define/contract (webview-set-innerHTML! wv id html)
|
(define/contract (webview-set-innerHTML! wv id html)
|
||||||
(-> wv? symbol? (or/c string? xexpr?) symbol?)
|
(-> wv-win? symbol? (or/c string? xexpr?) symbol?)
|
||||||
(if (string? html)
|
(if (string? html)
|
||||||
(webview-run-js wv
|
(webview-run-js wv
|
||||||
(with-id id el
|
(with-id id el
|
||||||
@@ -624,7 +663,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-set-value! wv id val)
|
(define/contract (webview-set-value! wv id val)
|
||||||
(-> wv? symbol? (or/c symbol? string? number? boolean? g:date? g:time? g:datetime? rgba?) symbol?)
|
(-> wv-win? symbol? (or/c symbol? string? number? boolean? g:date? g:time? g:datetime? rgba?) symbol?)
|
||||||
(webview-run-js wv
|
(webview-run-js wv
|
||||||
(with-id id el
|
(with-id id el
|
||||||
((string-append
|
((string-append
|
||||||
@@ -651,7 +690,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-value wv id)
|
(define/contract (webview-value wv id)
|
||||||
(-> wv? symbol? (or/c string? boolean?))
|
(-> wv-win? symbol? (or/c string? boolean?))
|
||||||
(let ((v (webview-call-js wv
|
(let ((v (webview-call-js wv
|
||||||
(with-id id el
|
(with-id id el
|
||||||
((string-append "let f = function() {\n"
|
((string-append "let f = function() {\n"
|
||||||
@@ -670,7 +709,7 @@
|
|||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_ name type-pred? convert)
|
((_ name type-pred? convert)
|
||||||
(define/contract (name wv id)
|
(define/contract (name wv id)
|
||||||
(-> wv? symbol? (or/c type-pred? boolean?))
|
(-> wv-win? symbol? (or/c type-pred? boolean?))
|
||||||
(let ((v (webview-value wv id)))
|
(let ((v (webview-value wv id)))
|
||||||
(if (eq? v #f)
|
(if (eq? v #f)
|
||||||
#f
|
#f
|
||||||
@@ -689,7 +728,7 @@
|
|||||||
|
|
||||||
|
|
||||||
(define/contract (webview-add-class! wv id-or-selector class)
|
(define/contract (webview-add-class! wv id-or-selector class)
|
||||||
(-> wv? (or/c symbol? string?) (or/c symbol? string? list?) hash?)
|
(-> wv-win? (or/c symbol? string?) (or/c symbol? string? list?) hash?)
|
||||||
(let ((sel (if (symbol? id-or-selector)
|
(let ((sel (if (symbol? id-or-selector)
|
||||||
(format "#~a" id-or-selector)
|
(format "#~a" id-or-selector)
|
||||||
id-or-selector))
|
id-or-selector))
|
||||||
@@ -709,7 +748,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-remove-class! wv id-or-selector class)
|
(define/contract (webview-remove-class! wv id-or-selector class)
|
||||||
(-> wv? (or/c symbol? string?) (or/c symbol? string? list?) hash?)
|
(-> wv-win? (or/c symbol? string?) (or/c symbol? string? list?) hash?)
|
||||||
(let ((sel (if (symbol? id-or-selector)
|
(let ((sel (if (symbol? id-or-selector)
|
||||||
(format "#~a" id-or-selector)
|
(format "#~a" id-or-selector)
|
||||||
id-or-selector))
|
id-or-selector))
|
||||||
@@ -731,7 +770,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-set-style! wv selector style-entries)
|
(define/contract (webview-set-style! wv selector style-entries)
|
||||||
(-> wv? (or/c symbol? string?) (or/c kv? list-of-kv?) hash?)
|
(-> wv-win? (or/c symbol? string?) (or/c kv? list-of-kv?) hash?)
|
||||||
(let ((sel (if (symbol? selector)
|
(let ((sel (if (symbol? selector)
|
||||||
(format "#~a" selector)
|
(format "#~a" selector)
|
||||||
selector))
|
selector))
|
||||||
@@ -755,7 +794,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-get-style wv selector styles)
|
(define/contract (webview-get-style wv selector styles)
|
||||||
(-> wv? (or/c symbol? string?) (or/c symbol? list-of-symbol?) (or/c list? hash?))
|
(-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) (or/c list? hash?))
|
||||||
(let ((sel (if (symbol? selector)
|
(let ((sel (if (symbol? selector)
|
||||||
(format "#~a" selector)
|
(format "#~a" selector)
|
||||||
selector))
|
selector))
|
||||||
@@ -788,7 +827,7 @@
|
|||||||
|
|
||||||
|
|
||||||
(define/contract (webview-unset-style! wv selector style-entries)
|
(define/contract (webview-unset-style! wv selector style-entries)
|
||||||
(-> wv? (or/c symbol? string?) (or/c symbol? list-of-symbol?) hash?)
|
(-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) hash?)
|
||||||
(let ((sel (if (symbol? selector)
|
(let ((sel (if (symbol? selector)
|
||||||
(format "#~a" selector)
|
(format "#~a" selector)
|
||||||
selector))
|
selector))
|
||||||
@@ -813,7 +852,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-set-attr! wv selector attr-entries)
|
(define/contract (webview-set-attr! wv selector attr-entries)
|
||||||
(-> wv? (or/c symbol? string?)
|
(-> wv-win? (or/c symbol? string?)
|
||||||
(or/c kv? list-of-kv?) hash?)
|
(or/c kv? list-of-kv?) hash?)
|
||||||
(let* ((sel (if (symbol? selector)
|
(let* ((sel (if (symbol? selector)
|
||||||
(format "#~a" selector)
|
(format "#~a" selector)
|
||||||
@@ -847,7 +886,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
(define/contract (webview-attr wv id attr)
|
(define/contract (webview-attr wv id attr)
|
||||||
(-> wv? symbol? (or/c symbol? string?) (or/c string? boolean?))
|
(-> wv-win? symbol? (or/c symbol? string?) (or/c string? boolean?))
|
||||||
(let ((v (webview-call-js wv
|
(let ((v (webview-call-js wv
|
||||||
(with-id id el
|
(with-id id el
|
||||||
-> (format "el.getAttribute('~a');" attr))
|
-> (format "el.getAttribute('~a');" attr))
|
||||||
@@ -862,7 +901,7 @@
|
|||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_ name type-pred? convert)
|
((_ name type-pred? convert)
|
||||||
(define/contract (name wv id attr)
|
(define/contract (name wv id attr)
|
||||||
(-> wv? symbol? (or/c symbol? string?) (or/c type-pred? boolean?))
|
(-> wv-win? symbol? (or/c symbol? string?) (or/c type-pred? boolean?))
|
||||||
(let ((v (webview-attr wv id attr)))
|
(let ((v (webview-attr wv id attr)))
|
||||||
(if (eq? v #f)
|
(if (eq? v #f)
|
||||||
#f
|
#f
|
||||||
@@ -891,11 +930,14 @@
|
|||||||
|
|
||||||
(define file-getter (webview-standard-file-getter example-path))
|
(define file-getter (webview-standard-file-getter example-path))
|
||||||
|
|
||||||
|
(define test-context (webview-new-context file-getter))
|
||||||
|
|
||||||
(define (test)
|
(define (test)
|
||||||
(let* ((cb (λ (handle evt)
|
(let* ((cb (λ (handle evt)
|
||||||
(displayln evt)))
|
(displayln evt)))
|
||||||
(h (webview-create 'test file-getter cb))
|
(h (webview-create test-context "index.html" cb))
|
||||||
)
|
)
|
||||||
|
(displayln h)
|
||||||
(webview-set-title! h "This is a test window")
|
(webview-set-title! h "This is a test window")
|
||||||
(webview-resize h 800 600)
|
(webview-resize h 800 600)
|
||||||
(webview-move h 350 220)
|
(webview-move h 350 220)
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
#define COMMAND_FILE_OPEN 20
|
#define COMMAND_FILE_OPEN 20
|
||||||
#define COMMAND_FILE_SAVE 21
|
#define COMMAND_FILE_SAVE 21
|
||||||
#define COMMAND_SET_OU_TOKEN 22
|
#define COMMAND_SET_OU_TOKEN 22
|
||||||
#define COMMAND_SET_CERTIFICATE 23
|
|
||||||
|
|
||||||
class Command
|
class Command
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
rkt_webview_init();
|
rkt_webview_init();
|
||||||
|
|
||||||
wv1 = rkt_webview_create(0, eventCb, nullptr);
|
int context = rkt_webview_new_context("console.log('boilerplate!');", nullptr);
|
||||||
|
|
||||||
|
wv1 = rkt_webview_create(context, 0, eventCb);
|
||||||
|
|
||||||
rkt_webview_move(wv1, 200, 300);
|
rkt_webview_move(wv1, 200, 300);
|
||||||
rkt_webview_resize(wv1, 800, 600);
|
rkt_webview_resize(wv1, 800, 600);
|
||||||
@@ -57,7 +59,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
|
|
||||||
if (i == 10) {
|
if (i == 10) {
|
||||||
wv2 = rkt_webview_create(wv1, eventCb, nullptr);
|
wv2 = rkt_webview_create(context, wv1, eventCb);
|
||||||
rkt_webview_move(wv2, 400, 200);
|
rkt_webview_move(wv2, 400, 200);
|
||||||
rkt_webview_resize(wv2, 800, 600);
|
rkt_webview_resize(wv2, 800, 600);
|
||||||
rkt_webview_set_url(wv2, "https://127.0.0.1");
|
rkt_webview_set_url(wv2, "https://127.0.0.1");
|
||||||
|
|||||||
@@ -32,10 +32,17 @@ void rkt_webview_init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int rkt_webview_create(rktwebview_t parent, event_cb_t js_event_cb, const char *optional_server_cert_pem)
|
|
||||||
|
rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, const char *optional_server_cert_pem)
|
||||||
{
|
{
|
||||||
rkt_webview_init();
|
rkt_webview_init();
|
||||||
return handler->rktWebViewCreate(parent, js_event_cb, optional_server_cert_pem);
|
return handler->newContext(boilerplate_js, optional_server_cert_pem);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rkt_webview_create(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_event_cb)
|
||||||
|
{
|
||||||
|
rkt_webview_init();
|
||||||
|
return handler->rktWebViewCreate(context, parent, js_event_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rkt_webview_close(rktwebview_t wv)
|
void rkt_webview_close(rktwebview_t wv)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
typedef int rktwebview_t;
|
typedef int rktwebview_t;
|
||||||
|
typedef int rkt_wv_context_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
rktwebview_t wv;
|
rktwebview_t wv;
|
||||||
@@ -81,12 +82,12 @@ typedef void (*event_cb_t)(rkt_data_t *);
|
|||||||
|
|
||||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_init();
|
RKTWEBVIEW_QT_EXPORT void rkt_webview_init();
|
||||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms);
|
||||||
|
|
||||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_free_data(rkt_data_t *d);
|
RKTWEBVIEW_QT_EXPORT void rkt_webview_free_data(rkt_data_t *d);
|
||||||
|
|
||||||
RKTWEBVIEW_QT_EXPORT rkt_data_t *rkt_webview_version();
|
RKTWEBVIEW_QT_EXPORT rkt_data_t *rkt_webview_version();
|
||||||
|
|
||||||
RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rktwebview_t parent, event_cb_t js_event_cb, const char *optional_server_cert_pem);
|
RKTWEBVIEW_QT_EXPORT rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, const char *optional_server_cert_pem);
|
||||||
|
|
||||||
|
RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_event_cb);
|
||||||
RKTWEBVIEW_QT_EXPORT void rkt_webview_close(rktwebview_t wv);
|
RKTWEBVIEW_QT_EXPORT void rkt_webview_close(rktwebview_t wv);
|
||||||
RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv);
|
RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv);
|
||||||
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title);
|
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title);
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QAbstractEventDispatcher>
|
#include <QAbstractEventDispatcher>
|
||||||
|
#include <QWebEngineProfile>
|
||||||
|
#include <QWebEngineProfileBuilder>
|
||||||
|
#include <QWebEngineScriptCollection>
|
||||||
|
#include <QWebEngineScript>
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
|
||||||
@@ -29,14 +33,12 @@ void Rktwebview_qt::processCommand(Command *cmd)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case COMMAND_CREATE: {
|
case COMMAND_CREATE: {
|
||||||
int parent = cmd->args[0].toInt();
|
rkt_wv_context_t context = cmd->args[0].toInt();
|
||||||
|
rktwebview_t parent = cmd->args[1].toInt();
|
||||||
|
|
||||||
void *f = cmd->args[1].value<void *>();
|
void *f = cmd->args[2].value<void *>();
|
||||||
event_cb_t js_event_cb = reinterpret_cast <event_cb_t>(f);
|
event_cb_t js_event_cb = reinterpret_cast <event_cb_t>(f);
|
||||||
|
|
||||||
bool has_scp = cmd->args[2].toBool();
|
|
||||||
QByteArray scp_pem = cmd->args[3].toByteArray();
|
|
||||||
|
|
||||||
WebviewWindow *p;
|
WebviewWindow *p;
|
||||||
if (_views.contains(parent)) {
|
if (_views.contains(parent)) {
|
||||||
p = _views[parent];
|
p = _views[parent];
|
||||||
@@ -44,22 +46,28 @@ void Rktwebview_qt::processCommand(Command *cmd)
|
|||||||
p = nullptr;
|
p = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
WebviewWindow *w = new WebviewWindow(p, has_scp, scp_pem);
|
if (!_contexts.contains(context)) {
|
||||||
WebViewQt *view = new WebViewQt(nextHandle(), w);
|
cmd->result = -1;
|
||||||
w->addView(view, this);
|
cmd->done = true;
|
||||||
|
} else {
|
||||||
|
QWebEngineProfile *profile = _contexts[context];
|
||||||
|
WebviewWindow *w = new WebviewWindow(profile, p);
|
||||||
|
WebViewQt *view = new WebViewQt(nextHandle(), w);
|
||||||
|
w->addView(view, this);
|
||||||
|
|
||||||
int id = view->id();
|
int id = view->id();
|
||||||
|
|
||||||
_views[id] = w;
|
_views[id] = w;
|
||||||
_view_js_callbacks[id] = js_event_cb;
|
_view_js_callbacks[id] = js_event_cb;
|
||||||
|
|
||||||
w->show();
|
w->show();
|
||||||
while(!w->windowCreated()) {
|
while(!w->windowCreated()) {
|
||||||
doEvents();
|
doEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd->result = id;
|
||||||
|
cmd->done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd->result = id;
|
|
||||||
cmd->done = true;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case COMMAND_CLOSE: {
|
case COMMAND_CLOSE: {
|
||||||
@@ -370,17 +378,68 @@ int Rktwebview_qt::nextHandle()
|
|||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Rktwebview_qt::rktWebViewCreate(int parent, event_cb_t js_evt_cb, const char *optional_server_cert_pem)
|
rkt_wv_context_t Rktwebview_qt::newContext(const char *boilerplate_js, const char *optional_server_cert_pem)
|
||||||
|
{
|
||||||
|
QWebEngineProfileBuilder b;
|
||||||
|
if (optional_server_cert_pem != nullptr) {
|
||||||
|
QByteArray scp = QByteArray(optional_server_cert_pem);
|
||||||
|
QList<QSslCertificate> certs;
|
||||||
|
QSslCertificate cert(scp);
|
||||||
|
certs.append(cert);
|
||||||
|
b.setAdditionalTrustedCertificates(certs);
|
||||||
|
}
|
||||||
|
_context_counter += 1;
|
||||||
|
QString name = QString::asprintf("profile-%d", _context_counter);
|
||||||
|
|
||||||
|
QString code = "if (window.rkt_event_queue === undefined) { window.rkt_event_queue = []; }\n"
|
||||||
|
"window.rkt_send_event = function(obj) {\n"
|
||||||
|
" console.log('Sending event: ' + obj);\n"
|
||||||
|
" window.rkt_event_queue.push(obj);\n"
|
||||||
|
"};\n"
|
||||||
|
"window.rkt_get_events = function() {\n"
|
||||||
|
" let q = window.rkt_event_queue;\n"
|
||||||
|
" window.rkt_event_queue = [];\n"
|
||||||
|
" let json_q = JSON.stringify(q);\n"
|
||||||
|
" return json_q;\n"
|
||||||
|
"};\n"
|
||||||
|
"";
|
||||||
|
|
||||||
|
QList<QWebEngineScript> scripts;
|
||||||
|
QWebEngineProfile *p = b.createProfile(name);
|
||||||
|
QWebEngineScriptCollection *col = p->scripts();
|
||||||
|
QWebEngineScript s1;
|
||||||
|
s1.setInjectionPoint(QWebEngineScript::InjectionPoint::DocumentReady);
|
||||||
|
s1.setName("eventing");
|
||||||
|
s1.setSourceCode(code);
|
||||||
|
s1.setWorldId(QWebEngineScript::MainWorld);
|
||||||
|
scripts.append(s1);
|
||||||
|
|
||||||
|
QWebEngineScript s2;
|
||||||
|
s2.setInjectionPoint(QWebEngineScript::InjectionPoint::DocumentReady);
|
||||||
|
s2.setName("boilerplate");
|
||||||
|
s2.setSourceCode(boilerplate_js);
|
||||||
|
s2.setWorldId(QWebEngineScript::MainWorld);
|
||||||
|
scripts.append(s2);
|
||||||
|
|
||||||
|
col->insert(scripts);
|
||||||
|
|
||||||
|
QWebEngineScriptCollection *c = p->scripts();
|
||||||
|
QList<QWebEngineScript> l = c->toList();
|
||||||
|
printf("%d\n", l.size());
|
||||||
|
|
||||||
|
_contexts[_context_counter] = p;
|
||||||
|
|
||||||
|
return _context_counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Rktwebview_qt::rktWebViewCreate(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_evt_cb)
|
||||||
{
|
{
|
||||||
Command c(COMMAND_CREATE);
|
Command c(COMMAND_CREATE);
|
||||||
|
c.args.push_back(context);
|
||||||
c.args.push_back(parent);
|
c.args.push_back(parent);
|
||||||
void *function = reinterpret_cast<void *>(js_evt_cb);
|
void *function = reinterpret_cast<void *>(js_evt_cb);
|
||||||
QVariant f(QVariant::fromValue(function));
|
QVariant f(QVariant::fromValue(function));
|
||||||
c.args.push_back(f);
|
c.args.push_back(f);
|
||||||
bool has_scp = (optional_server_cert_pem != nullptr);
|
|
||||||
c.args.push_back(has_scp);
|
|
||||||
QByteArray scp = (optional_server_cert_pem == nullptr) ? QByteArray("") : QByteArray(optional_server_cert_pem);
|
|
||||||
c.args.push_back(scp);
|
|
||||||
|
|
||||||
postCommand(&c);
|
postCommand(&c);
|
||||||
|
|
||||||
@@ -659,7 +718,7 @@ void Rktwebview_qt::onPageLoad(rktwebview_t w)
|
|||||||
|
|
||||||
void Rktwebview_qt::pageLoaded(rktwebview_t w, bool ok)
|
void Rktwebview_qt::pageLoaded(rktwebview_t w, bool ok)
|
||||||
{
|
{
|
||||||
runJs(w,
|
/*runJs(w,
|
||||||
"if (window.rkt_event_queue === undefined) { window.rkt_event_queue = []; }\n"
|
"if (window.rkt_event_queue === undefined) { window.rkt_event_queue = []; }\n"
|
||||||
"window.rkt_send_event = function(obj) {\n"
|
"window.rkt_send_event = function(obj) {\n"
|
||||||
" console.log('Sending event: ' + obj);\n"
|
" console.log('Sending event: ' + obj);\n"
|
||||||
@@ -672,6 +731,20 @@ void Rktwebview_qt::pageLoaded(rktwebview_t w, bool ok)
|
|||||||
" return json_q;\n"
|
" return json_q;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
// Inject code of the profile to this page
|
||||||
|
WebviewWindow *win = _views[w];
|
||||||
|
QWebEngineProfile *p = win->profile();
|
||||||
|
QWebEngineScriptCollection *col = p->scripts();
|
||||||
|
QList<QWebEngineScript> l = col->toList();
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < l.size(); i++) {
|
||||||
|
runJs(w, l[i].sourceCode().toUtf8().constData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// trigger page loaded.
|
// trigger page loaded.
|
||||||
EventContainer e("page-loaded");
|
EventContainer e("page-loaded");
|
||||||
@@ -775,6 +848,8 @@ Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) :
|
|||||||
_argc = 1;
|
_argc = 1;
|
||||||
_argv[0] = const_cast<char *>("Rktwebview_qt");
|
_argv[0] = const_cast<char *>("Rktwebview_qt");
|
||||||
|
|
||||||
|
_context_counter = 0;
|
||||||
|
|
||||||
|
|
||||||
_current_handle = 0;
|
_current_handle = 0;
|
||||||
_handler = handler;
|
_handler = handler;
|
||||||
@@ -800,3 +875,19 @@ Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) :
|
|||||||
|
|
||||||
*_handler = nullptr;
|
*_handler = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rktwebview_qt::~Rktwebview_qt()
|
||||||
|
{
|
||||||
|
QList<int> win_keys = _views.keys();
|
||||||
|
int i, N;
|
||||||
|
for(i = 0, N = win_keys.size(); i < N; i++) {
|
||||||
|
WebviewWindow *w = _views[win_keys[i]];
|
||||||
|
delete w;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<int> c_keys = _contexts.keys();
|
||||||
|
for(i = 0, N = c_keys.size(); i < N; i++) {
|
||||||
|
QWebEngineProfile *p = _contexts[c_keys[i]];
|
||||||
|
delete p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -26,8 +26,11 @@ class RKTWEBVIEW_QT_EXPORT Rktwebview_qt : public QObject
|
|||||||
private:
|
private:
|
||||||
QApplication *_app;
|
QApplication *_app;
|
||||||
rktwebview_t _current_handle;
|
rktwebview_t _current_handle;
|
||||||
|
|
||||||
|
int _context_counter;
|
||||||
|
QHash<int, QWebEngineProfile *> _contexts;
|
||||||
QHash<int, WebviewWindow *> _views;
|
QHash<int, WebviewWindow *> _views;
|
||||||
QHash<int, event_cb_t> _view_js_callbacks;
|
QHash<int, event_cb_t> _view_js_callbacks;
|
||||||
|
|
||||||
QTimer _process_events;
|
QTimer _process_events;
|
||||||
|
|
||||||
@@ -64,7 +67,8 @@ public:
|
|||||||
public:
|
public:
|
||||||
int nextHandle();
|
int nextHandle();
|
||||||
public:
|
public:
|
||||||
int rktWebViewCreate(int parent, event_cb_t js_evt_cb, const char *optional_server_cert_pem);
|
rkt_wv_context_t newContext(const char *boilerplate_js, const char *optional_server_cert_pem);
|
||||||
|
int rktWebViewCreate(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_evt_cb);
|
||||||
void rktWebViewClose(int wv);
|
void rktWebViewClose(int wv);
|
||||||
void rktSetOUToken(rktwebview_t wv, const char *ou_token);
|
void rktSetOUToken(rktwebview_t wv, const char *ou_token);
|
||||||
void rktQuit();
|
void rktQuit();
|
||||||
@@ -110,6 +114,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
Rktwebview_qt(Rktwebview_qt **handler);
|
Rktwebview_qt(Rktwebview_qt **handler);
|
||||||
|
~Rktwebview_qt();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ WebViewQt::WebViewQt(int id, WebviewWindow *window)
|
|||||||
_window = window;
|
_window = window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int WebViewQt::id() const
|
int WebViewQt::id() const
|
||||||
{
|
{
|
||||||
return _id;
|
return _id;
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ signals:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
WebViewQt(int id, WebviewWindow *window);
|
WebViewQt(int id, WebviewWindow *window);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WEBVIEWQT_H
|
#endif // WEBVIEWQT_H
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ static void displ1(QSslCertificate &cert, QList<QSslCertificate::SubjectInfo > l
|
|||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
WebviewWindow::WebviewWindow(WebviewWindow *parent, bool has_scp, QByteArray scp_pem)
|
WebviewWindow::WebviewWindow(QWebEngineProfile *profile, WebviewWindow *parent)
|
||||||
: QMainWindow{parent}
|
: QMainWindow{parent}
|
||||||
{
|
{
|
||||||
static int profile_nr = 0;
|
static int profile_nr = 0;
|
||||||
@@ -51,21 +51,7 @@ WebviewWindow::WebviewWindow(WebviewWindow *parent, bool has_scp, QByteArray scp
|
|||||||
_moved = 0;
|
_moved = 0;
|
||||||
_resized = 0;
|
_resized = 0;
|
||||||
|
|
||||||
QWebEngineProfileBuilder b;
|
_profile = profile;
|
||||||
if (has_scp) {
|
|
||||||
profile_nr += 1;
|
|
||||||
char buf[100];
|
|
||||||
sprintf(buf, "profile-%d", profile_nr);
|
|
||||||
QString name(buf);
|
|
||||||
QSslCertificate cert(scp_pem);
|
|
||||||
|
|
||||||
QList<QSslCertificate> certs;
|
|
||||||
certs.append(cert);
|
|
||||||
b.setAdditionalTrustedCertificates(certs);
|
|
||||||
_profile = b.createProfile(name);
|
|
||||||
} else {
|
|
||||||
_profile = QWebEngineProfile::defaultProfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent != nullptr) {
|
if (parent != nullptr) {
|
||||||
setWindowModality(Qt::WindowModality::WindowModal);
|
setWindowModality(Qt::WindowModality::WindowModal);
|
||||||
@@ -78,7 +64,9 @@ WebviewWindow::WebviewWindow(WebviewWindow *parent, bool has_scp, QByteArray scp
|
|||||||
|
|
||||||
void WebviewWindow::navigationRequested(QWebEngineNavigationRequest &req)
|
void WebviewWindow::navigationRequested(QWebEngineNavigationRequest &req)
|
||||||
{
|
{
|
||||||
if (req.navigationType() == QWebEngineNavigationRequest::NavigationType::TypedNavigation) {
|
QWebEngineNavigationRequest::NavigationType t = req.navigationType();
|
||||||
|
if (t == QWebEngineNavigationRequest::NavigationType::TypedNavigation ||
|
||||||
|
t == QWebEngineNavigationRequest::RedirectNavigation) {
|
||||||
req.accept();
|
req.accept();
|
||||||
} else {
|
} else {
|
||||||
EventContainer e("navigation-request");
|
EventContainer e("navigation-request");
|
||||||
@@ -226,8 +214,9 @@ void WebviewWindow::addView(WebViewQt *v, Rktwebview_qt *c)
|
|||||||
_view = v;
|
_view = v;
|
||||||
this->setCentralWidget(v);
|
this->setCentralWidget(v);
|
||||||
|
|
||||||
QWebEnginePage *page;
|
QWebEnginePage *page = _view->page();
|
||||||
|
|
||||||
|
/*
|
||||||
if (_profile == nullptr) {
|
if (_profile == nullptr) {
|
||||||
page = _view->page();
|
page = _view->page();
|
||||||
} else {
|
} else {
|
||||||
@@ -255,6 +244,7 @@ void WebviewWindow::addView(WebViewQt *v, Rktwebview_qt *c)
|
|||||||
);
|
);
|
||||||
evt_script.setWorldId(QWebEngineScript::ApplicationWorld);
|
evt_script.setWorldId(QWebEngineScript::ApplicationWorld);
|
||||||
//col.insert(evt_script);
|
//col.insert(evt_script);
|
||||||
|
*/
|
||||||
|
|
||||||
connect(page, &QWebEnginePage::loadFinished, this, [this](bool ok) {
|
connect(page, &QWebEnginePage::loadFinished, this, [this](bool ok) {
|
||||||
_container->pageLoaded(_view->id(), ok);
|
_container->pageLoaded(_view->id(), ok);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
void openDevTools();
|
void openDevTools();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit WebviewWindow(WebviewWindow *parent, bool has_scp, QByteArray scp_pem);
|
explicit WebviewWindow(QWebEngineProfile *profile, WebviewWindow *parent);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void triggerResize();
|
void triggerResize();
|
||||||
|
|||||||
Reference in New Issue
Block a user