diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-15 03:35:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-15 03:35:49 +0000 |
commit | d8bbc7858622b6d9c278469aab701ca0b609cddf (patch) | |
tree | eff41dc61d9f714852212739e6b3738b82a2af87 /parser/html/nsHtml5StringParser.cpp | |
parent | Releasing progress-linux version 125.0.3-1~progress7.99u1. (diff) | |
download | firefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.tar.xz firefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.zip |
Merging upstream version 126.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'parser/html/nsHtml5StringParser.cpp')
-rw-r--r-- | parser/html/nsHtml5StringParser.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/parser/html/nsHtml5StringParser.cpp b/parser/html/nsHtml5StringParser.cpp index 5fe2b2e323..69e2806ce5 100644 --- a/parser/html/nsHtml5StringParser.cpp +++ b/parser/html/nsHtml5StringParser.cpp @@ -20,9 +20,11 @@ nsHtml5StringParser::nsHtml5StringParser() mTreeBuilder(new nsHtml5TreeBuilder(mBuilder)), mTokenizer(new nsHtml5Tokenizer(mTreeBuilder.get(), false)) { mTokenizer->setInterner(&mAtomTable); + mTokenizer->setKeepBuffer(true); + mTreeBuilder->setKeepBuffer(true); } -nsHtml5StringParser::~nsHtml5StringParser() {} +nsHtml5StringParser::~nsHtml5StringParser() { ClearCaches(); } nsresult nsHtml5StringParser::ParseFragment( const nsAString& aSourceBuffer, nsIContent* aTargetNode, @@ -69,6 +71,31 @@ nsresult nsHtml5StringParser::ParseDocument( aTargetDoc->AllowsDeclarativeShadowRoots()); } +void nsHtml5StringParser::ClearCaches() { + mTokenizer->dropBufferIfLongerThan(0); + mTreeBuilder->dropBufferIfLongerThan(0); + if (mCacheClearer) { + mCacheClearer->Disconnect(); + mCacheClearer = nullptr; + } +} + +void nsHtml5StringParser::TryCache() { + const int32_t kMaxBuffer = 1024 * 1024; + bool didDrop = mTokenizer->dropBufferIfLongerThan(kMaxBuffer); + didDrop |= mTreeBuilder->dropBufferIfLongerThan(kMaxBuffer); + if (didDrop) { + return; + } + + if (!mCacheClearer) { + mCacheClearer = new CacheClearer(this); + nsCOMPtr<nsIRunnable> runnable = mCacheClearer.get(); + NS_DispatchToMainThreadQueue(runnable.forget(), + mozilla::EventQueuePriority::Idle); + } +} + nsresult nsHtml5StringParser::Tokenize(const nsAString& aSourceBuffer, Document* aDocument, bool aScriptingEnabledForNoscriptParsing, @@ -109,8 +136,10 @@ nsresult nsHtml5StringParser::Tokenize(const nsAString& aSourceBuffer, if (NS_SUCCEEDED(rv)) { mTokenizer->eof(); } + mTokenizer->end(); mBuilder->Finish(); mAtomTable.Clear(); + TryCache(); return rv; } |