emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/firefox-javascript-repl b0695f591d 02/24: Complete acto


From: Thomas Fitzsimmons
Subject: [elpa] externals/firefox-javascript-repl b0695f591d 02/24: Complete actor retrieval
Date: Thu, 1 Jun 2023 00:41:51 -0400 (EDT)

branch: externals/firefox-javascript-repl
commit b0695f591d142d5779588c6588bfd1c5340e1713
Author: Thomas Fitzsimmons <fitzsim@fitzsim.org>
Commit: Thomas Fitzsimmons <fitzsim@fitzsim.org>

    Complete actor retrieval
    
    * firefox-javascript-repl.el (firefox-javascript-repl--message)
    (firefox-javascript-repl--error)
    (firefox-javascript-repl--accept-input)
    (firefox-javascript-repl--send-string)
    (firefox-javascript-repl--get-first-tab-actor): New functions.
    (firefox-javascript-repl--create-profile-directory): Kill buffer
    after writing out its contents.
    (firefox-javascript-repl): Distinguish standard output and network
    process names and buffer names.  Remove a debug message.  Kill
    network and process buffers when Firefox terminates.  Check for a
    network connection to Firefox.  Find the actor in the first tab.
---
 firefox-javascript-repl.el | 78 ++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 72 insertions(+), 6 deletions(-)

diff --git a/firefox-javascript-repl.el b/firefox-javascript-repl.el
index 2e1311bcf4..bab00de84d 100644
--- a/firefox-javascript-repl.el
+++ b/firefox-javascript-repl.el
@@ -36,6 +36,15 @@
   :group 'external
   :type 'string)
 
+(defun firefox-javascript-repl--message (format &rest arguments)
+  "Print to *Messages* a package herald and FORMAT.
+ARGUMENTS will be used for FORMAT, like `messages'."
+  (apply #'message (concat "firefox-javascript-repl: " format) arguments))
+
+(defun firefox-javascript-repl--error (message)
+  "Throw an error with a package herald and MESSAGE."
+  (error "firefox-javascript-repl: %s" message))
+
 (defun firefox-javascript-repl--create-profile-directory ()
   "Create a profile directory."
   (let ((profile-directory (make-temp-file "firefox-javascript-repl-" t)))
@@ -44,9 +53,42 @@
       (insert "user_pref(\"devtools.debugger.remote-enabled\", true);\n")
       (insert "user_pref(\"devtools.chrome.enabled\", true);\n")
       (insert "user_pref(\"devtools.debugger.prompt-connection\", false);\n")
-      (save-buffer 0))
+      (save-buffer 0)
+      (kill-buffer))
     profile-directory))
 
+(defun firefox-javascript-repl--get-first-tab-actor (network-buffer)
+  "Get the actor of the first browser tab.
+NETWORK-BUFFER is where Firefox responses go."
+  (gethash
+   "actor"
+   (elt
+    (gethash
+     "tabs"
+     (with-current-buffer network-buffer
+       (firefox-javascript-repl--message "BUF: %S" (buffer-string))
+       (goto-char (point-max))
+       (unless (bolp)
+         (insert "\n"))
+       (search-backward "{\"tabs\":")
+       (let ((start (point)))
+         (forward-sexp)
+         (prog1
+             (json-parse-string (buffer-substring start (point)))
+           (goto-char (point-max))))))
+    0)))
+
+(defun firefox-javascript-repl--accept-input (network)
+  "Wait up to ten sections to see if packets are received from NETWORK."
+  (unless (accept-process-output network 10 0 t)
+    (firefox-javascript-repl--error
+     "Failed to receive network packets from Firefox")))
+
+(defun firefox-javascript-repl--send-string (network message)
+  "Send to NETWORK a MESSAGE then wait for the response."
+  (process-send-string network message)
+  (firefox-javascript-repl--accept-input network))
+
 (defun firefox-javascript-repl ()
   "Run a new instance of Firefox in a new profile.
 Set about:config values `devtools.debugger.remote-enabled' to
@@ -58,23 +100,47 @@ localhost (127.0.0.1) TCP port 6000."
   (when (not (process-status "firefox-javascript-repl"))
     (let* ((profile-directory
             (firefox-javascript-repl--create-profile-directory))
-           (process-name (file-name-nondirectory profile-directory))
+           (temporary-name (file-name-nondirectory profile-directory))
+           (process-name (concat "out-" temporary-name))
+           (process-buffer-name (concat "*" process-name "*"))
+           (network-name (concat "net-" temporary-name))
+           (network-buffer-name (concat "*" network-name "*"))
            (firefox-process
             (start-process "firefox-javascript-repl"
-                           process-name
+                           process-buffer-name
                            firefox-javascript-repl-binary
                            "about:blank"
                            "-profile" profile-directory
                            "-start-debugger-server")))
       (set-process-sentinel firefox-process
                             (lambda (process event)
-                              (message "%S %S" process event)
                               (when (or (string= event "killed\n")
                                         (string= event "finished\n"))
-                                (message
-                                 "firefox-javascript-repl: %s %s; deleting %s"
+                                (firefox-javascript-repl--message
+                                 "%s %s; deleting %s"
                                  process (string-trim event) profile-directory)
+                                (ignore-errors (kill-buffer 
network-buffer-name))
+                                (kill-buffer process-buffer-name)
                                 (delete-directory profile-directory t))))
+      (let (network)
+        (catch 'connected
+          (dotimes (_count 50)
+            (when
+                (setq network
+                      (ignore-errors
+                        (open-network-stream process-name network-buffer-name
+                                             "127.0.0.1" 6000)))
+              (throw 'connected network))
+            (sit-for 2))
+          (firefox-javascript-repl--error
+           "Failed to connect to Firefox network port"))
+        (firefox-javascript-repl--accept-input network)
+        (firefox-javascript-repl--message "Established Firefox connection")
+        (firefox-javascript-repl--send-string
+         network "31:{\"to\":\"root\",\"type\":\"listTabs\"}")
+        (let ((actor (firefox-javascript-repl--get-first-tab-actor
+                      network-buffer-name)))
+          (message "Actor: %s" actor)))
       nil)))
 
 (defun firefox-javascript-repl-stop ()



reply via email to

[Prev in Thread] Current Thread [Next in Thread]