diff options
| author | Joakim Verona | 2012-01-23 15:08:53 +0100 |
|---|---|---|
| committer | Joakim Verona | 2012-01-23 15:08:53 +0100 |
| commit | d5114bfea3ea4c37c57e2af0f3b095be9fcd8bac (patch) | |
| tree | b61140bc590538137eee8416bfe28852ecf606af | |
| parent | 698bd5eb8efd16be779b75934175c52d9150b5c9 (diff) | |
| download | emacs-d5114bfea3ea4c37c57e2af0f3b095be9fcd8bac.tar.gz emacs-d5114bfea3ea4c37c57e2af0f3b095be9fcd8bac.zip | |
added stuff for logging
| -rw-r--r-- | README.xwidget | 33 | ||||
| -rw-r--r-- | lisp/xwidget.el | 47 |
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 | ||
| 781 | so turned out this got solved by using proper lisp objects for | 781 | so turned out this got solved by using proper lisp objects for |
| 782 | xwidgets. yay! | 782 | xwidgets. yay! |
| @@ -1527,3 +1527,34 @@ a callback that sets the buffer name automatically | |||
| 1527 | ** TODO unique buffer names | 1527 | ** TODO unique buffer names |
| 1528 | the webkit xwidgets renames the buffer after load but not uniquely so | 1528 | the webkit xwidgets renames the buffer after load but not uniquely so |
| 1529 | it sometimes fails. | 1529 | it sometimes fails. |
| 1530 | ** TODO kill the offscreen webkit xwidgets when last view killed | ||
| 1531 | The offscreen xwidgets is currently kept around even if the xwidgets | ||
| 1532 | views are all gone. this is a general problem and it requires actions | ||
| 1533 | on the behalf of the application to resolve. | ||
| 1534 | |||
| 1535 | In the case of webkit it is currently possible to get errors like these: | ||
| 1536 | |||
| 1537 | Debugger 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 | |||
| 1543 | because the last view is gone and the offscreen widgets is still | ||
| 1544 | generating events. | ||
| 1545 | |||
| 1546 | In the case of webkit it is okay to kill the offscreen widgets | ||
| 1547 | completely when the user kills the last view window because it would | ||
| 1548 | be unexpected by the user to see it pop up again. This is not true in | ||
| 1549 | the general case. | ||
| 1550 | |||
| 1551 | ** DONE xwidgets debugging log | ||
| 1552 | CLOSED: [2012-01-23 Mon 14:32] | ||
| 1553 | currently theres a lot of debugging traces using "message" which is | ||
| 1554 | annoying. Instead put them in a separate trace buffer. | ||
| 1555 | (see xwidget-log) | ||
| 1556 | ** TODO make garbage collect work for xwidgets | ||
| 1557 | when an xwidget is removed from xwidget-alist, and there are no other | ||
| 1558 | references(mostly views) the xwidget should be garbage collected. | ||
| 1559 | |||
| 1560 | special 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 | ||