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_