From b0d2af4e01f73a1f647736501abd0cbf60539aee Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Sat, 11 Mar 2023 15:41:00 +0800 Subject: [PATCH] Issue #2158 - Part 3: Parse preload links as part of the HTML5 parser's speculative load queue --- parser/html/nsHtml5TreeBuilderCppSupplement.h | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/parser/html/nsHtml5TreeBuilderCppSupplement.h b/parser/html/nsHtml5TreeBuilderCppSupplement.h index c973478e00..8e1cbe8f9a 100644 --- a/parser/html/nsHtml5TreeBuilderCppSupplement.h +++ b/parser/html/nsHtml5TreeBuilderCppSupplement.h @@ -230,6 +230,54 @@ nsHtml5TreeBuilder::createElement(int32_t aNamespace, mSpeculativeLoadQueue.AppendElement()->InitPreconnect( url, crossOrigin); } + } else if (rel.LowerCaseEqualsASCII("preload")) { + nsHtml5String url = + aAttributes->getValue(nsHtml5AttributeName::ATTR_HREF); + if (url) { + nsHtml5String preloadAs = + aAttributes->getValue(nsHtml5AttributeName::ATTR_AS); + if (preloadAs.LowerCaseEqualsASCII("script")) { + nsHtml5String charset = + aAttributes->getValue(nsHtml5AttributeName::ATTR_CHARSET); + nsHtml5String type = + aAttributes->getValue(nsHtml5AttributeName::ATTR_TYPE); + nsHtml5String crossOrigin = + aAttributes->getValue(nsHtml5AttributeName::ATTR_CROSSORIGIN); + nsHtml5String integrity = + aAttributes->getValue(nsHtml5AttributeName::ATTR_INTEGRITY); + mSpeculativeLoadQueue.AppendElement()->InitScript( + url, + charset, + type, + crossOrigin, + integrity, + mode == nsHtml5TreeBuilder::IN_HEAD, + false, + false, + false); + mCurrentHtmlScriptIsAsyncOrDefer = false; + } else if (preloadAs.LowerCaseEqualsASCII("style")) { + nsHtml5String charset = + aAttributes->getValue(nsHtml5AttributeName::ATTR_CHARSET); + nsHtml5String crossOrigin = + aAttributes->getValue(nsHtml5AttributeName::ATTR_CROSSORIGIN); + nsHtml5String integrity = + aAttributes->getValue(nsHtml5AttributeName::ATTR_INTEGRITY); + mSpeculativeLoadQueue.AppendElement()->InitStyle( + url, charset, crossOrigin, integrity); + } else if (preloadAs.LowerCaseEqualsASCII("image")) { + nsHtml5String srcset = + aAttributes->getValue(nsHtml5AttributeName::ATTR_SRCSET); + nsHtml5String crossOrigin = + aAttributes->getValue(nsHtml5AttributeName::ATTR_CROSSORIGIN); + nsHtml5String referrerPolicy = + aAttributes->getValue(nsHtml5AttributeName::ATTR_REFERRERPOLICY); + nsHtml5String sizes = + aAttributes->getValue(nsHtml5AttributeName::ATTR_SIZES); + mSpeculativeLoadQueue.AppendElement()->InitImage( + url, crossOrigin, referrerPolicy, srcset, sizes); + } + } } } } else if (nsHtml5Atoms::video == aName) {