1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
'use strict';
(async () => {
try {
await keepass.migrateKeyRing();
await page.initSettings();
await page.initOpenedTabs();
await httpAuth.init();
await keepass.reconnect(null, 5000); // 5 second timeout for the first connect
await keepass.enableAutomaticReconnect();
} catch (e) {
console.log('init.js failed');
}
})();
/**
* Generate information structure for created tab and invoke all needed
* functions if tab is created in foreground
* @param {object} tab
*/
browser.tabs.onCreated.addListener((tab) => {
if (tab.id > 0) {
if (tab.selected) {
page.currentTabId = tab.id;
if (!page.tabs[tab.id]) {
page.createTabEntry(tab.id);
}
page.switchTab(tab);
}
}
});
/**
* Remove information structure of closed tab for freeing memory
* @param {integer} tabId
* @param {object} removeInfo
*/
browser.tabs.onRemoved.addListener((tabId, removeInfo) => {
delete page.tabs[tabId];
if (page.currentTabId === tabId) {
page.currentTabId = -1;
}
});
/**
* Remove stored credentials on switching tabs.
* Invoke functions to retrieve credentials for focused tab
* @param {object} activeInfo
*/
browser.tabs.onActivated.addListener(async function(activeInfo) {
// Remove possible credentials from old tab information
page.clearCredentials(page.currentTabId, true);
try {
const info = await browser.tabs.get(activeInfo.tabId);
if (info && info.id) {
page.currentTabId = info.id;
if (info.status === 'complete') {
if (!page.tabs[info.id]) {
page.createTabEntry(info.id);
}
page.switchTab(info);
}
}
} catch (err) {
console.log('Error: ' + err);
}
});
/**
* Update browserAction on every update of the page
* @param {integer} tabId
* @param {object} changeInfo
*/
browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
// If the tab URL has changed (e.g. logged in) clear credentials
if (changeInfo.url) {
page.clearLogins(tabId);
}
if (changeInfo.status === 'complete') {
browserAction.showDefault(tab);
if (!page.tabs[tab.id]) {
page.createTabEntry(tab.id);
}
}
});
browser.runtime.onMessage.addListener(kpxcEvent.onMessage);
const contextMenuItems = [
{ title: tr('contextMenuFillUsernameAndPassword'), action: 'fill_username_password' },
{ title: tr('contextMenuFillPassword'), action: 'fill_password' },
{ title: tr('contextMenuFillTOTP'), action: 'fill_totp' },
{ title: tr('contextMenuShowPasswordGenerator'), action: 'show_password_generator' },
{ title: tr('contextMenuSaveCredentials'), action: 'remember_credentials' }
];
const menuContexts = [ 'editable' ];
if (isFirefox()) {
menuContexts.push('password');
}
// Create context menu items
for (const item of contextMenuItems) {
browser.contextMenus.create({
title: item.title,
contexts: menuContexts,
onclick: (info, tab) => {
browser.tabs.sendMessage(tab.id, {
action: item.action
}).catch((err) => {
console.log(err);
});
}
});
}
// Listen for keyboard shortcuts specified by user
browser.commands.onCommand.addListener(async (command) => {
if (contextMenuItems.some(e => e.action === command)) {
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
if (tabs.length) {
browser.tabs.sendMessage(tabs[0].id, { action: command });
}
}
});
|