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