jenkins-bot has submitted this change and it was merged.

Change subject: Make local overlays local to surface and remove insane z-indexes
......................................................................


Make local overlays local to surface and remove insane z-indexes

ve.ui.Surface.js
* Make local overlay a child of ve-ui-surface and a sibling to
  ve-ce-surface elements.
** This keeps local overlays relative to their surface and eliminates the
   need for insane z-indexes.

ve.ui.PopupWidget.js
* PopupWidget boundaries are now relative to ve-ce-surface and no longer
  protrude out

ve.ce.Node.css, ve.ui.Window.css
* Removal or replacement of insane z-indexes.

ve.ce.FocusableNode.js, ve.ce.ProtectedNode.js, ve.ce.ResizableNode.js,
ve.ui.Context.js
* Translate offsets from local overlay

ve.init.mw.ViewPageTarget-monobook.css,
ve.init.mw.ViewPageTarget-vector.css
* Skin specific z-indexes for global overlay

ve.init.mw.ViewPageTarget.js
* Applied direction specific mw class to ce.Surface vs ui.Surface to
  prevent mw content styles from being applied to ui elements.

ve.ui.Dialog.css
* Adjustments to surface inside of dialog so that relative offsets for
  local overlays can be properly calculated.

ve.ui.Surface.css
* Explicitly force .ve-ui-surface to be relative so that it's children can
  be relatively positioned.

ve.ui.Widget.css
* Removal of unnecessary font-size properties now that local overlay is
  sibling of surface.

ve.js
* Added get relative position helper method to translate position offsets
  from target parent

Bug: 50241
Change-Id: Ibadce404a2286bc5dcec48f0d9da89004dbbd867
---
M modules/ve/ce/ve.ce.FocusableNode.js
M modules/ve/ce/ve.ce.ProtectedNode.js
M modules/ve/ce/ve.ce.RelocatableNode.js
M modules/ve/ce/ve.ce.ResizableNode.js
M modules/ve/ce/ve.ce.Surface.js
M modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-monobook.css
M modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-vector.css
M modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget.css
M modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
M modules/ve/test/ve.Element.test.js
M modules/ve/ui/styles/ve.ui.Dialog.css
M modules/ve/ui/styles/ve.ui.Surface.css
M modules/ve/ui/styles/ve.ui.Tool.css
M modules/ve/ui/styles/ve.ui.Widget.css
M modules/ve/ui/styles/ve.ui.Window.css
M modules/ve/ui/ve.ui.Context.js
M modules/ve/ui/ve.ui.Frame.js
M modules/ve/ui/ve.ui.Surface.js
M modules/ve/ui/widgets/ve.ui.LookupInputWidget.js
M modules/ve/ui/widgets/ve.ui.PopupWidget.js
M modules/ve/ui/widgets/ve.ui.TextInputMenuWidget.js
M modules/ve/ve.Element.js
22 files changed, 106 insertions(+), 61 deletions(-)

Approvals:
  Trevor Parscal: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/modules/ve/ce/ve.ce.FocusableNode.js 
