From 7f1db1dc4546338e16c4883edcaebd51cfb1c021 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:13:05 -0800 Subject: [PATCH 1/2] Can save storage objects in both session and local storage --- dwds/debug_extension_mv3/web/storage.dart | 29 +++++++++++- dwds/test/puppeteer/extension_test.dart | 57 +++++++++++++++++++++-- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/dwds/debug_extension_mv3/web/storage.dart b/dwds/debug_extension_mv3/web/storage.dart index dc4328ced..bca409655 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..97022e5f6 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: @@ -78,7 +85,8 @@ void main() async { final appTabId = (await worker.evaluate(tabIdForAppJs)) as int; final debugInfoKey = '$appTabId-debugInfo'; final storageObj = - await worker.evaluate(_fetchStorageObjJs(debugInfoKey)); + await worker.evaluate( + _fetchStorageObjJs(debugInfoKey, storageArea: 'session')); final json = storageObj[debugInfoKey]; final debugInfo = serializers.deserialize(jsonDecode(json)) as DebugInfo; @@ -90,6 +98,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 +205,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 +224,13 @@ String _fetchStorageObjJs(String storageKey) { } '''; } + +String _clearStorageJs() { + return ''' + async () => { + await chrome.storage.local.clear(); + await chrome.storage.session.clear(); + return true; + } +'''; +} From 8e90edb0a198a346a2544a0f6b9911b1e0bc2901 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:19:52 -0800 Subject: [PATCH 2/2] Fix analyzer error --- dwds/debug_extension_mv3/web/storage.dart | 16 ++++++++-------- dwds/test/puppeteer/extension_test.dart | 3 +-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dwds/debug_extension_mv3/web/storage.dart b/dwds/debug_extension_mv3/web/storage.dart index bca409655..26a286c63 100644 --- a/dwds/debug_extension_mv3/web/storage.dart +++ b/dwds/debug_extension_mv3/web/storage.dart @@ -28,17 +28,17 @@ enum StorageObject { } } - _Persistance get persistance { + Persistance get persistance { switch (this) { case StorageObject.debugInfo: - return _Persistance.sessionOnly; + return Persistance.sessionOnly; case StorageObject.devToolsOpener: - return _Persistance.acrossSessions; + return Persistance.acrossSessions; } } } -enum _Persistance { +enum Persistance { sessionOnly, acrossSessions; } @@ -82,15 +82,15 @@ Future fetchStorageObject({required StorageObject type, int? tabId}) { return completer.future; } -StorageArea _getStorageArea(_Persistance persistance) { +StorageArea _getStorageArea(Persistance persistance) { switch (persistance) { - case _Persistance.acrossSessions: + case Persistance.acrossSessions: return chrome.storage.local; - case _Persistance.sessionOnly: + 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 97022e5f6..12369d96b 100644 --- a/dwds/test/puppeteer/extension_test.dart +++ b/dwds/test/puppeteer/extension_test.dart @@ -84,8 +84,7 @@ void main() async { final tabIdForAppJs = _tabIdForTabJs(appUrl); final appTabId = (await worker.evaluate(tabIdForAppJs)) as int; final debugInfoKey = '$appTabId-debugInfo'; - final storageObj = - await worker.evaluate( + final storageObj = await worker.evaluate( _fetchStorageObjJs(debugInfoKey, storageArea: 'session')); final json = storageObj[debugInfoKey]; final debugInfo =