Skip to content

Commit 5700fce

Browse files
authored
Merge pull request #60 from oslabs-beta/josh/tabs
changed background script so that it can handle multiple tabs
2 parents a647722 + f09b7cf commit 5700fce

File tree

1 file changed

+92
-39
lines changed

1 file changed

+92
-39
lines changed

src/extension/background.js

Lines changed: 92 additions & 39 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
@@ -50,42 +80,65 @@ chrome.runtime.onConnect.addListener((port) => {
5080
});
5181

5282
// 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;
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
switch (action) {
58104
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 = [];
63109
break;
64110
case 'recordSnap':
65-
if (firstSnapshot) {
66-
firstSnapshot = false;
111+
if (tabsObj[tabId].firstSnapshot) {
112+
tabsObj[tabId].firstSnapshot = false;
67113
// 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+
}
76124
break;
77125
}
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);
82128

83129
// 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+
}
88136
break;
89137
default:
90138
}
91139
});
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

Comments
 (0)