Bug 1380227 - Avoid many UTF16toUTF8 and UTF8toUTF16 conversions in nsStringBundle. r=emk.
Most of the names passed to nsIStringBundle::{Get,Format}StringFromUTF8Name
have one of the two following forms:
- a 16-bit C string literal, which is then converted to an 8-bit string in
order for the lookup to occur;
- an 8-bit C string literal converted to a 16-bit string, which is then
converted back to an 8-bit string in order for the lookup to occur.
This patch introduces and uses alternative methods that can take an 8-bit C
string literal, which requires changing some signatures in other methods and
functions. It replaces all C++ uses of the old methods.
The patch also changes the existing {Get,Format}StringFromName() methods so
they take an AUTF8String argument for the name instead of a wstring, because
that's nicer for JS code.
Even though there is a method for C++ code and a different one for JS code,
|binaryname| is used so that the existing method names can be used for the
common case in both languages.
The change reduces the number of NS_ConvertUTF8toUTF16 and
NS_ConvertUTF16toUTF8 conversions while running Speedometer v2 from ~270,000 to
~160,000. (Most of these conversions involved the string
"deprecatedReferrerDirective" in nsCSPParser.cpp.)

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- *//* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. *//* The privileged system principal. */#include"nscore.h"#include"SystemPrincipal.h"#include"nsIComponentManager.h"#include"nsIServiceManager.h"#include"nsIURL.h"#include"nsCOMPtr.h"#include"nsXPIDLString.h"#include"nsReadableUtils.h"#include"nsCRT.h"#include"nsString.h"#include"nsIClassInfoImpl.h"#include"nsIScriptSecurityManager.h"#include"pratom.h"NS_IMPL_CLASSINFO(SystemPrincipal,nullptr,nsIClassInfo::SINGLETON|nsIClassInfo::MAIN_THREAD_ONLY,NS_SYSTEMPRINCIPAL_CID)NS_IMPL_QUERY_INTERFACE_CI(SystemPrincipal,nsIPrincipal,nsISerializable)NS_IMPL_CI_INTERFACE_GETTER(SystemPrincipal,nsIPrincipal,nsISerializable)#define SYSTEM_PRINCIPAL_SPEC "[System Principal]"already_AddRefed<SystemPrincipal>SystemPrincipal::Create(){RefPtr<SystemPrincipal>sp=newSystemPrincipal();sp->FinishInit(NS_LITERAL_CSTRING(SYSTEM_PRINCIPAL_SPEC),OriginAttributes());returnsp.forget();}nsresultSystemPrincipal::GetScriptLocation(nsACString&aStr){aStr.AssignLiteral(SYSTEM_PRINCIPAL_SPEC);returnNS_OK;}///////////////////////////////////////// Methods implementing nsIPrincipal /////////////////////////////////////////NS_IMETHODIMPSystemPrincipal::GetHashValue(uint32_t*result){*result=NS_PTR_TO_INT32(this);returnNS_OK;}NS_IMETHODIMPSystemPrincipal::GetURI(nsIURI**aURI){*aURI=nullptr;returnNS_OK;}NS_IMETHODIMPSystemPrincipal::GetCsp(nsIContentSecurityPolicy**aCsp){*aCsp=nullptr;returnNS_OK;}NS_IMETHODIMPSystemPrincipal::SetCsp(nsIContentSecurityPolicy*aCsp){// Never destroy an existing CSP on the principal.// This method should only be called in rare cases.returnNS_ERROR_FAILURE;}NS_IMETHODIMPSystemPrincipal::EnsureCSP(nsIDOMDocument*aDocument,nsIContentSecurityPolicy**aCSP){// CSP on a system principal makes no sensereturnNS_ERROR_FAILURE;}NS_IMETHODIMPSystemPrincipal::GetPreloadCsp(nsIContentSecurityPolicy**aPreloadCSP){*aPreloadCSP=nullptr;returnNS_OK;}NS_IMETHODIMPSystemPrincipal::EnsurePreloadCSP(nsIDOMDocument*aDocument,nsIContentSecurityPolicy**aPreloadCSP){// CSP on a system principal makes no sensereturnNS_OK;}NS_IMETHODIMPSystemPrincipal::GetDomain(nsIURI**aDomain){*aDomain=nullptr;returnNS_OK;}NS_IMETHODIMPSystemPrincipal::SetDomain(nsIURI*aDomain){returnNS_OK;}NS_IMETHODIMPSystemPrincipal::GetBaseDomain(nsACString&aBaseDomain){// No base domain for chrome.returnNS_OK;}NS_IMETHODIMPSystemPrincipal::GetAddonId(nsAString&aAddonId){aAddonId.Truncate();returnNS_OK;};//////////////////////////////////////////// Methods implementing nsISerializable ////////////////////////////////////////////NS_IMETHODIMPSystemPrincipal::Read(nsIObjectInputStream*aStream){// no-op: CID is sufficient to identify the mSystemPrincipal singletonreturnNS_OK;}NS_IMETHODIMPSystemPrincipal::Write(nsIObjectOutputStream*aStream){// no-op: CID is sufficient to identify the mSystemPrincipal singletonreturnNS_OK;}