Mercurial > addons > firefox-addons > open-incognito
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 |
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 }); |