Bug 674791 - dragging the left text selection marker down selects to the bottom of the page [r=wjohnston]

This commit is contained in:
Mark Finkle 2011-08-04 15:26:42 -04:00
Родитель 727e924515
Коммит 8d8670f525
1 изменённых файлов: 27 добавлений и 16 удалений

Просмотреть файл

@ -1351,8 +1351,8 @@ var SelectionHandler = {
this.selectedText = ""; this.selectedText = "";
// if this is an iframe, dig down to find the document that was clicked // if this is an iframe, dig down to find the document that was clicked
let x = json.x; let x = json.x - scrollOffset.x;
let y = json.y; let y = json.y - scrollOffset.y;
let offset = scrollOffset; let offset = scrollOffset;
let elem = utils.elementFromPoint(x, y, true, false); let elem = utils.elementFromPoint(x, y, true, false);
while (elem && (elem instanceof HTMLIFrameElement || elem instanceof HTMLFrameElement)) { while (elem && (elem instanceof HTMLIFrameElement || elem instanceof HTMLFrameElement)) {
@ -1379,8 +1379,8 @@ var SelectionHandler = {
selection.removeAllRanges(); selection.removeAllRanges();
// Position the caret using a fake mouse click // Position the caret using a fake mouse click
utils.sendMouseEventToWindow("mousedown", x - scrollOffset.x, y - scrollOffset.y, 0, 1, 0, true); utils.sendMouseEventToWindow("mousedown", x, y, 0, 1, 0, true);
utils.sendMouseEventToWindow("mouseup", x - scrollOffset.x, y - scrollOffset.y, 0, 1, 0, true); utils.sendMouseEventToWindow("mouseup", x, y, 0, 1, 0, true);
// Select the word nearest the caret // Select the word nearest the caret
try { try {
@ -1423,7 +1423,7 @@ var SelectionHandler = {
try { try {
// The selection might already be gone // The selection might already be gone
if (this.contentWindow) if (this.contentWindow)
this.contentWindow.getSelection().collapseToStart(); this.contentWindow.getSelection().removeAllRanges();
this.contentWindow = null; this.contentWindow = null;
} catch(e) {} } catch(e) {}
@ -1450,19 +1450,24 @@ var SelectionHandler = {
if (elemUnder && elemUnder.ownerDocument.defaultView != this.contentWindow) if (elemUnder && elemUnder.ownerDocument.defaultView != this.contentWindow)
return; return;
// Use fake mouse events to update the selection
if (json.type == "end") { if (json.type == "end") {
this.cache.end.x = json.x - scrollOffset.x; // Keep the cache in "client" coordinates, but translate for the mouse event
this.cache.end.y = json.y - scrollOffset.y; this.cache.end = { x: json.x, y: json.y };
utils.sendMouseEventToWindow("mousedown", this.cache.end.x, this.cache.end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true); let end = { x: this.cache.end.x - scrollOffset.x, y: this.cache.end.y - scrollOffset.y };
utils.sendMouseEventToWindow("mouseup", this.cache.end.x, this.cache.end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true); utils.sendMouseEventToWindow("mousedown", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
utils.sendMouseEventToWindow("mouseup", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
} else { } else {
this.cache.start.x = json.x - scrollOffset.x; // Keep the cache in "client" coordinates, but translate for the mouse event
this.cache.start.y = json.y - scrollOffset.y; this.cache.start = { x: json.x, y: json.y };
utils.sendMouseEventToWindow("mousedown", this.cache.start.x, this.cache.start.y, 0, 1, 0, true); let start = { x: this.cache.start.x - scrollOffset.x, y: this.cache.start.y - scrollOffset.y };
// Don't cause a click. A mousedown is enough to move the caret let end = { x: this.cache.end.x - scrollOffset.x, y: this.cache.end.y - scrollOffset.y };
//utils.sendMouseEventToWindow("mouseup", this.cache.start.x, this.cache.start.y, 0, 1, 0, true);
utils.sendMouseEventToWindow("mousedown", this.cache.end.x, this.cache.end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true); utils.sendMouseEventToWindow("mousedown", start.x, start.y, 0, 0, 0, true);
utils.sendMouseEventToWindow("mouseup", this.cache.end.x, this.cache.end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true); utils.sendMouseEventToWindow("mouseup", start.x, start.y, 0, 0, 0, true);
utils.sendMouseEventToWindow("mousedown", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
utils.sendMouseEventToWindow("mouseup", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
} }
// Cache the selected text since the selection might be gone by the time we get the "end" message // Cache the selected text since the selection might be gone by the time we get the "end" message
@ -1487,6 +1492,12 @@ var SelectionHandler = {
cache.end.x = rects[i].right + aOffset.x; cache.end.x = rects[i].right + aOffset.x;
cache.end.y = rects[i].bottom + aOffset.y; cache.end.y = rects[i].bottom + aOffset.y;
} }
// Keep the handles from being positioned completely out of the selection range
const HANDLE_VERTICAL_MARGIN = 4;
cache.start.y -= HANDLE_VERTICAL_MARGIN;
cache.end.y -= HANDLE_VERTICAL_MARGIN;
cache.rect = aRange.getBoundingClientRect(); cache.rect = aRange.getBoundingClientRect();
cache.rect.left += aOffset.x; cache.rect.left += aOffset.x;
cache.rect.top += aOffset.y; cache.rect.top += aOffset.y;