@@ -5,9 +5,19 @@ var inspectedTabs = {};
55// tabId -> buffered data
66var data = { } ;
77
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 ] ;
1121
1222 if ( ! data [ tabId ] || message === 'refresh' ) {
1323 resetState ( tabId ) ;
@@ -98,39 +108,37 @@ function bufferData(tabId, message) {
98108 // TODO: Handle digest timings
99109}
100110
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+ }
118116
119- devToolsPort . onDisconnect . addListener ( function ( ) {
120- delete inspectedTabs [ inspectedTabId ] ;
121- } ) ;
117+ function registerInspectedTabId ( devToolsPort , inspectedTabId ) {
118+ inspectedTabs [ inspectedTabId ] = devToolsPort ;
122119
123- //devToolsPort.onMessage.removeListener(registerInspectedTabId);
120+ if ( ! data [ inspectedTabId ] ) {
121+ resetState ( inspectedTabId ) ;
124122 }
123+ devToolsPort . postMessage ( {
124+ event : 'hydrate' ,
125+ data : data [ inspectedTabId ]
126+ } ) ;
125127
126- } ) ;
128+ var devToolsDisconnect = createRxFrom ( devToolsPort . onDisconnect ) ;
129+ devToolsDisconnect . forEach ( onDisconnect ) ;
130+ return event ;
131+ }
127132
128- chrome . tabs . onRemoved . addListener ( function ( tabId ) {
133+ function onDisconnect ( inspectedTabId ) {
134+ delete inspectedTabs [ inspectedTabId ] ;
135+ }
136+
137+ function onTabsRemoved ( tabId ) {
129138 if ( data [ tabId ] ) {
130139 delete data [ tabId ] ;
131140 }
132- } ) ;
133-
141+ }
134142
135143function showPageAction ( tabId ) {
136144 chrome . pageAction . show ( tabId ) ;
@@ -139,3 +147,19 @@ function showPageAction(tabId) {
139147 title : 'Batarang Active'
140148 } ) ;
141149}
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