Skip to content

Commit

Permalink
Fix blocked cookies count and remove promise queue clearing.
Browse files Browse the repository at this point in the history
  • Loading branch information
amovar18 committed Dec 21, 2023
1 parent 5193f69 commit 3db0c50
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 177 deletions.
16 changes: 6 additions & 10 deletions packages/extension/src/localStore/cookieStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,6 @@ const CookieStore = {
* @param {Array} cookies Cookies data.
*/
async update(tabId: string, cookies: CookieData[]) {
const currentStorageSnapshot = await chrome.storage.local.get();
if (!currentStorageSnapshot[tabId]) {
return;
}
// eslint-disable-next-line complexity
await updateStorage(tabId, (prevState: TabData) => {
const _prevCookies = prevState?.cookies || {};
Expand Down Expand Up @@ -90,12 +86,12 @@ const CookieStore = {
_updatedCookies[cookieKey].headerType === 'javascript'
? _updatedCookies[cookieKey].headerType
: cookie.headerType,
frameIdList: Array.from(
new Set<number>([
frameIdList: [
...new Set<string | number>([
...(cookie.frameIdList ?? []),
...(_updatedCookies[cookieKey].frameIdList ?? []),
])
),
]),
],
};
} else {
_updatedCookies[cookieKey] = cookie;
Expand Down Expand Up @@ -264,7 +260,7 @@ const CookieStore = {
[tabId]: {
cookies: {},
focusedAt: Date.now(),
isDebuggerAttached: extensionStorage?.isUsingCDP,
isDebuggerAttached: false,
},
tabToRead: tabId,
});
Expand All @@ -273,7 +269,7 @@ const CookieStore = {
[tabId]: {
cookies: {},
focusedAt: Date.now(),
isDebuggerAttached: extensionStorage?.isUsingCDP,
isDebuggerAttached: false,
},
});
}
Expand Down
133 changes: 19 additions & 114 deletions packages/extension/src/serviceWorker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import { CookieStore } from '../localStore';
import parseResponseCookieHeader from './parseResponseCookieHeader';
import parseRequestCookieHeader from './parseRequestCookieHeader';
import { getTab } from '../utils/getTab';
import { getCurrentTab, getCurrentTabId } from '../utils/getCurrentTabId';
import { getCurrentTab } from '../utils/getCurrentTabId';
import {
type CookieDatabase,
fetchDictionary,
Expand Down Expand Up @@ -245,6 +245,20 @@ chrome.tabs.onRemoved.addListener(async (tabId) => {
* @see https://developer.chrome.com/docs/extensions/reference/tabs/#event-onUpdated
*/
chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
try {
const localStorage = await chrome.storage.local.get();
if (!localStorage[tabId] && localStorage[tabId].isDebuggerAttached) {
return;
}
await chrome.debugger.attach({ tabId: Number(tabId) }, '1.3');
localStorage[tabId].isDebuggerAttached = true;
chrome.debugger.sendCommand({ tabId: Number(tabId) }, 'Network.enable');
chrome.debugger.sendCommand({ tabId: Number(tabId) }, 'Audits.enable');
await chrome.storage.local.set(localStorage);
} catch (error) {
//Fail silently
}

if (changeInfo.status === 'loading' && tab.url) {
PROMISE_QUEUE.clear();
await PROMISE_QUEUE.add(async () => {
Expand Down Expand Up @@ -312,16 +326,16 @@ chrome.debugger.onEvent.addListener((source, method, params) => {
const tab = await getCurrentTab();
const url = tab && tab[0] ? tab[0].url : '';

if (method === 'Network.requestWillBeSent' && params) {
const request = params as Protocol.Network.RequestWillBeSentEvent;
if (method === 'Network.responseReceived' && params) {
const request = params as Protocol.Network.ResponseReceivedEvent;
if (!cdpURLToRequestMap[tabId]) {
cdpURLToRequestMap[tabId] = {
[request.requestId]: request?.documentURL,
[request.requestId]: request?.response.url,
};
} else {
cdpURLToRequestMap[tabId] = {
...cdpURLToRequestMap[tabId],
[request.requestId]: request?.documentURL,
[request.requestId]: request?.response.url,
};
}
}
Expand Down Expand Up @@ -356,7 +370,6 @@ chrome.debugger.onEvent.addListener((source, method, params) => {
url,
cookieDB
);

await CookieStore.update(tabId, allCookies);
}

Expand Down Expand Up @@ -384,70 +397,6 @@ chrome.debugger.onEvent.addListener((source, method, params) => {
})();
});

chrome.webNavigation.onBeforeNavigate.addListener(async (details) => {
PROMISE_QUEUE.clear();
await PROMISE_QUEUE.add(async () => {
const syncStorage = await chrome.storage.sync.get();
const _isSingleTabProcessingMode = await isSingleTabProcessingMode();

if (!details.tabId || !details.url) {
return;
}

if (
!syncStorage?.isUsingCDP ||
details.url.startsWith('chrome://') ||
details.url.startsWith('about:blank')
) {
return;
}

let localStorage = await chrome.storage.local.get();

if (localStorage && Object.keys(localStorage).length === 0) {
await CookieStore.addTabData(details.tabId.toString());
localStorage = await chrome.storage.local.get();
}

if (_isSingleTabProcessingMode) {
if (
details.tabId.toString() !== localStorage.tabToRead &&
localStorage[details.tabId.toString()]?.isDebuggerAttached
) {
return;
}

try {
await chrome.debugger.attach({ tabId: details.tabId }, '1.3');
localStorage[details.tabId?.toString()].isDebuggerAttached = true;
chrome.debugger.sendCommand({ tabId: details.tabId }, 'Network.enable');
chrome.debugger.sendCommand({ tabId: details.tabId }, 'Audits.enable');
await chrome.storage.local.set(localStorage);
} catch (error) {
//Fail silently
}
} else {
// Have to check multiple condition since debugger cannot be attached on empty url tab and on chrome:// urls
if (
!localStorage[details.tabId.toString()] &&
localStorage[details.tabId.toString()]?.isDebuggerAttached
) {
return;
}

try {
await chrome.debugger.attach({ tabId: details.tabId }, '1.3');
localStorage[details.tabId?.toString()].isDebuggerAttached = true;
chrome.debugger.sendCommand({ tabId: details.tabId }, 'Network.enable');
chrome.debugger.sendCommand({ tabId: details.tabId }, 'Audits.enable');
await chrome.storage.local.set(localStorage);
} catch (error) {
//Silently fail
}
}
});
});

chrome.storage.sync.onChanged.addListener(
async (changes: { [key: string]: chrome.storage.StorageChange }) => {
await PROMISE_QUEUE.add(async () => {
Expand Down Expand Up @@ -538,47 +487,3 @@ chrome.storage.sync.onChanged.addListener(
});
}
);

const listenToNewTab = async (tabId?: number) => {
const newTabId = tabId?.toString() || (await getCurrentTabId());

if (!newTabId) {
return '';
}

await CookieStore.addTabData(newTabId);

const storedTabData = Object.keys(await chrome.storage.local.get());

storedTabData.some(async (tabIdToDelete) => {
if (tabIdToDelete !== newTabId) {
await CookieStore.removeTabData(tabIdToDelete);

if (!Number.isNaN(parseInt(tabIdToDelete))) {
await chrome.action.setBadgeText({
tabId: parseInt(tabIdToDelete),
text: '',
});
}
}
});

return newTabId;
};

chrome.runtime.onMessage.addListener((request) => {
if (request?.type === 'SET_TAB_TO_READ') {
PROMISE_QUEUE.clear();
PROMISE_QUEUE.add(async () => {
const newTab = await listenToNewTab(request?.payload?.tabId);

// Can't use sendResponse as delay is too long. So using sendMessage instead.
chrome.runtime.sendMessage({
type: 'syncCookieStore:SET_TAB_TO_READ',
payload: {
tabId: newTab,
},
});
});
}
});
28 changes: 8 additions & 20 deletions packages/extension/src/view/devtools/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import { useCookieStore } from './stateProviders/syncCookieStore';
import './app.css';
import { Cookies } from './components';
import useFrameOverlay from './hooks/useFrameOverlay';
import { CookieStore } from '../../localStore';

const App: React.FC = () => {
const [sidebarWidth, setSidebarWidth] = useState(200);
Expand All @@ -54,6 +53,7 @@ const App: React.FC = () => {
setIsInspecting,
canStartInspecting,
tabUrl,
isCurrentTabBeingListenedTo,
} = useCookieStore(({ state, actions }) => ({
contextInvalidated: state.contextInvalidated,
setContextInvalidated: actions.setContextInvalidated,
Expand All @@ -64,6 +64,7 @@ const App: React.FC = () => {
setIsInspecting: actions.setIsInspecting,
canStartInspecting: state.canStartInspecting,
tabUrl: state.tabUrl,
isCurrentTabBeingListenedTo: state.isCurrentTabBeingListenedTo,
}));

const listenToMouseChange = useCallback(() => {
Expand Down Expand Up @@ -118,10 +119,14 @@ const App: React.FC = () => {
setSidebarData((prev) => {
const data = { ...prev };
const psData = data['privacySandbox'];

psData.children['cookies'].panel = (
<Cookies setFilteredCookies={setFilteredCookies} />
);
if (!isCurrentTabBeingListenedTo) {
psData.children['cookies'].children = {};
psData.children['cookies'].extraInterfaceToTitle = null;
return data;
}
psData.children['cookies'].children = Object.keys(tabFrames || {}).reduce(
(acc, url) => {
acc[url] = {
Expand Down Expand Up @@ -157,6 +162,7 @@ const App: React.FC = () => {
});
}, [
canStartInspecting,
isCurrentTabBeingListenedTo,
isInspecting,
isKeySelected,
isSidebarFocused,
Expand Down Expand Up @@ -205,24 +211,6 @@ const App: React.FC = () => {
updateSelectedItemKey(selectedFrame || 'cookies');
}, [selectedFrame, tabUrl, updateSelectedItemKey]);

useEffect(() => {
const storeChangeListener = async () => {
const tabId = chrome.devtools.inspectedWindow.tabId.toString();

const getTabBeingListenedTo = await chrome.storage.local.get();

if (getTabBeingListenedTo && tabId !== getTabBeingListenedTo?.tabToRead) {
await CookieStore.removeTabData(tabId); // Hot Fix: Remove tab data if tab is not being listened to
}
};

chrome.storage.onChanged.addListener(storeChangeListener);

return () => {
chrome.storage.onChanged.removeListener(storeChangeListener);
};
}, [updateSelectedItemKey]);

const [filteredCookies, setFilteredCookies] = useState<CookieTableData[]>([]);

const handleUpdate = useCallback(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ import useContextSelector from '../../../../utils/useContextSelector';
import { ALLOWED_NUMBER_OF_TABS } from '../../../../constants';
import setDocumentCookies from '../../../../utils/setDocumentCookies';
import isOnRWS from '../../../../contentScript/utils/isOnRWS';
import { getCurrentTabId } from '../../../../utils/getCurrentTabId';
import { CookieStore } from '../../../../localStore';

export interface CookieStoreContext {
state: {
Expand Down Expand Up @@ -322,44 +324,44 @@ export const Provider = ({ children }: PropsWithChildren) => {
}
}, [tabId]);

const changeListeningToThisTab = useCallback(() => {
chrome.runtime.sendMessage({
type: 'SET_TAB_TO_READ',
payload: {
tabId,
},
});
}, [tabId]);
const changeListeningToThisTab = useCallback(async () => {
let changedTabId = tabId?.toString();

useEffect(() => {
const listener = async (message: {
type: string;
payload: { tabId: number };
}) => {
if (message.type === 'syncCookieStore:SET_TAB_TO_READ') {
chrome.devtools.inspectedWindow.eval(
'window.location.href',
(result, isException) => {
if (!isException && typeof result === 'string') {
setTabUrl(result);
}
}
);
if (!tabId) {
changedTabId = await getCurrentTabId();
}

await chrome.tabs.reload(Number(message.payload.tabId));
if (!changedTabId) {
return;
}

setIsCurrentTabBeingListenedTo(true);
setLoading(false);
setCanStartInspecting(false);
}
};
await CookieStore.addTabData(changedTabId);

chrome.runtime.onMessage.addListener(listener);
const storedTabData = Object.keys(await chrome.storage.local.get());

return () => {
chrome.runtime.onMessage.removeListener(listener);
};
}, []);
// eslint-disable-next-line guard-for-in
storedTabData.forEach(async (tabIdToBeDeleted) => {
if (
tabIdToBeDeleted !== changedTabId &&
tabIdToBeDeleted !== 'tabToRead'
) {
try {
await chrome.debugger.detach({ tabId: Number(tabIdToBeDeleted) });
await CookieStore.removeTabData(tabIdToBeDeleted);

if (!Number.isNaN(parseInt(tabIdToBeDeleted))) {
await chrome.action.setBadgeText({
tabId: parseInt(tabIdToBeDeleted),
text: '',
});
}
} catch (error) {
// Fail silently.
}
}
});
await chrome.tabs.reload(Number(changedTabId));
}, [tabId]);

const tabUpdateListener = useCallback(
async (_tabId: number, changeInfo: chrome.tabs.TabChangeInfo) => {
Expand Down

0 comments on commit 3db0c50

Please sign in to comment.