9
9
*/
10
10
11
11
// Add-on SDK
12
- const { Cu } = require ( "chrome" ) ;
12
+ const { Cu, components } = require ( "chrome" ) ;
13
13
14
14
// DevTools
15
15
const { DebuggerServer } = Cu . import ( "resource://gre/modules/devtools/dbg-server.jsm" , { } ) ;
@@ -21,6 +21,7 @@ const { makeInfallible } = devtools["require"]("devtools/toolkit/DevToolsUtils.j
21
21
const DevToolsUtils = devtools [ "require" ] ( "devtools/toolkit/DevToolsUtils" ) ;
22
22
const { NodeActor } = devtools [ "require" ] ( "devtools/server/actors/inspector" ) ;
23
23
24
+ // Constants
24
25
const Previewers = DebuggerServer . ObjectActorPreviewers ;
25
26
26
27
// Number of items to preview in objects, arrays, maps, sets, lists,
@@ -96,8 +97,16 @@ var FireQueryActor = ActorClass(
96
97
this . parent = parent ;
97
98
this . state = "detached" ;
98
99
100
+ // DevTools events
99
101
this . onNodeActorForm = this . onNodeActorForm . bind ( this ) ;
100
102
this . onNavigate = this . onNavigate . bind ( this ) ;
103
+
104
+ // jQuery events
105
+ this . onDataModified = this . onDataModified . bind ( this ) ;
106
+ this . onJQueryDetected = this . onJQueryDetected . bind ( this ) ;
107
+
108
+ // Console customization
109
+ this . onBuildPreview = this . onBuildPreview . bind ( this ) ;
101
110
} ,
102
111
103
112
/**
@@ -135,7 +144,7 @@ var FireQueryActor = ActorClass(
135
144
136
145
this . state = "attached" ;
137
146
138
- Previewers . Object . unshift ( this . onBuildPreview . bind ( this ) ) ;
147
+ Previewers . Object . unshift ( this . onBuildPreview ) ;
139
148
140
149
Events . on ( this . parent , "navigate" , this . onNavigate ) ;
141
150
Events . on ( NodeActor , "form" , this . onNodeActorForm ) ;
@@ -158,7 +167,13 @@ var FireQueryActor = ActorClass(
158
167
Events . off ( this . parent , "navigate" , this . onNavigate ) ;
159
168
Events . off ( NodeActor , "form" , this . onNodeActorForm ) ;
160
169
161
- // xxxHonza: remove previewer
170
+ // Remove (content) window listeners.
171
+ let win = this . parent . window . wrappedJSObject ;
172
+ win . removeEventListener ( "jQueryDetected" , this . onJQueryDetected , true ) ;
173
+ win . removeEventListener ( "firequery-event" , this . onDataModified , true ) ;
174
+
175
+ // Remove previewer listener (web console).
176
+ removeItem ( Previewers . Object , this . onBuildPreview ) ;
162
177
} ) , {
163
178
request : { } ,
164
179
response : {
@@ -258,28 +273,8 @@ var FireQueryActor = ActorClass(
258
273
this . walkerActorID = walkerActorID || this . walkerActorID ;
259
274
260
275
let win = this . parent . window . wrappedJSObject ;
261
-
262
- win . addEventListener ( "jQueryDetected" , event => {
263
- win . eval ( this . patch ) ;
264
- } , true ) ;
265
-
266
- win . addEventListener ( "firequery-event" , event => {
267
- let walkerActor = this . conn . getActor ( this . walkerActorID ) ;
268
- if ( ! walkerActor ) {
269
- return ;
270
- }
271
-
272
- let data = walkerActor . attachElement ( event . target ) ;
273
- let jQueryData = hasJQueryData ( event . target ) ;
274
-
275
- Trace . sysout ( "FireQueryActor.fireQueryEvent;" , {
276
- data : data ,
277
- jQueryData : jQueryData
278
- } ) ;
279
-
280
- Events . emit ( this , "data-modified" , data , jQueryData ) ;
281
- } , true ) ;
282
-
276
+ win . addEventListener ( "jQueryDetected" , this . onJQueryDetected , true ) ;
277
+ win . addEventListener ( "firequery-event" , this . onDataModified , true ) ;
283
278
win . eval ( this . watcher ) ;
284
279
} ) , {
285
280
request : {
@@ -292,11 +287,49 @@ var FireQueryActor = ActorClass(
292
287
}
293
288
} ) ,
294
289
290
+ onJQueryDetected : makeInfallible ( function ( event ) {
291
+ let win = this . parent . window . wrappedJSObject ;
292
+
293
+ Trace . sysout ( "FireQueryActor.onJQueryDetected; " + win . location , event ) ;
294
+
295
+ win . eval ( this . patch ) ;
296
+ } ) ,
297
+
298
+ onDataModified : makeInfallible ( function ( event ) {
299
+ let win = this . parent . window . wrappedJSObject ;
300
+
301
+ Trace . sysout ( "FireQueryActor.onDataModified; " + win . location , event ) ;
302
+
303
+ if ( ignoreEventParsers ( ) ) {
304
+ return ;
305
+ }
306
+
307
+ let walkerActor = this . conn . getActor ( this . walkerActorID ) ;
308
+ if ( ! walkerActor ) {
309
+ return ;
310
+ }
311
+
312
+ let data = walkerActor . attachElement ( event . target ) ;
313
+ let jQueryData = hasJQueryData ( event . target ) ;
314
+
315
+ Trace . sysout ( "FireQueryActor.onDataModified;" , {
316
+ data : data ,
317
+ jQueryData : jQueryData
318
+ } ) ;
319
+
320
+ try {
321
+ Events . emit ( this , "data-modified" , data , jQueryData ) ;
322
+ } catch ( err ) {
323
+ Trace . sysout ( "FireQueryActor.onDataModified; ERROR " + err , err ) ;
324
+ }
325
+ } ) ,
326
+
295
327
/**
296
328
* Returns jQuery data for given node.
297
329
*/
298
330
getJQueryData : method ( expectState ( "attached" , function ( node ) {
299
331
Trace . sysout ( "FireQueryActor.getJQueryData;" , node ) ;
332
+
300
333
return {
301
334
jQueryData : hasJQueryData ( node . rawNode )
302
335
}
@@ -334,7 +367,6 @@ var FireQueryActor = ActorClass(
334
367
form . setFormProperty ( "hasJQueryData" , ! ! data ) ;
335
368
336
369
let json = data ? JSON . stringify ( data ) : "" ;
337
- Trace . sysout ( "FireQueryActor.onNodeActorForm; " + json , arguments ) ;
338
370
} )
339
371
} ) ;
340
372
@@ -417,5 +449,39 @@ NodeActor.prototype.form = function(detail) {
417
449
return form ;
418
450
}
419
451
452
+ // Helpers
453
+
454
+ /**
455
+ * Remove an item from specified array. Copied from Firebug.sdk
456
+ * (since the SDK isn't available on the backend).
457
+ */
458
+ function removeItem ( list , item ) {
459
+ for ( let i = 0 ; i < list . length ; i ++ ) {
460
+ if ( list [ i ] == item ) {
461
+ list . splice ( i , 1 ) ;
462
+ return true ;
463
+ }
464
+ }
465
+ return false ;
466
+ } ;
467
+
468
+ /**
469
+ * EventParser module in DevTools is internally executing jQuery.data
470
+ * function. Ignore these calls.
471
+ */
472
+ function ignoreEventParsers ( ) {
473
+ var eventParser = "resource://gre/modules/devtools/event-parsers.js" ;
474
+ var counter = 0 ;
475
+ var stack = components . stack ;
476
+ while ( stack && counter ++ < 10 ) {
477
+ var url = stack . filename ;
478
+ if ( url . indexOf ( eventParser ) != - 1 ) {
479
+ return true ;
480
+ }
481
+ stack = stack . caller ;
482
+ }
483
+ return false ;
484
+ }
485
+
420
486
// Exports from this module
421
487
exports . FireQueryActor = FireQueryActor ;
0 commit comments