diff --git a/blink/renderer/core/html/parser/html_document_parser.cc b/blink/renderer/core/html/parser/html_document_parser.cc
index 7166d5aca35994cf22153fe15bb12a3f7ca88dbc..3868a5c0c41d765eda88c32af8aa004a4c50ed0e 100644
--- a/blink/renderer/core/html/parser/html_document_parser.cc
+++ b/blink/renderer/core/html/parser/html_document_parser.cc
@@ -88,6 +88,11 @@ constexpr int kDefaultMaxTokenizationBudget = 250;
constexpr int kInfiniteTokenizationBudget = 1e7;
constexpr int kNumYieldsWithDefaultBudget = 2;
+#if BUILDFLAG(IS_OHOS)
+constexpr int kOptimizedMaxTokenizationBudget = 100;
+static bool kUseOptimizedBudget = false;
+#endif
+
class EndIfDelayedForbiddenScope;
class ShouldCompleteScope;
class AttemptToEndForbiddenScope;
@@ -186,6 +191,14 @@ bool IsPreloadScanningEnabled(Document* document) {
document->GetSettings()->GetDoHtmlPreloadScanning();
}
+#if BUILDFLAG(IS_OHOS)
+void SetOptimizeParserBudgetEnabled(bool enable) {
+ LOG(DEBUG) << "OptimizeParserBudget set enable: " << enable;
+ TRACE_EVENT1("blink", "SetOptimizeParserBudgetEnabled", "enable", enable);
+ kUseOptimizedBudget = enable;
+}
+#endif
+
base::TimeDelta GetDefaultTimedBudget() {
static const base::FeatureParam kDefaultParserBudgetParam{
&features::kTimedHTMLParserBudget, "default-parser-budget",
@@ -642,6 +655,9 @@ bool HTMLDocumentParser::PumpTokenizer() {
(task_runner_state_->TimesYielded() <= kNumYieldsWithDefaultBudget)
? task_runner_state_->GetDefaultBudget()
: kInfiniteTokenizationBudget;
+#if BUILDFLAG(IS_OHOS)
+ budget = kUseOptimizedBudget ? kOptimizedMaxTokenizationBudget : budget;
+#endif
base::TimeDelta timed_budget;
if (TimedParserBudgetEnabled())
@@ -712,6 +728,16 @@ bool HTMLDocumentParser::PumpTokenizer() {
elapsed_time = chunk_parsing_timer.Elapsed();
}
should_yield = elapsed_time >= timed_budget;
+#if BUILDFLAG(IS_OHOS)
+ if (kUseOptimizedBudget) {
+ should_yield = should_yield || budget <= 0;
+ if (should_yield) {
+ LOG(DEBUG) << "OptimizeParserBudget in PumpTokenlizer. current parse tokens: " << tokens_parsed <<
+ ". left token budget: " << budget <<
+ ". elapsed time: " << elapsed_time;
+ }
+ }
+#endif
} else {
should_yield = budget <= 0;
}
diff --git a/blink/renderer/core/html/parser/html_document_parser.h b/blink/renderer/core/html/parser/html_document_parser.h
index c196588137da1fbc554c3fc27916a424fc77b6a4..a4bad36ea30b23f17292d1e80220e73c45c73f7c 100644
--- a/blink/renderer/core/html/parser/html_document_parser.h
+++ b/blink/renderer/core/html/parser/html_document_parser.h
@@ -84,6 +84,10 @@ enum ParserPrefetchPolicy {
void CORE_EXPORT ResetDiscardedTokenCountForTesting();
size_t CORE_EXPORT GetDiscardedTokenCountForTesting();
+#if BUILDFLAG(IS_OHOS)
+void CORE_EXPORT SetOptimizeParserBudgetEnabled(bool enable);
+#endif
+
class CORE_EXPORT HTMLDocumentParser : public ScriptableDocumentParser,
private HTMLParserScriptRunnerHost {
public:
diff --git a/blink/renderer/core/paint/timing/paint_timing.cc b/blink/renderer/core/paint/timing/paint_timing.cc
index b1c947b887bbceea505e92d675d4da668473fd6a..044bdfdf63b65371f6f354f8f745946b24806566 100644
--- a/blink/renderer/core/paint/timing/paint_timing.cc
+++ b/blink/renderer/core/paint/timing/paint_timing.cc
@@ -15,6 +15,7 @@
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_view.h"
+#include "third_party/blink/renderer/core/html/parser/html_document_parser.h"
#include "third_party/blink/renderer/core/inspector/console_message.h"
#include "third_party/blink/renderer/core/loader/document_loader.h"
#include "third_party/blink/renderer/core/loader/interactive_detector.h"
@@ -350,6 +351,11 @@ void PaintTiming::SetFirstContentfulPaintPresentation(base::TimeTicks stamp) {
TRACE_EVENT_INSTANT_WITH_TIMESTAMP0("benchmark,loading",
"GlobalFirstContentfulPaint",
TRACE_EVENT_SCOPE_GLOBAL, stamp);
+#if BUILDFLAG(IS_OHOS)
+ LOG(DEBUG) << "OptimizeParserBudget FCP reset budget.";
+ TRACE_EVENT0("blink", "PaintTiming::SetFirstContentfulPaintPresentation");
+ blink:SetOptimizeParserBudgetEnabled(false);
+#endif
first_contentful_paint_presentation_ = stamp;
bool is_soft_navigation_fcp = false;
if (first_contentful_paint_presentation_ignoring_soft_navigations_