Skip to content

Commit 9b19b3b

Browse files
authored
Can save storage objects in both session and local storage (#1807)
1 parent e75c45e commit 9b19b3b

File tree

2 files changed

+79
-8
lines changed

2 files changed

+79
-8
lines changed

dwds/debug_extension_mv3/web/storage.dart

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ enum StorageObject {
2727
return 'devToolsOpener';
2828
}
2929
}
30+
31+
Persistance get persistance {
32+
switch (this) {
33+
case StorageObject.debugInfo:
34+
return Persistance.sessionOnly;
35+
case StorageObject.devToolsOpener:
36+
return Persistance.acrossSessions;
37+
}
38+
}
39+
}
40+
41+
enum Persistance {
42+
sessionOnly,
43+
acrossSessions;
3044
}
3145

3246
Future<bool> setStorageObject<T>({
@@ -39,7 +53,8 @@ Future<bool> setStorageObject<T>({
3953
final json = jsonEncode(serializers.serialize(value));
4054
final storageObj = <String, String>{storageKey: json};
4155
final completer = Completer<bool>();
42-
chrome.storage.local.set(jsify(storageObj), allowInterop(() {
56+
final storageArea = _getStorageArea(type.persistance);
57+
storageArea.set(jsify(storageObj), allowInterop(() {
4358
if (callback != null) {
4459
callback();
4560
}
@@ -52,7 +67,8 @@ Future<bool> setStorageObject<T>({
5267
Future<T?> fetchStorageObject<T>({required StorageObject type, int? tabId}) {
5368
final storageKey = _createStorageKey(type, tabId);
5469
final completer = Completer<T?>();
55-
chrome.storage.local.get([storageKey], allowInterop((Object storageObj) {
70+
final storageArea = _getStorageArea(type.persistance);
71+
storageArea.get([storageKey], allowInterop((Object storageObj) {
5672
final json = getProperty(storageObj, storageKey) as String?;
5773
if (json == null) {
5874
debugWarn('Does not exist.', prefix: storageKey);
@@ -66,6 +82,15 @@ Future<T?> fetchStorageObject<T>({required StorageObject type, int? tabId}) {
6682
return completer.future;
6783
}
6884

85+
StorageArea _getStorageArea(Persistance persistance) {
86+
switch (persistance) {
87+
case Persistance.acrossSessions:
88+
return chrome.storage.local;
89+
case Persistance.sessionOnly:
90+
return chrome.storage.session;
91+
}
92+
}
93+
6994
String _createStorageKey(StorageObject type, int? tabId) {
7095
if (tabId == null) return type.keyName;
7196
return '$tabId-${type.keyName}';

dwds/test/puppeteer/extension_test.dart

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ import 'dart:async';
1313
import 'dart:convert';
1414

1515
import 'package:dwds/data/debug_info.dart';
16-
import 'package:dwds/data/serializers.dart';
1716
import 'package:puppeteer/puppeteer.dart';
1817
import 'package:test/test.dart';
1918

19+
import '../../debug_extension_mv3/web/data_serializers.dart';
20+
import '../../debug_extension_mv3/web/data_types.dart';
2021
import '../fixtures/context.dart';
2122
import 'test_utils.dart';
2223

@@ -61,11 +62,17 @@ void main() async {
6162
.waitForTarget((target) => target.type == 'service_worker');
6263
});
6364

65+
tearDown(() async {
66+
final worker = (await serviceWorkerTarget.worker)!;
67+
await Future.delayed(Duration(seconds: executionContextDelay));
68+
await worker.evaluate(_clearStorageJs());
69+
});
70+
6471
tearDownAll(() async {
6572
await browser.close();
6673
});
6774

68-
test('the debug info for a Dart app is saved in the extension storage',
75+
test('the debug info for a Dart app is saved in session storage',
6976
() async {
7077
final appUrl = context.appUrl;
7178
// Navigate to the Dart app:
@@ -77,8 +84,8 @@ void main() async {
7784
final tabIdForAppJs = _tabIdForTabJs(appUrl);
7885
final appTabId = (await worker.evaluate(tabIdForAppJs)) as int;
7986
final debugInfoKey = '$appTabId-debugInfo';
80-
final storageObj =
81-
await worker.evaluate(_fetchStorageObjJs(debugInfoKey));
87+
final storageObj = await worker.evaluate(
88+
_fetchStorageObjJs(debugInfoKey, storageArea: 'session'));
8289
final json = storageObj[debugInfoKey];
8390
final debugInfo =
8491
serializers.deserialize(jsonDecode(json)) as DebugInfo;
@@ -92,6 +99,32 @@ void main() async {
9299
await appTab.close();
93100
});
94101

102+
test('whether to open in a new tab or window is saved in local storage',
103+
() async {
104+
// Navigate to the extension settings page:
105+
final extensionOrigin = getExtensionOrigin(browser);
106+
final settingsTab = await navigateToPage(
107+
browser,
108+
url: '$extensionOrigin/settings.html',
109+
isNew: true,
110+
);
111+
// Set the settings to open DevTools in a new window:
112+
await settingsTab.tap('#windowOpt');
113+
await settingsTab.tap('#saveButton');
114+
// Wait for the saved message to verify settings have been saved:
115+
await settingsTab.waitForSelector('#savedMsg');
116+
// Close the settings tab:
117+
await settingsTab.close();
118+
// Check that is has been saved in local storage:
119+
final worker = (await serviceWorkerTarget.worker)!;
120+
final storageObj = await worker.evaluate(
121+
_fetchStorageObjJs('devToolsOpener', storageArea: 'local'));
122+
final json = storageObj['devToolsOpener'];
123+
final devToolsOpener =
124+
serializers.deserialize(jsonDecode(json)) as DevToolsOpener;
125+
expect(devToolsOpener.newWindow, isTrue);
126+
});
127+
95128
test(
96129
'can configure opening DevTools in a tab/window with extension settings',
97130
() async {
@@ -173,12 +206,15 @@ String _windowIdForTabJs(String tabUrl) {
173206
''';
174207
}
175208

176-
String _fetchStorageObjJs(String storageKey) {
209+
String _fetchStorageObjJs(
210+
String storageKey, {
211+
required String storageArea,
212+
}) {
177213
return '''
178214
async () => {
179215
const storageKey = "$storageKey";
180216
return new Promise((resolve, reject) => {
181-
chrome.storage.local.get(storageKey, (storageObj) => {
217+
chrome.storage.$storageArea.get(storageKey, (storageObj) => {
182218
if (storageObj != null) {
183219
resolve(storageObj);
184220
} else {
@@ -189,3 +225,13 @@ String _fetchStorageObjJs(String storageKey) {
189225
}
190226
''';
191227
}
228+
229+
String _clearStorageJs() {
230+
return '''
231+
async () => {
232+
await chrome.storage.local.clear();
233+
await chrome.storage.session.clear();
234+
return true;
235+
}
236+
''';
237+
}

0 commit comments

Comments
 (0)