├── README.md
├── bootstrap.js
├── changelog-ru.md
├── changelog.md
├── chrome.manifest
├── content.js
├── content.jsm
├── defaults
└── preferences
│ └── prefs.js
├── icon.png
├── icon.xcf
├── install.rdf
├── license.txt
├── locale
├── ar
│ └── pt.properties
├── bg
│ └── pt.properties
├── ca
│ └── pt.properties
├── de
│ └── pt.properties
├── el
│ └── pt.properties
├── en-US
│ └── pt.properties
├── es
│ └── pt.properties
├── et
│ └── pt.properties
├── fi
│ └── pt.properties
├── fr
│ └── pt.properties
├── hu
│ └── pt.properties
├── id
│ └── pt.properties
├── it
│ └── pt.properties
├── ja
│ └── pt.properties
├── nl
│ └── pt.properties
├── pl
│ └── pt.properties
├── pt-BR
│ └── pt.properties
├── pt-PT
│ └── pt.properties
├── ru
│ └── pt.properties
├── sr
│ └── pt.properties
├── tr
│ └── pt.properties
├── uk
│ └── pt.properties
├── vi
│ └── pt.properties
├── zh-CN
│ └── pt.properties
└── zh-TW
│ └── pt.properties
├── log.js
├── make.bat
├── make.sh
├── patcher.jsm
├── privacy-16.png
├── privacy-24.png
├── privacy-32.png
├── protocol-process.js
├── protocol.jsm
├── protocolRedirect.html
└── virtualKeyCodes.js
/README.md:
--------------------------------------------------------------------------------
1 | Works only in Gecko 20.0 and higher because used API doesn't exist in older versions!
2 |
3 | #### WebExtensions and compatibility with Firefox 57+
4 | Issue #254 + Private Tab WE repository
5 |
6 | #### Known issues:
7 | * We just inherit private state from selected tab and tries preserve private state of dropped link-like things, this is simple to implement, but may confuse a bit…
8 | * If you use "New Private Tab" + "New Tab" buttons after tabs toolbar, you need to manually remove "New Private Tab" button before disabling or uninstalling Private Tab. Or you can remove "New Tab" button, press OK in Customize Toolbar dialog and then place "New Tab" directly after tabs.
9 | * Can't open new private tab, if installed Scriptify-based extension: please use Greasemonkey or Scriptish instead (#110).
10 | * In Firefox 52+ `private:…` URI may be opened only in new tab due to fix for bug 1318388 (#251).
11 |
12 | #### Styles:
13 | You can use `.tabbrowser-tab[privateTab-isPrivate]` (private tab), `#main-window[privateTab-selectedTabIsPrivate]` (selected tab is private) and `#main-window[privateTab-isPrivate]` (built-in private window) selectors in styles for userChrome.css/Stylish.
14 |
Example styles:
15 | * change underline of private tabs
16 | * change icon
17 | * change background color
18 | * add overlay icon
19 | * add icons to menu items
20 | * hide some menu items
21 |
22 | #### Options
23 | See extensions.privateTab.\* preferences in about:config page, some descriptions can be found in defaults/preferences/prefs.js.
24 |
25 | * extensions.privateTab.sendRefererHeader
26 |
`0` – don't send HTTP referer when URI is opened in new private tab
27 |
`1` – send only if private tab opened from another private tab
28 |
`2` – always send (as Firefox itself do for “Open Link in New Private Window”)
29 |
30 | * extensions.privateTab.usePrivateWindowStyle
31 |
`true` – use style of private window, if current tab is private
32 |
`false` – only show private state of window (regardless of current tab private state)
33 |
34 | ##### Keyboard shortcuts:
35 | You can modify keyboard shortcuts through about:config page, see notes about extensions.privateTab.key.\* preferences in defaults/preferences/prefs.js.
36 |
37 | #### Troubleshooting:
38 | Try new clean Firefox profile to ensure that there are no conflicts with another extensions or some specific configuration.
39 | ##### Debug logs:
40 | Options in about:config:
41 | * extensions.privateTab.debug – enable debug logs
42 | * extensions.privateTab.debug.verbose – additionally enable detailed debug logs (not needed in most cases)
43 |
44 | Then use Browser Console (formerly Error Console, Ctrl+Shift+J) to see messages like `[Private Tab] …`.
45 |
46 | #### API for other extensions:
47 | ##### Events:
48 | You can listen for following events:
49 |
50 |
51 |
52 | event.type |
53 | event.target |
54 | event.detail |
55 | Description |
56 |
57 |
58 |
59 |
60 | PrivateTab:PrivateChanged |
61 | tab |
62 | 1 – private tab 0 – not private |
63 | Changed private state of the tab event.explicitOriginalTarget – initial tab in case of toggling using duplication (Firefox 51+, Private Tab 0.2.1.3+) |
64 |
65 |
66 | PrivateTab:OpenInNewTab |
67 | tab |
68 | 1 – may be opened as child tab |
69 | Link was opened in new private tab |
70 |
71 |
72 | PrivateTab:OpenNewTab |
73 | tab |
74 | 1 – opened using middle-click (or left-click with any modifier) |
75 | Opened new (empty) private tab |
76 |
77 |
78 |
79 |
80 | ##### API functions:
81 | boolean [privateTab.isTabPrivate](#privatetabistabprivate)(in DOMNode tab)
82 |
void [privateTab.isTabPrivateAsync](#privatetabistabprivateasync)(in DOMNode tab, in function callback[, in object context])
83 |
boolean [privateTab.toggleTabPrivate](#privatetabtoggletabprivate)(in DOMNode tab[, in boolean isPrivate])
84 |
DOMNode [privateTab.duplicateTabAndTogglePrivate](#privatetabduplicatetabandtoggleprivate)(in DOMNode tab[, in boolean isPrivate])
85 |
DOMNode [privateTab.replaceTabAndTogglePrivate](#privatetabreplacetabandtoggleprivate)(in DOMNode tab[, in boolean isPrivate[, in function onSuccessCallback]])
86 |
void [privateTab.readyToOpenTab](#privatetabreadytoopentab)(in boolean isPrivate)
87 |
void [privateTab.readyToOpenTabs](#privatetabreadytoopentabs)(in boolean isPrivate)
88 |
boolean [privateTab.hasClosedTabs](#privatetabhasclosedtabs)
89 |
void [privateTab.forgetClosedTabs](#privatetabforgetclosedtabs)()
90 |
boolean [privateTab.tabLabelIsEmpty](#privatetabtablabelisempty)(in string tabLabel[, in boolean isEmpty])
91 |
92 | ###### privateTab.isTabPrivate()
93 | Investigates that the tab are private (`true`) or not (`false`), example:
94 | ```js
95 | // Close all (visible) private tabs:
96 | Array.slice(gBrowser.visibleTabs || gBrowser.tabs).forEach(function(tab) {
97 | if(privateTab.isTabPrivate(tab))
98 | gBrowser.removeTab(tab);
99 | });
100 | ```
101 | ###### privateTab.isTabPrivateAsync()
102 | The same as [privateTab.isTabPrivate](#privatetabistabprivate), but get real state of `nsILoadContext.usePrivateBrowsing` in multi-process mode (Electrolysis aka e10s), Private Tab 0.2.1+.
103 |
Not needed in most cases!
104 | ```js
105 | // Asynchronously get privacy state of given tab.
106 | // In most cases should be replaced with synchronous privateTab.isTabPrivate()
107 | privateTab.isTabPrivateAsync(gBrowser.selectedTab, function(isPrivate) {
108 | alert("Selected tab is " + (isPrivate ? "private" : "not private"));
109 | });
110 | ```
111 | ###### privateTab.toggleTabPrivate()
112 | Changes tab private state:
113 |
Toggle: `privateTab.toggleTabPrivate(tab)`
114 |
Make private: `privateTab.toggleTabPrivate(tab, true)`
115 |
Make not private: `privateTab.toggleTabPrivate(tab, false)`
116 | ```js
117 | // Make all (visible) tabs private:
118 | Array.forEach(
119 | gBrowser.visibleTabs || gBrowser.tabs,
120 | function(tab) {
121 | if(!privateTab.isTabPrivate(tab))
122 | privateTab.toggleTabPrivate(tab, true);
123 | }
124 | );
125 | ```
126 | ###### privateTab.duplicateTabAndTogglePrivate()
127 | Duplicate already opened tab in private or non-private tab.
128 | ```js
129 | // Duplicate selected tab and toggle private state of duplicated tab
130 | var tab = gBrowser.selectedTab;
131 | var pos = "_tPos" in tab
132 | ? tab._tPos
133 | : Array.prototype.indexOf.call(gBrowser.tabs, tab); // SeaMonkey
134 | var dupTab = gBrowser.selectedTab = privateTab.duplicateTabAndTogglePrivate(tab);
135 | gBrowser.moveTabTo(dupTab, pos + 1); // Place right after initial tab
136 | ```
137 | ###### privateTab.replaceTabAndTogglePrivate()
138 | Changes tab private state using tab duplication (for Firefox 52+):
139 | ```js
140 | // Duplicate selected tab, toggle private state of duplicated tab and then close initial tab
141 | privateTab.replaceTabAndTogglePrivate(gBrowser.selectedTab);
142 | // The same as above + also load new URL into duplicated tab (Private Tab 0.2.3+)
143 | privateTab.replaceTabAndTogglePrivate(gBrowser.selectedTab, undefined, function onSuccess(dupTab) {
144 | dupTab.linkedBrowser.loadURI("https://example.com/");
145 | });
146 | ```
147 | ###### privateTab.readyToOpenTab()
148 | Allows to open private or not private tab (independent of any inheritance mechanism), example:
149 | ```js
150 | // Open in private tab:
151 | privateTab.readyToOpenTab(true);
152 | gBrowser.addTab("https://mozilla.org/");
153 | ```
154 | ```js
155 | // Open in not private tab:
156 | privateTab.readyToOpenTab(false);
157 | gBrowser.addTab("https://mozilla.org/");
158 | ```
159 | ###### privateTab.readyToOpenTabs()
160 | Allows to open many private or not private tabs (independent of any inheritance mechanism), example:
161 | ```js
162 | // Open in private tabs:
163 | privateTab.readyToOpenTabs(true);
164 | gBrowser.addTab("https://mozilla.org/");
165 | gBrowser.addTab("https://addons.mozilla.org/");
166 | // ...
167 | privateTab.stopToOpenTabs();
168 | ```
169 | ###### privateTab.hasClosedTabs
170 | Only for extensions.privateTab.rememberClosedPrivateTabs = true, Private Tab 0.1.7.4+.
171 |
Return true, if there is at least one private tab in undo close list, example:
172 | ```js
173 | if(privateTab.hasClosedTabs)
174 | alert("We have at least one closed private tabs");
175 | else
176 | alert("We don't have closed private tabs");
177 | ```
178 | ###### privateTab.forgetClosedTabs()
179 | Only for extensions.privateTab.rememberClosedPrivateTabs = true, Private Tab 0.1.7.4+.
180 |
Forget about all closed private tabs in window, example:
181 | ```js
182 | // Forget about all closed private tabs in window
183 | privateTab.forgetClosedTabs();
184 | ```
185 | ###### privateTab.tabLabelIsEmpty()
186 | Mark tab label as empty (or non-empty), example:
187 | ```js
188 | // Mark tab label/URI as empty:
189 | if("tabLabelIsEmpty" in privateTab) // Private Tab 0.1.7.2+
190 | privateTab.tabLabelIsEmpty("chrome://speeddial/content/speeddial.xul", true);
191 | ```
192 | ```js
193 | // Check state:
194 | var isEmpty = privateTab.tabLabelIsEmpty("chrome://speeddial/content/speeddial.xul");
195 | ```
196 | ```js
197 | // Restore state (e.g. for restartless extensions):
198 | privateTab.tabLabelIsEmpty("chrome://speeddial/content/speeddial.xul", false);
199 | ```
200 | Note: used global storage for labels (not per-window)! So, it's enough to call this function only once.
201 |
202 | ##### Backward compatibility:
203 | Check for Private Tab installed (and enabled):
204 | ```js
205 | if("privateTab" in window) {
206 | // Do something with "privateTab" object
207 | }
208 | ```
209 |
210 | ##### Code examples:
211 | Open link in private tab using FireGestures extension:
212 | ```js
213 | // Remember the active tab's position
214 | var tab = gBrowser.selectedTab;
215 | var pos = "_tPos" in tab
216 | ? tab._tPos
217 | : Array.prototype.indexOf.call(gBrowser.tabs, tab); // SeaMonkey
218 | // Get the DOM node at the starting point of gesture
219 | var srcNode = FireGestures.sourceNode;
220 | // Get the link URL inside the node
221 | var linkURL = FireGestures.getLinkURL(srcNode);
222 | if (!linkURL)
223 | throw "Not on a link";
224 | // Check the URL is safe
225 | FireGestures.checkURL(linkURL, srcNode.ownerDocument);
226 | // Open link in new private tab
227 | privateTab.readyToOpenTab(true);
228 | var newPrivateTab = gBrowser.addTab(linkURL);
229 | gBrowser.moveTabTo(newPrivateTab, pos + 1); // Place right after initial tab
230 | ```
--------------------------------------------------------------------------------
/changelog-ru.md:
--------------------------------------------------------------------------------
1 | #### Private Tab: История изменений
2 |
3 | `+` - добавлено
4 | `-` - удалено
5 | `x` - исправлено
6 | `*` - улучшено
7 |
8 | ##### master/HEAD
9 | `x` Исправлено использование nsISessionStore в Firefox 61+(bug 1450559, спасибо Dumby).
10 | `x` Исключены попытки обновления удаленного функционала для вкладок в заголовке окна в Firefox 61+.
11 | `x` Теперь используется `BrowserWindowTracker.getTopWindow()` вместо удаленного `RecentWindow.getMostRecentBrowserWindow()` в Firefox 61+, спасибо Dumby.
12 | `x` Исправлено определение XULElement в Firefox 61+.
13 | `x` Теперь используется nsIFaviconService вместо удаленного mozIAsyncFavicons в Firefox 62+.
14 | `x` Исправлена работа extensions.privateTab.rememberClosedPrivateTabs = true в Firefox 57+.
15 | `x` Исправлено определение новых пустых вкладок в Firefox 58+ (bug 1409784).
16 | `x` Исключены попытки обновления удаленного TrackingProtection.icon в Firefox 63+.
17 | `x` Исправления для совместимости с Pale Moon 28.1+ и Basilisk.
18 | `x` Исправлена подсветка закрытых приватных вкладок в меню.
19 | `x` Исправлена кнопка после последней вкладки в Firefox 65+ (теперь доступна только через getAnonymousElementByAttribute(), также теперь используется специальный атрибут вместо использования трюка c [currentset*=…] в стилях).
20 | `x` Исправлен приватный протокол в Firefox 63+: восстановлено обновление иконки закладки без nsIContentFrameMessageManager (bug 1475727).
21 | `x` Исправлена валидация about:… ссылок типа private:about:newtab.
22 | `x` Исправлено контекстное меню в Firefox 64+, теперь передается triggeringPrincipal для открытия ссылок в приватных вкладках.
23 | `*` Переключение приватности через клонирование вкладки: добавлено принудительное отключение анимации открытия/закрытия вкладки.
24 | `*` Применение стилей приватного окна осуществляется без оптимизирующих производительность задержек, чтобы никогда не было видно промежуточные состояния переключающегося интерфейса.
25 | `x` Исправлен доступ к замене старых анонимных узлов XBL в Firefox 72+.
26 | `x` Исправлено использование `createElement()` в Firefox 69+ для отличного от XUL пространства имен по умолчанию (bug 1534407).
27 | `x` Исправлена подсветка приватных вкладок в Firefox 75+.
28 | `x` Исправлено определение browser.xhtml в Firefox 69+(bug 1553188).
29 | `*` Экспериментальное: добавлено наследование приватного состояния родительской вкладки (XUL-версии) Tree Style Tab.
30 | `x` Исправлено обновление иконки закладки при открытии private:… ссылки в текущей вкладке (через клонирование вкладки).
31 | `x` Исправлена обработка перетаскивания ссылки из приватной вкладки в обычную в Firefox 51+: будет использовано переключение приватности клонированием вкладки.
32 | `*` Улучшена API-функция privateTab.duplicateTabAndTogglePrivate(): добавлен аргумент onSuccessCallback.
33 |
34 | ##### 0.2.3pre (2018-03-23)
35 | `x` Добавлен хак для перетаскивания приватной вкладки в другое окно (при отключенном мультипроцессном режиме, спасибо Dumby) (#242).
36 | `+` Добавлена Dutch локаль (nl), спасибо TonnesM (#268).
37 | `+` Добавлена болгарская локаль (bg), спасибо Peyu Yovev (#270, #271, #272).
38 | `+` Обновлена арабская (ar) локаль, спасибо tahani5.
39 | `*` Улучшен внешний вид кнопки после последней вкладки в Firefox 57+ (для extensions.legacy.enabled = true, также добавлена настройка extensions.privateTab.fixAfterTabsButtonsAccessibility.force).
40 | `*` Корректировки для совместимости с Basilisk.
41 | `x` Исправлено использование функций-генераторов в Firefox 58+ (bug 1083482).
42 | `x` Исправлены строковые настройки в Firefox 58+ (bug 1414096).
43 | `x` Исправлен приватный протокол в Firefox 58+ (странное поведение с __defineGetter__(), доступный только для чтения nsIURI.spec) (bug 1431204).
44 | `x` Исправлено использование inIDOMUtils в Firefox 59+, теперь используется window.InspectorUtils (bug 1427419).
45 | `x` Исправлена обработка первого окна браузера в Firefox 60+ (browser.startup.blankWindow = true, спасибо Dumby) (bug 1336227).
46 | `x` Исправлены горячие клавиши в Firefox 60+, добавлена замена для удаленного nsIDOMKeyEvent bug 1436508.
47 | `x` Исправлена работа с внутренними данными DownloadsCommon.jsm в Firefox 57+.
48 |
49 | ##### 0.2.2 (2017-05-27)
50 | `*` Обновлено и откорректировано API-событие `PrivateTab:PrivateChanged` API event: добавлена возможность отслеживания переключения с помощью дублирования вкладки в Firefox 51+ (#244).
51 | `*` Переключение приватности через клонирование вкладки: теперь делается попытка восстановить текст в адресной строке (#237).
52 | `x` Исправлен приватный протокол в Firefox 37-43 (возникало исключение в `nsIIOService.newChannelFromURIWithLoadInfo(…, null)`) (#247).
53 | `+` Обновлена индонезийская (id) локаль, спасибо Muhammad Anwari Ramadhan.
54 | `x` Исправлена возможность открытия новой приватной вкладки в Firefox 54+ (с browser.newtab.preload = true) (#252).
55 | `+` Добавлен API privateTab.replaceTabAndTogglePrivate().
56 | `x` Исправлена возможность открытия private:… ссылок в уже открытых вкладках (будет использоваться обходной путь с клонированием вкладки) (#251).
57 |
58 | ##### 0.2.1.2 (2017-01-27)
59 | `x` Исправлено переключение приватности выгруженных вкладок в Firefox 51+ (#237).
60 | `x` Добавлен запрет переключения приватности еще не загруженных вкладок в 51+ во избежание повреждения содержимого вкладок: добавлено ожидание загрузки и предотвращаются слишком частые вызовы переключения (#237).
61 | `x` Исправлено удаление оберток для функций из других расширений типа `window.TabScope._updateTitle()` в Firefox 45+ (теперь для расширений используется «песочница», и будет использован трюк для получения ссылки на актуальный объект `window` для сохранения внутренних данных).
62 | `x` Исправлено переключение приватности вкладок при выключенном мультипроцессном режиме в Firefox 51+ (#237, #241).
63 | `x` Исправлено переключение приватности закрепленных вкладок в Firefox 51+ (добавлено восстановление закрепленности) (#237).
64 |
65 | ##### 0.2.1.1 (2017-01-21)
66 | `x` Исправлено обновление заголовка и внешнего вида окна при переключении приватности активной не мультипроцессной вкладки (восстановлении не мультипроцессной приватной вкладки) в Firefox 51+ (#237, #239).
67 | `x` При отключении расширения закрытые приватные вкладки теперь не сохраняются в списке для восстановления (extensions.privateTab.rememberOwnerTab = true).
68 | `x` Подкорректировано переключение приватности уже открытых вкладок в Firefox 51+: теперь используется более надежный способ ожидания асинхронного клонирования вкладки (#237).
69 | `x` Исправлено переключение приватных вкладок в обычный режим при отключении расширения в Firefox 51+.
70 | `x` Исправлено: расширение не запускалось на новом профиле (ReferenceError: _log is not defined) (#240).
71 |
72 | ##### 0.2.1 (2017-01-18)
73 | `*` Немного улучшена производительность при запуске в мультипроцессном режиме: frame script теперь загружается после небольшой задержки.
74 | `x` Исправлено восстановление обертки вокруг `browser.swapDocShells()` для обработки «оторванных» вкладок в мультипроцессном режиме.
75 | `*` Улучшена производительность в мультипроцессном режиме (#234).
76 | `*` Открытие всех закладок: улучшена совместимость с другими расширениями, например, с Tree Style Tab (настройка extensions.privateTab.openPlacesInPrivateTabs.callNativeMenuItems).
77 | `*` Улучшено потребление памяти в мультипроцессном режиме: теперь используется общий модуль content.jsm для frame scripts (#235).
78 | `+` Добавлен API privateTab.isTabPrivateAsync().
79 | `x` Исправлена совместимость с будущими версиями Firefox: прекращено использование Array generics вида `Array.forEach()` (bug 1222547).
80 | `x` Исправлено открытие новой приватной вкладки с предзагруженным about:newtab в Firefox 52+ (спасибо Dumby).
81 | `x` Исправлена возможность переключения приватности вкладок в Firefox 51+, теперь будет использоваться клонированная вкладка (#237).
82 | `x` Исправлен патчер при наличии оберток от других расширений (TypeError: Array is undefined) (спасибо Dumby).
83 | `x` Исправлена совместимость с будущими версиями Firefox: прекращено использование `Date.prototype.toLocaleFormat()` (bug 818634).
84 | `+` Добавлен API privateTab.duplicateTabAndTogglePrivate().
85 | `x` Добавлено игнорирование некорректного оповещения "last-pb-context-exited" в мультипроцессном режиме (bug 1329912).
86 | `x` Исправлена возможность восстановления закрытых приватных вкладок в мультипроцессном режиме (настройка extensions.privateTab.rememberClosedPrivateTabs) (#239).
87 |
88 | ##### 0.2.0 (2016-08-25)
89 | `x` Исправления для мультипроцессного режима (Electrolysis aka e10s) в части «unsafe CPOW usage» (#208).
90 | `*` Обновлена португальская (Португалия) локаль (pt-PT), спасибо SW1FT (#210).
91 | `x` Исправлен приватный протокол в мультипроцессном режиме (#211).
92 | `x` Некоторые улучшения и исправления для мультипроцессного режима (#162).
93 | `*` Теперь используется только один frame script для обмена сообщениями в мультипроцессном режиме (#213).
94 | `x` Исправлена возможная рекурсия в обертке для `tab.setAttribute("image", …)` (#214).
95 | `x` Исправлена совместимость с Firefox 51+ (SyntaxError: non-generator method definitions may not contain yield) (#228).
96 | `x` Исправлено определение клонированных вкладок как не пустых (#230).
97 | `x` Исправлено определение закрытия вкладок в Firefox 47+ (из-за изменений в свойстве `detail` события `TabClose`).
98 | `x` Исправлено отсутствие иконок вкладок в мультипроцессном режиме (#224).
99 | `+` Добавлена финская локаль (fi), спасибо hellojole (#226).
100 | `*` Небольшие внутренние улучшения и исправления.
101 |
102 | ##### 0.1.9.1 (2016-02-01)
103 | `x` Исправлена синтаксическая ошибка в Firefox 46.0a1+ при использовании generator comprehension (#203).
104 | `x` Исправлена обработка вкладок для просмотра исходного кода страницы (#204).
105 | `x` Учитывается настройка browser.chrome.image_icons.max_size при просмотре отдельных изображений.
106 | `x` Ссылки, открытые в новой приватной вкладке, становились не приватными (мультипроцессный режим: Electrolysis aka e10s) (#202).
107 | `x` Исправлено обновление заголовка окна и индикатора приватного режима в мультипроцессном режиме.
108 | `*` Обновлена французская локаль (fr), спасибо Charles Milette (#207).
109 |
110 | ##### 0.1.9 (2016-01-02)
111 | `*` Используется новый API для получения адреса новой вкладки в Firefox 44+ (см. bug 1204983).
112 | `x` Исправлена обработка перетаскивания вкладок между приватными и обычными окнами в Firefox 44+.
113 | `+` Добавлена поддержка пользовательского интерфейса защиты от отслеживания в Firefox 42+ (#196).
114 | `x` Исправлено: настройка extensions.privateTab.rememberClosedPrivateTabs в некоторых случаях могла ломать возможность восстановления закрытых вкладок (#197).
115 | `+` Добавлена португальская (Португалия) локаль (pt-PT), спасибо SW1FT (#199).
116 |
117 | ##### 0.1.8.1 (2015-10-24)
118 | `x` Исправлена поддержка приватных загрузок в панели загрузок в Firefox 42+ (#186).
119 | `x` Исправлено: настройка extensions.privateTab.rememberClosedPrivateTabs могла не работать в некоторых случаях (см. #146).
120 |
121 | ##### 0.1.8 (2015-08-12)
122 | `x` Исправлена совместимость с будущими версиями Firefox (bug 1090880, #178).
123 | `x` Исправлены иконки кнопок после последней вкладки в Firefox 40+ (#180).
124 | `x` Используется правильный адрес при открытии приватной вкладки через панель задач Windows в Firefox 42+ (см. bug 1118285).
125 | `x` Некоторые исправления для мультипроцессного режима (Electrolysis aka e10s) (#162).
126 | `x` Исправлено определение вкладок, открытых из внешнего приложения в Firefox 38+ (#184).
127 |
128 | ##### 0.1.7.5 (2015-05-21)
129 | `x` Исправлено обновление панели загрузок при переключении между приватными и обычными вкладками в Firefox 38+ (#176).
130 |
131 | ##### 0.1.7.4 (2015-05-10)
132 | `x` Исправлена возможность запоминать закрытые приватные вкладки в Firefox 29+ (настройка extensions.privateTab.rememberClosedPrivateTabs) (#146).
133 | `+` Добавлена подсветка закрытых приватных вкладок в меню «Недавно закрытые вкладки» (#154).
134 | `*` Улучшена работа галочки «Приватная вкладка» (в контекстном меню вкладок) для загружающихся вкладок (настройка extensions.privateTab.toggleTabPrivateAutoReload.stopLoading).
135 | `x` Исправлен размер кнопки «Новая приватная вкладка» после последней вкладки, если открыто много вкладок и кнопка была скрыта на момент запуска.
136 | `x` Исправлена совместимость с Firefox 38+ (#165).
137 | `+` Добавлено: privateTab.hasClosedTabs и privateTab.forgetClosedTabs() API для других расширений.
138 |
139 | ##### 0.1.7.3 (2014-08-09)
140 | `x` Исправлено восстановление закрытых не приватных вкладок в приватных окнах.
141 | `*` Улучшена поддержка иконок у private:… закладок (#147).
142 | `*` Обновлена вьетнамская локаль (vi), спасибо Leof36.
143 | `x` Исправлен протокол «private» в Firefox 20 и 21 (#150).
144 | `*` Увеличена иконка расширения, отображающаяся в управлении дополнениями: теперь используется 48×48px вместо 32×32px.
145 | `x` Исправлено определение пустых вкладок в Firefox 33+ (не пустые вкладки некорректно определялись как пустые и становились не приватными) (#152).
146 |
147 | ##### 0.1.7.2 (2014-05-18)
148 | `*` Добавлена возможность использовать простые ссылки вида private:example.com, префикс `http://` будет автоматически добавлен ко всем ссылкам без протокола.
149 | `x` Подправлена подпись кнопки «Новая приватная вкладка» в русской и французской локалях в Firefox 29+ (Australis): теперь используется короткий вариант из-за небольшой доступной длины в новом меню (#141).
150 | `x` Подкорректировано предыдущее исправление вида кнопки «Новая приватная вкладка» после последней вкладки при наведении курсора в Firefox 29+ (Australis) (#138).
151 | `+` Добавлена турецкая локаль (tr), спасибо alfapegasi.
152 | `x` Исправлено определение страниц от Super Start 7.0+ как пустых (#142).
153 | `+` Добавлено: privateTab.tabLabelIsEmpty() API для других расширений (#143).
154 | `x` Исправлено: закрытые приватные вкладки по ошибке удалялись в приватных окнах (#145).
155 |
156 | ##### 0.1.7.1 (2014-04-20)
157 | `+` Добавлено отображение сочетания клавиш во всплывающей подсказке кнопки для панелей инструментов в Firefox 29+ (Australis) (#136).
158 | `x` Workaround для корректного обновления заголовка окна в Firefox 29+ (Australis), также см. bug 987929 (или вы можете использовать более корректно работающий обходной путь – установить browser.tabs.drawInTitlebar = false или extensions.privateTab.usePrivateWindowStyle = false).
159 | `x` Исправлена ширина кликабельной области кнопки «Новая приватная вкладка» после последней вкладки в Firefox 29+ (Australis) (#137).
160 | `x` Подправлен внешний вид кнопки «Новая приватная вкладка» после последней вкладки в Firefox 29+ (Australis) (#138).
161 | `*` Улучшен протокол «private»: теперь работают простые ссылки вида private:http://example.com/, а не только private:///#http://example.com/.
162 |
163 | ##### 0.1.7 (2014-02-11)
164 | `+` Добавлена возможность удалять приватные вкладки из списка для восстановления закрытых вкладок только после завершения приватного просмотра (#112).
165 | `+` Добавлена подсветка приватных вкладок в меню «Список всех вкладок» (#113).
166 | `x` Исправлено: сочетания клавиш из одного символа (например, просто `V` или `Shift+V`) теперь игнорируются в WYSIWYG редакторах.
167 | `x` Исправлена обработка встроенных приватных окон в SeaMonkey (#116).
168 | `x` Исправлено обновление панели загрузок в Firefox 28.0a1+.
169 | `x` Исправлено добавление кнопки на панель инструментов в Firefox 29+ (Australis) (#121).
170 | `+` Добавлены настройки для изменения адреса, который будет открываться в новых пустых вкладках (extensions.privateTab.newPrivateTabURL и extensions.privateTab.newPrivateTabURL.inPrivateWindow) (#125).
171 | `+` Добавлена возможность отключения стилей приватного окна, если активна приватная вкладка (настройка extensions.privateTab.usePrivateWindowStyle).
172 | `+` Упрощена возможность перезаписи стилей приватных вкладок/закладок из других тем/расширений (по умолчанию отключено, см. настройки extensions.privateTab.stylesHighPriority\*) (#127).
173 | `+` Добавлена иконка 32×32px для Australis'а (используется в панели меню и при настройке панелей) (#128).
174 | `x` Исправлено: история панели поиска сохранялась в приватных вкладках (#129).
175 | `*` Небольшие улучшения кода.
176 | `+` Обновлена польская локаль (pl), спасибо marcinsu.
177 | `*` Обновлена венгерская локаль (hu), спасибо evenorbert.
178 |
179 | ##### 0.1.6 (2013-10-31)
180 | `*` Улучшена совместимость с Tab Mix Plus (большое спасибо onemen'у за исправления со стороны Tab Mix Plus) (#95, #96).
181 | `+` В контекстное меню кнопки на панели задач добавлен пункт «новая приватная вкладка» (только Windows 7 и выше, настройка extensions.privateTab.showItemInTaskBarJumpList) (#98).
182 | `+` Добавлен пункт контекстного меню для открытия нескольких закладок/элементов истории в приватных вкладках (#99).
183 | `*` Изменено сочетание клавиш по умолчанию для переключения приватности текущей вкладки с Ctrl+Alt+V на Ctr+Alt+T (установите extensions.privateTab.key.toggleTabPrivate = «control alt VK_V» для восстановления старого сочетания) (#105).
184 | `+` Добавлена возможность наследования приватного состояния для новых пустых вкладок и окон (установите extensions.privateTab.makeNewEmptyTabsPrivate/extensions.privateTab.makeNewEmptyWindowsPrivate в `-1`) (#111).
185 |
186 | ##### 0.1.5 (2013-08-24)
187 | `*` Добавлена возможность отображения кнопок «Новая приватная вкладка» и «Новая вкладка» после последней вкладки (#92).
188 | `x` Исправлено: вкладки, открытые из других расширений, могли некорректно определяться как открытые из внешнего приложения (#93).
189 | `x` Исправлено: некорректные ссылки с использованием протокола «private» приводили к падению браузера (#94).
190 |
191 | ##### 0.1.4 (2013-08-19)
192 | `x` Исправлены пустые всплывающие подсказки у вкладок в Firefox 25.0a1+ (#75).
193 | `+` Добавлена возможность просмотра исходного кода приватных вкладок (#74).
194 | `x` Подкорректирована метка «(приватная вкладка)» на всплывающей панели Tab Scope (#78).
195 | `+` Добавлена индонезийская (id) локаль, спасибо Daisuke Bjm Project.
196 | `+` Добавлена украинская (uk) локаль, спасибо dbv92.
197 | `+` Добавлена арабская (ar) локаль, спасибо infinity.
198 | `*` Улучшена совместимость с расширениями типа Fast Dial (#84).
199 | `x` Исправлена несовместимость с расширением Tile Tabs 10.0 (#83).
200 | `x` Добавлены исправления для бага Mozilla #885177 (#85).
201 | `*` Добавлено сохранение текста в адресной строке после автоматической перезагрузке (#86).
202 | `*` Улучшено поведение после закрытия приватных вкладок (настройка extensions.privateTab.rememberOwnerTab) (#87).
203 | `+` Реализован протокол «private»: теперь можно использовать специальные ссылки для открытия приватных вкладок из закладок или из командной строки (пример: private:///#https://addons.mozilla.org/, может быть отключено с помощью настройки extensions.privateTab.enablePrivateProtocol) (#89).
204 | `+` Добавлена возможность показывать кнопку «Новая приватная вкладка» после кнопки «Новая вкладка» (#90).
205 | `*` Добавлена возможность инвертирования поведения автоматической перезагрузки (настройка extensions.privateTab.toggleTabPrivateAutoReload) с помощью клика средней кнопкой мыли (или левой с любым модификатором).
206 |
207 | ##### 0.1.3 (2013-06-13)
208 | `+` Добавлена возможность предотвращения завершения приватной сессии (в случае наличия активных загрузок и т.п.) (#53).
209 | `x` Исправлена возможная утечка памяти (только если кто-то использовал privateTab.readyToOpenTabs() без последующего privateTab.stopToOpenTabs()).
210 | `x` Исправлено: небольшие изображения из приватных вкладок (отображаются с иконками на вкладках) кэшировались на диск (#56).
211 | `x` Отключено сохранение миниатюр для приватных вкладок (#58).
212 | `+` Добавлена настройка extensions.privateTab.debug.verbose для разрешения вывода дополнительной отладочной информации в консоль ошибок.
213 | `x` Исправлен конфликт с расширением NoSquint (#61).
214 | `*` Небольшие улучшения производительности.
215 | `*` Улучшена возможность локализации диалога подтверждения в случае отключения или удаления расширения.
216 | `+` Добавлены локали:
217 | Catalan (ca), спасибо Dimas-sc
218 | Hungarian (hu), спасибо evenorbert
219 | Italian (it), спасибо moretti
220 | Portuguese (Brazilian) (pt-BR), спасибо Ghelman
221 | Serbian (sr), спасибо DakSrbija
222 | Spanish (es), спасибо strel
223 | `*` Обновлены локали:
224 | Chinese (Simplified) (zh-CN), спасибо Cye3s
225 | Chinese (Traditional) (zh-TW), спасибо ikurrina
226 | Estonian (et), спасибо mdr-ksk
227 | French (fr) из babelzilla.org (переведено не все)
228 | German (de), спасибо sierkb
229 | Greek (el), спасибо Grg68
230 | Japanese (jp), спасибо charishi
231 | Polish (pl), спасибо marcinsu
232 |
233 | ##### 0.1.2 (2013-05-01)
234 | `+` Добавлена польская локаль (pl), спасибо marcinsu.
235 | `*` Подкорректировано: приватность текущей вкладки теперь не наследуется для новых вкладок и окон, открытых из внешних приложений (настройка extensions.privateTab.allowOpenExternalLinksInPrivateTabs) (#42).
236 | `x` Исправлено определение новых окон, открытых с помощью JavaScript-функции window.open() с указанием размеров как не пустых.
237 | `x` Исправлен внешний вид текущей приватной вкладки в Mac OS X (#44).
238 | `x` Исправлено: добавлено удаление оберток при закрытии окна, чтобы исключить утечки памяти (#45, #46).
239 | `+` Добавлена эстонская локать (et), спасибо mdr.ksk.
240 | `x` Исправлено: сочетание клавиш не отображалось в меню Файл в Mac OS X #47.
241 | `+` Добавлена настройка extensions.privateTab.keysHighPriority для обработки key\*-события в capturing (true) или bubbling (false) фазе, см. http://www.w3.org/TR/DOM-Level-3-Events/#event-flow.
242 | `*` Подкорректирована китайская (Traditional) локаль (zh-TW), спасибо ikurrina.
243 | `+` Добавлена возможность закрытия всех приватных вкладок при отключении или удалении расширения (#51).
244 |
245 | ##### 0.1.1 (2013-04-24)
246 | `+` Добавлена французская локаль (fr), спасибо Stis.
247 | `+` Добавлена китайская (Simplified) локаль (zh-CN), спасибо Cye3s.
248 | `x` Исправлена утечка памяти при отключении расширения (не удалялся объект window.privateTab) (#33).
249 | `+` Добавлена вьетнамская локаль (vi), спасибо Leof36.
250 | `+` Добавлена немецкая локаль (de), спасибо sierkb.
251 | `*` Улучшена совместимость с расширениями типа Personal Menu (#35).
252 | `+` Добавлено определение страниц от Super Start как пустых.
253 | `*` Улучшено: теперь приватные вкладки не сохраняются в сессиях (#36).
254 | `*` Улучшено: добавлено отображение загрузок из приватных вкладок в не приватном окне (#31).
255 | `*` Улучшена всплывающая подсказка для приватных вкладок в темах оформления с темным фоном всплывающих подсказок (#38).
256 | `+` Добавлена греческая локаль (el), спасибо Grg68.
257 |
258 | ##### 0.1.0 (2013-04-09)
259 | `*` Используется встроенный модификатор заголовка окна в последних версиях SeaMonkey 2.19a1+ (2013-03-27+).
260 | `*` Исправлено определение встроенных приватных окон в последних версиях SeaMonkey 2.19a1+ (2013-03-27+).
261 | `x` Исправлено восстановление заголовка окна в SeaMonkey при отключении расширения.
262 | `+` Добавлена возможность открывать все новые пустые вкладки в приватном режиме (экспериментальное, настройки: extensions.privateTab.makeNewEmptyTabsPrivate, extensions.privateTab.makeNewEmptyWindowsPrivate).
263 | `+` Добавлена китайская (Traditional) локаль (zh-TW), спасибо arbiger.
264 | `+` Добавлена японская локаль (ja), спасибо charishi.
265 | `x` Workaround для browser.newtab.preload = true.
266 | `x` Исправлено корректирование ширины кнопки-меню приложения: добавлена задержка, чтобы успели примениться стили других расширений.
267 | `x` Исправлено: сочетание клавиш для переключения приватности вкладки иногда работало не для текущей вкладки.
268 | `*` Добавлена возможность задания нескольких сочетаний клавиш для одной команды: extensions.privateTab.key.%command%#%alias_name%.
269 | `x` Исправлено (надеюсь): сочетания клавиш не работали на не латинских раскладках клавиатуры (#19).
270 | `*` Небольшие оптимизации.
271 |
272 | ##### 0.1.0b4 (2013-03-26)
273 | `+` Добавлено определение страниц от Speed Dial и FVD Speed Dial как пустых.
274 | `+` Добавлен атрибут «privateTab-isPrivate» для приватного окна (может использоваться в пользовательских стилях).
275 | `+` Добавлена кнопка для панелей инструментов.
276 | `x` Исправлено восстановление закрытых не приватных вкладок в приватных окнах.
277 | `+` Закрытые приватные вкладки больше не сохраняются в списке недавно закрытых (настройка extensions.privateTab.rememberClosedPrivateTabs).
278 | `+` Добавлена настройка extensions.privateTab.sendRefererHeader.
279 | `x` Перетаскивание: исправлено изменение приватности уже открытых вкладок.
280 | `*` Перетаскивание: новая вкладка (или вкладка, на которую перетащили) становится приватной, если источник или получатель были приватными (настройка extensions.privateTab.dragAndDropBehavior).
281 | `+` Реализованы API для других расширений.
282 | `+` Добавлено обновление вкладки после переключения приватности из контекстного меню (настройка extensions.privateTab.toggleTabPrivateAutoReload).
283 |
284 | ##### 0.1.0b3 (2013-03-19)
285 | `+` Добавлена возможность перетаскивания вкладок между приватными и не приватными окнами (настройка extensions.privateTab.dragAndDropTabsBetweenDifferentWindows).
286 | `x` Исправлено открытие ссылок в приватных вкладках: вкладки не сохранялись в истории, но использовались не приватные cookies.
287 |
288 | ##### 0.1.0b2 (2013-03-17)
289 | `*` Пункт контекстного меню закладок «Открыть в новой вкладке» теперь всегда открывает не приватную вкладку: после добавления пункта «Открыть в новой приватной вкладке» такое поведение более интуитивно.
290 | `x` Добавлено скрытие текста сочетаний клавиш в меню приложения и исправлено некорректное отображение текста сочетаний клавиш встроенного пункта «Новое приватное окно» (#3).
291 | `x` Исправлено обновление сочетаний клавиш в нескольких окнах при изменении настроек extensions.privateTab.key.\*.
292 | `x` Исправлено перетаскивание из приватных вкладок в приватном окне.
293 | `+` Добавлена настройка extensions.privateTab.dragAndDropUseTargetPrivateState для использования приватного состояния «получателя» для перетаскиваемых ссылок (#4).
294 | `*` Некоторые внутренние улучшения.
295 |
296 | ##### 0.1.0b2pre (2013-03-14)
297 | `*` Улучшен способ фиксирования ширины кнопки-меню приложения.
298 | `*` Добавлено обновление ширины «заполнителя» для кнопки-меню приложения, если ширина кнопки не может быть зафиксирована.
299 | `+` Добавлен пункт контекстного меню для закладок (#2).
300 |
301 | ##### 0.1.0b1 (2013-03-13)
302 | `*` Приватное состояние при перетаскивании теперь наследуется от вкладки-источника.
303 | `+` Экспериментальное: пункты меню теперь также добавляются и во встроенные приватные окна.
304 | `*` Теперь можно открыть новое не приватное окно из приватной вкладки (с помощью команды «Новое окно»).
305 | `+` Добавлена поддержка встроенного пункта контекстного меню «Открыть ссылку в новом приватном окне» в SeaMonkey 2.19a1.
306 | `*` Исправлена ширина кнопки-меню приложения: используется одна и та же ширина для приватного и не приватного состояния (настройка extensions.privateTab.fixAppButtonWidth).
307 | `x` Исправлено некорректное отображение пунктов контекстного меню «Открыть ссылку в новой вкладке/новом окне».
308 | `*` При открытии новой приватной вкладки фокус переносится а адресную строку.
309 |
310 | ##### 0.1.0a3 (2013-02-20)
311 | `*` Первая публичная версия.
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | #### Private Tab: Changelog
2 |
3 | `+` - added
4 | `-` - deleted
5 | `x` - fixed
6 | `*` - improved
7 |
8 | ##### master/HEAD
9 | `x` Fixed nsISessionStore usage in Firefox 61+(bug 1450559, thanks to Dumby).
10 | `x` Don't try to update removed things for “tabs in title bar” in Firefox 61+.
11 | `x` Use `BrowserWindowTracker.getTopWindow()` instead of removed `RecentWindow.getMostRecentBrowserWindow()` in Firefox 61+, thanks to Dumby.
12 | `x` Fixed XULElement detection in Firefox 61+.
13 | `x` Use nsIFaviconService instead of removed mozIAsyncFavicons in Firefox 62+.
14 | `x` Fixed extensions.privateTab.rememberClosedPrivateTabs = true in Firefox 57+.
15 | `x` Correctly detect new empty tabs in Firefox 58+ (bug 1409784).
16 | `x` Don't try to update removed TrackingProtection.icon in Firefox 63+.
17 | `x` Compatibility fixes for Pale Moon 28.1+ and Basilisk.
18 | `x` Correctly highlight closed private tabs in menus.
19 | `x` Fixed button after last tab in Firefox 65+ (now accessible only using getAnonymousElementByAttribute(), also set special attribute instead of [currentset*=…] trick in styles).
20 | `x` Fixed private protocol in Firefox 63+: correctly update bookmark favicon without nsIContentFrameMessageManager (bug 1475727).
21 | `x` Correctly validate about:… URIs like private:about:newtab.
22 | `x` Fixed context menu in Firefox 64+, specify triggeringPrincipal to open link in private tab.
23 | `*` Toggle private state using tab duplication: force disable tab open/close animations.
24 | `*` Apply private window styles without performance-optimized delays to newer show intermediate UI state.
25 | `x` Fixed accessing to replacements for old XBL anonymous nodes in Firefox 72+.
26 | `x` Fixed `createElement()` usage in Firefox 69+ for non-XUL default namespace (bug 1534407).
27 | `x` Correctly highlight private tabs in Firefox 75+.
28 | `x` Correctly detect browser.xhtml in Firefox 69+(bug 1553188).
29 | `*` Experimental: inherit private state from parent tab of (XUL-based) Tree Style Tab.
30 | `x` Correctly update bookmark favicon, if private:… URI was opened in current tab (with tab duplication trick).
31 | `x` Correctly handle dropped link from private tab into non-private tab in Firefox 51+: will be used tab duplication trick.
32 | `*` Improved privateTab.duplicateTabAndTogglePrivate() API function: added onSuccessCallback argument.
33 |
34 | ##### 0.2.3pre (2018-03-23)
35 | `x` Added trick to drag private tab to another window (with disabled multi-process mode, thanks to Dumby) (#242).
36 | `+` Added Dutch locale (nl), thanks to TonnesM (#268).
37 | `+` Added Bulgarian locale (bg), thanks to Peyu Yovev (#270, #271, #272).
38 | `+` Updated Arabic (ar) locale, thanks to tahani5.
39 | `*` Better appearance of button after last tab in Firefox 57+ (for extensions.legacy.enabled = true, also introduced extensions.privateTab.fixAfterTabsButtonsAccessibility.force preference).
40 | `*` Compatibility enhancements for Basilisk.
41 | `x` Fixed generator function usage in Firefox 58+ (bug 1083482).
42 | `x` Fixed string preferences in Firefox 58+ (bug 1414096).
43 | `x` Fixed private protocol in Firefox 58+ (strange things with __defineGetter__(), nsIURI.spec is now read-only) (bug 1431204).
44 | `x` Fixed inIDOMUtils usage in Firefox 59+, now used window.InspectorUtils (bug 1427419).
45 | `x` Correctly handle first browser window in Firefox 60+ (browser.startup.blankWindow = true, thanks to Dumby) (bug 1336227).
46 | `x` Fixed hotkeys hotkeys in Firefox 60+, added replacement for removed nsIDOMKeyEvent bug 1436508.
47 | `x` Fixed accessing to DownloadsCommon.jsm internals in Firefox 57+.
48 |
49 | ##### 0.2.2 (2017-05-27)
50 | `*` Updated and corrected `PrivateTab:PrivateChanged` API event: added ability to track toggling using tab duplication in Firefox 51+ (#244).
51 | `*` Toggle private state using tab duplication: try restore text in URL bar (#237).
52 | `x` Fixed private protocol in Firefox 37-43 (caused by `nsIIOService.newChannelFromURIWithLoadInfo(…, null)` failure) (#247).
53 | `*` Updated Indonesian (id) locale, thanks to Muhammad Anwari Ramadhan.
54 | `x` Fixed ability to open new private tab in Firefox 54+ (with browser.newtab.preload = true) (#252).
55 | `+` Added privateTab.replaceTabAndTogglePrivate() API.
56 | `x` Fixed ability to open private:… URI in already opened tab (will be used workaround with tab duplication) (#251).
57 |
58 | ##### 0.2.1.2 (2017-01-27)
59 | `x` Correctly toggle private state of unloaded (pending) tabs in Firefox 51+ (#237).
60 | `x` Don't toggle private state of not yet initialized tabs in Firefox 51+ to not break tab's contents: wait for loading and forbid too often toggle state calls (#237).
61 | `x` Correctly remove wrappers for functions from another extensions like `window.TabScope._updateTitle()` in Firefox 45+ (now sandboxed, will used trick to get actual `window` object to store internal data).
62 | `x` Correctly toggle private state with disabled multi-process mode in Firefox 51+ (#237, #241).
63 | `x` Correctly toggle private state of pinned tabs in Firefox 51+ (now pinned state will be restored) (#237).
64 |
65 | ##### 0.2.1.1 (2017-01-21)
66 | `x` Correctly update window title and style, if toggled private state of selected non-remote tab (restored non-remote private tab) in Firefox 51+ (#237, #239).
67 | `x` Don't save closed private tabs in undo close history after extension disabling (extensions.privateTab.rememberOwnerTab = true).
68 | `x` Correctly toggle private state of already opened tabs in Firefox 51+: now used more robust way to wait for asynchronous tab duplication (#237).
69 | `x` Correctly make tabs non-private after extension disabling in Firefox 51+.
70 | `x` Fixed: fail to startup on new profile (ReferenceError: _log is not defined) (#240).
71 |
72 | ##### 0.2.1 (2017-01-18)
73 | `*` Slightly improved startup performance in multi-process mode: frame script will be loaded after small delay.
74 | `x` Correctly restore wrapper for `browser.swapDocShells()` to handle detached tabs in multi-process mode.
75 | `*` Improved performance in multi-process mode (#234).
76 | `*` Open all bookmarks: improved compatibility with other extensions like Tree Style Tab (extensions.privateTab.openPlacesInPrivateTabs.callNativeMenuItems preference).
77 | `*` Improved memory usage in multi-process mode: now used shared content.jsm module for frame scripts (#235).
78 | `+` Added privateTab.isTabPrivateAsync() API.
79 | `x` Fixed compatibility with future Firefox versions: don't use Array generics like `Array.forEach()` (bug 1222547).
80 | `x` Correctly open new private tab with preloaded about:newtab in Firefox 52+ (thanks to Dumby).
81 | `x` Fixed ability to toggle tab private state in Firefox 51+, now will be used duplicated tab (#237).
82 | `x` Fixed patcher around third-party wrappers (TypeError: Array is undefined) (thanks to Dumby).
83 | `x` Fixed compatibility with future Firefox versions: don't use deprecated `Date.prototype.toLocaleFormat()` (bug 818634).
84 | `+` Added privateTab.duplicateTabAndTogglePrivate() API.
85 | `x` Workaround to ignore wrong `last-pb-context-exited` notification in multi-process mode (bug 1329912).
86 | `x` Fixed ability to restore closed private tabs in multi-process mode (extensions.privateTab.rememberClosedPrivateTabs preference) (#239).
87 |
88 | ##### 0.2.0 (2016-08-25)
89 | `x` Compatibility fixes for multi-process mode (Electrolysis aka e10s) around “unsafe CPOW usage” (#208).
90 | `*` Updated Portuguese (Portugal) locale (pt-PT), thanks to SW1FT (#210).
91 | `x` Fixed private protocol in multi-process mode (#211).
92 | `x` Some tweaks and fixes for multi-process mode (#162).
93 | `*` Now used only one frame script for communications in multi-process mode (#213).
94 | `x` Fixed possible recursion in wrapper for `tab.setAttribute("image", …)` (#214).
95 | `x` Fixed compatibility with Firefox 51+ (SyntaxError: non-generator method definitions may not contain yield) (#228).
96 | `x` Fixed detection of duplicated tabs as non-empty (#230).
97 | `x` Correctly detect tab closing in Firefox 47+ (due to changes in `detail` property of `TabClose` event).
98 | `x` Fixed missing tab favicons in multi-process mode (#224).
99 | `+` Added Finnish locale (fi), thanks to hellojole (#226).
100 | `*` Small internal enhancements and fixes.
101 |
102 | ##### 0.1.9.1 (2016-02-01)
103 | `x` Fixed syntax error in Firefox 46.0a1+ around generator comprehension (#203).
104 | `x` Correctly handle view source tabs (#204).
105 | `x` Respect browser.chrome.image_icons.max_size preference for image documents.
106 | `x` Links loaded in new private tab becomes non-private (multi-process mode: Electrolysis aka e10s) (#202).
107 | `x` Correctly update window title and private mode indication in multi-process mode.
108 | `*` Updated French locale (fr), thanks to Charles Milette (#207).
109 |
110 | ##### 0.1.9 (2016-01-02)
111 | `*` Use new API to get URL of new tab in Firefox 44+ (see bug 1204983).
112 | `x` Correctly handle drag and drop of tabs between private and non-private windows in Firefox 44+.
113 | `+` Added support for user interface for tracking protection in Firefox 42+ (#196).
114 | `x` Fixed: extensions.privateTab.rememberClosedPrivateTabs may break undo close tab feature in some cases (#197).
115 | `+` Added Portuguese (Portugal) locale (pt-PT), thanks to SW1FT (#199).
116 |
117 | ##### 0.1.8.1 (2015-10-24)
118 | `x` Fixed support for private downloads in download panel in Firefox 42+ (#186).
119 | `x` Fixed: extensions.privateTab.rememberClosedPrivateTabs may not work in some cases (see #146).
120 |
121 | ##### 0.1.8 (2015-08-12)
122 | `x` Fixed compatibility with future Firefox versions (bug 1090880, #178).
123 | `x` Fixed icons of buttons after last tab in Firefox 40+ (#180).
124 | `x` Use correct URL to open private tab from Windows task bar in Firefox 42+ (see bug 1118285).
125 | `x` Some compatibility fixes for multi-process mode (Electrolysis aka e10s) (#162).
126 | `x` Fixed detection of externally opened tabs in Firefox 38+ (#184).
127 |
128 | ##### 0.1.7.5 (2015-05-21)
129 | `x` Correctly reinitialize download panel after switch between private and non-private tabs in Firefox 38+ (#176).
130 |
131 | ##### 0.1.7.4 (2015-05-10)
132 | `x` Fixed ability to remember closed private tabs in Firefox 29+ (extensions.privateTab.rememberClosedPrivateTabs preference) (#146).
133 | `+` Added highlighting for closed private tabs inside “Recently Closed Tabs” menu (#154).
134 | `*` Now “Private Tab” checkbox (in tab context menu) works better for loading tabs (extensions.privateTab.toggleTabPrivateAutoReload.stopLoading preference).
135 | `x` Fixed size of “New Private Tab” button after last tab, if there is many tabs and button was hidden at startup.
136 | `x` Fixed compatibility with Firefox 38+ (#165).
137 | `+` Added privateTab.hasClosedTabs and privateTab.forgetClosedTabs() API for other extensions.
138 |
139 | ##### 0.1.7.3 (2014-08-09)
140 | `x` Correctly restore closed non-private tabs in private windows.
141 | `*` Improved favicons support in private:… bookmarks (#147).
142 | `*` Updated Vietnamese locale (vi), thanks to Leof36.
143 | `x` Fixed “private” protocol in Firefox 20 and 21 (#150).
144 | `*` Enlarged extension icon for Add-on Manager: now used 48×48px instead of 32×32px.
145 | `x` Fixed detection of emty tabs in Firefox 33+ (non-empty tabs was wrongly detected as empty and becomes non-private) (#152).
146 |
147 | ##### 0.1.7.2 (2014-05-18)
148 | `*` Added ability to use simple links like private:example.com, `http://` prefix will be added automatically to all links without protocol.
149 | `x` Corrected label for “New Private Tab” button in Russian and French locales in Firefox 29+ (Australis): now used short variant due to small available length in new menu (#141).
150 | `x` Corrected previous fix for appearance of hovered “New Private Tab” button after last tab in Firefox 29+ (Australis) (#138).
151 | `+` Added Turkish locale (tr), thanks to alfapegasi.
152 | `x` Correctly detect Super Start 7.0+ page as blank (#142).
153 | `+` Added privateTab.tabLabelIsEmpty() API for other extensions (#143).
154 | `x` Fixed: closed private tabs are wrongly cleared in private windows (#145).
155 |
156 | ##### 0.1.7.1 (2014-04-20)
157 | `+` Display hotkey in toolbar button's tooltip in Firefox 29+ (Australis) (#136).
158 | `x` Workaround to correctly update title bar in Firefox 29+ (Australis), also see bug 987929 (you can set browser.tabs.drawInTitlebar = false or extensions.privateTab.usePrivateWindowStyle = false as alternative and better workaround).
159 | `x` Fixed width of clickable area for “New Private Tab” button after last tab in Firefox 29+ (Australis) (#137).
160 | `x` Corrected appearance for “New Private Tab” button after last tab in Firefox 29+ (Australis) (#138).
161 | `*` Improved “private” protocol: now works simple private:http://example.com/ links, not only private:///#http://example.com/.
162 |
163 | ##### 0.1.7 (2014-02-11)
164 | `+` Added ability to remove private tabs from undo close history only after private browsing ends (#112).
165 | `+` Added highlighting of private tabs in “List all tabs” menu (#113).
166 | `x` Correctly ignore single char hotkeys (like just `V` or `Shift+V`) in WYSIWYG editors.
167 | `x` Correctly detect built-in private windows in SeaMonkey (#116).
168 | `x` Correctly update download panel in Firefox 28.0a1+.
169 | `x` Correctly insert button into toolbar in Firefox 29+ (Australis) (#121).
170 | `+` Added preferences to open user-defined URL in new empty private tabs (extensions.privateTab.newPrivateTabURL and extensions.privateTab.newPrivateTabURL.inPrivateWindow) (#125).
171 | `+` Added ability to disable private window-like styles, if current tab is private (extensions.privateTab.usePrivateWindowStyle preference).
172 | `+` Simplified ability to override private tabs/bookmarks styles from other themes/extensions (disabled by default, see extensions.privateTab.stylesHighPriority\* preferences) (#127).
173 | `+` Added 32×32px icon for Australis (used in menu panel and in customization area) (#128).
174 | `x` Correctly don't save search bar history from private tabs (#129).
175 | `*` Minor code improvements.
176 | `*` Updated Polish locale (pl), thanks to marcinsu.
177 | `*` Updated Hungarian locale (hu), thanks to evenorbert.
178 |
179 | ##### 0.1.6 (2013-10-31)
180 | `*` Improved compatibility with Tab Mix Plus (many thanks to onemen for fixes from Tab Mix Plus side) (#95, #96).
181 | `+` Added “new private tab” item to task bar context menu (only Windows 7 and higher, extensions.privateTab.showItemInTaskBarJumpList preference) (#98).
182 | `+` Added context menu item to open multiple bookmarks/history items in private tabs (#99).
183 | `*` Changed default hotkey for toggle private state of current tab from Ctrl+Alt+V to Ctr+Alt+T (set extensions.privateTab.key.toggleTabPrivate = “control alt VK_V” to restore old hotkey) (#105).
184 | `+` Added ability to inherit private state for new empty tabs and windows (set extensions.privateTab.makeNewEmptyTabsPrivate/extensions.privateTab.makeNewEmptyWindowsPrivate to `-1`) (#111).
185 |
186 | ##### 0.1.5 (2013-08-24)
187 | `*` Added ability to show buttons “New Private Tab” and “New Tab” after last tab (#92).
188 | `x` Fixed: tabs, opened from another extensions, may be wrongly detected as externally opened (#93).
189 | `x` Fixed: malformed private-protocol URLs reliably crash the browser (#94).
190 |
191 | ##### 0.1.4 (2013-08-19)
192 | `x` Fixed empty tabs tooltips on Firefox 25.0a1+ (#75).
193 | `+` Added ability to view source of private tabs (#74).
194 | `x` Corrected “(private tab)” label in Tab Scope's popup (#78).
195 | `+` Added Indonesian (id) locale, thanks to Daisuke Bjm Project.
196 | `+` Added Ukrainian (uk) locale, thanks to dbv92.
197 | `+` Added Arabic (ar) locale, thanks to infinity.
198 | `*` Improved compatibility with extensions like Fast Dial (#84).
199 | `x` Fixed incompatibility with Tile Tabs 10.0 (#83).
200 | `x` Corrected for changes in Mozilla bug #885177 (#85).
201 | `*` Preserve text in URL Bar after auto reloading (#86).
202 | `*` Improved behavior after closing of private tabs (extensions.privateTab.rememberOwnerTab preference) (#87).
203 | `+` Implemented “private” protocol: now we can use special URLs to open private tabs from bookmarks or from command line (example: private:///#https://addons.mozilla.org/, may be disabled using extensions.privateTab.enablePrivateProtocol preference) (#89).
204 | `+` Added ability to show “New Private Tab” button after “New Tab” button (#90).
205 | `*` Added ability to invert auto reload behavior (extensions.privateTab.toggleTabPrivateAutoReload preference) using middle-click (or left-click with any modifier).
206 |
207 | ##### 0.1.3 (2013-06-13)
208 | `+` Added ability to prevent private session from ending (in case of active downloads etc.) (#53).
209 | `x` Fixed possible memory leak (only if someone use privateTab.readyToOpenTabs() without following privateTab.stopToOpenTabs()).
210 | `x` Fixed: small images from private tabs (displayed with favicons) are cached to disk (#56).
211 | `x` Disabled thumbnails capturing from private tabs (#58).
212 | `+` Added extensions.privateTab.debug.verbose preference to log some additional debug information into Error Console.
213 | `x` Fixed conflict with NoSquint extension (#61).
214 | `*` Small performance improvements.
215 | `*` Improved localizability of confirmation dialog in case of extension disabling or uninstalling.
216 | `+` Added locales:
217 | Catalan (ca), thanks to Dimas-sc
218 | Hungarian (hu), thanks to evenorbert
219 | Italian (it), thanks to moretti
220 | Portuguese (Brazilian) (pt-BR), thanks to Ghelman
221 | Serbian (sr), thanks to DakSrbija
222 | Spanish (es), thanks to strel
223 | `*` Updated locales:
224 | Chinese (Simplified) (zh-CN), thanks to Cye3s
225 | Chinese (Traditional) (zh-TW), thanks to ikurrina
226 | Estonian (et), thanks to mdr-ksk
227 | French (fr) from babelzilla.org (yes, not complete)
228 | German (de), thanks to sierkb
229 | Greek (el), thanks to Grg68
230 | Japanese (jp), thanks to charishi
231 | Polish (pl), thanks to marcinsu
232 |
233 | ##### 0.1.2 (2013-05-01)
234 | `+` Added Polish locale (pl), thanks to marcinsu.
235 | `*` Corrected: don't inherit private state for new tabs and new windows, opened from external application (extensions.privateTab.allowOpenExternalLinksInPrivateTabs preference) (#42).
236 | `x` Correctly detect new windows from JavaScript's window.open() with size parameters as not empty.
237 | `x` Correct appearance for selected private on Mac OS X (#44).
238 | `x` Fixed: remove wrappers when window is closed to avoid memory leaks (#45, #46).
239 | `+` Added Estonian locale (et), thanks to mdr.ksk.
240 | `x` Fixed: hotkey isn't shown in File menu on Mac OS X #47.
241 | `+` Added extensions.privateTab.keysHighPriority preference to handle key\* event in the capturing (true) or bubbling (false) phase, see http://www.w3.org/TR/DOM-Level-3-Events/#event-flow.
242 | `*` Corrected Chinese (Traditional) locale (zh-TW), thanks to ikurrina.
243 | `+` Added ability to close all private tabs after extension will be disabled or uninstalled (#51).
244 |
245 | ##### 0.1.1 (2013-04-24)
246 | `+` Added French locale (fr), thanks to Stis.
247 | `+` Added Chinese (Simplified) locale (zh-CN), thanks to Cye3s.
248 | `x` Fixed memory leak on extension disabling (due to not deleted window.privateTab) (#33).
249 | `+` Added Vietnamese locale (vi), thanks to Leof36.
250 | `+` Added German locale (de), thanks to sierkb.
251 | `*` Improved compatibility with extensions like Personal Menu (#35).
252 | `+` Detect Super Start page as blank.
253 | `*` Improved: now private tabs aren't saved in sessions (#36).
254 | `*` Improved: show downloads from private tabs in not private window (#31).
255 | `*` Better tooltip for private tabs on themes with dark tooltip background (#38).
256 | `+` Added Greek locale (el), thanks to Grg68.
257 |
258 | ##### 0.1.0 (2013-04-09)
259 | `*` Will be used built-in title modifier in latest SeaMonkey 2.19a1+ (2013-03-27+).
260 | `*` Correctly detect built-in private windows in latest SeaMonkey 2.19a1+ (2013-03-27+).
261 | `x` Correctly restore window title in SeaMonkey on extension disabling.
262 | `+` Added ability to open all new blank/empty tabs in private mode (experimental, preferences: extensions.privateTab.makeNewEmptyTabsPrivate, extensions.privateTab.makeNewEmptyWindowsPrivate).
263 | `+` Added Chinese (Traditional) locale (zh-TW), thanks to arbiger.
264 | `+` Added Japanese locale (ja), thanks to charishi.
265 | `x` Workaround for browser.newtab.preload = true.
266 | `x` Correctly fix App button width: wait for third-party styles.
267 | `x` Fixed: toggle tab private hotkey works for wrong tab sometimes.
268 | `*` Allow setup multiple hotkeys for one command: extensions.privateTab.key.%command%#%alias_name%.
269 | `x` Fixed (hopefully): hotkeys doesn't work on non-Latin keyboard layouts (#19).
270 | `*` Small optimizations.
271 |
272 | ##### 0.1.0b4 (2013-03-26)
273 | `+` Detect Speed Dial and FVD Speed Dial pages as blank.
274 | `+` Added “privateTab-isPrivate” attribute to private window (may be used in user styles).
275 | `+` Added toolbar button.
276 | `x` Correctly undo close not private tabs in private windows.
277 | `+` Don't save closed private tabs in undo close history (extensions.privateTab.rememberClosedPrivateTabs preference).
278 | `+` Added extensions.privateTab.sendRefererHeader preference.
279 | `x` Drag-and-drop: correctly change private state of already existing tabs.
280 | `*` Drag-and-drop: make new (or target) tab private, if source or target are private (extensions.privateTab.dragAndDropBehavior preference).
281 | `+` Implemented API for other extensions.
282 | `+` Reload tab after private state has been changed from context menu (extensions.privateTab.toggleTabPrivateAutoReload preference).
283 |
284 | ##### 0.1.0b3 (2013-03-19)
285 | `+` Allow drag-and-drop tabs between private and not private windows (extensions.privateTab.dragAndDropTabsBetweenDifferentWindows preference).
286 | `x` Correctly open link in new private tab: in previous versions tab aren't saved in the history, but was used not private cookies.
287 |
288 | ##### 0.1.0b2 (2013-03-17)
289 | `*` Always open not private tab using “Open in a New Tab” in bookmark context menu: now we have “Open in a New Private Tab”, so this is more intuitive.
290 | `x` Hide hotkeys text from App menu and don't break hetkey text hiding for built-in “New Private Window” item (#3).
291 | `x` Correctly update hotkeys in multiple windows after extensions.privateTab.key.\* preferences changes.
292 | `x` Fix drop from private tab in private window.
293 | `+` Added extensions.privateTab.dragAndDropUseTargetPrivateState preference to use target private state for dropped link-like things (#4).
294 | `*` Some internal improvements.
295 |
296 | ##### 0.1.0b2pre (2013-03-14)
297 | `*` Use better way to fix App button width.
298 | `*` Update placeholder for App button, if width can't be fixed.
299 | `+` Added context menu item for bookmarks (#2).
300 |
301 | ##### 0.1.0b1 (2013-03-13)
302 | `*` Inherit private state from source tab for any dropped link-like thing.
303 | `+` Experimental: add menu items to built-in private window too.
304 | `*` Allow open new not private window from private tab (using “New Window” command).
305 | `+` Support for built-in “Open Link in Private Window” in SeaMonkey 2.19a1.
306 | `*` Fix App button width: the same width for private and not private state (extensions.privateTab.fixAppButtonWidth preference).
307 | `x` Correctly change visibility of built-in “Open Link in New Tab/Window”.
308 | `*` Open new private tab with focused URL bar.
309 |
310 | ##### 0.1.0a3 (2013-02-20)
311 | `*` First public release.
--------------------------------------------------------------------------------
/chrome.manifest:
--------------------------------------------------------------------------------
1 | content privatetab ./
2 |
3 | locale privatetab en-US locale/en-US/
4 | locale privatetab ar locale/ar/
5 | locale privatetab bg locale/bg/
6 | locale privatetab ca locale/ca/
7 | locale privatetab de locale/de/
8 | locale privatetab el locale/el/
9 | locale privatetab es locale/es/
10 | locale privatetab et locale/et/
11 | locale privatetab fi locale/fi/
12 | locale privatetab fr locale/fr/
13 | locale privatetab hu locale/hu/
14 | locale privatetab id locale/id/
15 | locale privatetab it locale/it/
16 | locale privatetab ja locale/ja/
17 | locale privatetab nl locale/nl/
18 | locale privatetab pl locale/pl/
19 | locale privatetab pt-BR locale/pt-BR/
20 | locale privatetab pt-PT locale/pt-PT/
21 | locale privatetab ru locale/ru/
22 | locale privatetab sr locale/sr/
23 | locale privatetab tr locale/tr/
24 | locale privatetab uk locale/uk/
25 | locale privatetab vi locale/vi/
26 | locale privatetab zh-CN locale/zh-CN/
27 | locale privatetab zh-TW locale/zh-TW/
--------------------------------------------------------------------------------
/content.js:
--------------------------------------------------------------------------------
1 | {
2 | let {Services} = Components.utils.import("resource://gre/modules/Services.jsm", {});
3 | if(Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT)
4 | new (Components.utils.import("chrome://privatetab/content/content.jsm", {}).PrivateTabContent)(this);
5 | }
--------------------------------------------------------------------------------
/content.jsm:
--------------------------------------------------------------------------------
1 | var EXPORTED_SYMBOLS = ["PrivateTabContent"];
2 |
3 | Components.utils.import("resource://gre/modules/Services.jsm");
4 | __defineGetter__.call(this, "_log", function() {
5 | delete this._log;
6 | Services.scriptloader.loadSubScript("chrome://privatetab/content/log.js");
7 | return _log;
8 | });
9 |
10 | function PrivateTabContent(frameGlobal) {
11 | this.fg = frameGlobal;
12 | this.init();
13 | }
14 | PrivateTabContent.prototype = {
15 | instances: { // For global counter
16 | count: 0
17 | },
18 | get privacyContext() {
19 | return this.fg.docShell
20 | .QueryInterface(Components.interfaces.nsILoadContext);
21 | },
22 | get isPrivate() {
23 | return this.privacyContext.usePrivateBrowsing;
24 | },
25 | init: function() {
26 | ++this.instances.count;
27 | this.fg.addEventListener("unload", this, false);
28 | this.fg.addMessageListener("PrivateTab:Action", this);
29 | this.fg.addMessageListener("SessionStore:restoreHistory", this);
30 | },
31 | destroy: function(force) {
32 | _log && _dbgv && _log(
33 | "[frame script] destroy(" + (force || "") + "), instances: " + this.instances.count
34 | + ", current: " + this.fg.content.location.href.substr(0, 255)
35 | );
36 | this.fg.removeEventListener("unload", this, false);
37 | this.fg.removeMessageListener("PrivateTab:Action", this);
38 | this.fg.removeMessageListener("SessionStore:restoreHistory", this);
39 | this.fg = null;
40 | if(--this.instances.count == 0 && force) {
41 | _log("[frame script] unload content.jsm");
42 | Components.utils.unload("chrome://privatetab/content/content.jsm");
43 | }
44 | },
45 | handleEvent: function(e) {
46 | if(e.type == "unload" && e.target == this.fg)
47 | this.destroy();
48 | },
49 | receiveMessage: function(msg) {
50 | switch(msg.name) {
51 | case "PrivateTab:Action": this.handleActionMessage(msg.data); break;
52 | case "SessionStore:restoreHistory": this.handleSessionRestoring(msg.data);
53 | }
54 | },
55 |
56 | handleActionMessage: function(data) {
57 | switch(data.action) {
58 | case "GetState":
59 | this.fg.sendAsyncMessage("PrivateTab:PrivateState", { isPrivate: this.isPrivate });
60 | break;
61 | case "ToggleState":
62 | this.togglePrivate(data.isPrivate, data.silent || false);
63 | break;
64 | case "WaitLoading":
65 | this.waitLoading();
66 | break;
67 | case "GetImageDocumentDataURL":
68 | this.getImageDocumentDataURL();
69 | break;
70 | case "Destroy":
71 | this.destroy(true);
72 | }
73 | },
74 | handleSessionRestoring: function(data) {
75 | var tabData = data.tabData;
76 | var isPrivate = tabData && tabData.attributes && "privateTab-isPrivate" in tabData.attributes || false;
77 | if(isPrivate == this.isPrivate)
78 | _log("[frame script] handleSessionRestoring(): private state is already " + isPrivate);
79 | else {
80 | _log("[frame script] handleSessionRestoring(): private state -> " + isPrivate);
81 | this.privacyContext.usePrivateBrowsing = isPrivate;
82 | }
83 | },
84 |
85 | togglePrivate: function(isPrivate, silent) {
86 | var needChange = true;
87 | if(isPrivate === undefined)
88 | isPrivate = !this.isPrivate;
89 | else if(isPrivate == this.isPrivate) // Nothing to do
90 | needChange = false;
91 | if(needChange)
92 | this.privacyContext.usePrivateBrowsing = isPrivate;
93 | !silent && this.fg.sendAsyncMessage("PrivateTab:PrivateChanged", {
94 | isPrivate: isPrivate,
95 | reallyChanged: needChange
96 | });
97 | },
98 | waitLoading: function() {
99 | var fg = this.fg;
100 | function feedback() {
101 | fg.sendAsyncMessage("PrivateTab:ContentLoaded", {
102 | principal: fg.content.document.nodePrincipal
103 | });
104 | }
105 | var webProgress = fg.docShell.QueryInterface(Components.interfaces.nsIWebProgress);
106 | if(!webProgress.isLoadingDocument) {
107 | feedback();
108 | return;
109 | }
110 | fg.addEventListener("load", function onLoad(e) {
111 | if(e.target == fg.content.document) {
112 | fg.removeEventListener("load", onLoad, true);
113 | feedback();
114 | }
115 | }, true);
116 | },
117 | getImageDocumentDataURL: function() {
118 | var data = "";
119 | var doc = this.fg.content.document;
120 | var isImageDoc = doc instanceof Components.interfaces.nsIImageDocument;
121 | if(isImageDoc) {
122 | var req = doc.imageRequest;
123 | var image = req && req.image;
124 | try {
125 | var maxSize = Services.prefs.getIntPref("browser.chrome.image_icons.max_size");
126 | }
127 | catch(e) {
128 | Components.utils.reportError(e);
129 | maxSize = 1024;
130 | }
131 | if(image && image.width <= maxSize && image.height <= maxSize) {
132 | var img = doc.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "img")[0];
133 | var canvas = doc.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
134 | canvas.width = image.width;
135 | canvas.height = image.height;
136 | var ctx = canvas.getContext("2d");
137 | ctx.drawImage(img, 0, 0);
138 | data = canvas.toDataURL();
139 | _log("[frame script] getImageDocumentDataURL() => data:");
140 | }
141 | else {
142 | _log("[frame script] getImageDocumentDataURL(): image missing or too large");
143 | }
144 | }
145 | this.fg.sendAsyncMessage("PrivateTab:ImageDocumentDataURL", {
146 | isImageDocument: isImageDoc,
147 | dataURL: data
148 | });
149 | }
150 | };
--------------------------------------------------------------------------------
/defaults/preferences/prefs.js:
--------------------------------------------------------------------------------
1 | pref("extensions.privateTab.loadInBackground", -1);
2 | // -1 - use built-in browser.tabs.loadInBackground or browser.tabs.loadBookmarksInBackground
3 | // 0 - load in foreground
4 | // 1 - load in background
5 |
6 | pref("extensions.privateTab.keysUseKeydownEvent", true); // Use "keydown" event instead of "keypress"
7 | pref("extensions.privateTab.keysHighPriority", true); // Handle key* event in capturing phase
8 | pref("extensions.privateTab.keysIgnoreDefaultPrevented", false); // Ignore, if someone stops key* event
9 | // See https://developer.mozilla.org/en-US/docs/XUL/Tutorial/Keyboard_Shortcuts
10 | // and https://web.archive.org/web/20140506014522/https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Virtual_key_codes
11 | // Syntax: [ ] (or leave empty to disable)
12 | // It's better to use VK_* codes for keysUseKeydownEvent = true.
13 | // You can also create alias for hotkey using extensions.privateTab.key.%command%#%alias_name%, example:
14 | // pref("extensions.privateTab.key.openNewPrivateTab#2", "VK_F8")
15 | pref("extensions.privateTab.key.openNewPrivateTab", "control alt VK_P");
16 | pref("extensions.privateTab.key.toggleTabPrivate", "control alt VK_T");
17 |
18 | pref("extensions.privateTab.newPrivateTabURL", "");
19 | pref("extensions.privateTab.newPrivateTabURL.inPrivateWindow", "");
20 | // Any URL to open it in new empty private tabs or leave empty to open the same as in new non-private tabs
21 |
22 | pref("extensions.privateTab.dragAndDropBehavior", 0);
23 | // 0 - make new (or target) tab private, if source or target are private
24 | // 1 - use source private state
25 | // 2 - use target private state
26 | pref("extensions.privateTab.dragAndDropTabsBetweenDifferentWindows", true);
27 | pref("extensions.privateTab.rememberClosedPrivateTabs", false);
28 | // But be careful: undo close history with private tabs will be saved to the disk!
29 | pref("extensions.privateTab.rememberClosedPrivateTabs.cleanup", 2); // (only for rememberClosedPrivateTabs == true)
30 | // Remove closed private tabs from undo close history in closing windows and after closing of last private tab/window
31 | // 0 - disable cleanup
32 | // 1 - perform cleanup after "last-pb-context-exited" notification
33 | // 2 - additionally perform cleanup after closing of last private tab in SeaMonkey (SeaMonkey has
34 | // some cache for fast tabs restoring and doesn't destroy closed tabs immediately)
35 | pref("extensions.privateTab.savePrivateTabsInSessions", false);
36 | pref("extensions.privateTab.makeNewEmptyTabsPrivate", 0);
37 | pref("extensions.privateTab.makeNewEmptyWindowsPrivate", 0);
38 | // -1 - inherit private state from owner tab
39 | // 0 - ignore new empty tabs (windows)
40 | // 1 - make new empty tabs private (make single empty tab in new empty windows private)
41 | pref("extensions.privateTab.allowOpenExternalLinksInPrivateTabs", false);
42 | pref("extensions.privateTab.sendRefererHeader", 2);
43 | // 0 - don't send
44 | // 1 - only if private tab opened from private tab
45 | // 2 - always send (as Firefox itself do for "Open Link in New Private Window")
46 |
47 | // Additional options for checkbox in tab context menu, only for Firefox 50 and older
48 | // See https://github.com/Infocatcher/Private_Tab/issues/237
49 | pref("extensions.privateTab.toggleTabPrivateAutoReload", true);
50 | pref("extensions.privateTab.toggleTabPrivateAutoReload.stopLoading", true);
51 |
52 | pref("extensions.privateTab.workaroundForPendingTabs", true);
53 | pref("extensions.privateTab.dontUseTabsInPopupWindows", true);
54 | pref("extensions.privateTab.rememberOwnerTab", false);
55 | pref("extensions.privateTab.openPlacesInPrivateTabs.callNativeMenuItems", true);
56 | pref("extensions.privateTab.fixAppButtonWidth", true);
57 | pref("extensions.privateTab.fixAfterTabsButtonsAccessibility", true);
58 | pref("extensions.privateTab.fixAfterTabsButtonsAccessibility.force", false);
59 | // Fix width of clickable area for "New Tab" and "New Private Tab" buttons after last tab
60 | pref("extensions.privateTab.fixAfterTabsButtonsAccessibility.iconPadding", "");
61 | // Custom padding for button's icon (to override autodetected value), example: "6px 11px"
62 | pref("extensions.privateTab.patchDownloads", true);
63 | pref("extensions.privateTab.enablePrivateProtocol", true);
64 | pref("extensions.privateTab.showItemInTaskBarJumpList", true); // Works only if enablePrivateProtocol == true
65 | pref("extensions.privateTab.usePrivateWindowStyle", true);
66 | // true - apply private window style to private tabs (and show tab private state)
67 | // false - show window private state
68 | pref("extensions.privateTab.stylesHighPriority", true); // Set "!important" flag to force override third-party styles
69 | pref("extensions.privateTab.stylesHighPriority.tree", true); // The same as above for private:... bookmarks inside XUL
70 |
71 | pref("extensions.privateTab.debug", false);
72 | pref("extensions.privateTab.debug.verbose", false);
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/Private_Tab/025f31631de916c19d5925f689257a1cdd41d18b/icon.png
--------------------------------------------------------------------------------
/icon.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/Private_Tab/025f31631de916c19d5925f689257a1cdd41d18b/icon.xcf
--------------------------------------------------------------------------------
/install.rdf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 | privateTab@infocatcher
7 | 2
8 | true
9 | true
10 | Private Tab
11 | 0.2.3pre
12 | Adds private tabs
13 | Infocatcher
14 | http://infocatcher.ucoz.net/ext/fx/private_tab/update.rdf
15 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgtEbrhCdZetIAanFNvkT441WwBgXcg1Zzlo5s5
16 | j9VLByj/L6UXAVqSria1dejjkKfxVbRXvqalJ7mENRambKpZ4AfV3dBCKUDjME56CMaAK7+DxMqaM3
17 | KEDKXn8XfqL2qkFsgcVjqh6AfltKRcyLGkU9+YQ82EXo6xm47hywoQIDAQAB
18 |
19 |
20 |
21 | {ec8030f7-c20a-464f-9b0e-13a3a9e97384}
22 | 20.0
23 | 65.0a1
24 |
25 |
26 |
27 |
28 |
29 | {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}
30 | 2.17
31 | 2.62a1
32 |
33 |
34 |
35 |
36 |
37 | {8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}
38 | 27.0
39 | 28.*
40 |
41 |
42 |
43 |
44 |
45 | en-US
46 | Private Tab
47 | Adds private tabs
48 | Infocatcher
49 |
50 |
51 |
52 |
53 |
54 | ar
55 | Private Tab
56 | إضافة علامات تبويب خاصة
57 | Infocatcher
58 | infinity
59 | tahani5
60 |
61 |
62 |
63 |
64 |
65 | bg
66 | Private Tab
67 | Добавяне на раздели за поверително сърфиране
68 | Infocatcher
69 | Peyu Yovev
70 |
71 |
72 |
73 |
74 |
75 | ca
76 | Private Tab
77 | Afegeix pestanyes privades
78 | Infocatcher
79 | Dimas Streich
80 |
81 |
82 |
83 |
84 |
85 | de
86 | Private Tab
87 | Fügt private Tabs hinzu.
88 | Infocatcher
89 | sierkb
90 |
91 |
92 |
93 |
94 |
95 | el
96 | Καρτέλα ιδιωτικής περιήγησης
97 | Δημιουργία καρτελών ιδιωτικής περιήγησης
98 | Infocatcher
99 | Γιώργος Μαλαμάς
100 |
101 |
102 |
103 |
104 |
105 | es
106 | Private Tab
107 | Añade pestañas privadas
108 | Infocatcher
109 | strel
110 |
111 |
112 |
113 |
114 |
115 | et
116 | Private Tab
117 | Lisab privaatse kaardi funktsiooni
118 | Infocatcher
119 | Maidur
120 |
121 |
122 |
123 |
124 |
125 | fi
126 | Private Tab
127 | Lisää yksityiset välilehdet
128 | Infocatcher
129 | Joel Hietala
130 |
131 |
132 |
133 |
134 |
135 | fr
136 | Private Tab
137 | La navigation privée gérée par onglets.
138 | Infocatcher
139 | Stis
140 | Charles Milette
141 |
142 |
143 |
144 |
145 |
146 | hu
147 | Private Tab
148 | Privát lapok használata
149 | Infocatcher
150 | Norbert Evenich
151 |
152 |
153 |
154 |
155 |
156 | id
157 | Tab penjelajahan pribadi
158 | Menambahkan tab mode penjelajahan pribadi
159 | Infocatcher
160 | Muhammad Anwar Ramadhan (Daisuke Dan)
161 |
162 |
163 |
164 |
165 |
166 | it
167 | Private Tab
168 | La navigazione anonima su schede
169 | Infocatcher
170 | moretti
171 |
172 |
173 |
174 |
175 |
176 | ja
177 | プライベートタブ
178 | プライベートタブを追加します
179 | Infocatcher
180 | charishi
181 |
182 |
183 |
184 |
185 |
186 | nl
187 | Private Tab
188 | Voegt privétabbladen toe.
189 | Infocatcher
190 | Tonnes
191 |
192 |
193 |
194 |
195 |
196 | pl
197 | Prywatna karta
198 | Dodaje prywatne karty.
199 | Infocatcher
200 | marcinsu
201 |
202 |
203 |
204 |
205 |
206 | pt-BR
207 | Private Tab
208 | Cria abas de navegação privativa
209 | Infocatcher
210 | Marcelo Ghelman (ghelman.net)
211 |
212 |
213 |
214 |
215 |
216 | pt-PT
217 | Private Tab
218 | Cria separadores de navegação privada
219 | Infocatcher
220 | Rodrigo Cunha (SW1FT)
221 |
222 |
223 |
224 |
225 |
226 | ru
227 | Private Tab
228 | Добавляет приватные вкладки
229 | Infocatcher
230 |
231 |
232 |
233 |
234 |
235 | sr
236 | Приватни језичак
237 | Додаје приватни језичак
238 | Infocatcher
239 | ДакСРБИЈА
240 |
241 |
242 |
243 |
244 |
245 | tr
246 | Private Tab
247 | Gizli sekmeler ekler
248 | Infocatcher
249 | Sinan Kaan Yerli (skyerli.org)
250 |
251 |
252 |
253 |
254 |
255 | uk
256 | Private Tab
257 | Додає приватні вкладки
258 | Infocatcher
259 | dbv92
260 |
261 |
262 |
263 |
264 |
265 | vi
266 | Private Tab
267 | Duyệt web riêng tư theo thẻ
268 | Infocatcher
269 | Leof36
270 |
271 |
272 |
273 |
274 |
275 | zh-CN
276 | 隐私标签页
277 | 增加打开隐私标签页功能
278 | Infocatcher
279 | Cye3s
280 |
281 |
282 |
283 |
284 |
285 | zh-TW
286 | 隱私分頁
287 | 在分頁中開起隱私分頁
288 | Infocatcher
289 | arbiger
290 | ikurrina
291 |
292 |
293 |
294 |
295 |
--------------------------------------------------------------------------------
/license.txt:
--------------------------------------------------------------------------------
1 | ***** BEGIN LICENSE BLOCK *****
2 | Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 |
4 | The contents of this file are subject to the Mozilla Public License Version
5 | 1.1 (the "License"); you may not use this file except in compliance with
6 | the License. You may obtain a copy of the License at
7 | http://www.mozilla.org/MPL/
8 |
9 | Software distributed under the License is distributed on an "AS IS" basis,
10 | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 | for the specific language governing rights and limitations under the
12 | License.
13 |
14 | The Original Code is Private Tab.
15 | The Initial Developer of the Original Code is Infocatcher.
16 |
17 | Portions created by the Initial Developer are Copyright (C) 2013-2021
18 | the Initial Developer. All Rights Reserved.
19 |
20 | Contributor(s):
21 |
22 |
23 | Alternatively, the contents of this file may be used under the terms of
24 | either the GNU General Public License Version 2 or later (the "GPL"), or
25 | the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 | in which case the provisions of the GPL or the LGPL are applicable instead
27 | of those above. If you wish to allow use of your version of this file only
28 | under the terms of either the GPL or the LGPL, and not to allow others to
29 | use your version of this file under the terms of the MPL, indicate your
30 | decision by deleting the provisions above and replace them with the notice
31 | and other provisions required by the GPL or the LGPL. If you do not delete
32 | the provisions above, a recipient may use your version of this file under
33 | the terms of any one of the MPL, the GPL or the LGPL.
34 |
35 | ***** END LICENSE BLOCK *****
--------------------------------------------------------------------------------
/locale/ar/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=فتح في صفحه خاصه جديده
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=فتح في صفحه خاصه جديده
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=فتح الكل في علامات تبويب خاصة
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=صفحه خاصه
11 | privateTabTip=(صفحه خاصه)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=صفحه خاصه جديده
15 | openNewPrivateTabTip=فتح في صفحه خاصه جديده
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=صفحه خاصه
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab==صفحه خاصه جديده
27 | taskBarOpenNewPrivateTabDesc=Open a new tab in private browsing mode.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=فتح علامة تبويب خاصة
30 | taskBarOpenNewPrivateTabDescSM=Open a new private browsing tab.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (التصفح الخاص)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=صفحه خاصه
39 | dialogQuestionSingle=فتح في صفحه خاصه?
40 | dialogCloseSingle=&اغلق
41 | dialogRestoreSingle=اجعلها غير خاصه
42 | # For more than one tab:
43 | dialogTitle=اجعلها صفحه خاصه
44 | dialogQuestion=فتح في صفحه خاصه??
45 | dialogClose=&اغلق
46 | dialogRestore=اجعلها غير خاصه
47 |
--------------------------------------------------------------------------------
/locale/bg/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Отвори линка в поверителен раздел
2 | openInNewPrivateTabAccesskey=п
3 |
4 | openPlacesInNewPrivateTab=Отвори в поверителен раздел
5 | openPlacesInNewPrivateTabAccesskey=р
6 |
7 | openPlacesInPrivateTabs=Отвори всички в поверителни раздели
8 | openPlacesInPrivateTabsAccesskey=в
9 |
10 | privateTab=Поверителен раздел
11 | privateTabTip=(поверителен раздел)
12 | privateTabAccesskey=в
13 |
14 | openNewPrivateTab=Нов поверителен раздел
15 | openNewPrivateTabTip=Отвори в поверителен раздел
16 | openNewPrivateTabAccesskey=р
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Поверителен раздел
21 | openNewPrivateTabShortAccesskey=д
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Нов поверителен раздел
27 | taskBarOpenNewPrivateTabDesc=Нов поверителен раздел в режима за поверително сърфиране.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Отвори в поверителен раздел
30 | taskBarOpenNewPrivateTabDescSM=Отвори нов поверителен раздел
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Поверително сърфиране)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Поверителен раздел
39 | dialogQuestionSingle=Какво искате да направите с този поверителен раздел?
40 | dialogCloseSingle=&Затвори го
41 | dialogRestoreSingle=Направи го &не-поверителен
42 | # For more than one tab:
43 | dialogTitle=Поверителен раздел
44 | dialogQuestion=Какво искате да направите с тези %S поверителни раздела?
45 | dialogClose=&Затвори ги
46 | dialogRestore=Направи ги &не-поверителни
47 |
--------------------------------------------------------------------------------
/locale/ca/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Obre l'enllaç en una pestanya privada nova
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Obre en una nova pestanya privada
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Obre-ho tot en pestanyes privades
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Pestanya privada
11 | privateTabTip=(pestanya privada)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Pestanya privada nova
15 | openNewPrivateTabTip=Obre una pestanya privada nova
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Pestanya privada
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Pestanya privada nova
27 | taskBarOpenNewPrivateTabDesc=Obre una pestanya nova en mode de navegació privada.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Obre pestanya privada
30 | taskBarOpenNewPrivateTabDescSM=Obre una pestanya de navegació privada nova.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Navegació privada)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Pestanya privada
39 | dialogQuestionSingle=Què cal fer amb la pestanya privada?
40 | dialogCloseSingle=&Tancar-la
41 | dialogRestoreSingle=Fer-la &no-privada
42 | # For more than one tab:
43 | dialogTitle=Pestanya privada
44 | dialogQuestion=Què cal fer amb les %S pestanyes privades?
45 | dialogClose=&Tancar-les
46 | dialogRestore=Fer-les &no-privades
--------------------------------------------------------------------------------
/locale/de/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Link in neuem privaten Tab öffnen
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Neuer privater Tab
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Öffne alle in privaten Tabs
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Privater Tab
11 | privateTabTip=(Privater Modus)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Neuer privater Tab
15 | openNewPrivateTabTip=Neuen privaten Tab öffnen
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Privater Tab
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Neuer privater Tab
27 | taskBarOpenNewPrivateTabDesc=Öffne einen neuen Tab im privaten Modus
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Öffne privaten Tab
30 | taskBarOpenNewPrivateTabDescSM=Öffne einen neuen privaten Tab
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Privater Modus)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Privaten Tab schließen oder umwandeln
39 | dialogQuestionSingle=Es ist %S privater Tab geöffnet. Was soll mit ihm geschehen?
40 | dialogCloseSingle=Privaten Tab &schließen
41 | dialogRestoreSingle=In normalen Tab &umwandeln
42 | # For more than one tab:
43 | dialogTitle=Private Tabs schließen oder umwandeln
44 | dialogQuestion=Es sind %S private Tabs geöffnet. Was soll mit ihnen geschehen?
45 | dialogClose=Private Tabs &schließen
46 | dialogRestore=In normale Tabs &umwandeln
47 |
--------------------------------------------------------------------------------
/locale/el/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Άνοιγμα δεσμού σε νέα καρτέλα ιδιωτικής περιήγησης
2 | openInNewPrivateTabAccesskey=ω
3 |
4 | openPlacesInNewPrivateTab=Άνοιγμα σε νέα καρτέλα ιδιωτικής περιήγησης
5 | openPlacesInNewPrivateTabAccesskey=ω
6 |
7 | openPlacesInPrivateTabs=Άνοιγμα όλων σε καρτέλες ιδιωτικής περιήγησης
8 | openPlacesInPrivateTabsAccesskey=ω
9 |
10 | privateTab=Καρτέλα ιδιωτικής περιήγησης
11 | privateTabTip=(ιδιωτική καρτέλα)
12 | privateTabAccesskey=ω
13 |
14 | openNewPrivateTab=Νέα καρτέλα ιδιωτικής περιήγησης
15 | openNewPrivateTabTip=Άνοιγμα μιας νέας καρτέλας ιδιωτικής περιήγησης
16 | openNewPrivateTabAccesskey=ω
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Καρτέλα ιδιωτικής περιήγησης
21 | openNewPrivateTabShortAccesskey=ω
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Νέα καρτέλα ιδιωτικής περιήγησης
27 | taskBarOpenNewPrivateTabDesc=Άνοιγμα μιας νέας καρτέλας ιδιωτικής περιήγησης.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Άνοιγμα καρτέλας ιδιωτικής περιήγησης
30 | taskBarOpenNewPrivateTabDescSM=Άνοιγμα μιας νέας καρτέλας ιδιωτικής περιήγησης.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Ιδιωτική περιήγηση)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Καρτέλα ιδιωτικής περιήγησης
39 | dialogQuestionSingle=Τι θα θέλατε να κάνετε με την ανοικτή καρτέλα ιδιωτικής περιήγησης;
40 | dialogCloseSingle=&Κλείσιμο αυτής
41 | dialogRestoreSingle=&Μετατροπή αυτής σε μη-ιδιωτική
42 | # For more than one tab:
43 | dialogTitle=Καρτέλα ιδιωτικής περιήγησης
44 | dialogQuestion=Τι θα θέλατε να κάνετε με τις %S ανοικτές καρτέλες ιδιωτικής περιήγησης;
45 | dialogClose=&Κλείσιμο αυτών
46 | dialogRestore=&Μετατροπή αυτών σε μη-ιδιωτικές
--------------------------------------------------------------------------------
/locale/en-US/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Open Link in New Private Tab
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Open in a New Private Tab
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Open All in Private Tabs
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Private Tab
11 | privateTabTip=(private tab)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=New Private Tab
15 | openNewPrivateTabTip=Open a new private tab
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Private Tab
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=New private tab
27 | taskBarOpenNewPrivateTabDesc=Open a new tab in private browsing mode.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Open private tab
30 | taskBarOpenNewPrivateTabDescSM=Open a new private browsing tab.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Private Browsing)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=What would you like to do with one private tab?
40 | dialogCloseSingle=&Close it
41 | dialogRestoreSingle=Make it &non-private
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=What would you like to do with %S private tabs?
45 | dialogClose=&Close them
46 | dialogRestore=Make them &non-private
--------------------------------------------------------------------------------
/locale/es/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Abrir enlace en una nueva pestaña privada
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Abrir en una nueva pestaña privada
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Abrir todo en pestañas privadas
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Pestaña privada
11 | privateTabTip=(pestaña privada)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Nueva pestaña privada
15 | openNewPrivateTabTip=Abre una pestaña privada nueva
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Pestaña privada
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Nueva pestaña privada
27 | taskBarOpenNewPrivateTabDesc=Abre una nueva pestaña en modo de navegación privada.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Abrir pestaña privada
30 | taskBarOpenNewPrivateTabDescSM=Abre una nueva pestaña de navegación privada.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Navegación privada)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=Hay %S pestaña(s) privadas(s) ¿Qué le gustaría hacer?
40 | dialogCloseSingle=&Cerrarla(s)
41 | dialogRestoreSingle=Hacerla(s) &no-privada(s)
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=Hay %S pestaña(s) privadas(s) ¿Qué le gustaría hacer?
45 | dialogClose=&Cerrarla(s)
46 | dialogRestore=Hacerla(s) &no-privada(s)
47 |
--------------------------------------------------------------------------------
/locale/et/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Ava link uuel privaatsel kaardil
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Ava uuel privaatsel kaardil
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Ava kõik privaatsetel kaartidel
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Privaatne kaart
11 | privateTabTip=(privaatne kaart)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Uus privaatne kaart
15 | openNewPrivateTabTip=Ava uus privaatne kaart
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Privaatne kaart
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Uus privaatne kaart
27 | taskBarOpenNewPrivateTabDesc=Ava uus kaart privaatse veebilehitsemise režiimis.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Ava privaatne kaart
30 | taskBarOpenNewPrivateTabDescSM=Ava uus privaatse veebilehitsemise kaart.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Privaatne veebilehitsemine)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=Mida teha privaatse kaardiga?
40 | dialogCloseSingle=&Sulge see
41 | dialogRestoreSingle=Tee see &mitte-privaatseks
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=Mida teha %S privaatse kaardiga?
45 | dialogClose=&Sulge need
46 | dialogRestore=Tee need &mitte-privaatseks
47 |
--------------------------------------------------------------------------------
/locale/fi/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Avaa linkki uudella yksityisellä välilehdellä
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Avaa uudella yksityisellä välilehdellä
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Avaa kaikki yksityisillä välilehdillä
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Yksityinen välilehti
11 | privateTabTip=(Yksityinen välilehti)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Uusi yksityinen välilehti
15 | openNewPrivateTabTip=Avaa uusi yksityinen välilehti
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Yksityinen välilehti
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Uusi yksityinen välilehti
27 | taskBarOpenNewPrivateTabDesc=Avaa uusi välilehti yksityisessä selaustilassa.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Avaa yksityinen välilehti
30 | taskBarOpenNewPrivateTabDescSM=Avaa uusi yksityisen selauksen välilehti.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Yksityinen selaus)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Yksityinen välilehti
39 | dialogQuestionSingle=Mitä haluaisit tehdä yksityisen välilehden kanssa?
40 | dialogCloseSingle=&Sulje se
41 | dialogRestoreSingle=Tee siitä &ei-yksityinen
42 | # For more than one tab:
43 | dialogTitle=Yksityiset välilehdet
44 | dialogQuestion=Mitä haluaisit tehdä %S yksityisen välilehden kanssa?
45 | dialogClose=&Sulje ne
46 | dialogRestore=Tee niistä &ei-yksityisiä
47 |
--------------------------------------------------------------------------------
/locale/fr/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Ouvrir le lien dans un onglet de navigation privée
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Ouvrir dans un nouvel onglet privé
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Tout ouvrir dans des onglets privés
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Onglet privé
11 | privateTabTip=(navigation privée)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Nouvel onglet de navigation privée
15 | openNewPrivateTabTip=Ouvre un onglet de navigation privée
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=true
20 | openNewPrivateTabShort=Onglet privé
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Nouvel onglet de navigation privée
27 | taskBarOpenNewPrivateTabDesc=Ouvrir un nouvel onglet en mode de navigation privée.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Ouvrir un onglet de navigation privée
30 | taskBarOpenNewPrivateTabDescSM=Ouvrir un nouvel onglet de navigation privée.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Navigation privée)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Onglet privé
39 | dialogQuestionSingle=Que souhaitez-vous faire avec un onglet privé ?
40 | dialogCloseSingle=Le &fermer
41 | dialogRestoreSingle=Le rendre &non-privé
42 | # For more than one tab:
43 | dialogTitle=Onglet privé
44 | dialogQuestion=Que souhaitez-vous faire avec %S onglets privés ?
45 | dialogClose=Les &fermer
46 | dialogRestore=Les rendre &non-privés
47 |
--------------------------------------------------------------------------------
/locale/hu/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Megnyitás új privát lapon
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Megnyitás új privát lapon
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Összes megnyitása privát lapon
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Privát lap
11 | privateTabTip=(privát lap)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Új privát lap
15 | openNewPrivateTabTip=Új privát lap megnyitása
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Privát lap
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Új privát lap
27 | taskBarOpenNewPrivateTabDesc=Új lap megnyitása privát böngészés módban.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Privát lap megnyitása
30 | taskBarOpenNewPrivateTabDescSM=Egy új privát böngészőfül megnyitása.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Privát böngészés)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=Mit szeretne tenni az egy megnyitott privát lappal?
40 | dialogCloseSingle=&Bezárom
41 | dialogRestoreSingle=Átalakítom &normál lappá
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=Mit szeretne tenni a %S privát lappal?
45 | dialogClose=&Bezárom ezeket
46 | dialogRestore=Átalakítom ezeket &normál lappá
47 |
--------------------------------------------------------------------------------
/locale/id/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Buka Tautan di Tab Penjelajahan Pribadi Baru
2 | openInNewPrivateTabAccesskey=r
3 |
4 | openPlacesInNewPrivateTab=Buka di Tab Penjelajahan Pribadi Baru
5 | openPlacesInNewPrivateTabAccesskey=r
6 |
7 | openPlacesInPrivateTabs=Buka Semua di Tab Pribadi
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Tab Penjelajahan Pribadi
11 | privateTabTip=(Mode Penjelajahan Pribadi)
12 | privateTabAccesskey=r
13 |
14 | openNewPrivateTab=Tab Mode Pribadi Baru
15 | openNewPrivateTabTip=Buka tab penjelajahan pribadi baru
16 | openNewPrivateTabAccesskey=r
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Tab Pribadi
21 | openNewPrivateTabShortAccesskey=r
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Tab mode pribadi baru
27 | taskBarOpenNewPrivateTabDesc=Buka tab baru dalam modus penjelajahan pribadi.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Tab mode pribadi baru
30 | taskBarOpenNewPrivateTabDescSM=Buka tab baru dalam modus penjelajahan pribadi.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Mode Penjelajahan Pribadi)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Tab Pribadi
39 | dialogQuestionSingle=Apa yang ingin Anda lakukan dengan satu tab pribadi ini?
40 | dialogCloseSingle=&Tutup
41 | dialogRestoreSingle=Buat jadi &non-pribadi
42 | # For more than one tab:
43 | dialogTitle=Tab Pribadi
44 | dialogQuestion=Apa yang ingin Anda lakukan dengan %S tab pribadi?
45 | dialogClose=&Tutup
46 | dialogRestore=Buat jadi &non-pribadi
47 |
--------------------------------------------------------------------------------
/locale/it/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Apri link in una nuova scheda anonima
2 | openInNewPrivateTabAccesskey=o
3 |
4 | openPlacesInNewPrivateTab=Apri in una nuova scheda anonima
5 | openPlacesInNewPrivateTabAccesskey=o
6 |
7 | openPlacesInPrivateTabs=Open All in Private Tabs
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Scheda anonima
11 | privateTabTip=(navigazione anonima)
12 | privateTabAccesskey=o
13 |
14 | openNewPrivateTab=Nuova scheda anonima
15 | openNewPrivateTabTip=Apre una nuova scheda anonima
16 | openNewPrivateTabAccesskey=o
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Scheda anonima
21 | openNewPrivateTabShortAccesskey=o
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Nuova scheda anonima
27 | taskBarOpenNewPrivateTabDesc=Open a new tab in private browsing mode.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Open private tab
30 | taskBarOpenNewPrivateTabDescSM=Open a new private browsing tab.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Navigazione Anonima)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=What would you like to do with one private tab?
40 | dialogCloseSingle=&Close it
41 | dialogRestoreSingle=Make it &non-private
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=What would you like to do with %S private tabs?
45 | dialogClose=&Close them
46 | dialogRestore=Make them &non-private
--------------------------------------------------------------------------------
/locale/ja/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=リンクを新しいプライベートタブで開く
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=新しいプライベートタブで開く
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=全てをプライベートタブで開く
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=プライベートタブ
11 | privateTabTip=(プライベートタブ)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=新しいプライベートタブ
15 | openNewPrivateTabTip=新しいプライベートタブを開く
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=プライベートタブ
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=新しいプライベートタブ
27 | taskBarOpenNewPrivateTabDesc=新しいタブをプライベートブラウジングモードで開く。
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=プライベートタブを開く
30 | taskBarOpenNewPrivateTabDescSM=新しいプライベートブラウジングタブを開く。
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (プライベートブラウジング)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=プライベートタブ
39 | dialogQuestionSingle=プライベートタブをどうしますか?
40 | dialogCloseSingle=閉じる(&C)
41 | dialogRestoreSingle=通常タブに復旧(&n)
42 | # For more than one tab:
43 | dialogTitle=プライベートタブ
44 | dialogQuestion=%S個のプライベートタブをどうしますか?
45 | dialogClose=閉じる(&C)
46 | dialogRestore=通常タブに復旧(&n)
47 |
--------------------------------------------------------------------------------
/locale/nl/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Koppeling openen in nieuw privétabblad
2 | openInNewPrivateTabAccesskey=b
3 |
4 | openPlacesInNewPrivateTab=Openen in een nieuw privétabblad
5 | openPlacesInNewPrivateTabAccesskey=b
6 |
7 | openPlacesInPrivateTabs=Alle openen in privétabbladen
8 | openPlacesInPrivateTabsAccesskey=b
9 |
10 | privateTab=Privétabblad
11 | privateTabTip=(privétabblad)
12 | privateTabAccesskey=b
13 |
14 | openNewPrivateTab=Nieuw privétabblad
15 | openNewPrivateTabTip=Een nieuw privétabblad openen
16 | openNewPrivateTabAccesskey=b
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Privétabblad
21 | openNewPrivateTabShortAccesskey=b
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Nieuw privétabblad
27 | taskBarOpenNewPrivateTabDesc=Een nieuw tabblad openen in privénavigatiemodus.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Privétabblad openen
30 | taskBarOpenNewPrivateTabDescSM=Een nieuw privénavigatietabblad openen.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Privénavigatie)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Privétabblad
39 | dialogQuestionSingle=Wat wilt u met één privétabblad doen?
40 | dialogCloseSingle=Het &sluiten
41 | dialogRestoreSingle=Het &niet privé maken
42 | # For more than one tab:
43 | dialogTitle=Privétabblad
44 | dialogQuestion=Wat wilt u met %S privétabbladen doen?
45 | dialogClose=Deze &sluiten
46 | dialogRestore=Deze &niet privé maken
--------------------------------------------------------------------------------
/locale/pl/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Otwórz odnośnik w nowej karcie w trybie prywatnym
2 | openInNewPrivateTabAccesskey=r
3 |
4 | openPlacesInNewPrivateTab=Otwórz w nowej karcie w trybie prywatnym
5 | openPlacesInNewPrivateTabAccesskey=r
6 |
7 | openPlacesInPrivateTabs=Otwórz wszystkie w prywatnych kartach
8 | openPlacesInPrivateTabsAccesskey=r
9 |
10 | privateTab=Prywatna karta
11 | privateTabTip=(prywatna karta)
12 | privateTabAccesskey=r
13 |
14 | openNewPrivateTab=Nowa karta prywatna
15 | openNewPrivateTabTip=Otwórz nową kartę prywatną
16 | openNewPrivateTabAccesskey=r
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Prywatna karta
21 | openNewPrivateTabShortAccesskey=r
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Nowa karta prywatna
27 | taskBarOpenNewPrivateTabDesc=Otwórz nową kartę w trybie przeglądania prywatnego.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Otwórz kartę prywatną
30 | taskBarOpenNewPrivateTabDescSM=Otwórz nową kartę w trybie prywatnym.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (tryb prywatny)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Prywatna karta
39 | dialogQuestionSingle=Co chcesz zrobić z otwartą prywatną kartą?
40 | dialogCloseSingle=&Zamknij
41 | dialogRestoreSingle=Zamień na &nie prywatną
42 | # For more than one tab:
43 | dialogTitle=Prywatna karta
44 | dialogQuestion=Co chcesz zrobić z %S otwartymi prywatnymi kartami?
45 | dialogClose=&Zamknij
46 | dialogRestore=Zamień na &nie prywatne
--------------------------------------------------------------------------------
/locale/pt-BR/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Abrir em nova aba privativa
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Abrir em nova aba privativa
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Abrir tudo em abas privativas
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Aba privativa
11 | privateTabTip=(aba privativa)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Nova aba privativa
15 | openNewPrivateTabTip=Abre uma nova aba privativa
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Aba privativa
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Nova aba privativa
27 | taskBarOpenNewPrivateTabDesc=Abre uma nova aba em modo de navegação privativa.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Abrir aba privativa
30 | taskBarOpenNewPrivateTabDescSM=Abre uma nova aba com navegação privativa.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Navegação privativa)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Aba privativa
39 | dialogQuestionSingle=O que deseja fazer com uma aba privativa?
40 | dialogCloseSingle=&Fechar
41 | dialogRestoreSingle=Mudar para &não privativa
42 | # For more than one tab:
43 | dialogTitle=Aba privativa
44 | dialogQuestion=O que deseja fazer com %S abas privativas?
45 | dialogClose=&Fechar
46 | dialogRestore=Mudar para &não privativas
--------------------------------------------------------------------------------
/locale/pt-PT/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Abrir ligação em novo separador privado
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=Abrir em novo separador privado
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=Abrir tudo em separadores privados
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Separador privado
11 | privateTabTip=(separador privado)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=Novo separador privado
15 | openNewPrivateTabTip=Abre um novo separador privado
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Separador privado
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Novo separador privado
27 | taskBarOpenNewPrivateTabDesc=Abre um novo separador em modo de navegação privada.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Abrir separador privado
30 | taskBarOpenNewPrivateTabDescSM=Abre um novo separador de navegação privada.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Navegação privada)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Separador privado
39 | dialogQuestionSingle=O que deseja fazer com um separador privado?
40 | dialogCloseSingle=&Fechá-lo
41 | dialogRestoreSingle=Torná-lo &não privado
42 | # For more than one tab:
43 | dialogTitle=Separador privado
44 | dialogQuestion=O que deseja fazer com %S separadores privados?
45 | dialogClose=&Fechá-los
46 | dialogRestore=Torná-los &não privados
47 |
--------------------------------------------------------------------------------
/locale/ru/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Открыть ссылку в новой приватной вкладке
2 | openInNewPrivateTabAccesskey=р
3 |
4 | openPlacesInNewPrivateTab=Открыть в новой приватной вкладке
5 | openPlacesInNewPrivateTabAccesskey=и
6 |
7 | openPlacesInPrivateTabs=Открыть всё в приватных вкладках
8 | openPlacesInPrivateTabsAccesskey=и
9 |
10 | privateTab=Приватная вкладка
11 | privateTabTip=(приватная вкладка)
12 | privateTabAccesskey=П
13 |
14 | openNewPrivateTab=Новая приватная вкладка
15 | openNewPrivateTabTip=Открыть новую приватную вкладку
16 | openNewPrivateTabAccesskey=р
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=true
20 | openNewPrivateTabShort=Приватная вкладка
21 | openNewPrivateTabShortAccesskey=р
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Новая приватная вкладка
27 | taskBarOpenNewPrivateTabDesc=Открыть новую вкладку в режиме приватного просмотра.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Открыть приватную вкладку
30 | taskBarOpenNewPrivateTabDescSM=Открыть новую вкладку приватного просмотра.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Приватный просмотр)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=Что вы хотите сделать с одной приватной вкладкой?
40 | dialogCloseSingle=&Закрыть её
41 | dialogRestoreSingle=Сделать её не приватной
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=Что вы хотите сделать с приватными вкладками (%S шт.)?
45 | dialogClose=&Закрыть их
46 | dialogRestore=Сделать их не приватными
--------------------------------------------------------------------------------
/locale/sr/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Отвори везу у приватном језичку
2 | openInNewPrivateTabAccesskey=п
3 |
4 | openPlacesInNewPrivateTab=Отвори нови приватни језичак
5 | openPlacesInNewPrivateTabAccesskey=п
6 |
7 | openPlacesInPrivateTabs=Отвори све у приватним језичцима
8 | openPlacesInPrivateTabsAccesskey=п
9 |
10 | privateTab=Приватни језичак
11 | privateTabTip=(приватни језичак)
12 | privateTabAccesskey=п
13 |
14 | openNewPrivateTab=Нови приватни језичак
15 | openNewPrivateTabTip=Отвори нови приватни језичак
16 | openNewPrivateTabAccesskey=п
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Приватни језичак
21 | openNewPrivateTabShortAccesskey=п
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Нови приватни језичак
27 | taskBarOpenNewPrivateTabDesc=Отвори нови језичак у приватном режиму.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Отвори приватни језичак
30 | taskBarOpenNewPrivateTabDescSM=Отвори нови приватни језичак
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (приватно прегледање)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Приватни језичак
39 | dialogQuestionSingle=Шта желите да урадите са једним приватним језичком?
40 | dialogCloseSingle=&Затвори
41 | dialogRestoreSingle=Учини га обичним језичком
42 | # For more than one tab:
43 | dialogTitle=Приватни језичак
44 | dialogQuestion=Шта желите да урадите са %S приватних језичака?
45 | dialogClose=&Затвори их
46 | dialogRestore=Учини их &обичним
--------------------------------------------------------------------------------
/locale/tr/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Bağlantıyı Yeni Gizli Sekmede Aç
2 | openInNewPrivateTabAccesskey=b
3 |
4 | openPlacesInNewPrivateTab=Yeni Gizli Sekmede Aç
5 | openPlacesInNewPrivateTabAccesskey=g
6 |
7 | openPlacesInPrivateTabs=Hepsini Gizli Sekmelerde Aç
8 | openPlacesInPrivateTabsAccesskey=h
9 |
10 | privateTab=Gizli Sekme
11 | privateTabTip=(gizli sekme)
12 | privateTabAccesskey=s
13 |
14 | openNewPrivateTab=Yeni Gizli Sekme
15 | openNewPrivateTabTip=Yeni gizli sekme aç
16 | openNewPrivateTabAccesskey=g
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Gizli Sekme
21 | openNewPrivateTabShortAccesskey=g
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Yeni gizli sekme
27 | taskBarOpenNewPrivateTabDesc=Gizli gezinti kipinde yeni bir sekme aç.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Gizli sekme aç
30 | taskBarOpenNewPrivateTabDescSM=Yeni gizli gezinti sekmesi aç.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Gizli Gezinti)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Gizli Sekme
39 | dialogQuestionSingle=Gizli sekmeyle ne yapmak istersin?
40 | dialogCloseSingle=&Kapat
41 | dialogRestoreSingle=&Gizliliği kaldır
42 | # For more than one tab:
43 | dialogTitle=Gizli Sekme
44 | dialogQuestion=%s gizli sekmeyle ne yapmak istersin?
45 | dialogClose=Hepsini &kapat
46 | dialogRestore=Hepsinin &gizliliğini kaldır
--------------------------------------------------------------------------------
/locale/uk/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Відкрити посилання в новій приватній вкладці
2 | openInNewPrivateTabAccesskey=р
3 |
4 | openPlacesInNewPrivateTab=Відкрити в новій приватній вкладці
5 | openPlacesInNewPrivateTabAccesskey=и
6 |
7 | openPlacesInPrivateTabs=Open All in Private Tabs
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Приватна вкладка
11 | privateTabTip=(приватна вкладка)
12 | privateTabAccesskey=П
13 |
14 | openNewPrivateTab=Нова приватна вкладка
15 | openNewPrivateTabTip=Відкрити нову приватну вкладку
16 | openNewPrivateTabAccesskey=р
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Приватна вкладка
21 | openNewPrivateTabShortAccesskey=р
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Нова приватна вкладка
27 | taskBarOpenNewPrivateTabDesc=Open a new tab in private browsing mode.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Open private tab
30 | taskBarOpenNewPrivateTabDescSM=Open a new private browsing tab.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Приватний перегляд)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Private Tab
39 | dialogQuestionSingle=Що ви хочете зробити з однією приватною вкладкою?
40 | dialogCloseSingle=&Закрити її
41 | dialogRestoreSingle=Зробити її не приватною
42 | # For more than one tab:
43 | dialogTitle=Private Tab
44 | dialogQuestion=Що ви хочете зробити з приватними вкладками (%S шт.)?
45 | dialogClose=&Закрити їх
46 | dialogRestore=Зробити їх не приватними
47 |
--------------------------------------------------------------------------------
/locale/vi/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=Mở liên kết trong Thẻ Riêng tư Mới
2 | openInNewPrivateTabAccesskey=r
3 |
4 | openPlacesInNewPrivateTab=Mở trong Thẻ Riêng tư
5 | openPlacesInNewPrivateTabAccesskey=r
6 |
7 | openPlacesInPrivateTabs=Mở tất cả là Thẻ Riêng tư
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=Thẻ Riêng tư
11 | privateTabTip=(thẻ riêng tư)
12 | privateTabAccesskey=r
13 |
14 | openNewPrivateTab=Thẻ Riêng tư Mới
15 | openNewPrivateTabTip=Mở Thẻ Riêng tư Mới
16 | openNewPrivateTabAccesskey=r
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=Thẻ Riêng tư
21 | openNewPrivateTabShortAccesskey=r
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=Thẻ riêng tư mới
27 | taskBarOpenNewPrivateTabDesc=Mở một thẻ mới ở chế độ duyệt riêng tư.
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=Thẻ riêng tư mới
30 | taskBarOpenNewPrivateTabDescSM=Mở một thẻ mới ở chế độ duyệt riêng tư.
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (Duyệt web Riêng tư)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=Thẻ Riêng tư
39 | dialogQuestionSingle=Thẻ này đang ở chế độ riêng tư. Bạn muốn...
40 | dialogCloseSingle=Đón&g thẻ.
41 | dialogRestoreSingle=Thoát chế độ riêng tư.
42 |
43 | # For more than one tab:
44 | dialogTitle=Thẻ Riêng tư
45 | dialogQuestion= Hiện có %S thẻ đang ở chế độ riêng tư. Bạn muốn...
46 | dialogClose=Đón&g thẻ
47 | dialogRestore=Thoát chế độ riêng tư.
48 |
--------------------------------------------------------------------------------
/locale/zh-CN/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=在新的隐私标签页中打开链接
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=在新的隐私标签页中打开
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=在隐私标签页中打开所有
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=隐私标签页
11 | privateTabTip=(隐私标签页)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=新建隐私标签页
15 | openNewPrivateTabTip=打开一个新的隐私标签页
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=隐私标签页
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=新建隐私标签页
27 | taskBarOpenNewPrivateTabDesc=在隐私模式中打开一个新标签页。
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=打开隐私标签页
30 | taskBarOpenNewPrivateTabDescSM=打开新隐私浏览标签页。
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\(隐私浏览)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=隐私标签页
39 | dialogQuestionSingle=您想对 1 个隐私标签页做什么操作?
40 | dialogCloseSingle=关闭它(&C)
41 | dialogRestoreSingle=转换为非隐私(&N)
42 | # For more than one tab:
43 | dialogTitle=隐私标签页
44 | dialogQuestion=您想对 %S 个隐私标签页做什么操作?
45 | dialogClose=关闭它们(&C)
46 | dialogRestore=转换为非隐私(&N)
47 |
--------------------------------------------------------------------------------
/locale/zh-TW/pt.properties:
--------------------------------------------------------------------------------
1 | openInNewPrivateTab=用新隱私分頁開啟鏈結
2 | openInNewPrivateTabAccesskey=v
3 |
4 | openPlacesInNewPrivateTab=用新隱私分頁開啟
5 | openPlacesInNewPrivateTabAccesskey=v
6 |
7 | openPlacesInPrivateTabs=全部用隱私分頁開啟
8 | openPlacesInPrivateTabsAccesskey=v
9 |
10 | privateTab=隱私分頁
11 | privateTabTip=(隱私分頁)
12 | privateTabAccesskey=v
13 |
14 | openNewPrivateTab=開新隱私分頁
15 | openNewPrivateTabTip=開啟一個新的隱私分頁
16 | openNewPrivateTabAccesskey=v
17 | # For SeaMonkey, item in "File - New" menu
18 | # And for Firefox 29+ (Australis), if following is set to "true" (instead of "false")
19 | openNewPrivateTabShortInAustralis=false
20 | openNewPrivateTabShort=隱私分頁
21 | openNewPrivateTabShortAccesskey=v
22 | # Template for toolbar button's tooltip in Firefox 29+ (Australis)
23 | buttonTipTemplate=%tip% (%key%)
24 |
25 | # Like taskbar.tasks.newPrivateWindow.* from chrome://browser/locale/taskbar.properties
26 | taskBarOpenNewPrivateTab=開新隱私分頁
27 | taskBarOpenNewPrivateTabDesc=使用隱私瀏覽模式開啟新分頁。
28 | # For SeaMonkey, like taskbar.tasks.newPrivate.* from chrome://navigator/locale/taskbar.properties
29 | taskBarOpenNewPrivateTabSM=開啟隱私分頁
30 | taskBarOpenNewPrivateTabDescSM=開啟新的隱私瀏覽分頁。
31 |
32 | # For SeaMonkey 2.18 and older, you can just copy Firefox translation:
33 | # mainWindow.titlePrivateBrowsingSuffix from view-source:chrome://browser/locale/browser.dtd
34 | privateBrowsingTitleModifier=\ (隱私瀏覽中)
35 |
36 | # Confirmation dialog in case of extension disabling or uninstalling
37 | # For only one tab:
38 | dialogTitleSingle=隱私分頁
39 | dialogQuestionSingle=您要如何處理 1 個隱私分頁?
40 | dialogCloseSingle=關閉它(&C)
41 | dialogRestoreSingle=轉換成非隱私(&N)
42 | # For more than one tab:
43 | dialogTitle=隱私分頁
44 | dialogQuestion=您要如何處理 %S 個隱私分頁?
45 | dialogClose=關閉它們(&C)
46 | dialogRestore=轉換成非隱私(&N)
47 |
--------------------------------------------------------------------------------
/log.js:
--------------------------------------------------------------------------------
1 | const LOG_PREFIX = "[Private Tab] ";
2 |
3 | if(!("Services" in this))
4 | Components.utils.import("resource://gre/modules/Services.jsm");
5 | __defineGetter__.call(this, "_dbg", function() {
6 | return _boolPref("debug");
7 | });
8 | __defineSetter__.call(this, "_dbg", function(v) {
9 | delete this._dbg;
10 | return this._dbg = v;
11 | });
12 | __defineGetter__.call(this, "_dbgv", function() {
13 | return _boolPref("debug.verbose");
14 | });
15 | __defineSetter__.call(this, "_dbgv", function(v) {
16 | delete this._dbgv;
17 | return this._dbgv = v;
18 | });
19 | function _boolPref(pref) {
20 | pref = "extensions.privateTab." + pref;
21 | if(Services.prefs.getPrefType(pref) == Services.prefs.PREF_BOOL)
22 | return Services.prefs.getBoolPref(pref);
23 | return true; // Not yet initialized
24 | }
25 |
26 | function ts() {
27 | var d = new Date();
28 | var ms = d.getMilliseconds();
29 | return d.toTimeString().replace(/^.*\d+:(\d+:\d+).*$/, "$1") + ":" + "000".substr(("" + ms).length) + ms + " ";
30 | }
31 | function _log(s) {
32 | if(!_dbg)
33 | return;
34 | var msg = LOG_PREFIX + ts() + s;
35 | Services.console.logStringMessage(msg);
36 | dump(msg + "\n");
37 | }
38 | function _tab(tab) {
39 | return tab && _str(tab.label);
40 | }
41 | function _str(s) {
42 | return s && s.substr(0, 255);
43 | }
44 | function _p(isPrivate) {
45 | return isPrivate ? "private" : "not private";
46 | }
--------------------------------------------------------------------------------
/make.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | set _out=private_tab-latest.xpi
3 | set _out_tmp=%~d0\~%_out%.tmp
4 | set _7zip="%COMMANDER_PATH%\arch\7-Zip-4.65\7z.exe"
5 | set _winRar="%COMMANDER_PATH%\arch\WinRAR\WinRAR.exe"
6 | title Make %_out%
7 |
8 | if not exist %_7zip% set _7zip="%ProgramFiles%\7-Zip\7z.exe"
9 | if not exist %_winRar% set _winRar="%ProgramFiles%\WinRAR\WinRAR.exe"
10 |
11 | if not exist %_7zip% (
12 | title Error - Make %_out%
13 | echo 7-Zip not found!
14 | if not exist %_winRar% (
15 | echo WinRAR not found!
16 | pause
17 | exit /b
18 | )
19 | )
20 |
21 | cd /d "%~dp0"
22 |
23 | if exist %_out_tmp% (
24 | title Error - Make %_out%
25 | echo =============================================
26 | echo Something went wrong, please remove or rename
27 | echo %_out_tmp%
28 | echo =============================================
29 | pause
30 | exit /b
31 | )
32 |
33 | :: Test for write access
34 | type nul > %_out_tmp%
35 | if not exist %_out_tmp% (
36 | echo =^> %_out_tmp% isn't writable
37 | echo ==^> will use %temp%
38 | set _out_tmp="%temp%\~%_out%.tmp"
39 | ) else (
40 | del %_out_tmp%
41 | )
42 |
43 | set _files=install.rdf *.manifest *.js *.jsm *.xul *.xml *.html *.css license* *.png defaults modules components locale chrome idl
44 | if exist %_7zip% (
45 | echo =^> %_7zip%
46 | %_7zip% a -tzip -mx9 -mfb=258 -mpass=15 -- %_out_tmp% %_files%
47 | ) else (
48 | echo =^> %_winRar%
49 | %_winRar% a -afzip -m5 -r -- %_out_tmp% %_files%
50 | )
51 |
52 | if not exist %_out_tmp% echo Error: %_out_tmp% not found! & pause & exit /b
53 |
54 | if not exist %_out% goto skipCompare
55 | fc /l /lb2 /t %_out% %_out_tmp%
56 | if %ErrorLevel% == 0 (
57 | del %_out_tmp%
58 | echo ===============
59 | echo ==^> No changes!
60 | echo ===============
61 | if not "%1" == "nodelay" ping -n 3 127.0.0.1 > nul
62 | exit /b
63 | )
64 | :skipCompare
65 |
66 | echo ==^> Changed, update...
67 | move /y %_out_tmp% %_out%
--------------------------------------------------------------------------------
/make.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | PROG=false
4 | XPI=private_tab-latest.xpi
5 | FILES='install.rdf *.manifest *.js *.jsm *.xul *.xml *.html *.css license* *.png defaults modules components locale chrome idl'
6 |
7 | for z in 7za 7z zip
8 | do
9 | if command -v $z >/dev/null 2>&1
10 | then
11 | PROG=$z
12 | break
13 | fi
14 | done
15 |
16 | if test $PROG = false
17 | then
18 | echo "usable program not found, abort."
19 | exit 1
20 | else
21 | echo "use $PROG to create xpi."
22 | fi
23 |
24 | if test $PROG = zip
25 | then
26 | $PROG -9r $XPI $FILES
27 | else
28 | $PROG a -tzip -mm=Deflate -mx9 -mfb258 -mpass=15 $XPI $FILES
29 | fi
--------------------------------------------------------------------------------
/patcher.jsm:
--------------------------------------------------------------------------------
1 | var EXPORTED_SYMBOLS = ["patcher"];
2 | var patcher = {
3 | // Do some magic to restore third party wrappers from other extensions
4 | wrapNS: "patcher::",
5 | init: function(ns, logger) {
6 | this.wrapNS = ns;
7 | if(logger)
8 | _log = logger;
9 | },
10 | destroy: function() {
11 | _log = function() {};
12 | },
13 | wrapFunction: function(obj, meth, key, callBefore, callAfter) {
14 | var win = this.getGlobal(obj);
15 | var name = key;
16 | key = this.wrapNS + key;
17 | var orig, wrapped;
18 | if(!(key in win)) {
19 | _log("[patcher] Patch " + name);
20 | orig = obj[meth];
21 | wrapped = obj[meth] = callAfter
22 | ? function wrapper() {
23 | var res = win[key].before.apply(this, arguments);
24 | if(res)
25 | return typeof res == "object" ? res.value : undefined;
26 | try {
27 | var ret = orig.apply(this, arguments);
28 | }
29 | catch(e) {
30 | Components.utils.reportError(e);
31 | }
32 | // Note: used "win.Array" to work after unloading of our .jsm
33 | win[key].after.apply(this, [ret].concat(win.Array.prototype.slice.call(arguments)));
34 | return ret;
35 | }
36 | : function wrapper() {
37 | var res = win[key].before.apply(this, arguments);
38 | if(res)
39 | return typeof res == "object" ? res.value : undefined;
40 | return orig.apply(this, arguments);
41 | };
42 | // Someone may want to do eval() patch...
43 | var getGlobal = function() {
44 | if(win instanceof Components.interfaces.nsIDOMWindow)
45 | return ["window", ""];
46 | var global = "_global_" + Math.random().toFixed(14).substr(2);
47 | return [
48 | global,
49 | "\n\tvar " + global + " = Components.utils.getGlobalForObject(this);"
50 | ];
51 | };
52 | var patch = callAfter
53 | ? function(s) {
54 | var rnd = Math.random().toFixed(14).substr(2);
55 | var res = "_res_" + rnd;
56 | var ret = "_ret_" + rnd;
57 | var [global, ensureGlobal] = getGlobal();
58 | return s
59 | .replace(
60 | /\{(?:\s*("|')use strict\1;)?/,
61 | "$&" + ensureGlobal
62 | + "\n\tvar " + res + " = " + global + '["' + key + '"].before.apply(this, arguments);\n'
63 | + '\tif(' + res + ') return typeof ' + res + ' == "object" ? ' + res + '.value : undefined;\n'
64 | + "\tvar " + ret + " = (function() {\n"
65 | )
66 | .replace(
67 | /\}$/,
68 | "\t}).apply(this, arguments);\n"
69 | + "\t" + global + '["' + key + '"].after'
70 | + '.apply(this, [' + ret + "].concat(Array.prototype.slice.call(arguments)));\n"
71 | + "\treturn " + ret + ";\n"
72 | + "}"
73 | );
74 | }
75 | : function(s) {
76 | var rnd = Math.random().toFixed(14).substr(2);
77 | var res = "_res_" + rnd;
78 | var [global, ensureGlobal] = getGlobal();
79 | return s.replace(
80 | /\{(?:\s*("|')use strict\1;)?/,
81 | "$&" + ensureGlobal
82 | + "\n\tvar " + res + " = " + global + '["' + key + '"].before.apply(this, arguments);\n'
83 | + '\tif(' + res + ') return typeof ' + res + ' == "object" ? ' + res + '.value : undefined;\n'
84 | );
85 | };
86 | wrapped.toString = function() {
87 | return patch(orig.toString());
88 | };
89 | wrapped.toSource = function() {
90 | return patch(orig.toSource());
91 | };
92 | }
93 | else {
94 | _log("[patcher] Will use previous patch for " + name);
95 | orig = win[key].orig; // Leave ability to unwrap (and break all third-party wrappers!)
96 | }
97 | if(callAfter)
98 | callAfter.before = callBefore;
99 | win[key] = {
100 | before: callBefore,
101 | after: callAfter,
102 | orig: orig,
103 | wrapped: wrapped,
104 | enabled: true
105 | };
106 | },
107 | unwrapFunction: function(obj, meth, key, forceDestroy) {
108 | var win = this.getGlobal(obj);
109 | var name = key;
110 | key = this.wrapNS + key;
111 | if(!(key in win))
112 | return;
113 | var wrapper = win[key];
114 | var wrapped = wrapper.wrapped;
115 | var canRestore = obj[meth] == wrapped;
116 | if(canRestore || forceDestroy) {
117 | _log("[patcher] Restore " + name + (canRestore ? "" : " [force]"));
118 | delete win[key];
119 | obj[meth] = wrapper.orig;
120 | }
121 | else {
122 | _log("[patcher] !!! Can't completely restore " + name + ": detected third-party wrapper!");
123 | if(wrapped) { // First failure, all next iterations will use already existing wrapper
124 | delete wrapped.toString;
125 | delete wrapped.toSource;
126 | wrapper.wrapped = undefined;
127 | }
128 | wrapper.before = wrapper.after = function empty() {};
129 | wrapper.enabled = false;
130 | if(win instanceof Components.interfaces.nsIDOMWindow) {
131 | win.addEventListener("unload", function destroyWrapper(e) {
132 | win.removeEventListener(e.type, destroyWrapper, false);
133 | delete win[key];
134 | obj[meth] = wrapper.orig;
135 | }, false);
136 | }
137 | }
138 | },
139 | isWrapped: function(obj, key) {
140 | var win = this.getGlobal(obj);
141 | key = this.wrapNS + key;
142 | return key in win && win[key].enabled;
143 | },
144 | getGlobal: function(obj) {
145 | var g = Components.utils.getGlobalForObject(obj);
146 | if(g instanceof Components.interfaces.nsIDOMWindow)
147 | return g.window; // Trick for [object Sandbox] in Firefox 45+
148 | return g;
149 | }
150 | };
151 | function _log() {}
--------------------------------------------------------------------------------
/privacy-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/Private_Tab/025f31631de916c19d5925f689257a1cdd41d18b/privacy-16.png
--------------------------------------------------------------------------------
/privacy-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/Private_Tab/025f31631de916c19d5925f689257a1cdd41d18b/privacy-24.png
--------------------------------------------------------------------------------
/privacy-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Infocatcher/Private_Tab/025f31631de916c19d5925f689257a1cdd41d18b/privacy-32.png
--------------------------------------------------------------------------------
/protocol-process.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | var {Services} = Components.utils.import("resource://gre/modules/Services.jsm", {});
3 | if(Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_CONTENT)
4 | return;
5 | var {privateProtocol} = Components.utils.import("chrome://privatetab/content/protocol.jsm", {});
6 | privateProtocol.init();
7 | addMessageListener("PrivateTab:ProtocolDestroy", function destroy(msg) {
8 | removeMessageListener("PrivateTab:ProtocolDestroy", destroy);
9 | privateProtocol.destroy();
10 | Components.utils.unload("chrome://privatetab/content/protocol.jsm");
11 | });
12 | })();
--------------------------------------------------------------------------------
/protocol.jsm:
--------------------------------------------------------------------------------
1 | var EXPORTED_SYMBOLS = ["privateProtocol"];
2 |
3 | const P_CID = Components.ID("{e974cf10-11cb-4293-af88-e61c7dfe717c}"),
4 | P_CONTRACTID = "@mozilla.org/network/protocol;1?name=private",
5 | P_HANDLER = Components.interfaces.nsIProtocolHandler,
6 | P_SCHEME = "private",
7 | P_NAME = "Private Tab protocol handler";
8 |
9 | Components.utils.import("resource://gre/modules/Services.jsm");
10 | var _log;
11 |
12 | var privateProtocol = {
13 | get platformVersion() {
14 | var pv = parseFloat(Services.appinfo.platformVersion);
15 | if(Services.appinfo.name == "Pale Moon" || Services.appinfo.name == "Basilisk")
16 | pv = pv >= 4.1 ? 56 : 28;
17 | delete this.platformVersion;
18 | return this.platformVersion = pv;
19 | },
20 | get compReg() {
21 | return Components.manager
22 | .QueryInterface(Components.interfaces.nsIComponentRegistrar);
23 | },
24 | init: function(logger) {
25 | if(logger)
26 | _log = logger;
27 | else
28 | Services.scriptloader.loadSubScript("chrome://privatetab/content/log.js");
29 | this.compReg.registerFactory(P_CID, P_NAME, P_CONTRACTID, this);
30 | _log("[protocol] Initialized" + (logger ? "" : " + loaded log.js"));
31 | },
32 | destroy: function() {
33 | this.compReg.unregisterFactory(P_CID, this);
34 | _log("[protocol] Destroyed");
35 | _log = null;
36 | },
37 |
38 | // nsIFactory
39 | createInstance: function(outer, iid) {
40 | if(outer != null)
41 | throw Components.results.NS_ERROR_NO_AGGREGATION;
42 | if(iid.equals(P_HANDLER))
43 | return this;
44 | throw Components.results.NS_ERROR_NO_INTERFACE;
45 | },
46 | lockFactory: function(lock) {
47 | throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
48 | },
49 | // nsISupports
50 | QueryInterface: function(iid) {
51 | if(
52 | iid.equals(Components.interfaces.nsISupports)
53 | || iid.equals(Components.interfaces.nsIFactory)
54 | || iid.equals(P_HANDLER)
55 | )
56 | return this;
57 | throw Components.results.NS_ERROR_NO_INTERFACE;
58 | },
59 |
60 | // nsIProtocolHandler
61 | defaultPort: -1,
62 | protocolFlags: P_HANDLER.URI_NORELATIVE
63 | | P_HANDLER.URI_NOAUTH
64 | | P_HANDLER.URI_FORBIDS_AUTOMATIC_DOCUMENT_REPLACEMENT
65 | //| P_HANDLER.URI_LOADABLE_BY_ANYONE
66 | | P_HANDLER.URI_DANGEROUS_TO_LOAD
67 | | P_HANDLER.URI_NON_PERSISTABLE,
68 | scheme: P_SCHEME,
69 | allowPort: function() {
70 | return false;
71 | },
72 | newURI: function(spec, originCharset, baseURI) {
73 | var uri = "@mozilla.org/network/simple-uri;1" in Components.classes // Removed in Firefox 61+
74 | && Components.classes["@mozilla.org/network/simple-uri;1"]
75 | .createInstance(Components.interfaces.nsIURI);
76 | if(!uri) {
77 | var mutator = Components.classes["@mozilla.org/network/simple-uri-mutator;1"]
78 | .createInstance(Components.interfaces.nsIURIMutator);
79 | return (this.newURI = function(spec, originCharset, baseURI) {
80 | return mutator.setSpec(spec).finalize();
81 | })(spec);
82 | }
83 | // nsIURI.spec is read-only in Firefox 58+: https://bugzilla.mozilla.org/show_bug.cgi?id=1431204
84 | if("mutate" in uri)
85 | return uri.mutate().setSpec(spec).finalize();
86 | uri.spec = spec;
87 | return uri;
88 | },
89 | newChannel: function(uri) {
90 | return this.newChannel2(uri, null);
91 | },
92 | newChannel2: function(uri, loadInfo) {
93 | var spec = uri.spec;
94 | _log("[protocol] newChannel(): spec = " + spec);
95 | var newSpec = "";
96 | var schemePrefix = P_SCHEME + ":";
97 | // Example: private:///#http://example.com/ (legacy) or private:http://example.com/
98 | if(spec && spec.startsWith(schemePrefix))
99 | newSpec = spec.substr(schemePrefix.length).replace(/^\/*#?/, "");
100 | _log("[protocol] newChannel(): newSpec = " + newSpec);
101 |
102 | // We can't use newChannel(newSpec, ...) here - strange things happens
103 | // Also we can't use nsIPrivateBrowsingChannel.setPrivate(true) for chrome:// URI
104 | var redirect = "chrome://privatetab/content/protocolRedirect.html#" + newSpec;
105 | var channel = "newChannelFromURIWithLoadInfo" in Services.io // Firefox 37+
106 | && (loadInfo || this.platformVersion >= 44) // Throws in Firefox 37-43 with null nsILoadInfo
107 | ? Services.io.newChannelFromURIWithLoadInfo(
108 | Services.io.newURI(redirect, null, null),
109 | loadInfo
110 | )
111 | : Services.io.newChannel(redirect, null, null); // Deprecated in Firefox 48+
112 | var ensurePrivate = function(reason) {
113 | _log("[protocol] " + reason + " => ensurePrivate()");
114 | var isPrivate = this.makeChannelPrivate(channel);
115 | ensurePrivate = function() { return true; }; // Don't call again in case of success
116 | if(!isPrivate) // Don't load, will use workaround with tab duplication
117 | channel.cancel(Components.results.NS_BINDING_ABORTED);
118 | return isPrivate;
119 | }.bind(this);
120 | function proxy(method) {
121 | return function() {
122 | return ensurePrivate("nsIChannel." + method + "()")
123 | && channel[method].apply(this, arguments);
124 | };
125 | }
126 | Services.tm.mainThread.dispatch(function() {
127 | ensurePrivate("fallback delay");
128 | }, Components.interfaces.nsIThread.DISPATCH_NORMAL);
129 | return {
130 | __proto__: channel,
131 | asyncOpen: proxy("asyncOpen"),
132 | asyncOpen2: proxy("asyncOpen2"),
133 | open: proxy("open"),
134 | open2: proxy("open2")
135 | };
136 | },
137 |
138 | makeChannelPrivate: function(channel) {
139 | var loadContext = this.getLoadContext(channel);
140 | if(loadContext) try {
141 | if(loadContext.usePrivateBrowsing) // Already private
142 | return true;
143 | loadContext.usePrivateBrowsing = true;
144 | return true;
145 | }
146 | catch(e) {
147 | if( // See https://github.com/Infocatcher/Private_Tab/issues/251
148 | this.platformVersion >= 52
149 | && this.fixTabFromLoadContext(loadContext, channel.URI.ref)
150 | )
151 | return undefined;
152 | Components.utils.reportError(e);
153 | }
154 | if(channel instanceof Components.interfaces.nsIPrivateBrowsingChannel) try {
155 | channel.setPrivate(true);
156 | return true;
157 | }
158 | catch(e) {
159 | Components.utils.reportError(e);
160 | }
161 | throw Components.results.NS_ERROR_NO_INTERFACE;
162 | },
163 | getLoadContext: function(channel) {
164 | try {
165 | if(channel.notificationCallbacks) {
166 | return channel.notificationCallbacks
167 | .getInterface(Components.interfaces.nsILoadContext);
168 | }
169 | }
170 | catch(e) {
171 | Components.utils.reportError(e);
172 | }
173 | try {
174 | if(channel.loadGroup && channel.loadGroup.notificationCallbacks) {
175 | return channel.loadGroup.notificationCallbacks
176 | .getInterface(Components.interfaces.nsILoadContext);
177 | }
178 | }
179 | catch(e) {
180 | Components.utils.reportError(e);
181 | }
182 | return null;
183 | },
184 | fixTabFromLoadContext: function(loadContext, uri) {
185 | if(loadContext.useRemoteTabs) {
186 | _log("[protocol] fixTabFromLoadContext(): in content process");
187 | var mm = "nsIContentFrameMessageManager" in Components.interfaces
188 | ? loadContext.associatedWindow
189 | .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
190 | .getInterface(Components.interfaces.nsIDocShell)
191 | .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
192 | .getInterface(Components.interfaces.nsIContentFrameMessageManager)
193 | : loadContext.associatedWindow.docShell.messageManager; // Firefox 63+
194 | var res = mm.sendSyncMessage("PrivateTab:ProtocolReplaceTab", { URI: uri });
195 | return res && res[0];
196 | }
197 | var browser = loadContext.topFrameElement;
198 | if(!browser) {
199 | _log("[protocol] fixTabFromLoadContext(): missing loadContext.topFrameElement");
200 | return false;
201 | }
202 | var window = browser.ownerDocument.defaultView;
203 | var pt = window.privateTab || null;
204 | if(!pt) {
205 | _log("[protocol] fixTabFromLoadContext(): missing window.privateTab");
206 | return false;
207 | }
208 | return pt._fixBrowserFromProtocol(browser, uri);
209 | }
210 | };
--------------------------------------------------------------------------------
/protocolRedirect.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Private Tab: Redirect…
4 |
5 |
8 |
--------------------------------------------------------------------------------
/virtualKeyCodes.js:
--------------------------------------------------------------------------------
1 | var getVKCharMap = {
2 | VK_SPACE: " ", //32
3 | VK_COLON: ":", //58
4 | VK_SEMICOLON: ";", //59
5 | VK_LESS_THAN: "<", //60
6 | VK_EQUALS: "=", //61
7 | VK_GREATER_THAN: ">", //62
8 | VK_QUESTION_MARK: "?", //63
9 | VK_AT: "@", //64
10 | VK_MULTIPLY: "*", //106
11 | VK_ADD: "+", //107
12 | VK_SUBTRACT: "-", //109
13 | VK_DECIMAL: ".", //110
14 | VK_DIVIDE: "/", //111
15 | VK_CIRCUMFLEX: "^", //160
16 | VK_EXCLAMATION: "!", //161
17 | VK_DOUBLE_QUOTE: '"', //162
18 | VK_HASH: "#", //163
19 | VK_DOLLAR: "$", //164
20 | VK_PERCENT: "%", //165
21 | VK_AMPERSAND: "&", //166
22 | VK_UNDERSCORE: "_", //167
23 | VK_OPEN_PAREN: "(", //168
24 | VK_CLOSE_PAREN: ")", //169
25 | VK_ASTERISK: "*", //170
26 | VK_PLUS: "+", //171
27 | VK_PIPE: "|", //172
28 | VK_HYPHEN_MINUS: "-", //173
29 | VK_OPEN_CURLY_BRACKET: "{", //174
30 | VK_CLOSE_CURLY_BRACKET: "}", //175
31 | VK_TILDE: "~", //176
32 | VK_COMMA: ",", //188
33 | VK_PERIOD: ".", //190
34 | VK_SLASH: "/", //191
35 | VK_BACK_QUOTE: "`", //192
36 | VK_OPEN_BRACKET: "[", //219
37 | VK_BACK_SLASH: "\\", //220
38 | VK_CLOSE_BRACKET: "]", //221
39 | VK_QUOTE: "'", //222
40 | __proto__: null
41 | };
42 | function getVKChar(vk) {
43 | // Firefox doesn't have string representation for some codes...
44 | // https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent#Virtual_key_codes
45 | return getVKCharMap[vk]
46 | || /^VK_(?:NUMPAD)?([\d+A-Z])$/.test(vk) && RegExp.$1
47 | || undefined;
48 | }
--------------------------------------------------------------------------------