Skip to content

Commit f6be551

Browse files
committed
merged
2 parents c83c426 + 5700fce commit f6be551

File tree

1 file changed

+80
-33
lines changed

1 file changed

+80
-33
lines changed

src/extension/background.js

Lines changed: 80 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,76 @@
11
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+
}
914

1015
// establishing connection with devtools
1116
chrome.runtime.onConnect.addListener((port) => {
1217
bg = port;
1318

1419
// if snapshots were saved in the snapshotArr,
1520
// 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+
// ---------------------------------------------------------------
1732
bg.postMessage({
1833
action: 'initialConnectSnapshots',
1934
payload: {
20-
snapshots: snapshotArr,
21-
mode,
35+
snapshots: Object.values(tabsObj)[0].snapshotArr,
36+
mode: Object.values(tabsObj)[0].mode,
2237
},
2338
});
2439
}
2540

2641
// receive snapshot from devtools and send it to contentScript
2742
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;
2952
switch (action) {
3053
case 'emptySnap':
31-
snapshotArr.splice(1);
54+
tabsObj[tabId].snapshotArr.splice(1);
3255
break;
3356
case 'setLock':
34-
mode.locked = payload;
57+
tabsObj[tabId].mode.locked = payload;
3558
break;
3659
case 'setPause':
37-
mode.paused = payload;
60+
tabsObj[tabId].mode.paused = payload;
3861
break;
3962
case 'setPersist':
40-
mode.persist = payload;
63+
tabsObj[tabId].mode.persist = payload;
4164
break;
4265
default:
4366
}
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+
// ---------------------------------------------------------------
4474
// find active tab
4575
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
4676
// send message to tab
@@ -51,50 +81,67 @@ chrome.runtime.onConnect.addListener((port) => {
5181

5282
// background.js recieves message from contentScript.js
5383
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;
5488
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;
56102

57103
console.log('request: ', request)
58104
console.log('sender: ', sender)
59105

60106
switch (action) {
61107
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 = [];
66112
break;
67113
case 'recordSnap':
68-
if (firstSnapshot) {
69-
firstSnapshot = false;
114+
if (tabsObj[tabId].firstSnapshot) {
115+
tabsObj[tabId].firstSnapshot = false;
70116
// 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);
72118
if (bg) {
73119
bg.postMessage({
74120
action: 'initialConnectSnapshots',
75121
payload: {
76-
snapshots: snapshotArr,
77-
mode,
122+
snapshots: tabsObj[tabId].snapshotArr,
123+
mode: tabsObj[tabId].mode,
78124
},
79125
});
80126
}
81127
break;
82128
}
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);
89131

90132
// send message to devtools
91-
if(bg) {
133+
if (bg) {
92134
bg.postMessage({
93135
action: 'sendSnapshots',
94-
payload: snapshotArr,
136+
payload: tabsObj[tabId].snapshotArr,
95137
});
96138
}
97139
break;
98140
default:
99141
}
100142
});
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

Comments
 (0)