feat: Options parameter for Session.clearData
API (#41355)
* feat: Options parameter for `Session.clearData` API
* Consolidate & curate data type categories
* Update docs for better typing
* off-by-one typo
* refactor to use `std::shared_ptr` instead of `base::RefCounted`
* fix compile errors
* std::enable_shared_from_this didn't work 🤷
* Refine docs with defaults
This commit is contained in:
parent
752f2eb124
commit
3eb94b72ba
5 changed files with 449 additions and 63 deletions
|
@ -1613,7 +1613,7 @@ describe('session module', () => {
|
|||
|
||||
// NOTE: This API clears more than localStorage, but localStorage is a
|
||||
// convenient test target for this API
|
||||
it('clears localstorage data', async () => {
|
||||
it('clears all data when no options supplied', async () => {
|
||||
const w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } });
|
||||
await w.loadFile(path.join(fixtures, 'api', 'localstorage.html'));
|
||||
|
||||
|
@ -1623,7 +1623,8 @@ describe('session module', () => {
|
|||
|
||||
expect(await w.webContents.executeJavaScript('localStorage.length')).to.equal(0);
|
||||
});
|
||||
it('clears localstorage data when called twice in parallel', async () => {
|
||||
|
||||
it('clears all data when no options supplied, called twice in parallel', async () => {
|
||||
const w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } });
|
||||
await w.loadFile(path.join(fixtures, 'api', 'localstorage.html'));
|
||||
|
||||
|
@ -1638,5 +1639,92 @@ describe('session module', () => {
|
|||
// Await the first promise so it doesn't creep into another test
|
||||
await clearDataPromise;
|
||||
});
|
||||
|
||||
it('only clears specified data categories', async () => {
|
||||
const w = new BrowserWindow({
|
||||
show: false,
|
||||
webPreferences: { nodeIntegration: true, contextIsolation: false }
|
||||
});
|
||||
await w.loadFile(
|
||||
path.join(fixtures, 'api', 'localstorage-and-indexeddb.html')
|
||||
);
|
||||
|
||||
const { webContents } = w;
|
||||
const { session } = webContents;
|
||||
|
||||
await once(ipcMain, 'indexeddb-ready');
|
||||
|
||||
async function queryData (channel: string): Promise<string> {
|
||||
const event = once(ipcMain, `result-${channel}`);
|
||||
webContents.send(`get-${channel}`);
|
||||
return (await event)[1];
|
||||
}
|
||||
|
||||
// Data is in localStorage
|
||||
await expect(queryData('localstorage')).to.eventually.equal('hello localstorage');
|
||||
// Data is in indexedDB
|
||||
await expect(queryData('indexeddb')).to.eventually.equal('hello indexeddb');
|
||||
|
||||
// Clear only indexedDB, not localStorage
|
||||
await session.clearData({ dataTypes: ['indexedDB'] });
|
||||
|
||||
// The localStorage data should still be there
|
||||
await expect(queryData('localstorage')).to.eventually.equal('hello localstorage');
|
||||
|
||||
// The indexedDB data should be gone
|
||||
await expect(queryData('indexeddb')).to.eventually.be.undefined();
|
||||
});
|
||||
|
||||
it('only clears the specified origins', async () => {
|
||||
const w = new BrowserWindow({ show: false });
|
||||
await w.loadURL('about:blank');
|
||||
|
||||
const { session } = w.webContents;
|
||||
const { cookies } = session;
|
||||
|
||||
await Promise.all([
|
||||
cookies.set({
|
||||
url: 'https://example.com/',
|
||||
name: 'testdotcom',
|
||||
value: 'testdotcom'
|
||||
}),
|
||||
cookies.set({
|
||||
url: 'https://example.org/',
|
||||
name: 'testdotorg',
|
||||
value: 'testdotorg'
|
||||
})
|
||||
]);
|
||||
|
||||
await session.clearData({ origins: ['https://example.com'] });
|
||||
|
||||
expect((await cookies.get({ url: 'https://example.com/', name: 'testdotcom' })).length).to.equal(0);
|
||||
expect((await cookies.get({ url: 'https://example.org/', name: 'testdotorg' })).length).to.be.greaterThan(0);
|
||||
});
|
||||
|
||||
it('clears all except the specified origins', async () => {
|
||||
const w = new BrowserWindow({ show: false });
|
||||
await w.loadURL('about:blank');
|
||||
|
||||
const { session } = w.webContents;
|
||||
const { cookies } = session;
|
||||
|
||||
await Promise.all([
|
||||
cookies.set({
|
||||
url: 'https://example.com/',
|
||||
name: 'testdotcom',
|
||||
value: 'testdotcom'
|
||||
}),
|
||||
cookies.set({
|
||||
url: 'https://example.org/',
|
||||
name: 'testdotorg',
|
||||
value: 'testdotorg'
|
||||
})
|
||||
]);
|
||||
|
||||
await session.clearData({ excludeOrigins: ['https://example.com'] });
|
||||
|
||||
expect((await cookies.get({ url: 'https://example.com/', name: 'testdotcom' })).length).to.be.greaterThan(0);
|
||||
expect((await cookies.get({ url: 'https://example.org/', name: 'testdotorg' })).length).to.equal(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue