From c6afaa10727fdabefad129cf76cf8a4d2caafb60 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Wed, 11 May 2011 16:30:21 -0700
Subject: [PATCH 01/20] Fix #5645 - Position: Allow for arbitrary element to be
containing element
---
ui/jquery.ui.position.js | 62 ++++++++++++++++++++++++----------------
1 file changed, 37 insertions(+), 25 deletions(-)
diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js
index 98b8198e29d..184571154b4 100644
--- a/ui/jquery.ui.position.js
+++ b/ui/jquery.ui.position.js
@@ -28,6 +28,7 @@ $.fn.position = function( options ) {
options = $.extend( {}, options );
var target = $( options.of ),
+ within = $( options.within || window ),
targetElem = target[0],
collision = ( options.collision || "flip" ).split( " " ),
offsets = {},
@@ -36,6 +37,8 @@ $.fn.position = function( options ) {
targetHeight,
basePosition;
+ options.within = within;
+
if ( targetElem.nodeType === 9 ) {
targetWidth = target.width();
targetHeight = target.height();
@@ -168,7 +171,8 @@ $.fn.position = function( options ) {
collisionHeight: collisionHeight,
offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
my: options.my,
- at: options.at
+ at: options.at,
+ within: within
});
}
});
@@ -183,12 +187,14 @@ $.fn.position = function( options ) {
$.ui.position = {
fit: {
left: function( position, data ) {
- var win = $( window ),
- overLeft = win.scrollLeft() - data.collisionPosition.left,
- overRight = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+ var win = $( data.within ),
+ winOffset = win.offset(),
+ outerWidth = win.outerWidth(),
+ overLeft = win.scrollLeft() - data.collisionPosition.left + winOffset.left,
+ overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset.left;
// element is wider than window or too far left -> align with left edge
- if ( data.collisionWidth > win.width() || overLeft > 0 ) {
+ if ( data.collisionWidth > outerWidth || overLeft > 0 ) {
position.left = position.left + overLeft;
// too far right -> align with right edge
} else if ( overRight > 0 ) {
@@ -199,12 +205,14 @@ $.ui.position = {
}
},
top: function( position, data ) {
- var win = $( window ),
- overTop = win.scrollTop() - data.collisionPosition.top,
- overBottom = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+ var win = $( data.within ),
+ winOffset = win.offset(),
+ outerHeight = win.outerHeight(),
+ overTop = win.scrollTop() - data.collisionPosition.top + winOffset.top,
+ overBottom = data.collisionPosition.top + data.collisionHeight - outerHeight - win.scrollTop() - winOffset.top;
// element is taller than window or too far up -> align with top edge
- if ( data.collisionHeight > win.height() || overTop > 0 ) {
+ if ( data.collisionHeight > outerHeight || overTop > 0 ) {
position.top = position.top + overTop;
// too far down -> align with bottom edge
} else if ( overBottom > 0 ) {
@@ -220,8 +228,12 @@ $.ui.position = {
if ( data.at[ 0 ] === center ) {
return;
}
- var win = $( window ),
- over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+ var win = $( data.within ),
+ winOffset = win.offset(),
+ outerWidth = win.outerWidth(),
+ overLeft = data.collisionPosition.left - winOffset.left,
+ overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset.left,
+ left = data.my[ 0 ] === "left",
myOffset = data.my[ 0 ] === "left" ?
-data.elemWidth :
data.my[ 0 ] === "right" ?
@@ -231,19 +243,21 @@ $.ui.position = {
data.targetWidth :
-data.targetWidth,
offset = -2 * data.offset[ 0 ];
- position.left += data.collisionPosition.left < 0 ?
- myOffset + atOffset + offset :
- over > 0 ?
- myOffset + atOffset + offset :
- 0;
+ if ( overLeft < 0 || overRight > 0 ) {
+ position.left += myOffset + atOffset + offset;
+ }
},
top: function( position, data ) {
if ( data.at[ 1 ] === center ) {
return;
}
- var win = $( window ),
- over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
- myOffset = data.my[ 1 ] === "top" ?
+ var win = $( data.within ),
+ winOffset = win.offset(),
+ outerHeight = win.outerHeight(),
+ overTop = data.collisionPosition.top - winOffset.top,
+ overBottom = data.collisionPosition.top + data.collisionHeight - outerHeight - win.scrollTop() - winOffset.top,
+ top = data.my[ 1 ] === "top",
+ myOffset = top ?
-data.elemHeight :
data.my[ 1 ] === "bottom" ?
data.elemHeight :
@@ -252,11 +266,9 @@ $.ui.position = {
data.targetHeight :
-data.targetHeight,
offset = -2 * data.offset[ 1 ];
- position.top += data.collisionPosition.top < 0 ?
- myOffset + atOffset + offset :
- over > 0 ?
- myOffset + atOffset + offset :
- 0;
+ if ( overTop < 0 || overBottom > 0) {
+ position.top += myOffset + atOffset + offset;
+ }
}
}
};
@@ -297,4 +309,4 @@ if ( $.uiBackCompat !== false ) {
}( jQuery ) );
}
-}( jQuery ) );
+}( jQuery ) );
\ No newline at end of file
From abf3a86c8b4220442d35c2da61544d5a0a529b77 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Wed, 11 May 2011 16:44:20 -0700
Subject: [PATCH 02/20] Fix issue when window is "within".
---
ui/jquery.ui.position.js | 46 +++++++++++++++++++++-------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js
index 184571154b4..eb94a64578d 100644
--- a/ui/jquery.ui.position.js
+++ b/ui/jquery.ui.position.js
@@ -37,8 +37,6 @@ $.fn.position = function( options ) {
targetHeight,
basePosition;
- options.within = within;
-
if ( targetElem.nodeType === 9 ) {
targetWidth = target.width();
targetHeight = target.height();
@@ -187,11 +185,12 @@ $.fn.position = function( options ) {
$.ui.position = {
fit: {
left: function( position, data ) {
- var win = $( data.within ),
- winOffset = win.offset(),
- outerWidth = win.outerWidth(),
- overLeft = win.scrollLeft() - data.collisionPosition.left + winOffset.left,
- overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset.left;
+ var win = data.within,
+ isWindow = $.isWindow(data.within[0]),
+ winOffset = isWindow ? 0 : win.offset().left,
+ outerWidth = isWindow ? win.width() : win.outerWidth(),
+ overLeft = win.scrollLeft() - data.collisionPosition.left + winOffset,
+ overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset;
// element is wider than window or too far left -> align with left edge
if ( data.collisionWidth > outerWidth || overLeft > 0 ) {
@@ -205,11 +204,12 @@ $.ui.position = {
}
},
top: function( position, data ) {
- var win = $( data.within ),
- winOffset = win.offset(),
- outerHeight = win.outerHeight(),
- overTop = win.scrollTop() - data.collisionPosition.top + winOffset.top,
- overBottom = data.collisionPosition.top + data.collisionHeight - outerHeight - win.scrollTop() - winOffset.top;
+ var win = data.within,
+ isWindow = $.isWindow(data.within[0]),
+ winOffset = isWindow ? 0 : win.offset().top,
+ outerHeight = isWindow ? win.height() : win.outerHeight(),
+ overTop = win.scrollTop() - data.collisionPosition.top + winOffset,
+ overBottom = data.collisionPosition.top + data.collisionHeight - outerHeight - win.scrollTop() - winOffset;
// element is taller than window or too far up -> align with top edge
if ( data.collisionHeight > outerHeight || overTop > 0 ) {
@@ -228,11 +228,12 @@ $.ui.position = {
if ( data.at[ 0 ] === center ) {
return;
}
- var win = $( data.within ),
- winOffset = win.offset(),
- outerWidth = win.outerWidth(),
- overLeft = data.collisionPosition.left - winOffset.left,
- overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset.left,
+ var win = data.within,
+ isWindow = $.isWindow(data.within[0]),
+ winOffset = isWindow ? 0 : win.offset().left,
+ outerWidth = isWindow ? win.width() : win.outerWidth(),
+ overLeft = data.collisionPosition.left - winOffset,
+ overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset
left = data.my[ 0 ] === "left",
myOffset = data.my[ 0 ] === "left" ?
-data.elemWidth :
@@ -251,11 +252,12 @@ $.ui.position = {
if ( data.at[ 1 ] === center ) {
return;
}
- var win = $( data.within ),
- winOffset = win.offset(),
- outerHeight = win.outerHeight(),
- overTop = data.collisionPosition.top - winOffset.top,
- overBottom = data.collisionPosition.top + data.collisionHeight - outerHeight - win.scrollTop() - winOffset.top,
+ var win = data.within,
+ isWindow = $.isWindow(data.within[0]),
+ winOffset = isWindow ? 0 : win.offset().top,
+ outerHeight = isWindow ? win.height() : win.outerHeight(),
+ overTop = data.collisionPosition.top - winOffset,
+ overBottom = data.collisionPosition.top + data.collisionHeight - outerHeight - win.scrollTop() - winOffset,
top = data.my[ 1 ] === "top",
myOffset = top ?
-data.elemHeight :
From 9e4e359705e6cb0b9608c3d842b7235ab1daefef Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Wed, 11 May 2011 16:52:43 -0700
Subject: [PATCH 03/20] fix spacing and add in a missing comma
---
ui/jquery.ui.position.js | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js
index eb94a64578d..ab9c6aae0c3 100644
--- a/ui/jquery.ui.position.js
+++ b/ui/jquery.ui.position.js
@@ -186,7 +186,7 @@ $.ui.position = {
fit: {
left: function( position, data ) {
var win = data.within,
- isWindow = $.isWindow(data.within[0]),
+ isWindow = $.isWindow( data.within[0] ),
winOffset = isWindow ? 0 : win.offset().left,
outerWidth = isWindow ? win.width() : win.outerWidth(),
overLeft = win.scrollLeft() - data.collisionPosition.left + winOffset,
@@ -205,7 +205,7 @@ $.ui.position = {
},
top: function( position, data ) {
var win = data.within,
- isWindow = $.isWindow(data.within[0]),
+ isWindow = $.isWindow( data.within[0] ),
winOffset = isWindow ? 0 : win.offset().top,
outerHeight = isWindow ? win.height() : win.outerHeight(),
overTop = win.scrollTop() - data.collisionPosition.top + winOffset,
@@ -228,12 +228,13 @@ $.ui.position = {
if ( data.at[ 0 ] === center ) {
return;
}
+
var win = data.within,
- isWindow = $.isWindow(data.within[0]),
+ isWindow = $.isWindow( data.within[0] ),
winOffset = isWindow ? 0 : win.offset().left,
outerWidth = isWindow ? win.width() : win.outerWidth(),
overLeft = data.collisionPosition.left - winOffset,
- overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset
+ overRight = data.collisionPosition.left + data.collisionWidth - outerWidth - win.scrollLeft() - winOffset,
left = data.my[ 0 ] === "left",
myOffset = data.my[ 0 ] === "left" ?
-data.elemWidth :
@@ -253,7 +254,7 @@ $.ui.position = {
return;
}
var win = data.within,
- isWindow = $.isWindow(data.within[0]),
+ isWindow = $.isWindow( data.within[0] ),
winOffset = isWindow ? 0 : win.offset().top,
outerHeight = isWindow ? win.height() : win.outerHeight(),
overTop = data.collisionPosition.top - winOffset,
From b6497996cee2dc8dff0006ceae0d6e240e658f6a Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Thu, 12 May 2011 13:28:01 +0000
Subject: [PATCH 04/20] Replace comma with semi-colon. How'd that get there?
---
ui/jquery.ui.position.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js
index ab9c6aae0c3..c1c815bd28e 100644
--- a/ui/jquery.ui.position.js
+++ b/ui/jquery.ui.position.js
@@ -111,7 +111,7 @@ $.fn.position = function( options ) {
parseInt( offsets.at[ 1 ], 10 ) *
( rpercent.test( offsets.at[ 1 ] ) ? targetHeight / 100 : 1 )
];
- basePosition.left += atOffset[ 0 ],
+ basePosition.left += atOffset[ 0 ];
basePosition.top += atOffset[ 1 ];
return this.each(function() {
From 396ed559a490507d07a605bd989e83d24e2d7f40 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Thu, 12 May 2011 14:27:29 +0000
Subject: [PATCH 05/20] Add a new visual test for position
---
tests/visual/position/position_within.html | 177 +++++++++++++++++++++
1 file changed, 177 insertions(+)
create mode 100644 tests/visual/position/position_within.html
diff --git a/tests/visual/position/position_within.html b/tests/visual/position/position_within.html
new file mode 100644
index 00000000000..f30ee625f40
--- /dev/null
+++ b/tests/visual/position/position_within.html
@@ -0,0 +1,177 @@
+
+
+
+
+ Position Visual Test: Default
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use the form controls to configure the positioning, or drag the positioned element to modify its offset.
+ Drag around the parent element to see collision detection in action.
+
+
+
+
+
+
+
This is the position parent element.
+
+
+
+
+
+
+
+ position...
+
+ my:
+
+ left
+ center
+ right
+
+
+ top
+ center
+ bottom
+
+
+
+ at:
+
+ left
+ center
+ right
+
+
+ top
+ center
+ bottom
+
+
+
+ offset:
+
+
+
+ collision:
+
+ flip
+ fit
+ none
+
+
+ flip
+ fit
+ none
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 0bda22f443ace20035ec4f049c60b951d5c82b03 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Thu, 12 May 2011 14:29:27 +0000
Subject: [PATCH 06/20] Update title to reflect test
---
tests/visual/position/position_within.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/visual/position/position_within.html b/tests/visual/position/position_within.html
index f30ee625f40..da97eb7e13a 100644
--- a/tests/visual/position/position_within.html
+++ b/tests/visual/position/position_within.html
@@ -2,7 +2,7 @@
- Position Visual Test: Default
+ Position Visual Test: Containing Element
From 7bca8c100445d1ab8da4f25bd9201408f5eb2174 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Thu, 12 May 2011 20:44:24 +0000
Subject: [PATCH 07/20] Fix typos in original tests
---
tests/unit/position/position_core.js | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js
index dbbda8a3b8a..b3f5d9b61e1 100644
--- a/tests/unit/position/position_core.js
+++ b/tests/unit/position/position_core.js
@@ -1,7 +1,7 @@
(function( $ ) {
function scrollTopSupport() {
- $( window ).scrollTop( 1 );
+ $( window ).scrollTop( 1 );
return $( window ).scrollTop() === 1;
}
@@ -64,7 +64,6 @@ test( "positions", function() {
center: 3,
right: 6,
top: 0,
- center: 3,
bottom: 6
};
var start = { left: 4, top: 4 };
@@ -351,7 +350,7 @@ test( "collision: flip, with offset", function() {
collisionTest2({
collision: "flip",
- at: "left-2 top-3",
+ at: "left-2 top-3"
}, { top: $( window ).height() + 3, left: $( window ).width() + 2 }, "right bottom, negative offset" );
});
From 17be87f34cb2651e7903db3911527c43f5c05ba1 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Thu, 12 May 2011 20:48:01 +0000
Subject: [PATCH 08/20] Whitespace fix
---
tests/unit/position/position_core.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js
index b3f5d9b61e1..613fffa02fb 100644
--- a/tests/unit/position/position_core.js
+++ b/tests/unit/position/position_core.js
@@ -1,7 +1,7 @@
(function( $ ) {
function scrollTopSupport() {
- $( window ).scrollTop( 1 );
+ $( window ).scrollTop( 1 );
return $( window ).scrollTop() === 1;
}
From dc66f02601eb3a46a93e5d08145e9b4580def237 Mon Sep 17 00:00:00 2001
From: David Murdoch
Date: Thu, 12 May 2011 20:50:16 +0000
Subject: [PATCH 09/20] Add tests for position's `within`
---
tests/unit/position/position.html | 44 +-
tests/unit/position/position_core_within.js | 560 ++++++++++++++++++++
tests/visual/position/position_within.html | 1 +
3 files changed, 586 insertions(+), 19 deletions(-)
create mode 100644 tests/unit/position/position_core_within.js
diff --git a/tests/unit/position/position.html b/tests/unit/position/position.html
index 4f2e87e080b..6e4373172f6 100644
--- a/tests/unit/position/position.html
+++ b/tests/unit/position/position.html
@@ -16,6 +16,7 @@
+
@@ -34,29 +35,34 @@
-->
-
-
-
-
-