diff options
author | Teddy Wing | 2021-01-24 17:59:59 +0100 |
---|---|---|
committer | Teddy Wing | 2021-01-24 17:59:59 +0100 |
commit | e7effab23b402b4ce83b4a5674e9eda9603565b1 (patch) | |
tree | 45f33be6c00c1e9b0a47d5b8708725f7b3c10c80 /l/src/main.lisp | |
parent | ea3acc904d9d32202ef7896d8c2c052f22bc705d (diff) | |
download | extreload-e7effab23b402b4ce83b4a5674e9eda9603565b1.tar.bz2 |
main.lisp: Reload extensions
Send DevTools Protocol messages to reload extensions. Not easy to do
things sequentially since the responses have to be handled in
`ws-on-message`. Once we filter the list of extensions wanted to reload,
attach to their DevTools targets, then send them JavaScript evaluation
messages that tells the extensions to reload.
Diffstat (limited to 'l/src/main.lisp')
-rw-r--r-- | l/src/main.lisp | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/l/src/main.lisp b/l/src/main.lisp index 65372d2..31afe73 100644 --- a/l/src/main.lisp +++ b/l/src/main.lisp @@ -18,13 +18,38 @@ `(:obj ("id" . ,call-id) ("method" . "Target.getTargets")))) +(defun target-attach-to-target-msg (call-id target-id) + (jsown:to-json + `(:obj ("id" . ,call-id) + ("method" . "Target.attachToTarget") + ("params" . (:obj ("targetId" . ,target-id) + ("flatten" . t)))))) + +(defun target-attached-to-target-msg-p (message) + (equal + (json-obj-get message "method") + "Target.attachedToTarget")) + +(defun runtime-evaluate-msg (call-id session-id expression) + (jsown:to-json + `(:obj ("id" . ,call-id) + ("sessionId" . ,session-id) + ("method" . "Runtime.evaluate") + ("params" . (:obj ("expression" . ,expression)))))) + (defun ws-on-message (message) (let* ((response (jsown:parse message)) (targets (parse-get-targets-response response))) (if targets (reload-extensions (extension-targets targets) - '("pacpdcpgfbpkdpmhfaljffnfbdanmblh"))))) + '("pacpdcpgfbpkdpmhfaljffnfbdanmblh"))) + + (if (target-attached-to-target-msg-p response) + (reload-extension + (json-obj-get + (json-obj-get response "params") + "sessionId"))))) (defun parse-get-targets-response (response) (let* ((result (json-obj-get response "result")) @@ -49,7 +74,17 @@ nil)) - (filter #'requested-extension-p targets))) + (dolist (extension (filter #'requested-extension-p targets)) + (attach-to-target extension)))) + +(defun attach-to-target (extension) + (let ((target-id (json-obj-get extension "targetId"))) + (wsd:send *client* + (target-attach-to-target-msg 2 target-id)))) + +(defun reload-extension (session-id) + (wsd:send *client* + (runtime-evaluate-msg 1 session-id "chrome.runtime.reload()"))) (defun extension-targets (targets) (labels ((extensionp (target) |