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