@@ -195,6 +195,7 @@ describe('MdRipple', () => {
195195 expect ( pxStringToFloat ( ripple . style . height ) ) . toBeCloseTo ( 2 * expectedRadius , 1 ) ;
196196 } ) ;
197197
198+
198199 it ( 'cleans up the event handlers when the container gets destroyed' , ( ) => {
199200 fixture = TestBed . createComponent ( RippleContainerWithNgIf ) ;
200201 fixture . detectChanges ( ) ;
@@ -208,6 +209,68 @@ describe('MdRipple', () => {
208209 rippleElement . dispatchEvent ( createMouseEvent ( 'mousedown' ) ) ;
209210 expect ( rippleBackground . classList ) . not . toContain ( 'md-ripple-active' ) ;
210211 } ) ;
212+
213+ describe ( 'when page is scrolled' , ( ) => {
214+ var veryLargeElement : HTMLDivElement = document . createElement ( 'div' ) ;
215+ var pageScrollTop = 500 ;
216+ var pageScrollLeft = 500 ;
217+
218+ beforeEach ( ( ) => {
219+ // Add a very large element to make the page scroll
220+ veryLargeElement . style . width = '4000px' ;
221+ veryLargeElement . style . height = '4000px' ;
222+ document . body . appendChild ( veryLargeElement ) ;
223+ document . body . scrollTop = pageScrollTop ;
224+ document . body . scrollLeft = pageScrollLeft ;
225+ // Firefox
226+ document . documentElement . scrollLeft = pageScrollLeft ;
227+ document . documentElement . scrollTop = pageScrollTop ;
228+ // Mobile safari
229+ window . scrollTo ( pageScrollLeft , pageScrollTop ) ;
230+ } ) ;
231+
232+ afterEach ( ( ) => {
233+ document . body . removeChild ( veryLargeElement ) ;
234+ document . body . scrollTop = 0 ;
235+ document . body . scrollLeft = 0 ;
236+ // Firefox
237+ document . documentElement . scrollLeft = 0 ;
238+ document . documentElement . scrollTop = 0 ;
239+ // Mobile safari
240+ window . scrollTo ( 0 , 0 ) ;
241+ } ) ;
242+
243+ it ( 'create ripple with correct position' , ( ) => {
244+ let elementTop = 600 ;
245+ let elementLeft = 750 ;
246+ let left = 50 ;
247+ let top = 75 ;
248+
249+ rippleElement . style . position = 'absolute' ;
250+ rippleElement . style . left = `${ elementLeft } px` ;
251+ rippleElement . style . top = `${ elementTop } px` ;
252+
253+ // Simulate a keyboard-triggered click by setting event coordinates to 0.
254+ const clickEvent = createMouseEvent ( 'click' , {
255+ clientX : left + elementLeft - pageScrollLeft ,
256+ clientY : top + elementTop - pageScrollTop ,
257+ screenX : left + elementLeft ,
258+ screenY : top + elementTop
259+ } ) ;
260+ rippleElement . dispatchEvent ( clickEvent ) ;
261+
262+ const expectedRadius = Math . sqrt ( 250 * 250 + 125 * 125 ) ;
263+ const expectedLeft = left - expectedRadius ;
264+ const expectedTop = top - expectedRadius ;
265+
266+ const ripple = < HTMLElement > rippleElement . querySelector ( '.md-ripple-foreground' ) ;
267+ expect ( pxStringToFloat ( ripple . style . left ) ) . toBeCloseTo ( expectedLeft , 1 ) ;
268+ expect ( pxStringToFloat ( ripple . style . top ) ) . toBeCloseTo ( expectedTop , 1 ) ;
269+ expect ( pxStringToFloat ( ripple . style . width ) ) . toBeCloseTo ( 2 * expectedRadius , 1 ) ;
270+ expect ( pxStringToFloat ( ripple . style . height ) ) . toBeCloseTo ( 2 * expectedRadius , 1 ) ;
271+ } ) ;
272+ } ) ;
273+
211274 } ) ;
212275
213276 describe ( 'configuring behavior' , ( ) => {
0 commit comments