1
1
let bg ;
2
- let snapshotArr = [ ] ;
3
- const mode = {
4
- persist : false ,
5
- locked : false ,
6
- paused : false ,
7
- } ;
8
- let firstSnapshot = true ;
2
+ const tabsObj = { } ;
3
+ function createTabObj ( ) {
4
+ return {
5
+ snapshotArr : [ ] ,
6
+ mode : {
7
+ persist : false ,
8
+ locked : false ,
9
+ paused : false ,
10
+ } ,
11
+ firstSnapshot : true ,
12
+ } ;
13
+ }
9
14
10
15
// establishing connection with devtools
11
16
chrome . runtime . onConnect . addListener ( ( port ) => {
12
17
bg = port ;
13
18
14
19
// if snapshots were saved in the snapshotArr,
15
20
// send it to devtools as soon as connection to devtools is made
16
- if ( snapshotArr . length > 0 ) {
21
+ if ( Object . values ( tabsObj ) [ 0 ] . snapshotArr . length > 0 ) {
22
+ // later we want to send the entire tabsObj to devTools
23
+ // but currently since devTools can only handle one tab at a time
24
+ // we will test our obj assuming that the user opened only one tab
25
+ // below is what we want the postMessage to look like eventually
26
+ // ---------------------------------------------------------------
27
+ // bg.postMessage({
28
+ // action: 'initialConnectSnapshots',
29
+ // payload: tabsObj,
30
+ // });
31
+ // ---------------------------------------------------------------
17
32
bg . postMessage ( {
18
33
action : 'initialConnectSnapshots' ,
19
34
payload : {
20
- snapshots : snapshotArr ,
21
- mode,
35
+ snapshots : Object . values ( tabsObj ) [ 0 ] . snapshotArr ,
36
+ mode : Object . values ( tabsObj ) [ 0 ] . mode ,
22
37
} ,
23
38
} ) ;
24
39
}
25
40
26
41
// receive snapshot from devtools and send it to contentScript
27
42
port . onMessage . addListener ( ( msg ) => {
28
- const { action, payload } = msg ;
43
+ // ---------------------------------------------------------------
44
+ // message incoming from devTools should look like this:
45
+ // {
46
+ // action: 'emptySnap',
47
+ // payload: tabsObj,
48
+ // tabId: 101
49
+ // }
50
+ // ---------------------------------------------------------------
51
+ const { action, payload, tabId } = msg ;
29
52
switch ( action ) {
30
53
case 'import' :
31
54
snapshotArr = payload ;
32
55
break ;
33
56
case 'emptySnap' :
34
- snapshotArr . splice ( 1 ) ;
57
+ tabsObj [ tabId ] . snapshotArr . splice ( 1 ) ;
35
58
break ;
36
59
case 'setLock' :
37
- mode . locked = payload ;
60
+ tabsObj [ tabId ] . mode . locked = payload ;
38
61
break ;
39
62
case 'setPause' :
40
- mode . paused = payload ;
63
+ tabsObj [ tabId ] . mode . paused = payload ;
41
64
break ;
42
65
case 'setPersist' :
43
- mode . persist = payload ;
66
+ tabsObj [ tabId ] . mode . persist = payload ;
44
67
break ;
45
68
default :
46
69
}
70
+
71
+ // Instead of sending the message to the active tab,
72
+ // now we can send messages to specific tabs that we specify
73
+ // using tabId
74
+ // ---------------------------------------------------------------
75
+ // chrome.tabs.sendMessage(tabId, msg);
76
+ // ---------------------------------------------------------------
47
77
// find active tab
48
78
chrome . tabs . query ( { active : true , currentWindow : true } , ( tabs ) => {
49
79
// send message to tab
@@ -53,42 +83,65 @@ chrome.runtime.onConnect.addListener((port) => {
53
83
} ) ;
54
84
55
85
// background.js recieves message from contentScript.js
56
- chrome . runtime . onMessage . addListener ( ( request ) => {
86
+ chrome . runtime . onMessage . addListener ( ( request , sender ) => {
87
+ // IGNORE THE AUTOMTAIC MESSAGE SENT BY CHROME WHEN CONTENT SCRIPT IS FIRST LOADED
88
+ if ( request . type === 'SIGN_CONNECT' ) return ;
89
+
90
+ const tabId = sender . tab . id ;
57
91
const { action } = request ;
58
- const { persist } = mode ;
92
+ let isReactTimeTravel = false ;
93
+
94
+ // Filter out tabs that don't have react-time-travel
95
+ if ( action === 'tabReload' || action === 'recordSnap' ) {
96
+ isReactTimeTravel = true ;
97
+ }
98
+
99
+ // everytime we get a new tabid, add it to the object
100
+ if ( isReactTimeTravel && ! ( tabId in tabsObj ) ) {
101
+ tabsObj [ tabId ] = createTabObj ( ) ;
102
+ }
103
+
104
+ const { persist } = tabsObj [ tabId ] . mode ;
59
105
60
106
switch ( action ) {
61
107
case 'tabReload' :
62
- firstSnapshot = true ;
63
- mode . locked = false ;
64
- mode . paused = false ;
65
- if ( ! persist ) snapshotArr = [ ] ;
108
+ tabsObj [ tabId ] . firstSnapshot = true ;
109
+ tabsObj [ tabId ] . mode . locked = false ;
110
+ tabsObj [ tabId ] . mode . paused = false ;
111
+ if ( ! persist ) tabsObj [ tabId ] . snapshotArr = [ ] ;
66
112
break ;
67
113
case 'recordSnap' :
68
- if ( firstSnapshot ) {
69
- firstSnapshot = false ;
114
+ if ( tabsObj [ tabId ] . firstSnapshot ) {
115
+ tabsObj [ tabId ] . firstSnapshot = false ;
70
116
// don't add anything to snapshot storage if mode is persisting for the initial snapshot
71
- if ( ! persist ) snapshotArr . push ( request . payload ) ;
72
- bg . postMessage ( {
73
- action : 'initialConnectSnapshots' ,
74
- payload : {
75
- snapshots : snapshotArr ,
76
- mode,
77
- } ,
78
- } ) ;
117
+ if ( ! persist ) tabsObj [ tabId ] . snapshotArr . push ( request . payload ) ;
118
+ if ( bg ) {
119
+ bg . postMessage ( {
120
+ action : 'initialConnectSnapshots' ,
121
+ payload : {
122
+ snapshots : tabsObj [ tabId ] . snapshotArr ,
123
+ mode : tabsObj [ tabId ] . mode ,
124
+ } ,
125
+ } ) ;
126
+ }
79
127
break ;
80
128
}
81
- snapshotArr . push ( request . payload ) ;
82
- // TODO:
83
- // get active tab id
84
- // get snapshot arr from tab object
129
+
130
+ tabsObj [ tabId ] . snapshotArr . push ( request . payload ) ;
85
131
86
132
// send message to devtools
87
- bg . postMessage ( {
88
- action : 'sendSnapshots' ,
89
- payload : snapshotArr ,
90
- } ) ;
133
+ if ( bg ) {
134
+ bg . postMessage ( {
135
+ action : 'sendSnapshots' ,
136
+ payload : tabsObj [ tabId ] . snapshotArr ,
137
+ } ) ;
138
+ }
91
139
break ;
92
140
default :
93
141
}
94
142
} ) ;
143
+
144
+ // when tab is closed, remove the tabid from the tabsObj
145
+ chrome . tabs . onRemoved . addListener ( ( tabId ) => {
146
+ delete tabsObj [ tabId ] ;
147
+ } ) ;
0 commit comments