@@ -5,9 +5,19 @@ var inspectedTabs = {};
5
5
// tabId -> buffered data
6
6
var data = { } ;
7
7
8
- function brokerMessage ( message , sender ) {
9
- var tabId = sender . tab . id ,
10
- devToolsPort = inspectedTabs [ tabId ] ;
8
+ var runtimeMessage = createRxFrom ( chrome . runtime . onMessage , messageSelector ) ;
9
+ var runtimeConnect = createRxFrom ( chrome . runtime . onConnect ) ;
10
+ var tabsRemoved = createRxFrom ( chrome . tabs . onRemoved ) ;
11
+
12
+ runtimeMessage . forEach ( brokerMessage ) ;
13
+ runtimeConnect . forEach ( onConnect ) ;
14
+ tabsRemoved . forEach ( onTabsRemoved ) ;
15
+
16
+ function brokerMessage ( event ) {
17
+ var message = event . message ;
18
+ var sender = event . sender ;
19
+ var tabId = sender . tab . id ;
20
+ var devToolsPort = inspectedTabs [ tabId ] ;
11
21
12
22
if ( ! data [ tabId ] || message === 'refresh' ) {
13
23
resetState ( tabId ) ;
@@ -98,39 +108,37 @@ function bufferData(tabId, message) {
98
108
// TODO: Handle digest timings
99
109
}
100
110
101
- // context script –> background
102
- chrome . runtime . onMessage . addListener ( brokerMessage ) ;
103
-
104
- chrome . runtime . onConnect . addListener ( function ( devToolsPort ) {
105
-
106
- devToolsPort . onMessage . addListener ( registerInspectedTabId ) ;
107
-
108
- function registerInspectedTabId ( inspectedTabId ) {
109
- inspectedTabs [ inspectedTabId ] = devToolsPort ;
110
-
111
- if ( ! data [ inspectedTabId ] ) {
112
- resetState ( inspectedTabId ) ;
113
- }
114
- devToolsPort . postMessage ( {
115
- event : 'hydrate' ,
116
- data : data [ inspectedTabId ]
117
- } ) ;
111
+ function onConnect ( devToolsPort ) {
112
+ var devToolsMessage = createRxFrom ( devToolsPort . onMessage ) ;
113
+ devToolsMessage . forEach ( registerInspectedTabId . bind ( null , devToolsPort ) ) ;
114
+ return event ;
115
+ }
118
116
119
- devToolsPort . onDisconnect . addListener ( function ( ) {
120
- delete inspectedTabs [ inspectedTabId ] ;
121
- } ) ;
117
+ function registerInspectedTabId ( devToolsPort , inspectedTabId ) {
118
+ inspectedTabs [ inspectedTabId ] = devToolsPort ;
122
119
123
- //devToolsPort.onMessage.removeListener(registerInspectedTabId);
120
+ if ( ! data [ inspectedTabId ] ) {
121
+ resetState ( inspectedTabId ) ;
124
122
}
123
+ devToolsPort . postMessage ( {
124
+ event : 'hydrate' ,
125
+ data : data [ inspectedTabId ]
126
+ } ) ;
125
127
126
- } ) ;
128
+ var devToolsDisconnect = createRxFrom ( devToolsPort . onDisconnect ) ;
129
+ devToolsDisconnect . forEach ( onDisconnect ) ;
130
+ return event ;
131
+ }
127
132
128
- chrome . tabs . onRemoved . addListener ( function ( tabId ) {
133
+ function onDisconnect ( inspectedTabId ) {
134
+ delete inspectedTabs [ inspectedTabId ] ;
135
+ }
136
+
137
+ function onTabsRemoved ( tabId ) {
129
138
if ( data [ tabId ] ) {
130
139
delete data [ tabId ] ;
131
140
}
132
- } ) ;
133
-
141
+ }
134
142
135
143
function showPageAction ( tabId ) {
136
144
chrome . pageAction . show ( tabId ) ;
@@ -139,3 +147,19 @@ function showPageAction(tabId) {
139
147
title : 'Batarang Active'
140
148
} ) ;
141
149
}
150
+
151
+ function createRxFrom ( target , selector ) {
152
+ return Rx . Observable . fromEventPattern (
153
+ function ( handler ) { target . addListener ( handler ) ; } ,
154
+ function ( handler ) { target . removeListener ( handler ) ; } ,
155
+ selector
156
+ ) ;
157
+ }
158
+
159
+ function messageSelector ( ) {
160
+ return {
161
+ message : arguments [ 0 ] ,
162
+ sender : arguments [ 1 ] ,
163
+ sendResponse : arguments [ 2 ]
164
+ } ;
165
+ }
0 commit comments