@@ -5,9 +5,19 @@ var inspectedTabs = {};
55// tabId -> buffered data
66var data = { } ;
77
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 ] ;
1121
1222 if ( ! data [ tabId ] || message === 'refresh' ) {
1323 resetState ( tabId ) ;
@@ -94,39 +104,37 @@ function bufferData(tabId, message) {
94104 // TODO: Handle digest timings
95105}
96106
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+ }
114112
115- devToolsPort . onDisconnect . addListener ( function ( ) {
116- delete inspectedTabs [ inspectedTabId ] ;
117- } ) ;
113+ function registerInspectedTabId ( devToolsPort , inspectedTabId ) {
114+ inspectedTabs [ inspectedTabId ] = devToolsPort ;
118115
119- //devToolsPort.onMessage.removeListener(registerInspectedTabId);
116+ if ( ! data [ inspectedTabId ] ) {
117+ resetState ( inspectedTabId ) ;
120118 }
119+ devToolsPort . postMessage ( {
120+ event : 'hydrate' ,
121+ data : data [ inspectedTabId ]
122+ } ) ;
121123
122- } ) ;
124+ var devToolsDisconnect = createRxFrom ( devToolsPort . onDisconnect ) ;
125+ devToolsDisconnect . forEach ( onDisconnect ) ;
126+ return event ;
127+ }
123128
124- chrome . tabs . onRemoved . addListener ( function ( tabId ) {
129+ function onDisconnect ( inspectedTabId ) {
130+ delete inspectedTabs [ inspectedTabId ] ;
131+ }
132+
133+ function onTabsRemoved ( tabId ) {
125134 if ( data [ tabId ] ) {
126135 delete data [ tabId ] ;
127136 }
128- } ) ;
129-
137+ }
130138
131139function showPageAction ( tabId ) {
132140 chrome . pageAction . show ( tabId ) ;
@@ -135,3 +143,19 @@ function showPageAction(tabId) {
135143 title : 'Batarang Active'
136144 } ) ;
137145}
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