annotate background.js @ 3:89239e60d9e1 default tip

Enable on privileged pages There are contexts in Firefox (for example, the default new tab page) that contain links to http(s) resources but are considered privileged. In these contexts `menus.onShown` does not provide the link URL to the extension and Open Incognito disables the context menu entry. However, if the entry is not disabled, the `onClicked` listener will actually know the link URL because a user's click on the extension's menu item is considered to be an explicit permission, so Open Incognito could work. Keep the menu item enabled if the URL is not available. There is a drawback that the item will be enabled but do nothing if the actual link has an unknown/unsupported protocol, but this is probably a more rare situation.
author Denis Lisov <dennis.lissov@gmail.com>
date Sat, 09 Feb 2019 03:38:05 +0300
parents 3353f3c48b6b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
1 /*
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
2 * Copyright (C) 2018 Guido Berhoerster <guido+open-incognito@berhoerster.name>
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
3 *
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
4 * This Source Code Form is subject to the terms of the Mozilla Public
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
7 */
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
8
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
9 'use strict';
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
10
3
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
11 function hasKnownProtocol(link) {
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
12 return (link.startsWith('http:') ||
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
13 link.startsWith('https:') ||
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
14 link.startsWith('ftp:'));
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
15 }
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
16
0
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
17 function onMenuShown(info, tab) {
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
18 let enabled = !tab.incognito &&
3
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
19 (typeof info.linkUrl === 'undefined' || hasKnownProtocol(info.linkUrl));
0
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
20 browser.menus.update('open-link-in-private-mode', {enabled});
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
21 browser.menus.refresh();
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
22 }
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
23
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
24 async function onClicked(info, tab) {
3
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
25 if(!hasKnownProtocol(info.linkUrl)) {
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
26 return;
89239e60d9e1 Enable on privileged pages
Denis Lisov <dennis.lissov@gmail.com>
parents: 0
diff changeset
27 }
0
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
28 let activeTabs = await browser.tabs.query({
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
29 active: true,
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
30 currentWindow: false,
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
31 windowType: 'normal'
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
32 });
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
33 console.log('active tabs:', activeTabs);
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
34 let [windowId, ] = activeTabs.reduce((accumulator, currentTab) =>
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
35 (currentTab.incognito && accumulator[1] < currentTab.lastAccessed) ?
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
36 [currentTab.windowId, currentTab.lastAccessed] : accumulator,
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
37 [-1, 0]);
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
38 if (windowId < 0) {
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
39 browser.windows.create({
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
40 incognito: true,
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
41 url: info.linkUrl
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
42 });
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
43 } else {
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
44 browser.tabs.create({
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
45 url: info.linkUrl,
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
46 windowId
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
47 });
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
48 }
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
49 }
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
50
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
51 browser.menus.create({
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
52 id: 'open-link-in-private-mode',
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
53 title: browser.i18n.getMessage('openLinkInPrivateWindow'),
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
54 enabled: false,
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
55 contexts: ['link']
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
56 },
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
57 () => {
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
58 if (browser.runtime.lastError) {
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
59 console.error('Failed to create menu item:', browser.runtime.lastError);
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
60 return;
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
61 }
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
62 browser.menus.onShown.addListener(onMenuShown);
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
63 browser.menus.onClicked.addListener(onClicked);
3353f3c48b6b Initial revision
Guido Berhoerster <guido+open-incognito@berhoerster.name>
parents:
diff changeset
64 });