mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 04:05:32 +00:00
![Nathan Froyd](/assets/img/avatar_default.png)
Moving the html5 atoms out into their own initialization phase makes the initialization of atoms more explicit and avoids problems with trying to move modules around so their atoms get initialized in the correct place. As an aesthetic bonus, this change produces pleasing symmetry in nsHtml5Module::{Initialize,Release}Statics. Reviewed-by: Nathan Froyd <froydnj@mozilla.com>
138 lines
4.0 KiB
C++
138 lines
4.0 KiB
C++
/* 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/. */
|
|
|
|
#include "nsHtml5AttributeName.h"
|
|
#include "nsHtml5ElementName.h"
|
|
#include "nsHtml5HtmlAttributes.h"
|
|
#include "nsHtml5NamedCharacters.h"
|
|
#include "nsHtml5Portability.h"
|
|
#include "nsHtml5StackNode.h"
|
|
#include "nsHtml5Tokenizer.h"
|
|
#include "nsHtml5TreeBuilder.h"
|
|
#include "nsHtml5UTF16Buffer.h"
|
|
#include "nsHtml5Module.h"
|
|
#include "nsIObserverService.h"
|
|
#include "nsIServiceManager.h"
|
|
#include "mozilla/Services.h"
|
|
#include "mozilla/Preferences.h"
|
|
#include "mozilla/Attributes.h"
|
|
|
|
using namespace mozilla;
|
|
|
|
// static
|
|
bool nsHtml5Module::sOffMainThread = true;
|
|
nsIThread* nsHtml5Module::sStreamParserThread = nullptr;
|
|
nsIThread* nsHtml5Module::sMainThread = nullptr;
|
|
|
|
// static
|
|
void
|
|
nsHtml5Module::InitializeStatics()
|
|
{
|
|
Preferences::AddBoolVarCache(&sOffMainThread, "html5.offmainthread");
|
|
nsHtml5AttributeName::initializeStatics();
|
|
nsHtml5ElementName::initializeStatics();
|
|
nsHtml5HtmlAttributes::initializeStatics();
|
|
nsHtml5NamedCharacters::initializeStatics();
|
|
nsHtml5Portability::initializeStatics();
|
|
nsHtml5StackNode::initializeStatics();
|
|
nsHtml5Tokenizer::initializeStatics();
|
|
nsHtml5TreeBuilder::initializeStatics();
|
|
nsHtml5UTF16Buffer::initializeStatics();
|
|
nsHtml5StreamParser::InitializeStatics();
|
|
nsHtml5TreeOpExecutor::InitializeStatics();
|
|
#ifdef DEBUG
|
|
sNsHtml5ModuleInitialized = true;
|
|
#endif
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsHtml5Module::ReleaseStatics()
|
|
{
|
|
#ifdef DEBUG
|
|
sNsHtml5ModuleInitialized = false;
|
|
#endif
|
|
nsHtml5AttributeName::releaseStatics();
|
|
nsHtml5ElementName::releaseStatics();
|
|
nsHtml5HtmlAttributes::releaseStatics();
|
|
nsHtml5NamedCharacters::releaseStatics();
|
|
nsHtml5Portability::releaseStatics();
|
|
nsHtml5StackNode::releaseStatics();
|
|
nsHtml5Tokenizer::releaseStatics();
|
|
nsHtml5TreeBuilder::releaseStatics();
|
|
nsHtml5UTF16Buffer::releaseStatics();
|
|
NS_IF_RELEASE(sStreamParserThread);
|
|
NS_IF_RELEASE(sMainThread);
|
|
}
|
|
|
|
// static
|
|
already_AddRefed<nsIParser>
|
|
nsHtml5Module::NewHtml5Parser()
|
|
{
|
|
MOZ_ASSERT(sNsHtml5ModuleInitialized, "nsHtml5Module not initialized.");
|
|
nsCOMPtr<nsIParser> rv = new nsHtml5Parser();
|
|
return rv.forget();
|
|
}
|
|
|
|
// static
|
|
nsresult
|
|
nsHtml5Module::Initialize(nsIParser* aParser, nsIDocument* aDoc, nsIURI* aURI, nsISupports* aContainer, nsIChannel* aChannel)
|
|
{
|
|
MOZ_ASSERT(sNsHtml5ModuleInitialized, "nsHtml5Module not initialized.");
|
|
nsHtml5Parser* parser = static_cast<nsHtml5Parser*> (aParser);
|
|
return parser->Initialize(aDoc, aURI, aContainer, aChannel);
|
|
}
|
|
|
|
class nsHtml5ParserThreadTerminator final : public nsIObserver
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
explicit nsHtml5ParserThreadTerminator(nsIThread* aThread)
|
|
: mThread(aThread)
|
|
{}
|
|
NS_IMETHOD Observe(nsISupports *, const char *topic, const char16_t *) override
|
|
{
|
|
NS_ASSERTION(!strcmp(topic, "xpcom-shutdown-threads"),
|
|
"Unexpected topic");
|
|
if (mThread) {
|
|
mThread->Shutdown();
|
|
mThread = nullptr;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
private:
|
|
~nsHtml5ParserThreadTerminator() {}
|
|
|
|
nsCOMPtr<nsIThread> mThread;
|
|
};
|
|
|
|
NS_IMPL_ISUPPORTS(nsHtml5ParserThreadTerminator, nsIObserver)
|
|
|
|
// static
|
|
nsIThread*
|
|
nsHtml5Module::GetStreamParserThread()
|
|
{
|
|
if (sOffMainThread) {
|
|
if (!sStreamParserThread) {
|
|
NS_NewNamedThread("HTML5 Parser", &sStreamParserThread);
|
|
NS_ASSERTION(sStreamParserThread, "Thread creation failed!");
|
|
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
|
NS_ASSERTION(os, "do_GetService failed");
|
|
os->AddObserver(new nsHtml5ParserThreadTerminator(sStreamParserThread),
|
|
"xpcom-shutdown-threads",
|
|
false);
|
|
}
|
|
return sStreamParserThread;
|
|
}
|
|
if (!sMainThread) {
|
|
NS_GetMainThread(&sMainThread);
|
|
NS_ASSERTION(sMainThread, "Main thread getter failed");
|
|
}
|
|
return sMainThread;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
bool nsHtml5Module::sNsHtml5ModuleInitialized = false;
|
|
#endif
|