Skip to content
Snippets Groups Projects
Verified Commit c4a5b4ec authored by Pier Angelo Vendrame's avatar Pier Angelo Vendrame :jack_o_lantern:
Browse files

Bug 11698: Incorporate Tor Browser Manual pages into Tor Browser

This patch associates the about:manual page to a translated page that
must be injected to browser/omni.ja after the build.
The content must be placed in chrome/browser/content/browser/manual/, so
that is then available at chrome://browser/content/manual/.
We preferred giving absolute freedom to the web team, rather than having
to change the patch in case of changes on the documentation.
parent cba5e42e
No related branches found
No related tags found
No related merge requests found
......@@ -461,6 +461,11 @@
<menupopup id="menu_HelpPopup" onpopupshowing="buildHelpMenu();">
<!-- Note: Items under here are cloned to the AppMenu Help submenu. The cloned items
have their strings defined by appmenu-data-l10n-id. -->
<!-- Add Tor Browser manual link -->
<menuitem id="torBrowserUserManual"
oncommand="gBrowser.selectedTab = gBrowser.addTab('about:manual', {triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()});"
label="&aboutTor.torbrowser_user_manual.label;"
accesskey="&aboutTor.torbrowser_user_manual.accesskey;"/>
<menuitem id="menu_openHelp"
oncommand="openHelpLink('firefox-help')"
hidden="true"
......
......@@ -15,6 +15,11 @@
#include "mozilla/StaticPrefs_browser.h"
#include "mozilla/dom/ContentChild.h"
// For Tor Browser manual
#include "nsTHashSet.h"
#include "mozilla/intl/LocaleService.h"
#include "mozilla/Omnijar.h"
namespace mozilla {
namespace browser {
......@@ -154,6 +159,12 @@ static const RedirEntry kRedirMap[] = {
nsIAboutModule::URI_CAN_LOAD_IN_CHILD | nsIAboutModule::ALLOW_SCRIPT |
nsIAboutModule::HIDE_FROM_ABOUTABOUT |
nsIAboutModule::IS_SECURE_CHROME_UI},
// The correct URI must be obtained by GetManualChromeURI
{"manual", "about:blank",
nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
nsIAboutModule::URI_CAN_LOAD_IN_PRIVILEGEDABOUT_PROCESS |
nsIAboutModule::IS_SECURE_CHROME_UI},
};
static nsAutoCString GetAboutModuleName(nsIURI* aURI) {
......@@ -170,6 +181,51 @@ static nsAutoCString GetAboutModuleName(nsIURI* aURI) {
return path;
}
static nsTHashSet<nsCStringHashKey> GetManualLocales() {
nsTHashSet<nsCStringHashKey> locales;
RefPtr<nsZipArchive> zip = Omnijar::GetReader(Omnijar::APP);
UniquePtr<nsZipFind> find;
const nsAutoCString prefix("chrome/browser/content/browser/manual/");
nsAutoCString needle = prefix;
needle.Append("*.html");
if (NS_SUCCEEDED(zip->FindInit(needle.get(), getter_Transfers(find)))) {
const char* entryName;
uint16_t entryNameLen;
while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) {
// 5 is to remove the final `.html`
const size_t length = entryNameLen - prefix.Length() - 5;
locales.Insert(nsAutoCString(entryName + prefix.Length(), length));
}
}
return locales;
}
static nsAutoCString GetManualChromeURI() {
static nsTHashSet<nsCStringHashKey> locales = GetManualLocales();
nsAutoCString reqLocale;
intl::LocaleService::GetInstance()->GetAppLocaleAsBCP47(reqLocale);
// Check every time the URL is needed in case the lang has been changed.
// We do not provide multi-language builds at the moment, so this should not
// happen, at least in Tor Browser desktop, but we prepared the patch to be
// ready also in such a case.
if (!locales.Contains(reqLocale) && reqLocale.Length() > 2 &&
reqLocale[2] == '-') {
// At the moment, codes in our manual output are either 2 letters (en) or
// 5 letters (pt-BR)
reqLocale.SetLength(2);
}
if (!locales.Contains(reqLocale)) {
reqLocale = "en";
}
// %s is the language
constexpr char model[] = "chrome://browser/content/manual/%s.html";
nsAutoCString url;
url.AppendPrintf(model, reqLocale.get());
return url;
}
NS_IMETHODIMP
AboutRedirector::NewChannel(nsIURI* aURI, nsILoadInfo* aLoadInfo,
nsIChannel** result) {
......@@ -224,6 +280,10 @@ AboutRedirector::NewChannel(nsIURI* aURI, nsILoadInfo* aLoadInfo,
NS_ENSURE_SUCCESS(rv, rv);
}
if (path.EqualsLiteral("manual")) {
url = GetManualChromeURI();
}
// fall back to the specified url in the map
if (url.IsEmpty()) {
url.AssignASCII(redir.url);
......@@ -282,6 +342,10 @@ AboutRedirector::GetChromeURI(nsIURI* aURI, nsIURI** chromeURI) {
nsAutoCString name = GetAboutModuleName(aURI);
if (name.EqualsLiteral("manual")) {
return NS_NewURI(chromeURI, GetManualChromeURI());
}
for (const auto& redir : kRedirMap) {
if (name.Equals(redir.id)) {
return NS_NewURI(chromeURI, redir.url);
......
......@@ -12,6 +12,7 @@ pages = [
'home',
'logins',
'loginsimportreport',
'manual',
'newtab',
'policies',
'preferences',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment