Skip to content

Commit 9e93147

Browse files
varjolintuvarjolintu
varjolintu
authored andcommitted
Update popup content dynamically
1 parent a274819 commit 9e93147

16 files changed

+325
-375
lines changed

.eslintrc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@
122122
"importScripts": "readonly",
123123
"IMPROVED_DETECTION_PREDEFINED_SITELIST": "readonly",
124124
"initColorTheme": "readonly",
125+
"initializeHttpAuthLoginList": "readonly",
126+
"initializeLoginList": "readonly",
125127
"isEdge": "readonly",
126128
"isFirefox": "readonly",
127129
"keepass": "readonly",
@@ -164,9 +166,12 @@
164166
"ORANGE_BUTTON": "readonly",
165167
"page": "readonly",
166168
"Pixels": "readonly",
167-
"PublicKeyCredential": "readonly",
169+
"PopupIcon": "readonly",
170+
"PopupState": "readonly",
168171
"PREDEFINED_SITELIST": "readonly",
172+
"PublicKeyCredential": "readonly",
169173
"RED_BUTTON": "readonly",
174+
"removeAllChildren": "readonly",
170175
"retrieveColorScheme": "readonly",
171176
"sendMessage": "readonly",
172177
"showNotification": "readonly",

keepassxc-browser/background/browserAction.js

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
const browserActionWrapper = browser.action || browser.browserAction;
44
const browserAction = {};
55

