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 'emptySnap' :
31
- snapshotArr . splice ( 1 ) ;
54
+ tabsObj [ tabId ] . snapshotArr . splice ( 1 ) ;
32
55
break ;
33
56
case 'setLock' :
34
- mode . locked = payload ;
57
+ tabsObj [ tabId ] . mode . locked = payload ;
35
58
break ;
36
59
case 'setPause' :
37
- mode . paused = payload ;
60
+ tabsObj [ tabId ] . mode . paused = payload ;
38
61
break ;
39
62
case 'setPersist' :
40
- mode . persist = payload ;
63
+ tabsObj [ tabId ] . mode . persist = payload ;
41
64
break ;
42
65
default :
43
66
}
67
+
68
+ // Instead of sending the message to the active tab,
69
+ // now we can send messages to specific tabs that we specify
70
+ // using tabId
71
+ // ---------------------------------------------------------------
72
+ // chrome.tabs.sendMessage(tabId, msg);
73
+ // ---------------------------------------------------------------
44
74
// find active tab
45
75
chrome . tabs . query ( { active : true , currentWindow : true } , ( tabs ) => {
46
76
// send message to tab
@@ -51,50 +81,67 @@ chrome.runtime.onConnect.addListener((port) => {
51
81
52
82
// background.js recieves message from contentScript.js
53
83
chrome . runtime . onMessage . addListener ( ( request , sender ) => {
84
+ // IGNORE THE AUTOMTAIC MESSAGE SENT BY CHROME WHEN CONTENT SCRIPT IS FIRST LOADED
85
+ if ( request . type === 'SIGN_CONNECT' ) return ;
86
+
87
+ const tabId = sender . tab . id ;
54
88
const { action } = request ;
55
- const { persist } = mode ;
89
+ let isReactTimeTravel = false ;
90
+
91
+ // Filter out tabs that don't have react-time-travel
92
+ if ( action === 'tabReload' || action === 'recordSnap' ) {
93
+ isReactTimeTravel = true ;
94
+ }
95
+
96
+ // everytime we get a new tabid, add it to the object
97
+ if ( isReactTimeTravel && ! ( tabId in tabsObj ) ) {
98
+ tabsObj [ tabId ] = createTabObj ( ) ;
99
+ }
100
+
101
+ const { persist } = tabsObj [ tabId ] . mode ;
56
102
57
103
console . log ( 'request: ' , request )
58
104
console . log ( 'sender: ' , sender )
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 ) ;
117
+ if ( ! persist ) tabsObj [ tabId ] . snapshotArr . push ( request . payload ) ;
72
118
if ( bg ) {
73
119
bg . postMessage ( {
74
120
action : 'initialConnectSnapshots' ,
75
121
payload : {
76
- snapshots : snapshotArr ,
77
- mode,
122
+ snapshots : tabsObj [ tabId ] . snapshotArr ,
123
+ mode : tabsObj [ tabId ] . mode ,
78
124
} ,
79
125
} ) ;
80
126
}
81
127
break ;
82
128
}
83
- snapshotArr . push ( request . payload ) ;
84
- // TODO:
85
- // get active tab id
86
- const tabID = sender . tab . id ;
87
- // get snapshot arr from tab object
88
- console . log ( tabID )
129
+
130
+ tabsObj [ tabId ] . snapshotArr . push ( request . payload ) ;
89
131
90
132
// send message to devtools
91
- if ( bg ) {
133
+ if ( bg ) {
92
134
bg . postMessage ( {
93
135
action : 'sendSnapshots' ,
94
- payload : snapshotArr ,
136
+ payload : tabsObj [ tabId ] . snapshotArr ,
95
137
} ) ;
96
138
}
97
139
break ;
98
140
default :
99
141
}
100
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