b/modules/ve/ce/ve.ce.FocusableNode.js
index 59d8070..328c672 100644
--- a/modules/ve/ce/ve.ce.FocusableNode.js
+++ b/modules/ve/ce/ve.ce.FocusableNode.js
@@ -151,19 +151,20 @@
 ve.ce.FocusableNode.prototype.createHighlight = function () {
        this.$.find( '*' ).add( this.$ ).each(
                ve.bind( function( i, element ) {
-                       var $element = $( element ),
-                               elementOffset;
-                       if ( !$element.is( ':visible' ) ) {
+                       var offset, $element = $( element );
+                       if ( $element.not( ':visible' ) ) {
                                return true;
                        }
-                       elementOffset = $element.offset();
+                       offset = ve.Element.getRelativePosition(
+                               $element, 
this.getRoot().getSurface().getSurface().$
+                       );
                        this.$highlights = this.$highlights.add(
                                $( '<div>' )
                                        .css( {
                                                height: $element.height(),
                                                width: $element.width(),
-                                               top: elementOffset.top,
-                                               left: elementOffset.left
+                                               top: offset.top,
+                                               left: offset.left
                                        } )
                                        .addClass( 
've-ce-focusableNode-highlight' )
                        );
diff --git a/modules/ve/ce/ve.ce.ProtectedNode.js 
b/modules/ve/ce/ve.ce.ProtectedNode.js
index 76c9a3e..329b5bf 100644
--- a/modules/ve/ce/ve.ce.ProtectedNode.js
+++ b/modules/ve/ce/ve.ce.ProtectedNode.js
@@ -233,7 +233,9 @@
        this.$.find( '.ve-ce-protectedNode-shield' ).each(
                ve.bind( function ( i, element ) {
                        var $shield = $( element ),
-                               offset = $shield.offset();
+                               offset = ve.Element.getRelativePosition(
+                                       $shield, 
this.getRoot().getSurface().getSurface().$
+                               );
                        this.$phantoms.eq( i ).css( {
                                'top': offset.top,
                                'left': offset.left,
diff --git a/modules/ve/ce/ve.ce.RelocatableNode.js 
b/modules/ve/ce/ve.ce.RelocatableNode.js
index bed4dd0..2625189 100644
--- a/modules/ve/ce/ve.ce.RelocatableNode.js
+++ b/modules/ve/ce/ve.ce.RelocatableNode.js
@@ -124,10 +124,14 @@
  * @method
  */
 ve.ce.RelocatableNode.prototype.setRelocatableMarkerSizeAndPosition = function 
() {
+       var offset = ve.Element.getRelativePosition(
+               this.$, this.getRoot().getSurface().getSurface().$
+       );
+
        this.$relocatableMarker.css( {
                'height': this.$.height(),
                'width': this.$.width(),
-               'top': this.$.offset().top,
-               'left': this.$.offset().left
+               'top': offset.top,
+               'left': offset.left
        } );
 };
diff --git a/modules/ve/ce/ve.ce.ResizableNode.js 
b/modules/ve/ce/ve.ce.ResizableNode.js
index 6c561d7..aa8e8fb 100644
--- a/modules/ve/ce/ve.ce.ResizableNode.js
+++ b/modules/ve/ce/ve.ce.ResizableNode.js
@@ -149,7 +149,9 @@
  * @method
  */
 ve.ce.ResizableNode.prototype.setResizableHandlesSizeAndPosition = function () 
{
-       var offset = this.$resizable.offset();
+       var offset = ve.Element.getRelativePosition(
+               this.$resizable, this.getRoot().getSurface().getSurface().$
+       );
 
        this.$resizeHandles
                .css( {
diff --git a/modules/ve/ce/ve.ce.Surface.js b/modules/ve/ce/ve.ce.Surface.js
index c09587a..181cb05 100644
--- a/modules/ve/ce/ve.ce.Surface.js
+++ b/modules/ve/ce/ve.ce.Surface.js
@@ -254,7 +254,7 @@
  */
 ve.ce.Surface.prototype.focus = function () {
        var $document = this.documentView.getDocumentNode().$,
-               $window = $( ve.Element.static.getWindow( $document ) ),
+               $window = $( ve.Element.getWindow( $document ) ),
                scrollTop = $window.scrollTop();
 
        $document[0].focus();
@@ -615,7 +615,7 @@
        this.pasting = true;
 
        var tx, scrollTop,
-               $window = $( ve.Element.static.getWindow( this.$$.context ) ),
+               $window = $( ve.Element.getWindow( this.$$.context ) ),
                view = this,
                selection = this.model.getSelection();
 
diff --git a/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-monobook.css 
b/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-monobook.css
index d3c6840..9800915 100644
--- a/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-monobook.css
+++ b/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-monobook.css
@@ -19,3 +19,7 @@
        font-size: 1.25em;
        line-height: 1.5em;
 }
+
+.ve-ui-surface-overlay-global {
+       z-index: 4;
+}
diff --git a/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-vector.css 
b/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-vector.css
index d7b99d6..ba5dc0c 100644
--- a/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-vector.css
+++ b/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget-vector.css
@@ -6,19 +6,16 @@
  */
 
 .ve-ui-surface {
-       margin-top: 0.8em;
-       margin-left: -1.5em;
-       margin-right: -1.5em;
+       margin: 0.8em -1.5em 0 -1.5em;
 }
 
 .ve-ce-documentNode {
        font-size: 0.8em;
-       padding-left: 1.875em; /* 1.5/0.8 */
-       padding-right: 1.875em; /* 1.5/0.8 */
+       padding: 0 1.875em; /* 1.5/0.8 */
 }
 
 .ve-init-mw-viewPageTarget-toolbar {
-       margin: -1em -1em 1em -1em;
+       margin: -1em;
        -webkit-transition: margin 200ms ease-out;
        -moz-transition: margin 200ms ease-out;
        -o-transition: margin 200ms ease-out;
@@ -28,4 +25,8 @@
 
 .ve-init-mw-viewPageTarget-toolbar .ve-ui-toolbar-bar {
        display: none;
-}
\ No newline at end of file
+}
+
+.ve-ui-surface-overlay-global {
+       z-index: 101; /* #p-personal is z-index 100 in vector :( */
+}
diff --git a/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget.css 
b/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget.css
index f08524e..afa3baf 100644
--- a/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget.css
+++ b/modules/ve/init/mw/styles/ve.init.mw.ViewPageTarget.css
@@ -8,7 +8,7 @@
 /* VisualEditor */
 
 .ve-ui-menuWidget {
-       font-size: 0.9em;
+       font-size: 0.8em;
 }
 
 .ve-init-mw-viewPageTarget-pageTitle {
diff --git a/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js 
b/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
index f2ce4b0..a198ed8 100644
--- a/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
+++ b/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
@@ -974,7 +974,9 @@
                                        } );
 
                                        // Add appropriately mw-content-ltr or 
mw-content-rtl class
-                                       this.surface.$.addClass( 'mw-content-' 
+ mw.config.get( 'wgVisualEditor' ).pageLanguageDir );
+                                       this.surface.view.$.addClass(
+                                               'mw-content-' + mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
+                                       );
                                        this.surface.initialize();
 
                                        setTimeout( callback );
@@ -2173,7 +2175,7 @@
                                // Scroll to heading:
                                // Wait for toolbar to animate in so we can 
account for its height
                                setTimeout( function () {
-                                       var $window = $( 
ve.Element.static.getWindow( target.$ ) );
+                                       var $window = $( ve.Element.getWindow( 
target.$ ) );
                                        $window.scrollTop( 
headingNode.$.offset().top - target.toolbar.$.height() );
                                }, 200 );
                        }
diff --git a/modules/ve/test/ve.Element.test.js 
b/modules/ve/test/ve.Element.test.js
index b3b706e..facf06d 100644
--- a/modules/ve/test/ve.Element.test.js
+++ b/modules/ve/test/ve.Element.test.js
@@ -25,18 +25,18 @@
        frameDoc.documentElement.appendChild( frameEl );
        frameDiv = frameDoc.createElement( 'div' );
 
-       assert.strictEqual( ve.Element.static.getDocument( $el ), doc, 'jQuery' 
);
-       assert.strictEqual( ve.Element.static.getDocument( $div ), doc, 'jQuery 
(detached)' );
-       assert.strictEqual( ve.Element.static.getDocument( el ), doc, 
'HTMLElement' );
-       assert.strictEqual( ve.Element.static.getDocument( div ), doc, 
'HTMLElement (detached)' );
-       assert.strictEqual( ve.Element.static.getDocument( win ), doc, 'Window' 
);
-       assert.strictEqual( ve.Element.static.getDocument( doc ), doc, 
'HTMLDocument' );
+       assert.strictEqual( ve.Element.getDocument( $el ), doc, 'jQuery' );
+       assert.strictEqual( ve.Element.getDocument( $div ), doc, 'jQuery 
(detached)' );
+       assert.strictEqual( ve.Element.getDocument( el ), doc, 'HTMLElement' );
+       assert.strictEqual( ve.Element.getDocument( div ), doc, 'HTMLElement 
(detached)' );
+       assert.strictEqual( ve.Element.getDocument( win ), doc, 'Window' );
+       assert.strictEqual( ve.Element.getDocument( doc ), doc, 'HTMLDocument' 
);
 
-       assert.strictEqual( ve.Element.static.getDocument( frameEl ), frameDoc, 
'HTMLElement (framed)' );
-       assert.strictEqual( ve.Element.static.getDocument( frameDiv ), 
frameDoc, 'HTMLElement (framed, detached)' );
-       assert.strictEqual( ve.Element.static.getDocument( frameDoc ), 
frameDoc, 'HTMLDocument (framed)' );
+       assert.strictEqual( ve.Element.getDocument( frameEl ), frameDoc, 
'HTMLElement (framed)' );
+       assert.strictEqual( ve.Element.getDocument( frameDiv ), frameDoc, 
'HTMLElement (framed, detached)' );
+       assert.strictEqual( ve.Element.getDocument( frameDoc ), frameDoc, 
'HTMLDocument (framed)' );
 
        assert.throws( function () {
-               ve.Element.static.getDocument( {} );
+               ve.Element.getDocument( {} );
        }, 'Invalid' );
 } );
diff --git a/modules/ve/ui/styles/ve.ui.Dialog.css 
b/modules/ve/ui/styles/ve.ui.Dialog.css
index 68d5208..1f1ee00 100644
--- a/modules/ve/ui/styles/ve.ui.Dialog.css
+++ b/modules/ve/ui/styles/ve.ui.Dialog.css
@@ -116,7 +116,6 @@
 }
 
 .ve-ui-window-body .ve-ui-surface {
-       padding: 0.25em 1.25em;
        border: solid 1px #ddd;
        border-radius: 0.25em;
        border-top-right-radius: 0;
@@ -173,6 +172,10 @@
        border-bottom-width: 0;
 }
 
+.ve-ui-window-body .ve-ce-documentNode {
+       padding: 0 1.875em; /* 1.5/0.8 */
+}
+
 /* ve.ui.MWTransclusionDialog */
 
 .ve-ui-mwTransclusionDialog-input {
diff --git a/modules/ve/ui/styles/ve.ui.Surface.css 
b/modules/ve/ui/styles/ve.ui.Surface.css
index c488fd3..b073a07 100644
--- a/modules/ve/ui/styles/ve.ui.Surface.css
+++ b/modules/ve/ui/styles/ve.ui.Surface.css
@@ -5,6 +5,10 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 
+.ve-ui-surface {
+       position: relative;
+}
+
 .ve-ui-surface:after {
        content: ".";
        display: block;
@@ -24,6 +28,6 @@
        left: 0;
 }
 
-.skin-monobook .ve-ui-surface-overlay {
-       z-index: 2;
+.ve-ui-surface-overlay-local {
+       z-index: 1;
 }
diff --git a/modules/ve/ui/styles/ve.ui.Tool.css 
b/modules/ve/ui/styles/ve.ui.Tool.css
index 7ba5c40..2d26eab 100644
--- a/modules/ve/ui/styles/ve.ui.Tool.css
+++ b/modules/ve/ui/styles/ve.ui.Tool.css
@@ -117,7 +117,7 @@
 .ve-ui-dropdownTool .ve-ui-menuWidget {
        left: -1px;
        top: 2.5em;
-       z-index: 10000;
+       z-index: 4;
 }
 
 .ve-ui-dropdownTool .ve-ui-labeledElement-label {
diff --git a/modules/ve/ui/styles/ve.ui.Widget.css 
b/modules/ve/ui/styles/ve.ui.Widget.css
index ab95129..ac3b454 100644
--- a/modules/ve/ui/styles/ve.ui.Widget.css
+++ b/modules/ve/ui/styles/ve.ui.Widget.css
@@ -377,7 +377,6 @@
 .ve-ui-mwLinkTargetInputWidget-menu {
        width: 20em;
        margin-top: -7px;
-       font-size: 0.8em;
 }
 
 .ve-ui-mwLinkTargetInputWidget-menu .ve-ui-menuWidget-item {
@@ -681,7 +680,6 @@
        padding: 0.5em;
        color: #fff;
        text-shadow: 1px 1px #000;
-       font-size: 0.8em;
        line-height: 1.125em;
        background-color: rgba(0,0,0,0.5);
        text-overflow: ellipsis;
diff --git a/modules/ve/ui/styles/ve.ui.Window.css 
b/modules/ve/ui/styles/ve.ui.Window.css
index fb7a1fc..3e664cf 100644
--- a/modules/ve/ui/styles/ve.ui.Window.css
+++ b/modules/ve/ui/styles/ve.ui.Window.css
@@ -46,5 +46,4 @@
        position: absolute;
        top: 0;
        left: 0;
-       z-index: 1000;
 }
diff --git a/modules/ve/ui/ve.ui.Context.js b/modules/ve/ui/ve.ui.Context.js
index 1087e0b..99dec73 100644
--- a/modules/ve/ui/ve.ui.Context.js
+++ b/modules/ve/ui/ve.ui.Context.js
@@ -29,7 +29,7 @@
        this.embedded = false;
        this.selection = null;
        this.toolbar = null;
-       this.popup = new ve.ui.PopupWidget( { '$$': this.$$ } );
+       this.popup = new ve.ui.PopupWidget( { '$$': this.$$, surface: 
this.surface } );
        this.$menu = this.$$( '<div>' );
        this.inspectors = new ve.ui.WindowSet( surface, ve.ui.inspectorFactory 
);
 
@@ -248,22 +248,30 @@
  * @chainable
  */
 ve.ui.Context.prototype.updateDimensions = function ( transition ) {
-       var position, $container, focusableOffset, focusableWidth,
+       var $container, focusableOffset, focusableWidth,
+               surface = this.surface.getView(),
                inspector = this.inspectors.getCurrent(),
-               focusedNode = this.surface.getView().getFocusedNode();
+               focusedNode = surface.getFocusedNode(),
+               // Get cursor position
+               position = surface.getSelectionRect(),
+               surfaceOffset = surface.$.offset();
 
-       // Get cursor position
-       position = this.surface.getView().getSelectionRect();
+       // translate from ce surface
+       position = {
+               y: position.end.y - surfaceOffset.top,
+               x: position.end.x - surfaceOffset.left
+       };
 
        if ( position ) {
                if ( this.embedded ) {
-                       focusableOffset = focusedNode.$focusable.offset();
+                       focusableOffset = ve.Element.getRelativePosition(
+                               focusedNode.$focusable, this.surface.$
+                       );
                        focusableWidth = focusedNode.$focusable.outerWidth();
                        $container = this.$menu;
                        position = { 'x': focusableOffset.left + 
focusableWidth, 'y': focusableOffset.top };
                        this.popup.align = 'right';
                } else {
-                       position = position && position.end;
                        $container = inspector ? this.inspectors.$ : this.$menu;
                        this.popup.align = 'center';
                }
diff --git a/modules/ve/ui/ve.ui.Frame.js b/modules/ve/ui/ve.ui.Frame.js
index 0699e9c..3c76cab 100644
--- a/modules/ve/ui/ve.ui.Frame.js
+++ b/modules/ve/ui/ve.ui.Frame.js
@@ -117,7 +117,7 @@
        }, this ), 10 );
 
        // Properties
-       this.$$ = ve.Element.static.get$$( doc, this );
+       this.$$ = ve.Element.get$$( doc, this );
        this.$content = this.$$( '.ve-ui-frame-content' );
        this.$document = this.$$( doc );
 };
diff --git a/modules/ve/ui/ve.ui.Surface.js b/modules/ve/ui/ve.ui.Surface.js
index 1e3e6f6..dcbade4 100644
--- a/modules/ve/ui/ve.ui.Surface.js
+++ b/modules/ve/ui/ve.ui.Surface.js
@@ -72,8 +72,9 @@
 /* Methods */
 
 ve.ui.Surface.prototype.initialize = function () {
-       this.$$( 'body' ).append( this.$localOverlay );
+       this.view.$.after( this.$localOverlay );
        $( 'body' ).append( this.$globalOverlay );
+
        this.view.initialize();
        // By re-asserting the current selection and forcing a poll we force 
selection to be something
        // reasonable - otherwise in Firefox, the initial selection is (0,0), 
causing bug 42277
diff --git a/modules/ve/ui/widgets/ve.ui.LookupInputWidget.js 
b/modules/ve/ui/widgets/ve.ui.LookupInputWidget.js
index 1b2b489..9de25e4 100644
--- a/modules/ve/ui/widgets/ve.ui.LookupInputWidget.js
+++ b/modules/ve/ui/widgets/ve.ui.LookupInputWidget.js
@@ -27,7 +27,7 @@
        this.lookupInput = input;
        this.$overlay = config.$overlay || this.$$( 
'.ve-surface-overlay-local:last' );
        this.lookupMenu = new ve.ui.TextInputMenuWidget( this, {
-               '$$': ve.Element.static.get$$( this.$overlay ),
+               '$$': ve.Element.get$$( this.$overlay ),
                'input': this.lookupInput,
                '$container': config.$container
        } );
diff --git a/modules/ve/ui/widgets/ve.ui.PopupWidget.js 
b/modules/ve/ui/widgets/ve.ui.PopupWidget.js
index a340478..d8850e6 100644
--- a/modules/ve/ui/widgets/ve.ui.PopupWidget.js
+++ b/modules/ve/ui/widgets/ve.ui.PopupWidget.js
@@ -26,6 +26,7 @@
        this.visible = false;
        this.$callout = this.$$( '<div>' );
        this.$body = this.$$( '<div>' );
+       this.surface = config.surface;
        this.transitionTimeout = null;
        this.align = config.align || 'center';
        this.autoClose = !!config.autoClose;
@@ -44,7 +45,7 @@
                // Listen for blur events
                this.$body.on( 'blur', ve.bind( this.onPopupBlur, this ) );
        }
-       this.$
+       this.$.hide()
                .addClass( 've-ui-popupWidget' )
                .append(
                        this.$body.addClass( 've-ui-popupWidget-body' ),
@@ -152,7 +153,7 @@
        }
 
        // Prevent viewport clipping, using padding between body and popup edges
-       overlapRight = this.$$( 'body' ).width() - ( x + ( width + left + ( 
padding * 2 ) ) );
+       overlapRight = this.surface.view.$.outerWidth( true ) - ( x + ( width + 
left + ( padding * 2 ) ) );
        overlapLeft = x + ( left - ( padding * 2 ) );
        if ( overlapRight < 0 ) {
                overlapOffset = overlapRight;
diff --git a/modules/ve/ui/widgets/ve.ui.TextInputMenuWidget.js 
b/modules/ve/ui/widgets/ve.ui.TextInputMenuWidget.js
index 8639d1f..15fbaf2 100644
--- a/modules/ve/ui/widgets/ve.ui.TextInputMenuWidget.js
+++ b/modules/ve/ui/widgets/ve.ui.TextInputMenuWidget.js
@@ -86,12 +86,14 @@
                dimensions = $container.offset();
 
        // Position under input
-       dimensions.top += $container.outerHeight( true );
-       dimensions.width = $container.outerWidth( true );
+       dimensions.top += $container.height();
+       dimensions.width = $container.width();
 
        // Compensate for frame position if in a differnt frame
        if ( this.input.$$.frame && this.input.$$.context !== 
this.$[0].ownerDocument ) {
-               frameOffset = this.input.$$.frame.$.offset();
+               frameOffset = ve.Element.getRelativePosition(
+                       this.input.$$.frame.$, this.$.closest( '.ve-ui-surface' 
)
+               );
                dimensions.left += frameOffset.left;
                dimensions.top += frameOffset.top;
        }
diff --git a/modules/ve/ve.Element.js b/modules/ve/ve.Element.js
index 72d8d34..d9238d4 100644
--- a/modules/ve/ve.Element.js
+++ b/modules/ve/ve.Element.js
@@ -19,7 +19,7 @@
        // Initialize config
        config = config || {};
        // Properties
-       this.$$ = config.$$ || ve.Element.static.get$$( document );
+       this.$$ = config.$$ || ve.Element.get$$( document );
        this.$ = this.$$( this.$$.context.createElement( this.getTagName() ) );
 };
 
@@ -53,7 +53,7 @@
  * @param {ve.ui.Frame} [frame] Frame of the document context
  * @returns {Function} Bound jQuery function
  */
-ve.Element.static.get$$ = function ( context, frame ) {
+ve.Element.get$$ = function ( context, frame ) {
        function wrapper( selector ) {
                return $( selector, wrapper.context );
        }
@@ -75,7 +75,7 @@
  * @returns {HTMLDocument} Document object
  * @throws {Error} If context is invalid
  */
-ve.Element.static.getDocument = function ( context ) {
+ve.Element.getDocument = function ( context ) {
        var doc =
                // jQuery - selections created "offscreen" won't have a 
context, so .context isn't reliable
                ( context[0] && context[0].ownerDocument ) ||
@@ -102,7 +102,7 @@
  * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the 
function to
  * @returns {Window} Window object
  */
-ve.Element.static.getWindow = function ( context ) {
+ve.Element.getWindow = function ( context ) {
        var doc = this.getDocument( context );
        return doc.parentWindow || doc.defaultView;
 };
@@ -119,7 +119,7 @@
  * @param {Object} [offset] Offset to start with, used internally
  * @returns {Object} Offset object, containing left and top properties
  */
-ve.Element.static.getFrameOffset = function ( from, to, offset ) {
+ve.Element.getFrameOffset = function ( from, to, offset ) {
        var i, len, frames, frame, rect;
 
        if ( !to ) {
@@ -153,6 +153,19 @@
        return offset;
 };
 
+/**
+ * Get the offset between two elements.
+ *
+ * @param {jQuery} $from 
+ * @param {jQuery} $to
+ * @returns {Object} Translated position coordinates, containing top and left 
properties
+ */
+ve.Element.getRelativePosition = function ( $from, $to ) {
+       var from = $from.offset(),
+               to = $to.offset();
+       return { 'top': from.top - to.top, 'left': from.left - to.left };
+};
+
 /* Methods */
 
 /**
@@ -174,7 +187,7 @@
  * @returns {HTMLDocument} Document object
  */
 ve.Element.prototype.getElementDocument = function () {
-       return ve.Element.static.getDocument( this.$ );
+       return ve.Element.getDocument( this.$ );
 };
 
 /**
@@ -184,5 +197,5 @@
  * @returns {Window} Window object
  */
 ve.Element.prototype.getElementWindow = function () {
-       return ve.Element.static.getWindow( this.$ );
+       return ve.Element.getWindow( this.$ );
 };

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ibadce404a2286bc5dcec48f0d9da89004dbbd867
Gerrit-PatchSet: 13
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Robmoen <[email protected]>
Gerrit-Reviewer: Christian <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Trevor Parscal <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to