@@ -440,7 +440,6 @@ describe('integration', function () {
440440 assert . equal ( breadcrumbs . length , 1 ) ;
441441
442442 assert . equal ( breadcrumbs [ 0 ] . type , 'ui_event' ) ;
443- // NOTE: attributes re-ordered. should this be expected?
444443 assert . equal ( breadcrumbs [ 0 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
445444 assert . equal ( breadcrumbs [ 0 ] . data . type , 'click' ) ;
446445 }
@@ -481,7 +480,6 @@ describe('integration', function () {
481480 assert . equal ( breadcrumbs . length , 1 ) ;
482481
483482 assert . equal ( breadcrumbs [ 0 ] . type , 'ui_event' ) ;
484- // NOTE: attributes re-ordered. should this be expected?
485483 assert . equal ( breadcrumbs [ 0 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
486484 assert . equal ( breadcrumbs [ 0 ] . data . type , 'click' ) ;
487485 }
@@ -529,13 +527,139 @@ describe('integration', function () {
529527 assert . equal ( breadcrumbs . length , 1 ) ;
530528
531529 assert . equal ( breadcrumbs [ 0 ] . type , 'ui_event' ) ;
532- // NOTE: attributes re-ordered. should this be expected?
533530 assert . equal ( breadcrumbs [ 0 ] . data . target , 'body > div.c > div.b > div.a' ) ;
534531 assert . equal ( breadcrumbs [ 0 ] . data . type , 'click' ) ;
535532 }
536533 ) ;
537534 } ) ;
538535
536+ it ( 'should record consecutive keypress events into a single "input" breadcrumb' , function ( done ) {
537+ var iframe = this . iframe ;
538+
539+ iframeExecute ( iframe , done ,
540+ function ( ) {
541+ setTimeout ( done ) ;
542+
543+ // some browsers trigger onpopstate for load / reset breadcrumb state
544+ Raven . _breadcrumbs = [ ] ;
545+
546+ // keypress <input/> twice
547+ var keypress1 = document . createEvent ( 'KeyboardEvent' ) ;
548+ keypress1 . initKeyboardEvent ( "keypress" , true , true , window , "b" , 66 , 0 , "" , false ) ;
549+
550+ var keypress2 = document . createEvent ( 'KeyboardEvent' ) ;
551+ keypress2 . initKeyboardEvent ( "keypress" , true , true , window , "a" , 65 , 0 , "" , false ) ;
552+
553+ var input = document . getElementsByTagName ( 'input' ) [ 0 ] ;
554+ input . dispatchEvent ( keypress1 ) ;
555+ input . dispatchEvent ( keypress2 ) ;
556+ } ,
557+ function ( ) {
558+ var Raven = iframe . contentWindow . Raven ,
559+ breadcrumbs = Raven . _breadcrumbs ;
560+
561+ assert . equal ( breadcrumbs . length , 1 ) ;
562+
563+ assert . equal ( breadcrumbs [ 0 ] . type , 'ui_event' ) ;
564+ assert . equal ( breadcrumbs [ 0 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
565+ assert . equal ( breadcrumbs [ 0 ] . data . type , 'input' ) ;
566+ }
567+ ) ;
568+ } ) ;
569+
570+ it ( 'should flush keypress breadcrumbs when an error is thrown' , function ( done ) {
571+ var iframe = this . iframe ;
572+
573+ iframeExecute ( iframe , done ,
574+ function ( ) {
575+ setTimeout ( done ) ;
576+
577+ // some browsers trigger onpopstate for load / reset breadcrumb state
578+ Raven . _breadcrumbs = [ ] ;
579+
580+ // keypress <input/>
581+ var keypress = document . createEvent ( 'KeyboardEvent' ) ;
582+ keypress . initKeyboardEvent ( "keypress" , true , true , window , "b" , 66 , 0 , "" , false ) ;
583+
584+ var input = document . getElementsByTagName ( 'input' ) [ 0 ] ;
585+ input . dispatchEvent ( keypress ) ;
586+
587+ foo ( ) ; // throw exception
588+ } ,
589+ function ( ) {
590+ var Raven = iframe . contentWindow . Raven ,
591+ breadcrumbs = Raven . _breadcrumbs ;
592+
593+ // 2 breadcrumbs: `ui_event`, then `error`
594+ assert . equal ( breadcrumbs . length , 2 ) ;
595+
596+ assert . equal ( breadcrumbs [ 0 ] . type , 'ui_event' ) ;
597+ assert . equal ( breadcrumbs [ 0 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
598+ assert . equal ( breadcrumbs [ 0 ] . data . type , 'input' ) ;
599+ }
600+ ) ;
601+ } ) ;
602+
603+ it ( 'should flush keypress breadcrumb when input event occurs immediately after' , function ( done ) {
604+ var iframe = this . iframe ;
605+
606+ iframeExecute ( iframe , done ,
607+ function ( ) {
608+ setTimeout ( done ) ;
609+
610+ // some browsers trigger onpopstate for load / reset breadcrumb state
611+ Raven . _breadcrumbs = [ ] ;
612+
613+ // 1st keypress <input/>
614+ var keypress1 = document . createEvent ( 'KeyboardEvent' ) ;
615+ keypress1 . initKeyboardEvent ( "keypress" , true , true , window , "b" , 66 , 0 , "" , false ) ;
616+
617+ // click <input/>
618+ var click = document . createEvent ( 'MouseEvent' ) ;
619+ click . initMouseEvent (
620+ "click" ,
621+ true /* bubble */ ,
622+ true /* cancelable */ ,
623+ window ,
624+ null ,
625+ 0 , 0 , 0 , 0 , /* coordinates */
626+ false , false , false , false , /* modifier keys */
627+ 0 /*left*/ ,
628+ null
629+ ) ;
630+
631+ // 2nd keypress
632+ var keypress2 = document . createEvent ( 'KeyboardEvent' ) ;
633+ keypress2 . initKeyboardEvent ( "keypress" , true , true , window , "a" , 65 , 0 , "" , false ) ;
634+
635+ var input = document . getElementsByTagName ( 'input' ) [ 0 ] ;
636+ input . dispatchEvent ( keypress1 ) ;
637+ input . dispatchEvent ( click ) ;
638+ input . dispatchEvent ( keypress2 ) ;
639+ } ,
640+ function ( ) {
641+ var Raven = iframe . contentWindow . Raven ,
642+ breadcrumbs = Raven . _breadcrumbs ;
643+
644+ // 2x `ui_event`
645+ assert . equal ( breadcrumbs . length , 3 ) ;
646+
647+ assert . equal ( breadcrumbs [ 0 ] . type , 'ui_event' ) ;
648+ assert . equal ( breadcrumbs [ 0 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
649+ assert . equal ( breadcrumbs [ 0 ] . data . type , 'input' ) ;
650+
651+ assert . equal ( breadcrumbs [ 1 ] . type , 'ui_event' ) ;
652+ assert . equal ( breadcrumbs [ 1 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
653+ assert . equal ( breadcrumbs [ 1 ] . data . type , 'click' ) ;
654+
655+ assert . equal ( breadcrumbs [ 2 ] . type , 'ui_event' ) ;
656+ assert . equal ( breadcrumbs [ 2 ] . data . target , 'body > form#foo-form > input[name="foo"][placeholder="lol"]' ) ;
657+ assert . equal ( breadcrumbs [ 2 ] . data . type , 'input' ) ;
658+
659+ }
660+ ) ;
661+ } ) ;
662+
539663 it ( 'should record history.[pushState|back] changes as navigation breadcrumbs' , function ( done ) {
540664 var iframe = this . iframe ;
541665
0 commit comments