aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeddy Wing2021-01-24 17:59:59 +0100
committerTeddy Wing2021-01-24 17:59:59 +0100
commite7effab23b402b4ce83b4a5674e9eda9603565b1 (patch)
tree45f33be6c00c1e9b0a47d5b8708725f7b3c10c80
parentea3acc904d9d32202ef7896d8c2c052f22bc705d (diff)
downloadextreload-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.
-rw-r--r--l/src/main.lisp39
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)