diff --git a/source/clog-connection-websockets.lisp b/source/clog-connection-websockets.lisp index 9e74f3c..138ef0c 100644 --- a/source/clog-connection-websockets.lisp +++ b/source/clog-connection-websockets.lisp @@ -97,11 +97,13 @@ connection)) (websocket-driver:close-connection connection)) ; don't send the reason for better security ((equal (first ml) "0") - ;; a ping - run browser gc - (execute connection-id + ;; a ping + (when *browser-gc-on-ping* + ;; run browser gc + (execute connection-id "Object.entries(clog).forEach(function(c,i,a) {if ((c[1] !== null) && (typeof c[1] === 'object') && (c[1].nodeType===1)) - {if (c[1].isConnected===false) {delete clog[c[0]]}}})") + {if (c[1].isConnected===false) {delete clog[c[0]]}}})")) (when *verbose-output* (format t "Connection ~A Ping~%" connection-id))) ((equal (first ml) "E") diff --git a/source/clog-connection.lisp b/source/clog-connection.lisp index eb0b0d7..eac2fb7 100644 --- a/source/clog-connection.lisp +++ b/source/clog-connection.lisp @@ -35,6 +35,7 @@ script." "CLOG system startup and shutdown" (*verbose-output* variable) + (*browser-gc-on-ping* variable) (*break-on-error* variable) (*disable-clog-debugging* variable) @@ -83,6 +84,7 @@ script." #-(or sbcl ecl mezzano) (apply #'make-hash-table args)) (defvar *verbose-output* nil "Verbose server output (default false)") +(defvar *browser-gc-on-ping* nil "Run a browser-gc on every ping") (defvar *break-on-error* t "Allow invoking debugger (default true)") (defvar *disable-clog-debugging* nil "When true turns off debug hooks") diff --git a/source/clog-element.lisp b/source/clog-element.lisp index 928ced9..08563f7 100644 --- a/source/clog-element.lisp +++ b/source/clog-element.lisp @@ -114,7 +114,8 @@ possible tag and keywords.")) (:documentation "Create a new CLOG-ELEMENT or sub-type of CLOG-TYPE from HTML as child of CLOG-OBJ and if :AUTO-PLACE (default t) place-inside-bottom-of CLOG-OBJ, you can also set auto-place to :bottom or :top. If HTML-ID is nil one -will be generated.")) +will be generated. If auto-place is nil, note that if browser-gc is called +or clog-connect:*browser-gc-on-ping* is t the browser side will be destroyed.")) (defmethod create-child ((obj clog-obj) html &key (html-id nil) (auto-place t) @@ -2277,9 +2278,11 @@ on browser.")) (defgeneric browser-gc (clog-element) (:documentation "Remove any clog cache items on browser not in DOM. -This gc is generally done during websocket pings. When clearing out -large amounts of DOM objects not using CLOG would be the main reason -to consider running this earlier.")) +If clog-connect:*browser-gc-on-ping* is set this is done during websocket pings. +Care should be taken as any clog-element not placed in the DOM will be deleted +on the browser side (for examle :auto-place nil set and not later placed.) +The main use is when clearing out large amounts of DOM objects not using CLOG +destroy.")) (defmethod browser-gc ((obj clog-element)) (js-execute obj diff --git a/tools/clog-builder-dir-tree.lisp b/tools/clog-builder-dir-tree.lisp index 1c44d9a..5b621a4 100644 --- a/tools/clog-builder-dir-tree.lisp +++ b/tools/clog-builder-dir-tree.lisp @@ -35,6 +35,7 @@ :visible nil :on-context-menu (lambda (obj) + (browser-gc obj) (let* ((disp (text-value (content obj))) (menu (create-panel obj :left (left obj) :top (top obj) @@ -129,6 +130,7 @@ (create-clog-tree-item (tree-root node) :on-context-menu (lambda (obj) + (browser-gc obj) (let* ((disp (text-value (content obj))) (menu (create-panel obj :left (left obj) :top (top obj) @@ -198,8 +200,8 @@ (project-tree-select obj (format nil "~A" item))) :content (file-namestring item)))) (on-change (obj) - (declare (ignore obj)) (setf (text tree) "") + (browser-gc obj) (let* ((root (text-value root-dir)) (tname (truename root)) (dir (format nil "~A" (uiop:native-namestring (if tname diff --git a/tools/clog-builder-project-tree.lisp b/tools/clog-builder-project-tree.lisp index f746786..4ba98a8 100644 --- a/tools/clog-builder-project-tree.lisp +++ b/tools/clog-builder-project-tree.lisp @@ -68,7 +68,7 @@ (set-on-window-move win (lambda (obj) (setf (height obj) (height obj)))) (set-on-window-close win (lambda (obj) - (declare (ignore obj)) + (browser-gc obj) (setf (project-tree-win app) nil))) (setf (positioning projects) :absolute) (set-geometry projects :height 27 :width "100%" :top 0 :left 0 :right 0) @@ -116,6 +116,7 @@ :visible nil :on-context-menu (lambda (obj) + (browser-gc obj) (let* ((disp (text-value (content obj))) (menu (create-panel obj :left (left obj) :top (top obj) @@ -166,6 +167,7 @@ (create-clog-tree-item (tree-root node) :on-context-menu (lambda (obj) + (browser-gc obj) (let* ((disp (text-value (content obj))) (menu (create-panel obj :left (left obj) :top (top obj) @@ -232,8 +234,8 @@ (setf (background-color load-btn) load-np) (window-focus win)) (on-change (obj) - (declare (ignore obj)) (setf (text tree) "") + (browser-gc obj) (let* ((sel (value projects))) (setf entry-point "") (cond ((equal sel "") @@ -256,6 +258,7 @@ :content root :on-context-menu (lambda (obj) + (browser-gc obj) (let* ((disp sel) (item root) (menu (create-panel obj diff --git a/tools/clog-builder-scope.lisp b/tools/clog-builder-scope.lisp index 2dbda35..b0403d9 100644 --- a/tools/clog-builder-scope.lisp +++ b/tools/clog-builder-scope.lisp @@ -317,6 +317,7 @@ name. If CLOG-BODY not set use *clog-debug-instance*" (closer-mop:class-direct-slots dclass)))) (on-change (object &key is-list) (setf (text tree) "") + (browser-gc object) (create-div tree :class "w3-tiny w3-center" :content "left-click - drill down / right-click - system browse

") (if is-list