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
@@ -50,42 +80,65 @@ chrome.runtime.onConnect.addListener((port) => {
50
80
} ) ;
51
81
52
82
// background.js recieves message from contentScript.js
53
- chrome . runtime . onMessage . addListener ( ( request ) => {
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
switch ( action ) {
58
104
case 'tabReload' :
59
- firstSnapshot = true ;
60
- mode . locked = false ;
61
- mode . paused = false ;
62
- if ( ! persist ) snapshotArr = [ ] ;
105
+ tabsObj [ tabId ] . firstSnapshot = true ;
106
+ tabsObj [ tabId ] . mode . locked = false ;
107
+ tabsObj [ tabId ] . mode . paused = false ;
108
+ if ( ! persist ) tabsObj [ tabId ] . snapshotArr = [ ] ;
63
109
break ;
64
110
case 'recordSnap' :
65
- if ( firstSnapshot ) {
66
- firstSnapshot = false ;
111
+ if ( tabsObj [ tabId ] . firstSnapshot ) {
112
+ tabsObj [ tabId ] . firstSnapshot = false ;
67
113
// don't add anything to snapshot storage if mode is persisting for the initial snapshot
68
- if ( ! persist ) snapshotArr . push ( request . payload ) ;
69
- bg . postMessage ( {
70
- action : 'initialConnectSnapshots' ,
71
- payload : {
72
- snapshots : snapshotArr ,
73
- mode,
74
- } ,
75
- } ) ;
114
+ if ( ! persist ) tabsObj [ tabId ] . snapshotArr . push ( request . payload ) ;
115
+ if ( bg ) {
116
+ bg . postMessage ( {
117
+ action : 'initialConnectSnapshots' ,
118
+ payload : {
119
+ snapshots : tabsObj [ tabId ] . snapshotArr ,
120
+ mode : tabsObj [ tabId ] . mode ,
121
+ } ,
122
+ } ) ;
123
+ }
76
124
break ;
77
125
}
78
- snapshotArr . push ( request . payload ) ;
79
- // TODO:
80
- // get active tab id
81
- // get snapshot arr from tab object
126
+
127
+ tabsObj [ tabId ] . snapshotArr . push ( request . payload ) ;
82
128
83
129
// send message to devtools
84
- bg . postMessage ( {
85
- action : 'sendSnapshots' ,
86
- payload : snapshotArr ,
87
- } ) ;
130
+ if ( bg ) {
131
+ bg . postMessage ( {
132
+ action : 'sendSnapshots' ,
133
+ payload : tabsObj [ tabId ] . snapshotArr ,
134
+ } ) ;
135
+ }
88
136
break ;
89
137
default :
90
138
}
91
139
} ) ;
140
+
141
+ // when tab is closed, remove the tabid from the tabsObj
142
+ chrome . tabs . onRemoved . addListener ( ( tabId ) => {
143
+ delete tabsObj [ tabId ] ;
144
+ } ) ;
0 commit comments