Matmarex has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/61190


Change subject: Make ve.ce.Surface.getSelectionRect() work on Opera
......................................................................

Make ve.ce.Surface.getSelectionRect() work on Opera

.getClientRects() on a collapsed native range returns an empty
collection on Opera, causing an exception to be thrown by rangy.

Handle collapsed ranges separately, by using .surroundContents() to
insert an empty <span> into the DOM, then read the span's offset.

Bug: 47772
Change-Id: I4bad882d1d6fb83bcdcfd0de3bfc9af52960c2ff
---
M modules/ve/ce/ve.ce.Surface.js
1 file changed, 31 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/90/61190/1

diff --git a/modules/ve/ce/ve.ce.Surface.js b/modules/ve/ce/ve.ce.Surface.js
index ff7403c..82816ad 100644
--- a/modules/ve/ce/ve.ce.Surface.js
+++ b/modules/ve/ce/ve.ce.Surface.js
@@ -136,14 +136,40 @@
  * @static
  */
 ve.ce.Surface.getSelectionRect = function () {
+       var rangySel, span, offset;
        if ( !rangy.initialized ) {
                rangy.init();
        }
-       var rangySel = rangy.getSelection();
-       return {
-               start: rangySel.getStartDocumentPos(),
-               end: rangySel.getEndDocumentPos()
-       };
+
+       rangySel = rangy.getSelection();
+
+       if ( rangySel.rangeCount === 0 ) {
+               // We can't do anything if there's no selection
+               return null;
+       } else if ( rangySel.isCollapsed ) {
+               // Empty selection - just a caret
+               // .getClientRects() on a collapsed native range returns an 
empty collection on Opera,
+               // causing an exception to be thrown by rangy
+               span = document.createElement( 'span' );
+               rangySel.getRangeAt( 0 ).surroundContents( span );
+               offset = $( span ).offset();
+               span.parentNode.removeChild( span );
+
+               // Calculate offset relative to window
+               offset.top -= $( window ).scrollTop();
+               offset.left -= $( window ).scrollLeft();
+
+               return {
+                       start: { x: offset.left, y: offset.top },
+                       end: { x: offset.left, y: offset.top }
+               };
+       } else {
+               // Normal selection
+               return {
+                       start: rangySel.getStartDocumentPos(),
+                       end: rangySel.getEndDocumentPos()
+               };
+       }
 };
 
 

-- 
To view, visit https://gerrit.wikimedia.org/r/61190
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4bad882d1d6fb83bcdcfd0de3bfc9af52960c2ff
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Matmarex <matma....@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to