Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions dwds/debug_extension_mv3/web/storage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<bool> setStorageObject<T>({
Expand All @@ -39,7 +53,8 @@ Future<bool> setStorageObject<T>({
final json = jsonEncode(serializers.serialize(value));
final storageObj = <String, String>{storageKey: json};
final completer = Completer<bool>();
chrome.storage.local.set(jsify(storageObj), allowInterop(() {
final storageArea = _getStorageArea(type.persistance);
storageArea.set(jsify(storageObj), allowInterop(() {
if (callback != null) {
callback();
}
Expand All @@ -52,7 +67,8 @@ Future<bool> setStorageObject<T>({
Future<T?> fetchStorageObject<T>({required StorageObject type, int? tabId}) {
final storageKey = _createStorageKey(type, tabId);
final completer = Completer<T?>();
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);
Expand All @@ -66,6 +82,15 @@ Future<T?> fetchStorageObject<T>({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}';
Expand Down
58 changes: 52 additions & 6 deletions dwds/test/puppeteer/extension_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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:
Expand All @@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -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 {
Expand All @@ -187,3 +223,13 @@ String _fetchStorageObjJs(String storageKey) {
}
''';
}

String _clearStorageJs() {
return '''
async () => {
await chrome.storage.local.clear();
await chrome.storage.session.clear();
return true;
}
''';
}