├── 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 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
event.typeevent.targetevent.detailDescription
PrivateTab:PrivateChangedtab1 – private tab
0 – not private
Changed private state of the tab
event.explicitOriginalTarget – initial tab in case of toggling using duplication (Firefox 51+, Private Tab 0.2.1.3+)
PrivateTab:OpenInNewTabtab1 – may be opened as child tabLink was opened in new private tab
PrivateTab:OpenNewTabtab1 – opened using middle-click
(or left-click with any modifier)
Opened new (empty) private tab
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 | } --------------------------------------------------------------------------------