aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Verona2012-01-23 15:08:53 +0100
committerJoakim Verona2012-01-23 15:08:53 +0100
commitd5114bfea3ea4c37c57e2af0f3b095be9fcd8bac (patch)
treeb61140bc590538137eee8416bfe28852ecf606af
parent698bd5eb8efd16be779b75934175c52d9150b5c9 (diff)
downloademacs-d5114bfea3ea4c37c57e2af0f3b095be9fcd8bac.tar.gz
emacs-d5114bfea3ea4c37c57e2af0f3b095be9fcd8bac.zip
added stuff for logging
-rw-r--r--README.xwidget33
-rw-r--r--lisp/xwidget.el47
2 files changed, 60 insertions, 20 deletions
diff --git a/README.xwidget b/README.xwidget
index db38e4cbd68..9cd741661bc 100644
--- a/README.xwidget
+++ b/README.xwidget
@@ -776,7 +776,7 @@ buffer. how do we catch these errors?
776 thats not really an error either 776 thats not really an error either
777- xwidgets should now be proper lisp objects so you dont delete them 777- xwidgets should now be proper lisp objects so you dont delete them
778 you await their garbage collection. so therefore there can never be 778 you await their garbage collection. so therefore there can never be
779 invalid disploy specs 779 invalid display specs
780 780
781so turned out this got solved by using proper lisp objects for 781so turned out this got solved by using proper lisp objects for
782xwidgets. yay! 782xwidgets. yay!
@@ -1527,3 +1527,34 @@ a callback that sets the buffer name automatically
1527** TODO unique buffer names 1527** TODO unique buffer names
1528the webkit xwidgets renames the buffer after load but not uniquely so 1528the webkit xwidgets renames the buffer after load but not uniquely so
1529it sometimes fails. 1529it sometimes fails.
1530** TODO kill the offscreen webkit xwidgets when last view killed
1531The offscreen xwidgets is currently kept around even if the xwidgets
1532views are all gone. this is a general problem and it requires actions
1533on the behalf of the application to resolve.
1534
1535In the case of webkit it is currently possible to get errors like these:
1536
1537Debugger entered--Lisp error: (error "Selecting deleted buffer")
1538 xwidget-webkit-callback(60925380 navigation-policy-decision-requested)
1539 xwidget-event-handler()
1540 call-interactively(xwidget-event-handler nil nil)
1541
1542
1543because the last view is gone and the offscreen widgets is still
1544generating events.
1545
1546In the case of webkit it is okay to kill the offscreen widgets
1547completely when the user kills the last view window because it would
1548be unexpected by the user to see it pop up again. This is not true in
1549the general case.
1550
1551** DONE xwidgets debugging log
1552 CLOSED: [2012-01-23 Mon 14:32]
1553currently theres a lot of debugging traces using "message" which is
1554annoying. Instead put them in a separate trace buffer.
1555(see xwidget-log)
1556** TODO make garbage collect work for xwidgets
1557when an xwidget is removed from xwidget-alist, and there are no other
1558references(mostly views) the xwidget should be garbage collected.
1559
1560special finalization would go into gc_sweep()
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index a8fa84da37f..50e74add6a0 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -142,35 +142,44 @@ defaults to the string looking like a url around the cursor position."
142;;since the xwidget can generate an event even if its offscreen 142;;since the xwidget can generate an event even if its offscreen
143;;TODO this needs to use callbacks and consider different xw ev types 143;;TODO this needs to use callbacks and consider different xw ev types
144(define-key (current-global-map) [xwidget-event] 'xwidget-event-handler) 144(define-key (current-global-map) [xwidget-event] 'xwidget-event-handler)
145(defun xwidget-log ( &rest msg)
146 (let ( (buf (get-buffer-create "*xwidget-log*")))
147 (save-excursion
148 (buffer-disable-undo buf)
149 (set-buffer buf)
150 (insert (apply 'format msg))
151 (insert "\n"))))
145 152
146(defun xwidget-event-handler () 153(defun xwidget-event-handler ()
147 "Receive xwidget event." 154 "Receive xwidget event."
148 (interactive) 155 (interactive)
149 (message "stuff happened to xwidget %S" last-input-event) 156 (xwidget-log "stuff happened to xwidget %S" last-input-event)
150 (let* 157 (let*
151 ((xwidget-event-type (nth 1 last-input-event)) 158 ((xwidget-event-type (nth 1 last-input-event))
152 (xwidget (nth 2 last-input-event)) 159 (xwidget (nth 2 last-input-event))
153 ;(xwidget-callback (xwidget-get xwidget 'callback));;TODO stopped working for some reason 160 ;(xwidget-callback (xwidget-get xwidget 'callback));;TODO stopped working for some reason
154 ) 161 )
155 ;(funcall xwidget-callback xwidget xwidget-event-type) 162 ;(funcall xwidget-callback xwidget xwidget-event-type)
156 (funcall 'xwidget-webkit-callback xwidget xwidget-event-type) 163 (funcall 'xwidget-webkit-callback xwidget xwidget-event-type)
157 )) 164 ))
158 165
159(defun xwidget-webkit-callback (xwidget xwidget-event-type) 166(defun xwidget-webkit-callback (xwidget xwidget-event-type)
160 (save-excursion 167 (save-excursion
161 (set-buffer (xwidget-buffer xwidget)) 168 (cond ( (buffer-live-p (xwidget-buffer xwidget))
162 (let* ( (strarg (nth 3 last-input-event))) 169 (set-buffer (xwidget-buffer xwidget))
163 (cond ((eq xwidget-event-type 'document-load-finished) 170 (let* ( (strarg (nth 3 last-input-event)))
164 (message "webkit finished loading: '%s'" (xwidget-webkit-get-title xwidget)) 171 (cond ((eq xwidget-event-type 'document-load-finished)
165 (xwidget-adjust-size-to-content xwidget) 172 (xwidget-log "webkit finished loading: '%s'" (xwidget-webkit-get-title xwidget))
166 (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget))) 173 (xwidget-adjust-size-to-content xwidget)
167 (pop-to-buffer (current-buffer)) 174 (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget)))
168 ) 175 (pop-to-buffer (current-buffer))
169 176 )
170 ((eq xwidget-event-type 'navigation-policy-decision-requested) 177
171 (if (string-match ".*#\\(.*\\)" strarg) 178 ((eq xwidget-event-type 'navigation-policy-decision-requested)
172 (xwidget-webkit-show-id-or-named-element xwidget (match-string 1 strarg)))) 179 (if (string-match ".*#\\(.*\\)" strarg)
173 (t (message "unhandled event:%s" xwidget-event-type)))))) 180 (xwidget-webkit-show-id-or-named-element xwidget (match-string 1 strarg))))
181 (t (xwidget-log "unhandled event:%s" xwidget-event-type)))))
182 (t (xwidget-log "error: callback called for xwidget with dead buffer")))))
174 183
175(define-derived-mode xwidget-webkit-mode 184(define-derived-mode xwidget-webkit-mode
176 special-mode "xwidget-webkit" "xwidget webkit view mode" 185 special-mode "xwidget-webkit" "xwidget webkit view mode"
@@ -272,7 +281,7 @@ Argument STR string."
272 (let ((y 281 (let ((y
273 (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementsByName('%s')[0].getBoundingClientRect().top" element-name) 0)))) 282 (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementsByName('%s')[0].getBoundingClientRect().top" element-name) 0))))
274 ;;now we need to tell emacs to scroll the element into view. 283 ;;now we need to tell emacs to scroll the element into view.
275 (message "scroll: %d" y) 284 (xwidget-log "scroll: %d" y)
276 (set-window-vscroll (selected-window) y t)) 285 (set-window-vscroll (selected-window) y t))
277 ) 286 )
278 287
@@ -282,7 +291,7 @@ Argument STR string."
282 (let ((y 291 (let ((y
283 (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementById('%s').getBoundingClientRect().top" element-id) 0)))) 292 (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementById('%s').getBoundingClientRect().top" element-id) 0))))
284 ;;now we need to tell emacs to scroll the element into view. 293 ;;now we need to tell emacs to scroll the element into view.
285 (message "scroll: %d" y) 294 (xwidget-log "scroll: %d" y)
286 (set-window-vscroll (selected-window) y t)) 295 (set-window-vscroll (selected-window) y t))
287 ) 296 )
288 297
@@ -295,7 +304,7 @@ Argument STR string."
295 (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementById('%s').getBoundingClientRect().top" element-id) 0))) 304 (string-to-number (xwidget-webkit-execute-script-rv xw (format "document.getElementById('%s').getBoundingClientRect().top" element-id) 0)))
296 (y3 (max y1 y2))) 305 (y3 (max y1 y2)))
297 ;;now we need to tell emacs to scroll the element into view. 306 ;;now we need to tell emacs to scroll the element into view.
298 (message "scroll: %d" y3) 307 (xwidget-log "scroll: %d" y3)
299 (set-window-vscroll (selected-window) y3 t)) 308 (set-window-vscroll (selected-window) y3 t))
300 ) 309 )
301 310