6-
browserAction.show = async function(tab, popupData) {
6+
browserAction.updatePopupIcon = async function(tab, popupData) {
77
popupData ??= page.popupData;
88
page.popupData = popupData;
99

@@ -12,38 +12,33 @@ browserAction.show = async function(tab, popupData) {
1212
});
1313

1414
if (popupData.popup && tab?.id) {
15-
browserActionWrapper.setPopup({
16-
tabId: tab.id,
17-
popup: `popups/${popupData.popup}.html`
18-
});
19-
2015
let badgeText = '';
21-
if (popupData.popup === 'popup_login') {
16+
if (popupData.popup === PopupState.LOGIN) {
2217
badgeText = page.tabs[tab.id]?.loginList?.length;
23-
} else if (popupData.popup === 'popup_httpauth') {
18+
} else if (popupData.popup === PopupState.HTTP_AUTH) {
2419
badgeText = page.tabs[tab.id]?.loginList?.logins?.length;
2520
}
2621

2722
browserAction.setBadgeText(tab?.id, badgeText);
2823
}
2924
};
3025

31-
browserAction.showDefault = async function(tab) {
26+
browserAction.updatePopup = async function(tab) {
3227
const popupData = {
33-
iconType: 'normal',
34-
popup: 'popup'
28+
iconType: PopupIcon.NORMAL,
29+
popup: PopupState.DEFAULT
3530
};
3631

3732
const response = await keepass.isConfigured().catch((err) => {
3833
logError('Cannot show default popup: ' + err);
3934
});
4035

4136
if (!response && !keepass.isKeePassXCAvailable) {
42-
popupData.iconType = 'cross';
37+
popupData.iconType = PopupIcon.CROSS;
4338
} else if (!keepass.isAssociated() && !keepass.isDatabaseClosed) {
44-
popupData.iconType = 'bang';
39+
popupData.iconType = PopupIcon.BANG;
4540
} else if (keepass.isKeePassXCAvailable && keepass.isDatabaseClosed) {
46-
popupData.iconType = 'locked';
41+
popupData.iconType = PopupIcon.LOCKED;
4742
}
4843

4944
// Get the current tab if no tab given
@@ -52,13 +47,21 @@ browserAction.showDefault = async function(tab) {
5247
return;
5348
}
5449

50+
// Credentials are available
5551
if (page?.tabs[tab.id]?.loginList.length > 0) {
56-
popupData.iconType = 'normal';
57-
popupData.popup = 'popup_login';
52+
popupData.iconType = PopupIcon.NORMAL;
53+
popupData.popup = PopupState.LOGIN;
5854
browserAction.setBadgeText(tab?.id, page.tabs[tab.id]?.loginList.length);
5955
}
6056

61-
await browserAction.show(tab, popupData);
57+
// HTTP Basic Auth credentials are available
58+
if (page.tabs[tab.id]?.loginList?.logins?.length > 0) {
59+
popupData.iconType = PopupIcon.NORMAL;
60+
popupData.popup = PopupState.HTTP_AUTH;
61+
browserAction.setBadgeText(tab?.id, page.tabs[tab.id]?.loginList?.logins?.length);
62+
}
63+
64+
await browserAction.updatePopupIcon(tab, popupData);
6265
};
6366

6467
browserAction.setBadgeText = function(tabId, badgeText) {
@@ -73,7 +76,7 @@ browserAction.setBadgeText = function(tabId, badgeText) {
7376
browserAction.generateIconName = async function(iconType) {
7477
let name = 'icon_';
7578
name += (await keepass.keePassXCUpdateAvailable()) ? 'new_' : '';
76-
name += (!iconType || iconType === 'normal') ? 'normal' : iconType;
79+
name += (!iconType || iconType === PopupIcon.NORMAL) ? PopupIcon.NORMAL : iconType;
7780

7881
let style = 'colored';
7982
if (page?.settings?.useMonochromeToolbarIcon) {

keepassxc-browser/background/client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ function onDisconnected() {
398398
keepass.databaseHash = '';
399399

400400
page.clearAllLogins();
401-
keepass.updatePopup('cross');
401+
keepass.updatePopup(PopupIcon.CROSS);
402402
keepass.updateDatabaseHashToContent();
403403
logError(`Failed to connect: ${(browser.runtime.lastError === null ? 'Unknown error' : browser.runtime.lastError.message)}`);
404404
}

keepassxc-browser/background/event.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ kpxcEvent.showStatus = async function(tab, configured, internalPoll) {
2121
}
2222

2323
if (!internalPoll) {
24-
browserAction.showDefault(tab);
24+
browserAction.updatePopup(tab);
2525
}
2626

2727
const errorMessage = page.tabs[tab.id]?.errorMessage ?? undefined;
@@ -30,14 +30,14 @@ kpxcEvent.showStatus = async function(tab, configured, internalPoll) {
3030

3131
return {
3232
associated: keepass.isAssociated(),
33-
3433
configured: configured,
3534
databaseClosed: keepass.isDatabaseClosed,
3635
encryptionKeyUnrecognized: keepass.isEncryptionKeyUnrecognized,
3736
error: errorMessage,
3837
iframeDetected: iframeDetected,
3938
identifier: keyId,
4039
keePassXCAvailable: keepass.isKeePassXCAvailable,
40+
popupData: page.popupData,
4141
showGettingStartedGuideAlert: page.settings.showGettingStartedGuideAlert,
4242
showTroubleshootingGuideAlert: page.settings.showTroubleshootingGuideAlert,
4343
usernameFieldDetected: usernameFieldDetected
@@ -154,13 +154,13 @@ kpxcEvent.onRemoveCredentialsFromTabInformation = async function(tab) {
154154

155155
kpxcEvent.onLoginPopup = async function(tab, logins) {
156156
const popupData = {
157-
iconType: 'normal',
158-
popup: 'popup_login'
157+
iconType: PopupIcon.NORMAL,
158+
popup: PopupState.LOGIN
159159
};
160160

161161
if (tab?.id) {
162162
page.tabs[tab.id].loginList = logins;
163-
await browserAction.show(tab, popupData);
163+
await browserAction.updatePopupIcon(tab, popupData);
164164
}
165165
};
166166

@@ -170,12 +170,14 @@ kpxcEvent.initHttpAuth = async function() {
170170

171171
kpxcEvent.onHTTPAuthPopup = async function(tab, data) {
172172
const popupData = {
173-
iconType: 'normal',
174-
popup: 'popup_httpauth'
173+
iconType: PopupIcon.NORMAL,
174+
popup: PopupState.HTTP_AUTH
175175
};
176176

177-
page.tabs[tab.id].loginList = data;
178-
await browserAction.show(tab, popupData);
177+
if (tab?.id) {
178+
page.tabs[tab.id].loginList = data;
179+
await browserAction.updatePopupIcon(tab, popupData);
180+
}
179181
};
180182

181183
kpxcEvent.onUsernameFieldDetected = async function(tab, detected) {

keepassxc-browser/background/init.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ const initListeners = async function() {
8282
}
8383

8484
if (changeInfo.status === 'complete' && tab?.id) {
85-
browserAction.showDefault(tab);
85+
browserAction.updatePopup(tab);
8686
if (!page.tabs[tab.id]) {
8787
page.createTabEntry(tab.id);
8888
}

keepassxc-browser/background/keepass.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ keepass.updateCredentials = async function(tab, args = []) {
5555
const [ entryId, username, password, url, group, groupUuid ] = args;
5656
const taResponse = await keepass.testAssociation(tab);
5757
if (!taResponse) {
58-
browserAction.showDefault(tab);
58+
browserAction.updatePopup(tab);
5959
return [];
6060
}
6161

@@ -108,7 +108,7 @@ keepass.retrieveCredentials = async function(tab, args = []) {
108108
const [ url, submiturl, triggerUnlock = false, httpAuth = false ] = args;
109109
const taResponse = await keepass.testAssociation(tab, [ false, triggerUnlock ]);
110110
if (!taResponse) {
111-
browserAction.showDefault(tab);
111+
browserAction.updatePopup(tab);
112112
return [];
113113
}
114114

@@ -145,14 +145,14 @@ keepass.retrieveCredentials = async function(tab, args = []) {
145145

146146
if (entries.length === 0) {
147147
// Questionmark-icon is not triggered, so we have to trigger for the normal symbol
148-
browserAction.showDefault(tab);
148+
browserAction.updatePopup(tab);
149149
}
150150

151151
logDebug(`Found ${entries.length} entries for url ${url}`);
152152
return entries;
153153
}
154154

155-
browserAction.showDefault(tab);
155+
browserAction.updatePopup(tab);
156156
return [];
157157
} catch (err) {
158158
logError(`retrieveCredentials failed: ${err}`);
@@ -168,7 +168,7 @@ keepass.generatePassword = async function(tab) {
168168
try {
169169
const taResponse = await keepass.testAssociation(tab);
170170
if (!taResponse) {
171-
browserAction.showDefault(tab);
171+
browserAction.updatePopup(tab);
172172
return '';
173173
}
174174

@@ -235,7 +235,7 @@ keepass.associate = async function(tab) {
235235
keepass.associated.value = true;
236236
keepass.associated.hash = response.hash || 0;
237237

238-
browserAction.showDefault(tab);
238+
browserAction.updatePopup(tab);
239239
return AssociatedAction.NEW_ASSOCIATION;
240240
}
241241

@@ -468,7 +468,7 @@ keepass.getDatabaseGroups = async function(tab) {
468468
try {
469469
const taResponse = await keepass.testAssociation(tab, [ false ]);
470470
if (!taResponse) {
471-
browserAction.showDefault(tab);
471+
browserAction.updatePopup(tab);
472472
return [];
473473
}
474474

@@ -495,7 +495,7 @@ keepass.getDatabaseGroups = async function(tab) {
495495
return groups;
496496
}
497497

498-
browserAction.showDefault(tab);
498+
browserAction.updatePopup(tab);
499499
return [];
500500
} catch (err) {
501501
logError(`getDatabaseGroups failed: ${err}`);
@@ -508,7 +508,7 @@ keepass.createNewGroup = async function(tab, args = []) {
508508
const [ groupName ] = args;
509509
const taResponse = await keepass.testAssociation(tab, [ false ]);
510510
if (!taResponse) {
511-
browserAction.showDefault(tab);
511+
browserAction.updatePopup(tab);
512512
return [];
513513
}
514514

@@ -534,7 +534,7 @@ keepass.createNewGroup = async function(tab, args = []) {
534534
logError('getDatabaseGroups rejected');
535535
}
536536

537-
browserAction.showDefault(tab);
537+
browserAction.updatePopup(tab);
538538
return [];
539539
} catch (err) {
540540
logError(`createNewGroup failed: ${err}`);
@@ -602,7 +602,7 @@ keepass.passkeysRegister = async function(tab, args = []) {
602602
try {
603603
const taResponse = await keepass.testAssociation(tab, [ false ]);
604604
if (!taResponse || !keepass.isConnected || args.length < 2) {
605-
browserAction.showDefault(tab);
605+
browserAction.updatePopup(tab);
606606
return [];
607607
}
608608

@@ -623,7 +623,7 @@ keepass.passkeysRegister = async function(tab, args = []) {
623623
return response;
624624
}
625625

626-
browserAction.showDefault(tab);
626+
browserAction.updatePopup(tab);
627627
return [];
628628
} catch (err) {
629629
logError(`passkeysRegister failed: ${err}`);
@@ -635,7 +635,7 @@ keepass.passkeysGet = async function(tab, args = []) {
635635
try {
636636
const taResponse = await keepass.testAssociation(tab, [ false ]);
637637
if (!taResponse || !keepass.isConnected || args.length < 2) {
638-
browserAction.showDefault(tab);
638+
browserAction.updatePopup(tab);
639639
return [];
640640
}
641641

@@ -656,7 +656,7 @@ keepass.passkeysGet = async function(tab, args = []) {
656656
return response;
657657
}
658658

659-
browserAction.showDefault(tab);
659+
browserAction.updatePopup(tab);
660660
return [];
661661
} catch (err) {
662662
logError(`passkeysGet failed: ${err}`);
@@ -910,7 +910,7 @@ keepass.handleError = function(tab, errorCode, errorMessage = '') {
910910

911911
keepass.updatePopup = function() {
912912
if (page && page.tabs.length > 0) {
913-
browserAction.showDefault();
913+
browserAction.updatePopup();
914914
}
915915
};
916916

keepassxc-browser/background/page.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ page.submittedCredentials = {};
5656
page.tabs = [];
5757

5858
page.popupData = {
59-
iconType: 'normal',
60-
popup: 'popup'
59+
iconType: PopupIcon.NORMAL,
60+
popup: PopupState.DEFAULT
6161
};
6262

6363
page.initSettings = async function() {
@@ -118,7 +118,7 @@ page.initOpenedTabs = async function() {
118118
}
119119

120120
page.currentTabId = currentTab?.id;
121-
browserAction.showDefault(currentTab);
121+
browserAction.updatePopup(currentTab);
122122
} catch (err) {
123123
logError('page.initOpenedTabs error: ' + err);
124124
return Promise.reject();
@@ -154,7 +154,7 @@ page.switchTab = async function(tab) {
154154
}
155155
}, page.settings.clearCredentialsTimeout * 1000);
156156

157-
browserAction.showDefault(tab);
157+
browserAction.updatePopup(tab);
158158
if (tab?.id) {
159159
browser.tabs.sendMessage(tab.id, { action: 'activated_tab' }).catch((e) => {
160160
logError('Cannot send activated_tab message: ' + e.message);
@@ -397,7 +397,7 @@ page.updateContextMenu = async function(tab, credentials) {
397397
};
398398

399399
page.updatePopup = function(tab) {
400-
browserAction.showDefault(tab);
400+
browserAction.updatePopup(tab);
401401
};
402402

403403
page.setAllowIframes = async function(tab, args = []) {

0 commit comments

Comments
 (0)