diff --git a/dwds/debug_extension_mv3/web/storage.dart b/dwds/debug_extension_mv3/web/storage.dart index dc4328ced..26a286c63 100644 --- a/dwds/debug_extension_mv3/web/storage.dart +++ b/dwds/debug_extension_mv3/web/storage.dart @@ -27,6 +27,20 @@ enum StorageObject { return 'devToolsOpener'; } } + + Persistance get persistance { + switch (this) { + case StorageObject.debugInfo: + return Persistance.sessionOnly; + case StorageObject.devToolsOpener: + return Persistance.acrossSessions; + } + } +} + +enum Persistance { + sessionOnly, + acrossSessions; } Future setStorageObject({ @@ -39,7 +53,8 @@ Future setStorageObject({ final json = jsonEncode(serializers.serialize(value)); final storageObj = {storageKey: json}; final completer = Completer(); - chrome.storage.local.set(jsify(storageObj), allowInterop(() { + final storageArea = _getStorageArea(type.persistance); + storageArea.set(jsify(storageObj), allowInterop(() { if (callback != null) { callback(); } @@ -52,7 +67,8 @@ Future setStorageObject({ Future fetchStorageObject({required StorageObject type, int? tabId}) { final storageKey = _createStorageKey(type, tabId); final completer = Completer(); - chrome.storage.local.get([storageKey], allowInterop((Object storageObj) { + final storageArea = _getStorageArea(type.persistance); + storageArea.get([storageKey], allowInterop((Object storageObj) { final json = getProperty(storageObj, storageKey) as String?; if (json == null) { debugWarn('Does not exist.', prefix: storageKey); @@ -66,6 +82,15 @@ Future fetchStorageObject({required StorageObject type, int? tabId}) { return completer.future; } +StorageArea _getStorageArea(Persistance persistance) { + switch (persistance) { + case Persistance.acrossSessions: + return chrome.storage.local; + case Persistance.sessionOnly: + return chrome.storage.session; + } +} + String _createStorageKey(StorageObject type, int? tabId) { if (tabId == null) return type.keyName; return '$tabId-${type.keyName}'; diff --git a/dwds/test/puppeteer/extension_test.dart b/dwds/test/puppeteer/extension_test.dart index ae243c741..12369d96b 100644 --- a/dwds/test/puppeteer/extension_test.dart +++ b/dwds/test/puppeteer/extension_test.dart @@ -13,10 +13,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:dwds/data/debug_info.dart'; -import 'package:dwds/data/serializers.dart'; import 'package:puppeteer/puppeteer.dart'; import 'package:test/test.dart'; +import '../../debug_extension_mv3/web/data_serializers.dart'; +import '../../debug_extension_mv3/web/data_types.dart'; import '../fixtures/context.dart'; import 'test_utils.dart'; @@ -61,11 +62,17 @@ void main() async { .waitForTarget((target) => target.type == 'service_worker'); }); + tearDown(() async { + final worker = (await serviceWorkerTarget.worker)!; + await Future.delayed(Duration(seconds: executionContextDelay)); + await worker.evaluate(_clearStorageJs()); + }); + tearDownAll(() async { await browser.close(); }); - test('the debug info for a Dart app is saved in the extension storage', + test('the debug info for a Dart app is saved in session storage', () async { final appUrl = context.appUrl; // Navigate to the Dart app: @@ -77,8 +84,8 @@ void main() async { final tabIdForAppJs = _tabIdForTabJs(appUrl); final appTabId = (await worker.evaluate(tabIdForAppJs)) as int; final debugInfoKey = '$appTabId-debugInfo'; - final storageObj = - await worker.evaluate(_fetchStorageObjJs(debugInfoKey)); + final storageObj = await worker.evaluate( + _fetchStorageObjJs(debugInfoKey, storageArea: 'session')); final json = storageObj[debugInfoKey]; final debugInfo = serializers.deserialize(jsonDecode(json)) as DebugInfo; @@ -90,6 +97,32 @@ void main() async { await appTab.close(); }); + test('whether to open in a new tab or window is saved in local storage', + () async { + // Navigate to the extension settings page: + final extensionOrigin = getExtensionOrigin(browser); + final settingsTab = await navigateToPage( + browser, + url: '$extensionOrigin/settings.html', + isNew: true, + ); + // Set the settings to open DevTools in a new window: + await settingsTab.tap('#windowOpt'); + await settingsTab.tap('#saveButton'); + // Wait for the saved message to verify settings have been saved: + await settingsTab.waitForSelector('#savedMsg'); + // Close the settings tab: + await settingsTab.close(); + // Check that is has been saved in local storage: + final worker = (await serviceWorkerTarget.worker)!; + final storageObj = await worker.evaluate( + _fetchStorageObjJs('devToolsOpener', storageArea: 'local')); + final json = storageObj['devToolsOpener']; + final devToolsOpener = + serializers.deserialize(jsonDecode(json)) as DevToolsOpener; + expect(devToolsOpener.newWindow, isTrue); + }); + test( 'can configure opening DevTools in a tab/window with extension settings', () async { @@ -171,12 +204,15 @@ String _windowIdForTabJs(String tabUrl) { '''; } -String _fetchStorageObjJs(String storageKey) { +String _fetchStorageObjJs( + String storageKey, { + required String storageArea, +}) { return ''' async () => { const storageKey = "$storageKey"; return new Promise((resolve, reject) => { - chrome.storage.local.get(storageKey, (storageObj) => { + chrome.storage.$storageArea.get(storageKey, (storageObj) => { if (storageObj != null) { resolve(storageObj); } else { @@ -187,3 +223,13 @@ String _fetchStorageObjJs(String storageKey) { } '''; } + +String _clearStorageJs() { + return ''' + async () => { + await chrome.storage.local.clear(); + await chrome.storage.session.clear(); + return true; + } +'''; +}