@@ -185,6 +185,7 @@ describe('MdRipple', () => {
185185 expect ( pxStringToFloat ( ripple . style . height ) ) . toBeCloseTo ( 2 * expectedRadius , 1 ) ;
186186 } ) ;
187187
188+
188189 it ( 'cleans up the event handlers when the container gets destroyed' , ( ) => {
189190 fixture = TestBed . createComponent ( RippleContainerWithNgIf ) ;
190191 fixture . detectChanges ( ) ;
@@ -197,7 +198,97 @@ describe('MdRipple', () => {
197198
198199 rippleElement . dispatchEvent ( createMouseEvent ( 'mousedown' ) ) ;
199200 expect ( rippleBackground . classList ) . not . toContain ( 'md-ripple-active' ) ;
201+
202+ it ( 'create ripple with correct position when page is scrolled' , ( ) => {
203+ let elementTop = 600 ;
204+ let elementLeft = 750 ;
205+ let pageScrollTop = 500 ;
206+ let pageScrollLeft = 500 ;
207+ let left = 50 ;
208+ let top = 75 ;
209+
210+ // Add a very large element to make the page scroll
211+ let veryLargeElement = document . createElement ( 'div' ) ;
212+ veryLargeElement . style . width = '4000px' ;
213+ veryLargeElement . style . height = '4000px' ;
214+ document . body . appendChild ( veryLargeElement ) ;
215+ document . body . scrollTop = pageScrollTop ;
216+ document . body . scrollLeft = pageScrollLeft ;
217+
218+ rippleElement . style . position = 'absolute' ;
219+ rippleElement . style . left = `${ elementLeft } px` ;
220+ rippleElement . style . top = `${ elementTop } px` ;
221+
222+ // Simulate a keyboard-triggered click by setting event coordinates to 0.
223+ const clickEvent = createMouseEvent ( 'click' , {
224+ clientX : left + elementLeft - pageScrollLeft ,
225+ clientY : top + elementTop - pageScrollTop ,
226+ screenX : left + elementLeft ,
227+ screenY : top + elementTop
228+ } ) ;
200229 } ) ;
230+
231+ describe ( 'when page is scrolled' , ( ) => {
232+ var veryLargeElement : HTMLDivElement = document . createElement ( 'div' ) ;
233+ var pageScrollTop = 500 ;
234+ var pageScrollLeft = 500 ;
235+
236+ beforeEach ( ( ) => {
237+ // Add a very large element to make the page scroll
238+ veryLargeElement . style . width = '4000px' ;
239+ veryLargeElement . style . height = '4000px' ;
240+ document . body . appendChild ( veryLargeElement ) ;
241+ document . body . scrollTop = pageScrollTop ;
242+ document . body . scrollLeft = pageScrollLeft ;
243+ // Firefox
244+ document . documentElement . scrollLeft = pageScrollLeft ;
245+ document . documentElement . scrollTop = pageScrollTop ;
246+ // Mobile safari
247+ window . scrollTo ( pageScrollLeft , pageScrollTop ) ;
248+ } ) ;
249+
250+ afterEach ( ( ) => {
251+ document . body . removeChild ( veryLargeElement ) ;
252+ document . body . scrollTop = 0 ;
253+ document . body . scrollLeft = 0 ;
254+ // Firefox
255+ document . documentElement . scrollLeft = 0 ;
256+ document . documentElement . scrollTop = 0 ;
257+ // Mobile safari
258+ window . scrollTo ( 0 , 0 ) ;
259+ } ) ;
260+
261+ it ( 'create ripple with correct position' , ( ) => {
262+ let elementTop = 600 ;
263+ let elementLeft = 750 ;
264+ let left = 50 ;
265+ let top = 75 ;
266+
267+ rippleElement . style . position = 'absolute' ;
268+ rippleElement . style . left = `${ elementLeft } px` ;
269+ rippleElement . style . top = `${ elementTop } px` ;
270+
271+ // Simulate a keyboard-triggered click by setting event coordinates to 0.
272+ const clickEvent = createMouseEvent ( 'click' , {
273+ clientX : left + elementLeft - pageScrollLeft ,
274+ clientY : top + elementTop - pageScrollTop ,
275+ screenX : left + elementLeft ,
276+ screenY : top + elementTop
277+ } ) ;
278+ rippleElement . dispatchEvent ( clickEvent ) ;
279+
280+ const expectedRadius = Math . sqrt ( 250 * 250 + 125 * 125 ) ;
281+ const expectedLeft = left - expectedRadius ;
282+ const expectedTop = top - expectedRadius ;
283+
284+ const ripple = < HTMLElement > rippleElement . querySelector ( '.md-ripple-foreground' ) ;
285+ expect ( pxStringToFloat ( ripple . style . left ) ) . toBeCloseTo ( expectedLeft , 1 ) ;
286+ expect ( pxStringToFloat ( ripple . style . top ) ) . toBeCloseTo ( expectedTop , 1 ) ;
287+ expect ( pxStringToFloat ( ripple . style . width ) ) . toBeCloseTo ( 2 * expectedRadius , 1 ) ;
288+ expect ( pxStringToFloat ( ripple . style . height ) ) . toBeCloseTo ( 2 * expectedRadius , 1 ) ;
289+ } ) ;
290+ } ) ;
291+
201292 } ) ;
202293
203294 describe ( 'configuring behavior' , ( ) => {
0 commit comments