Backed out changeset 05fc8d2d7ca9 (bug 863246) for failing various reftests, e.g. parser/htmlparser/tests/reftest/bug535530-2.html. r=backout on a CLOSED TREE

This commit is contained in:
Sebastian Hengst 2017-08-25 16:44:40 +02:00
parent 2e163c99b1
commit 163be910bb
14 changed files with 37 additions and 183 deletions

View file

@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
[features/activity-stream@mozilla.org] chrome.jar: [features/activity-stream@mozilla.org] chrome.jar:
% resource activity-stream %content/ contentaccessible=yes % resource activity-stream %content/
content/lib/ (./lib/*) content/lib/ (./lib/*)
content/common/ (./common/*) content/common/ (./common/*)
content/vendor/Redux.jsm (./vendor/Redux.jsm) content/vendor/Redux.jsm (./vendor/Redux.jsm)

View file

@ -3,9 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
[features/onboarding@mozilla.org] chrome.jar: [features/onboarding@mozilla.org] chrome.jar:
# resource://onboarding/ is referenced in about:home and about:newtab, % resource onboarding %content/
# so make it content-accessible.
% resource onboarding %content/ contentaccessible=yes
content/ (content/*) content/ (content/*)
# Package UITour-lib.js in here rather than under # Package UITour-lib.js in here rather than under
# /browser/components/uitour to avoid "unreferenced files" error when # /browser/components/uitour to avoid "unreferenced files" error when

View file

@ -7,7 +7,7 @@
lib/ (./lib/*) lib/ (./lib/*)
data/ (./data/*) data/ (./data/*)
skin/ (skin/*) skin/ (skin/*)
% resource shield-recipe-client-content %content/ contentaccessible=yes % resource shield-recipe-client-content %content/
content/ (./content/*) content/ (./content/*)
% resource shield-recipe-client-vendor %vendor/ contentaccessible=yes % resource shield-recipe-client-vendor %vendor/
vendor/ (./vendor/*) vendor/ (./vendor/*)

View file

@ -53,7 +53,6 @@
#include "nsIURIFixup.h" #include "nsIURIFixup.h"
#include "nsCDefaultURIFixup.h" #include "nsCDefaultURIFixup.h"
#include "nsIChromeRegistry.h" #include "nsIChromeRegistry.h"
#include "nsIResProtocolHandler.h"
#include "nsIContentSecurityPolicy.h" #include "nsIContentSecurityPolicy.h"
#include "nsIAsyncVerifyRedirectCallback.h" #include "nsIAsyncVerifyRedirectCallback.h"
#include "mozilla/Preferences.h" #include "mozilla/Preferences.h"
@ -916,9 +915,10 @@ nsScriptSecurityManager::CheckLoadURIFlags(nsIURI *aSourceURI,
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (hasFlags) { if (hasFlags) {
if (aFlags & nsIScriptSecurityManager::ALLOW_CHROME) { if (aFlags & nsIScriptSecurityManager::ALLOW_CHROME) {
// For now, don't change behavior for moz-icon:// and just allow it.
if (!targetScheme.EqualsLiteral("chrome") // For now, don't change behavior for resource:// or moz-icon:// and
&& !targetScheme.EqualsLiteral("resource")) { // just allow them.
if (!targetScheme.EqualsLiteral("chrome")) {
return NS_OK; return NS_OK;
} }
@ -939,51 +939,15 @@ nsScriptSecurityManager::CheckLoadURIFlags(nsIURI *aSourceURI,
return NS_OK; return NS_OK;
} }
if (targetScheme.EqualsLiteral("resource")) { // Allow the load only if the chrome package is whitelisted.
// Mochitests that need to load resource:// URIs not declared nsCOMPtr<nsIXULChromeRegistry> reg(do_GetService(
// content-accessible in manifests should set the preference NS_CHROMEREGISTRY_CONTRACTID));
// "security.all_resource_uri_content_accessible" true. if (reg) {
static bool sSecurityPrefCached = false;
static bool sAllResourceUriContentAccessible = false;
if (!sSecurityPrefCached) {
sSecurityPrefCached = true;
Preferences::AddBoolVarCache(
&sAllResourceUriContentAccessible,
"security.all_resource_uri_content_accessible",
false);
}
if (sAllResourceUriContentAccessible) {
return NS_OK;
}
nsCOMPtr<nsIProtocolHandler> ph;
rv = sIOService->GetProtocolHandler("resource", getter_AddRefs(ph));
NS_ENSURE_SUCCESS(rv, rv);
if (!ph) {
return NS_ERROR_DOM_BAD_URI;
}
nsCOMPtr<nsIResProtocolHandler> rph = do_QueryInterface(ph);
if (!rph) {
return NS_ERROR_DOM_BAD_URI;
}
bool accessAllowed = false; bool accessAllowed = false;
rph->AllowContentToAccess(aTargetBaseURI, &accessAllowed); reg->AllowContentToAccess(aTargetBaseURI, &accessAllowed);
if (accessAllowed) { if (accessAllowed) {
return NS_OK; return NS_OK;
} }
} else {
// Allow the load only if the chrome package is whitelisted.
nsCOMPtr<nsIXULChromeRegistry> reg(
do_GetService(NS_CHROMEREGISTRY_CONTRACTID));
if (reg) {
bool accessAllowed = false;
reg->AllowContentToAccess(aTargetBaseURI, &accessAllowed);
if (accessAllowed) {
return NS_OK;
}
}
} }
} }

View file

@ -42,14 +42,12 @@ struct SubstitutionMapping
nsCString scheme; nsCString scheme;
nsCString path; nsCString path;
SerializedURI resolvedURI; SerializedURI resolvedURI;
uint32_t flags;
bool operator ==(const SubstitutionMapping& rhs) const bool operator ==(const SubstitutionMapping& rhs) const
{ {
return scheme.Equals(rhs.scheme) && return scheme.Equals(rhs.scheme) &&
path.Equals(rhs.path) && path.Equals(rhs.path) &&
resolvedURI == rhs.resolvedURI && resolvedURI == rhs.resolvedURI;
flags == rhs.flags;
} }
}; };
@ -142,23 +140,19 @@ struct ParamTraits<SubstitutionMapping>
WriteParam(aMsg, aParam.scheme); WriteParam(aMsg, aParam.scheme);
WriteParam(aMsg, aParam.path); WriteParam(aMsg, aParam.path);
WriteParam(aMsg, aParam.resolvedURI); WriteParam(aMsg, aParam.resolvedURI);
WriteParam(aMsg, aParam.flags);
} }
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult) static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
{ {
nsCString scheme, path; nsCString scheme, path;
SerializedURI resolvedURI; SerializedURI resolvedURI;
uint32_t flags;
if (ReadParam(aMsg, aIter, &scheme) && if (ReadParam(aMsg, aIter, &scheme) &&
ReadParam(aMsg, aIter, &path) && ReadParam(aMsg, aIter, &path) &&
ReadParam(aMsg, aIter, &resolvedURI) && ReadParam(aMsg, aIter, &resolvedURI)) {
ReadParam(aMsg, aIter, &flags)) {
aResult->scheme = scheme; aResult->scheme = scheme;
aResult->path = path; aResult->path = path;
aResult->resolvedURI = resolvedURI; aResult->resolvedURI = resolvedURI;
aResult->flags = flags;
return true; return true;
} }
return false; return false;

View file

@ -927,15 +927,7 @@ nsChromeRegistryChrome::ManifestResource(ManifestProcessingContext& cx, int line
return; return;
} }
// By default, Firefox resources are not content-accessible unless the rv = rph->SetSubstitution(host, resolved);
// manifests opts in.
bool contentAccessible = (flags & nsChromeRegistry::CONTENT_ACCESSIBLE);
uint32_t substitutionFlags = 0;
if (contentAccessible) {
substitutionFlags |= nsIResProtocolHandler::ALLOW_CONTENT_ACCESS;
}
rv = rph->SetSubstitutionWithFlags(host, resolved, substitutionFlags);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
LogMessageWithContext(cx.GetManifestURI(), lineno, nsIScriptError::warningFlag, LogMessageWithContext(cx.GetManifestURI(), lineno, nsIScriptError::warningFlag,
"Warning: cannot set substitution for '%s'.", "Warning: cannot set substitution for '%s'.",

View file

@ -114,7 +114,7 @@ nsChromeRegistryContent::RegisterSubstitution(const SubstitutionMapping& aSubsti
return; return;
} }
rv = sph->SetSubstitutionWithFlags(aSubstitution.path, resolvedURI, aSubstitution.flags); rv = sph->SetSubstitution(aSubstitution.path, resolvedURI);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return; return;
} }

View file

@ -117,14 +117,13 @@ nsresult
SubstitutingProtocolHandler::CollectSubstitutions(InfallibleTArray<SubstitutionMapping>& aMappings) SubstitutingProtocolHandler::CollectSubstitutions(InfallibleTArray<SubstitutionMapping>& aMappings)
{ {
for (auto iter = mSubstitutions.ConstIter(); !iter.Done(); iter.Next()) { for (auto iter = mSubstitutions.ConstIter(); !iter.Done(); iter.Next()) {
SubstitutionEntry& entry = iter.Data(); nsCOMPtr<nsIURI> uri = iter.Data();
nsCOMPtr<nsIURI> uri = entry.baseURI;
SerializedURI serialized; SerializedURI serialized;
if (uri) { if (uri) {
nsresult rv = uri->GetSpec(serialized.spec); nsresult rv = uri->GetSpec(serialized.spec);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
SubstitutionMapping substitution = { mScheme, nsCString(iter.Key()), serialized, entry.flags }; SubstitutionMapping substitution = { mScheme, nsCString(iter.Key()), serialized };
aMappings.AppendElement(substitution); aMappings.AppendElement(substitution);
} }
@ -132,7 +131,7 @@ SubstitutingProtocolHandler::CollectSubstitutions(InfallibleTArray<SubstitutionM
} }
nsresult nsresult
SubstitutingProtocolHandler::SendSubstitution(const nsACString& aRoot, nsIURI* aBaseURI, uint32_t aFlags) SubstitutingProtocolHandler::SendSubstitution(const nsACString& aRoot, nsIURI* aBaseURI)
{ {
if (GeckoProcessType_Content == XRE_GetProcessType()) { if (GeckoProcessType_Content == XRE_GetProcessType()) {
return NS_OK; return NS_OK;
@ -151,7 +150,6 @@ SubstitutingProtocolHandler::SendSubstitution(const nsACString& aRoot, nsIURI* a
nsresult rv = aBaseURI->GetSpec(mapping.resolvedURI.spec); nsresult rv = aBaseURI->GetSpec(mapping.resolvedURI.spec);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
mapping.flags = aFlags;
for (uint32_t i = 0; i < parents.Length(); i++) { for (uint32_t i = 0; i < parents.Length(); i++) {
Unused << parents[i]->SendRegisterChromeItem(mapping); Unused << parents[i]->SendRegisterChromeItem(mapping);
@ -294,19 +292,11 @@ SubstitutingProtocolHandler::AllowPort(int32_t port, const char *scheme, bool *_
nsresult nsresult
SubstitutingProtocolHandler::SetSubstitution(const nsACString& root, nsIURI *baseURI) SubstitutingProtocolHandler::SetSubstitution(const nsACString& root, nsIURI *baseURI)
{
// Add-ons use this API but they should not be able to make anything
// content-accessible.
return SetSubstitutionWithFlags(root, baseURI, 0);
}
nsresult
SubstitutingProtocolHandler::SetSubstitutionWithFlags(const nsACString& root, nsIURI *baseURI, uint32_t flags)
{ {
if (!baseURI) { if (!baseURI) {
mSubstitutions.Remove(root); mSubstitutions.Remove(root);
NotifyObservers(root, baseURI); NotifyObservers(root, baseURI);
return SendSubstitution(root, baseURI, flags); return SendSubstitution(root, baseURI);
} }
// If baseURI isn't a same-scheme URI, we can set the substitution immediately. // If baseURI isn't a same-scheme URI, we can set the substitution immediately.
@ -320,11 +310,9 @@ SubstitutingProtocolHandler::SetSubstitutionWithFlags(const nsACString& root, ns
return NS_ERROR_INVALID_ARG; return NS_ERROR_INVALID_ARG;
} }
SubstitutionEntry& entry = mSubstitutions.GetOrInsert(root); mSubstitutions.Put(root, baseURI);
entry.baseURI = baseURI;
entry.flags = flags;
NotifyObservers(root, baseURI); NotifyObservers(root, baseURI);
return SendSubstitution(root, baseURI, flags); return SendSubstitution(root, baseURI);
} }
// baseURI is a same-type substituting URI, let's resolve it first. // baseURI is a same-type substituting URI, let's resolve it first.
@ -336,11 +324,9 @@ SubstitutingProtocolHandler::SetSubstitutionWithFlags(const nsACString& root, ns
rv = mIOService->NewURI(newBase, nullptr, nullptr, getter_AddRefs(newBaseURI)); rv = mIOService->NewURI(newBase, nullptr, nullptr, getter_AddRefs(newBaseURI));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
SubstitutionEntry& entry = mSubstitutions.GetOrInsert(root); mSubstitutions.Put(root, newBaseURI);
entry.baseURI = newBaseURI;
entry.flags = flags;
NotifyObservers(root, baseURI); NotifyObservers(root, baseURI);
return SendSubstitution(root, newBaseURI, flags); return SendSubstitution(root, newBaseURI);
} }
nsresult nsresult
@ -348,29 +334,10 @@ SubstitutingProtocolHandler::GetSubstitution(const nsACString& root, nsIURI **re
{ {
NS_ENSURE_ARG_POINTER(result); NS_ENSURE_ARG_POINTER(result);
SubstitutionEntry entry; if (mSubstitutions.Get(root, result))
if (mSubstitutions.Get(root, &entry)) {
nsCOMPtr<nsIURI> baseURI = entry.baseURI;
baseURI.forget(result);
return NS_OK; return NS_OK;
}
uint32_t flags; return GetSubstitutionInternal(root, result);
return GetSubstitutionInternal(root, result, &flags);
}
nsresult
SubstitutingProtocolHandler::GetSubstitutionFlags(const nsACString& root, uint32_t* flags)
{
*flags = 0;
SubstitutionEntry entry;
if (mSubstitutions.Get(root, &entry)) {
*flags = entry.flags;
return NS_OK;
}
nsCOMPtr<nsIURI> baseURI;
return GetSubstitutionInternal(root, getter_AddRefs(baseURI), flags);
} }
nsresult nsresult

View file

@ -9,9 +9,9 @@
#include "nsISubstitutingProtocolHandler.h" #include "nsISubstitutingProtocolHandler.h"
#include "nsInterfaceHashtable.h"
#include "nsIOService.h" #include "nsIOService.h"
#include "nsISubstitutionObserver.h" #include "nsISubstitutionObserver.h"
#include "nsDataHashtable.h"
#include "nsStandardURL.h" #include "nsStandardURL.h"
#include "mozilla/chrome/RegistryMessageUtils.h" #include "mozilla/chrome/RegistryMessageUtils.h"
#include "mozilla/Maybe.h" #include "mozilla/Maybe.h"
@ -44,16 +44,13 @@ protected:
virtual ~SubstitutingProtocolHandler() {} virtual ~SubstitutingProtocolHandler() {}
void ConstructInternal(); void ConstructInternal();
MOZ_MUST_USE nsresult SendSubstitution(const nsACString& aRoot, nsIURI* aBaseURI, uint32_t aFlags); MOZ_MUST_USE nsresult SendSubstitution(const nsACString& aRoot, nsIURI* aBaseURI);
nsresult GetSubstitutionFlags(const nsACString& root, uint32_t* flags);
// Override this in the subclass to try additional lookups after checking // Override this in the subclass to try additional lookups after checking
// mSubstitutions. // mSubstitutions.
virtual MOZ_MUST_USE nsresult GetSubstitutionInternal(const nsACString& aRoot, nsIURI** aResult, uint32_t* aFlags) virtual MOZ_MUST_USE nsresult GetSubstitutionInternal(const nsACString& aRoot, nsIURI** aResult)
{ {
*aResult = nullptr; *aResult = nullptr;
*aFlags = 0;
return NS_ERROR_NOT_AVAILABLE; return NS_ERROR_NOT_AVAILABLE;
} }
@ -77,28 +74,13 @@ protected:
nsIIOService* IOService() { return mIOService; } nsIIOService* IOService() { return mIOService; }
private: private:
struct SubstitutionEntry
{
SubstitutionEntry()
: flags(0)
{
}
~SubstitutionEntry()
{
}
nsCOMPtr<nsIURI> baseURI;
uint32_t flags;
};
// Notifies all observers that a new substitution from |aRoot| to // Notifies all observers that a new substitution from |aRoot| to
// |aBaseURI| has been set/installed for this protocol handler. // |aBaseURI| has been set/installed for this protocol handler.
void NotifyObservers(const nsACString& aRoot, nsIURI* aBaseURI); void NotifyObservers(const nsACString& aRoot, nsIURI* aBaseURI);
nsCString mScheme; nsCString mScheme;
Maybe<uint32_t> mFlags; Maybe<uint32_t> mFlags;
nsDataHashtable<nsCStringHashKey, SubstitutionEntry> mSubstitutions; nsInterfaceHashtable<nsCStringHashKey,nsIURI> mSubstitutions;
nsCOMPtr<nsIIOService> mIOService; nsCOMPtr<nsIIOService> mIOService;
// The list of observers added with AddObserver that will be // The list of observers added with AddObserver that will be

View file

@ -11,5 +11,4 @@
[scriptable, uuid(241d34ac-9ed5-46d7-910c-7a9d914aa0c5)] [scriptable, uuid(241d34ac-9ed5-46d7-910c-7a9d914aa0c5)]
interface nsIResProtocolHandler : nsISubstitutingProtocolHandler interface nsIResProtocolHandler : nsISubstitutingProtocolHandler
{ {
boolean allowContentToAccess(in nsIURI url);
}; };

View file

@ -14,11 +14,6 @@ interface nsISubstitutionObserver;
[scriptable, uuid(154c64fd-a69e-4105-89f8-bd7dfe621372)] [scriptable, uuid(154c64fd-a69e-4105-89f8-bd7dfe621372)]
interface nsISubstitutingProtocolHandler : nsIProtocolHandler interface nsISubstitutingProtocolHandler : nsIProtocolHandler
{ {
/**
* Content script may access files in this package.
*/
const short ALLOW_CONTENT_ACCESS = 1;
/** /**
* Sets the substitution for the root key: * Sets the substitution for the root key:
* resource://root/path ==> baseURI.resolve(path) * resource://root/path ==> baseURI.resolve(path)
@ -30,11 +25,6 @@ interface nsISubstitutingProtocolHandler : nsIProtocolHandler
*/ */
[must_use] void setSubstitution(in ACString root, in nsIURI baseURI); [must_use] void setSubstitution(in ACString root, in nsIURI baseURI);
/**
* Same as setSubstitution, but with specific flags.
*/
[must_use] void setSubstitutionWithFlags(in ACString root, in nsIURI baseURI, in uint32_t flags);
/** /**
* Gets the substitution for the root key. * Gets the substitution for the root key.
* *

View file

@ -61,36 +61,16 @@ NS_IMPL_QUERY_INTERFACE(nsResProtocolHandler, nsIResProtocolHandler,
NS_IMPL_ADDREF_INHERITED(nsResProtocolHandler, SubstitutingProtocolHandler) NS_IMPL_ADDREF_INHERITED(nsResProtocolHandler, SubstitutingProtocolHandler)
NS_IMPL_RELEASE_INHERITED(nsResProtocolHandler, SubstitutingProtocolHandler) NS_IMPL_RELEASE_INHERITED(nsResProtocolHandler, SubstitutingProtocolHandler)
NS_IMETHODIMP
nsResProtocolHandler::AllowContentToAccess(nsIURI *aURI, bool *aResult)
{
*aResult = false;
nsAutoCString host;
nsresult rv = aURI->GetAsciiHost(host);
NS_ENSURE_SUCCESS(rv, rv);
uint32_t flags;
rv = GetSubstitutionFlags(host, &flags);
NS_ENSURE_SUCCESS(rv, rv);
*aResult = flags & nsISubstitutingProtocolHandler::ALLOW_CONTENT_ACCESS;
return NS_OK;
}
nsresult nsresult
nsResProtocolHandler::GetSubstitutionInternal(const nsACString& aRoot, nsResProtocolHandler::GetSubstitutionInternal(const nsACString& root, nsIURI **result)
nsIURI** aResult,
uint32_t* aFlags)
{ {
nsAutoCString uri; nsAutoCString uri;
if (!ResolveSpecialCases(aRoot, NS_LITERAL_CSTRING("/"), NS_LITERAL_CSTRING("/"), uri)) { if (!ResolveSpecialCases(root, NS_LITERAL_CSTRING("/"), NS_LITERAL_CSTRING("/"), uri)) {
return NS_ERROR_NOT_AVAILABLE; return NS_ERROR_NOT_AVAILABLE;
} }
*aFlags = 0; // No content access. return NS_NewURI(result, uri);
return NS_NewURI(aResult, uri);
} }
bool bool
@ -118,14 +98,3 @@ nsResProtocolHandler::SetSubstitution(const nsACString& aRoot, nsIURI* aBaseURI)
MOZ_ASSERT(!aRoot.Equals(kGRE)); MOZ_ASSERT(!aRoot.Equals(kGRE));
return SubstitutingProtocolHandler::SetSubstitution(aRoot, aBaseURI); return SubstitutingProtocolHandler::SetSubstitution(aRoot, aBaseURI);
} }
nsresult
nsResProtocolHandler::SetSubstitutionWithFlags(const nsACString& aRoot,
nsIURI* aBaseURI,
uint32_t aFlags)
{
MOZ_ASSERT(!aRoot.Equals(""));
MOZ_ASSERT(!aRoot.Equals(kAPP));
MOZ_ASSERT(!aRoot.Equals(kGRE));
return SubstitutingProtocolHandler::SetSubstitutionWithFlags(aRoot, aBaseURI, aFlags);
}

View file

@ -34,7 +34,6 @@ public:
MOZ_MUST_USE nsresult Init(); MOZ_MUST_USE nsresult Init();
NS_IMETHOD SetSubstitution(const nsACString& aRoot, nsIURI* aBaseURI) override; NS_IMETHOD SetSubstitution(const nsACString& aRoot, nsIURI* aBaseURI) override;
NS_IMETHOD SetSubstitutionWithFlags(const nsACString& aRoot, nsIURI* aBaseURI, uint32_t aFlags) override;
NS_IMETHOD GetSubstitution(const nsACString& aRoot, nsIURI** aResult) override NS_IMETHOD GetSubstitution(const nsACString& aRoot, nsIURI** aResult) override
{ {
@ -62,7 +61,7 @@ public:
} }
protected: protected:
MOZ_MUST_USE nsresult GetSubstitutionInternal(const nsACString& aRoot, nsIURI** aResult, uint32_t* aFlags) override; MOZ_MUST_USE nsresult GetSubstitutionInternal(const nsACString& aRoot, nsIURI** aResult) override;
virtual ~nsResProtocolHandler() {} virtual ~nsResProtocolHandler() {}
MOZ_MUST_USE bool ResolveSpecialCases(const nsACString& aHost, MOZ_MUST_USE bool ResolveSpecialCases(const nsACString& aHost,

View file

@ -56,7 +56,7 @@ struct ManifestDirective
bool allowbootstrap; bool allowbootstrap;
// The contentaccessible flags only apply to content/resource directives. // The contentaccessible flags only apply to content directives.
bool contentflags; bool contentflags;
// Function to handle this directive. This isn't a union because C++ still // Function to handle this directive. This isn't a union because C++ still
@ -123,7 +123,7 @@ static const ManifestDirective kParsingTable[] = {
nullptr, &nsChromeRegistry::ManifestOverride, nullptr nullptr, &nsChromeRegistry::ManifestOverride, nullptr
}, },
{ {
"resource", 2, false, true, true, true, true, "resource", 2, false, true, true, true, false,
nullptr, &nsChromeRegistry::ManifestResource, nullptr nullptr, &nsChromeRegistry::ManifestResource, nullptr
} }
}; };