@@ -12,15 +12,13 @@ export default Ember.Component.extend({
1212 // want this test recorder to sit outside the ember app and not be intrusive
1313 pendingGeneratedDomChangedScript : "" ,
1414
15- initialObservedTarget : null , // cache this for performance
16-
1715 currentRouteName : "" ,
1816 routeHasChanged : false , //if true render a test condition for this
1917
2018 mutationObserversArr : [ ] , // we disconnect these when the component is removed form the canvas (essential for testing)
2119
2220 willDestroyElement : function ( ) {
23- console . log ( "destroying" ) ;
21+ console . log ( "destroying " + this . get ( "mutationObserversArr" ) . length + " mut observers ") ;
2422 this . get ( "mutationObserversArr" ) . forEach ( function ( observer ) {
2523 observer . disconnect ( ) ;
2624 } ) ;
@@ -52,6 +50,7 @@ export default Ember.Component.extend({
5250 } ,
5351
5452 onCurrentRouteNameChange : Ember . observer ( 'currentRouteName' , function ( ) {
53+ console . log ( this . get ( "currentRouteName" ) ) ;
5554 this . set ( "routeHasChanged" , true ) ;
5655 } ) ,
5756
@@ -65,8 +64,6 @@ export default Ember.Component.extend({
6564 */
6665 didInsertElement : function ( ) {
6766
68- this . set ( "initialObservedTarget" , document . querySelector ( "body [id^=ember]" ) ) ; // cache this for performance
69-
7067 var MutationObserver = window . MutationObserver || window . WebKitMutationObserver || window . MozMutationObserver ;
7168
7269 //listen to clicks on ember items, apart from
@@ -76,6 +73,10 @@ export default Ember.Component.extend({
7673 var indentation = ' ' ; //2 spaces
7774 var currentNestedLevel = 0 ; //tracks the nesting level for mutations
7875
76+ /**
77+ * This is a helper function extension of jquery to give us a dynamic path incase the user hasn't given an
78+ * interactive element an ID. We then use this path to repeat the user action in a test case.
79+ */
7980 Ember . $ . fn . extend ( {
8081 path : function ( ) {
8182
@@ -164,7 +165,6 @@ export default Ember.Component.extend({
164165 */
165166 function addObserverForTarget ( target ) {
166167
167-
168168 var observer = new MutationObserver ( function ( mutations ) {
169169 mutations . forEach ( function ( mutation ) {
170170
@@ -175,27 +175,17 @@ export default Ember.Component.extend({
175175 var addedNodesArray = Array . prototype . slice . call ( mutation . addedNodes ) ;
176176 var removedNodesArray = Array . prototype . slice . call ( mutation . removedNodes ) ;
177177
178- //ignore non tagged markup like carriage returns //todo investigate why ember does this, potential reflow issue
179- //ignore things with no id
180- //ignore ember-view wrapper divs
181-
182178 // This array is used to add new mutation Observers from the newly added DOM
183- var newMutationsFromAddedNodesArray = addedNodesArray . filter ( function ( node ) {
184- var classListArray = node . classList && Array . prototype . slice . call ( node . classList ) ;
185- //var isEmberView = classListArray ? (classListArray.indexOf("ember-view") === -1) : false;
186- var hasDoNotRecordClass = classListArray ? ( classListArray . indexOf ( "doNotRecord" ) !== - 1 ) : false ;
187- return node . nodeType !== 3 && ! hasDoNotRecordClass ;
188- } ) ;
179+ var newMutationsFromAddedNodesArray = addedNodesArray . filter ( filterDoNotRecordAndWhiteSpace ) ;
189180
190- //loop through the above and add observers
181+ //loop through the above and add observers, we need to do this dynamically
191182 newMutationsFromAddedNodesArray . forEach ( function ( node ) {
192- addInnerObserversForTarget ( node , 2 ) ; //just drill down 2 levels more
183+ addObserverForTarget ( node ) ; //just drill down 2 levels more
193184 } )
194185
195- //this array is used to generate the source code, we ignore anything with no ID
196-
197- addedNodesArray = addedNodesArray . filter ( unwantedNodesFilter ) ;
198- removedNodesArray = removedNodesArray . filter ( unwantedNodesFilter ) ;
186+ //this array is used to generate the source code, we filter
187+ addedNodesArray = addedNodesArray . filter ( filter_DoNotRecord_WhiteSpace_emberID_noID ) ;
188+ removedNodesArray = removedNodesArray . filter ( filter_DoNotRecord_WhiteSpace_emberID_noID ) ;
199189
200190 if ( ! addedNodesArray . length && ! removedNodesArray . length ) {
201191 //no point continuing in this iteration if nothing of interest
@@ -226,6 +216,8 @@ export default Ember.Component.extend({
226216 //this is the only place where observe is called so we can track them here too to disconnect
227217 observer . observe ( target , config ) ;
228218 self . get ( "mutationObserversArr" ) . push ( observer ) ;
219+ addInnerObserversForTarget ( target , 0 ) ; //forms new observers recursively
220+
229221
230222 }
231223
@@ -250,18 +242,14 @@ export default Ember.Component.extend({
250242 }
251243 }
252244
253- //only observe inside the ember app, get 1st ember div todo possibly move this outside if users wish to look outside ember app
254- // var initialObservedTarget = document.querySelector('body [id^=ember]');
255- addObserverForTarget ( this . get ( "initialObservedTarget" ) ) ;
245+ //todo possibly move this outside if users wish to look outside ember app
246+ var target = document . querySelector ( 'body [id^=ember]' ) ;
247+ addObserverForTarget ( target ) ; //as this does't do the recursive listeners straight away we have to call this:
256248
257- //this is still WIP, as things are behaving a bit weird..
258- if ( this . get ( "initialObservedTarget" ) . children ) {
259- addInnerObserversForTarget ( this . get ( "initialObservedTarget" ) , 0 ) ; //forms new observers recursively
260- }
261249 }
262250} ) ;
263251
264- function unwantedNodesFilter ( node ) {
252+ function filter_DoNotRecord_WhiteSpace_emberID_noID ( node ) {
265253 var classListArray = node . classList && Array . prototype . slice . call ( node . classList ) ;
266254 //var isEmberView = classListArray ? (classListArray.indexOf("ember-view") === -1) : false;
267255 var hasDoNotRecordClass = classListArray ? ( classListArray . indexOf ( "doNotRecord" ) !== - 1 ) : false ;
@@ -275,3 +263,10 @@ function unwantedNodesFilter(node) {
275263
276264 return node . nodeType !== 3 && node . id && ! hasDoNotRecordClass && ! hasEmberIdRegex . test ( node . id ) ;
277265}
266+
267+ function filterDoNotRecordAndWhiteSpace ( node ) {
268+ var classListArray = node . classList && Array . prototype . slice . call ( node . classList ) ;
269+ //var isEmberView = classListArray ? (classListArray.indexOf("ember-view") === -1) : false;
270+ var hasDoNotRecordClass = classListArray ? ( classListArray . indexOf ( "doNotRecord" ) !== - 1 ) : false ;
271+ return node . nodeType !== 3 && ! hasDoNotRecordClass ;
272+ }
0 commit comments