2
2
// tabId -> devtool port
3
3
var inspectedTabs = { } ;
4
4
5
- // TODO: keep track of app state here
6
- // tabId -> list of buffered events
7
- var buffer = { } ;
5
+ // tabId -> buffered data
6
+ var data = { } ;
8
7
9
8
function bufferOrForward ( message , sender ) {
10
9
var tabId = sender . tab . id ,
11
10
devToolsPort = inspectedTabs [ tabId ] ;
12
11
12
+ if ( ! data [ tabId ] || message === 'refresh' ) {
13
+ resetState ( tabId ) ;
14
+ }
15
+
16
+ // TODO: not sure how I feel about special-casing `refresh`
17
+ if ( message !== 'refresh' ) {
18
+ message = JSON . parse ( message ) ;
19
+ }
20
+
21
+ bufferData ( tabId , message ) ;
13
22
if ( devToolsPort ) {
14
23
devToolsPort . postMessage ( message ) ;
15
24
}
16
- if ( ! buffer [ tabId ] || message === 'refresh' ) {
17
- resetState ( tabId ) ;
25
+ }
26
+
27
+ function resetState ( tabId ) {
28
+ data [ tabId ] = {
29
+ hints : [ ] ,
30
+ scopes : { }
31
+ } ;
32
+ }
33
+
34
+ function bufferData ( tabId , message ) {
35
+ var tabData = data [ tabId ] ,
36
+ scope ;
37
+
38
+ if ( message . message ) {
39
+ return tabData . hints . push ( message ) ;
40
+ }
41
+
42
+ if ( message . event ) {
43
+ if ( message . event === 'scope:new' ) {
44
+ tabData . scopes [ message . child ] = {
45
+ parent : message . parent ,
46
+ children : [ ] ,
47
+ models : { }
48
+ } ;
49
+ if ( tabData . scopes [ message . parent ] ) {
50
+ tabData . scopes [ message . parent ] . children . push ( message . child ) ;
51
+ }
52
+ } else if ( message . id && ( scope = tabData . scopes [ message . id ] ) ) {
53
+ if ( message . event === 'scope:destroy' ) {
54
+ if ( scope . parent ) {
55
+ scope . parent . children . splice ( scope . parent . children . indexOf ( child ) , 1 ) ;
56
+ }
57
+ delete scopes [ message . id ] ;
58
+ } else if ( message . event === 'model:change' ) {
59
+ scope . models [ message . path ] = ( typeof message . value === 'undefined' ) ?
60
+ undefined : JSON . parse ( message . value ) ;
61
+ } else if ( message . event === 'scope:link' ) {
62
+ scope . descriptor = message . descriptor ;
63
+ }
64
+ }
18
65
}
19
- buffer [ tabId ] . push ( message ) ;
20
66
}
21
67
22
68
// context script –> background
@@ -29,11 +75,12 @@ chrome.runtime.onConnect.addListener(function(devToolsPort) {
29
75
function registerInspectedTabId ( inspectedTabId ) {
30
76
inspectedTabs [ inspectedTabId ] = devToolsPort ;
31
77
32
- if ( ! buffer [ inspectedTabId ] ) {
78
+ if ( ! data [ inspectedTabId ] ) {
33
79
resetState ( inspectedTabId ) ;
34
80
}
35
- buffer [ inspectedTabId ] . forEach ( function ( msg ) {
36
- devToolsPort . postMessage ( msg ) ;
81
+ devToolsPort . postMessage ( {
82
+ event : 'hydrate' ,
83
+ data : data [ inspectedTabId ]
37
84
} ) ;
38
85
39
86
devToolsPort . onDisconnect . addListener ( function ( ) {
@@ -44,7 +91,3 @@ chrome.runtime.onConnect.addListener(function(devToolsPort) {
44
91
}
45
92
46
93
} ) ;
47
-
48
- function resetState ( tabId ) {
49
- buffer [ tabId ] = [ ] ;
50
- }
0 commit comments