OSDN Git Service

VirtualBuffer: When changing pages in IE (and perhaps other cases), the buffer is...
authorJames Teh <jamie@jantrid.net>
Thu, 30 Jun 2011 05:02:22 +0000 (15:02 +1000)
committerJames Teh <jamie@jantrid.net>
Thu, 30 Jun 2011 05:02:22 +0000 (15:02 +1000)
Therefore, save the last caret position when the caret is moved by the user or an event (in _set_selection) and remember that when terminating.
Fixes remembering of the last position on pages in IE.
Fixes #1604.

source/virtualBuffers/__init__.py

index 5b06537..667f796 100644 (file)
@@ -511,6 +511,7 @@ class VirtualBuffer(cursorManager.CursorManager, treeInterceptorHandler.TreeInte
                self.documentConstantIdentifier = self.documentConstantIdentifier\r
                if not hasattr(self.rootNVDAObject.appModule, "_vbufRememberedCaretPositions"):\r
                        self.rootNVDAObject.appModule._vbufRememberedCaretPositions = {}\r
+               self._lastCaretPosition = None\r
 \r
        def prepare(self):\r
                self.shouldPrepare=False\r
@@ -523,13 +524,8 @@ class VirtualBuffer(cursorManager.CursorManager, treeInterceptorHandler.TreeInte
                if not self.VBufHandle:\r
                        return\r
 \r
-               if self.shouldRememberCaretPositionAcrossLoads:\r
-                       try:\r
-                               caret = self.selection\r
-                               caret.collapse()\r
-                               self.rootNVDAObject.appModule._vbufRememberedCaretPositions[self.documentConstantIdentifier] = caret.bookmark\r
-                       except:\r
-                               pass\r
+               if self.shouldRememberCaretPositionAcrossLoads and self._lastCaretPosition:\r
+                       self.rootNVDAObject.appModule._vbufRememberedCaretPositions[self.documentConstantIdentifier] = self._lastCaretPosition\r
 \r
                self.unloadBuffer()\r
 \r
@@ -700,6 +696,12 @@ class VirtualBuffer(cursorManager.CursorManager, treeInterceptorHandler.TreeInte
                super(VirtualBuffer, self)._set_selection(info)\r
                if isScriptWaiting() or not info.isCollapsed:\r
                        return\r
+               # Save the last caret position for use in terminate().\r
+               # This must be done here because the buffer might be cleared just before terminate() is called,\r
+               # causing the last caret position to be lost.\r
+               caret = info.copy()\r
+               caret.collapse()\r
+               self._lastCaretPosition = caret.bookmark\r
                if config.conf['reviewCursor']['followCaret'] and api.getNavigatorObject() is self.rootNVDAObject:\r
                        api.setReviewPosition(info)\r
                if reason == speech.REASON_FOCUS:\r