Skip to content

Commit bc82f39

Browse files
committed
Fix issue when clearing empty databases
1 parent 4abb456 commit bc82f39

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

injected/integration-test/duck-ai-data-clearing.spec.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,45 @@ test('duck-ai-data-clearing feature handles localStorage errors gracefully', asy
9696
expect(messages[0].payload.method).toBe('duckAiClearDataFailed');
9797
});
9898

99+
test('duck-ai-data-clearing feature succeeds when data collections do not exist or are empty', async ({ page }, testInfo) => {
100+
const collector = ResultsCollector.create(page, testInfo.project.use);
101+
collector.withUserPreferences({
102+
messageSecret: 'ABC',
103+
javascriptInterface: 'javascriptInterface',
104+
messageCallback: 'messageCallback',
105+
});
106+
await collector.load(HTML, CONFIG);
107+
108+
const duckAiDataClearing = new DuckAiDataClearingSpec(page);
109+
110+
// Ensure localStorage item doesn't exist
111+
await page.evaluate(() => {
112+
localStorage.removeItem('savedAIChats');
113+
});
114+
115+
// Ensure IndexedDB is clean (no existing database or object store)
116+
await page.evaluate(() => {
117+
return new Promise((resolve) => {
118+
const deleteRequest = indexedDB.deleteDatabase('savedAIChatData');
119+
deleteRequest.onsuccess = () => resolve(null);
120+
deleteRequest.onerror = () => resolve(null); // Continue even if delete fails
121+
deleteRequest.onblocked = () => resolve(null); // Continue even if blocked
122+
});
123+
});
124+
125+
// Trigger data clearing on non-existent/empty data
126+
await collector.simulateSubscriptionMessage('duckAiDataClearing', 'duckAiClearData', {});
127+
128+
// Should still get completion message since there's nothing to fail
129+
const messages = await collector.waitForMessage('duckAiClearDataCompleted', 1);
130+
expect(messages).toHaveLength(1);
131+
expect(messages[0].payload.method).toBe('duckAiClearDataCompleted');
132+
133+
// Verify that subsequent verification shows no data exists
134+
await duckAiDataClearing.verifyDataCleared();
135+
await duckAiDataClearing.waitForVerification('Verification complete: All data cleared');
136+
});
137+
99138
class DuckAiDataClearingSpec {
100139
/**
101140
* @param {import("@playwright/test").Page} page

injected/src/features/duck-ai-data-clearing.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,31 @@ export class DuckAiDataClearing extends ContentFeature {
5757
reject(new Error('No DB result'));
5858
return;
5959
}
60+
61+
// Check if the object store exists
62+
if (!db.objectStoreNames.contains('chat-images')) {
63+
this.log.info('chat-images object store does not exist, nothing to clear');
64+
db.close();
65+
resolve(null);
66+
return;
67+
}
68+
6069
try {
6170
const transaction = db.transaction(['chat-images'], 'readwrite');
6271
const objectStore = transaction.objectStore('chat-images');
6372
const clearRequest = objectStore.clear();
64-
clearRequest.onsuccess = () => resolve(null);
73+
clearRequest.onsuccess = () => {
74+
db.close();
75+
resolve(null);
76+
};
6577
clearRequest.onerror = (err) => {
6678
this.log.error('Error clearing object store:', err);
79+
db.close();
6780
reject(err);
6881
};
6982
} catch (err) {
7083
this.log.error('Exception during IndexedDB clearing:', err);
84+
db.close();
7185
reject(err);
7286
}
7387
};

0 commit comments

Comments
 (0)