| Index: Source/core/html/parser/HTMLPreloadScanner.cpp
|
| diff --git a/Source/core/html/parser/HTMLPreloadScanner.cpp b/Source/core/html/parser/HTMLPreloadScanner.cpp
|
| index 79fb5611b843bf476ac278893b53deb26426128c..b0b463421340106ed9600079963e2ec3a8609df5 100644
|
| --- a/Source/core/html/parser/HTMLPreloadScanner.cpp
|
| +++ b/Source/core/html/parser/HTMLPreloadScanner.cpp
|
| @@ -85,20 +85,37 @@ static String initiatorFor(const StringImpl* tagImpl)
|
| return linkTag.localName();
|
| if (match(tagImpl, scriptTag))
|
| return scriptTag.localName();
|
| +#if ENABLE(PICTURE)
|
| + if (match(tagImpl, sourceTag))
|
| + return sourceTag.localName();
|
| + if (match(tagImpl, pictureTag))
|
| + return pictureTag.localName();
|
| +#endif
|
| ASSERT_NOT_REACHED();
|
| return "unknown";
|
| }
|
|
|
| class TokenPreloadScanner::StartTagScanner {
|
| public:
|
| - explicit StartTagScanner(const StringImpl* tagImpl)
|
| + explicit StartTagScanner(const StringImpl* tagImpl
|
| +#if ENABLE(PICTURE)
|
| + , bool inPicture
|
| +#endif
|
| + )
|
| : m_tagImpl(tagImpl)
|
| , m_linkIsStyleSheet(false)
|
| , m_inputIsImage(false)
|
| +#if ENABLE(PICTURE)
|
| + , m_tagInPicture(inPicture)
|
| +#endif
|
| {
|
| if (!match(m_tagImpl, imgTag)
|
| && !match(m_tagImpl, inputTag)
|
| && !match(m_tagImpl, linkTag)
|
| +#if ENABLE(PICTURE)
|
| + && !match(m_tagImpl, pictureTag)
|
| + && !match(m_tagImpl, sourceTag)
|
| +#endif
|
| && !match(m_tagImpl, scriptTag))
|
| m_tagImpl = 0;
|
| }
|
| @@ -134,6 +151,9 @@ public:
|
| return request.release();
|
| }
|
|
|
| +#if ENABLE(PICTURE)
|
| + bool inPicture() { return m_tagInPicture; }
|
| +#endif
|
| private:
|
| template<typename NameType>
|
| void processAttribute(const NameType& attributeName, const String& attributeValue)
|
| @@ -141,11 +161,27 @@ private:
|
| if (match(attributeName, charsetAttr))
|
| m_charset = attributeValue;
|
|
|
| - if (match(m_tagImpl, scriptTag) || match(m_tagImpl, imgTag)) {
|
| - if (match(attributeName, srcAttr))
|
| + if (match(m_tagImpl, scriptTag)
|
| + || match(m_tagImpl, imgTag)
|
| +#if ENABLE(PICTURE)
|
| + || match(m_tagImpl, pictureTag)
|
| +#endif
|
| + ) {
|
| + if (match(attributeName, srcAttr)) {
|
| setUrlToLoad(attributeValue);
|
| +#if ENABLE(PICTURE)
|
| + m_tagInPicture = false;
|
| +#endif
|
| + }
|
| else if (match(attributeName, crossoriginAttr) && !attributeValue.isNull())
|
| m_crossOriginMode = stripLeadingAndTrailingHTMLSpaces(attributeValue);
|
| +#if ENABLE(PICTURE)
|
| + } else if (match(m_tagImpl, sourceTag) && m_tagInPicture) {
|
| + if (match(attributeName, srcAttr))
|
| + setUrlToLoad(attributeValue);
|
| + else if (match(attributeName, mediaAttr))
|
| + m_mediaAttribute = attributeValue;
|
| +#endif
|
| } else if (match(m_tagImpl, linkTag)) {
|
| if (match(attributeName, hrefAttr))
|
| setUrlToLoad(attributeValue);
|
| @@ -188,7 +224,13 @@ private:
|
| {
|
| if (match(m_tagImpl, scriptTag))
|
| return CachedResource::Script;
|
| - if (match(m_tagImpl, imgTag) || (match(m_tagImpl, inputTag) && m_inputIsImage))
|
| + if (match(m_tagImpl, imgTag)
|
| + || (match(m_tagImpl, inputTag) && m_inputIsImage)
|
| +#if ENABLE(PICTURE)
|
| + || (match(m_tagImpl, pictureTag))
|
| + || (match(m_tagImpl, sourceTag))
|
| +#endif
|
| + )
|
| return CachedResource::ImageResource;
|
| if (match(m_tagImpl, linkTag) && m_linkIsStyleSheet)
|
| return CachedResource::CSSStyleSheet;
|
| @@ -219,8 +261,18 @@ private:
|
| bool m_linkIsStyleSheet;
|
| String m_mediaAttribute;
|
| bool m_inputIsImage;
|
| +#if ENABLE(PICTURE)
|
| + bool m_tagInPicture;
|
| +#endif
|
| };
|
|
|
| +static void appendBundleRequest(PreloadRequestStream& requests, bool start, bool end)
|
| +{
|
| + OwnPtr<PreloadRequest> request = PreloadRequest::create(start, end);
|
| + if (request)
|
| + requests.append(request.release());
|
| +}
|
| +
|
| TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL)
|
| : m_documentURL(documentURL)
|
| , m_inStyle(false)
|
| @@ -250,18 +302,18 @@ void TokenPreloadScanner::rewindTo(TokenPreloadScannerCheckpoint checkpointIndex
|
| m_checkpoints.clear();
|
| }
|
|
|
| -void TokenPreloadScanner::scan(const HTMLToken& token, Vector<OwnPtr<PreloadRequest> >& requests)
|
| +void TokenPreloadScanner::scan(const HTMLToken& token, PreloadRequestStream& requests)
|
| {
|
| scanCommon(token, requests);
|
| }
|
|
|
| -void TokenPreloadScanner::scan(const CompactHTMLToken& token, Vector<OwnPtr<PreloadRequest> >& requests)
|
| +void TokenPreloadScanner::scan(const CompactHTMLToken& token, PreloadRequestStream& requests)
|
| {
|
| scanCommon(token, requests);
|
| }
|
|
|
| template<typename Token>
|
| -void TokenPreloadScanner::scanCommon(const Token& token, Vector<OwnPtr<PreloadRequest> >& requests)
|
| +void TokenPreloadScanner::scanCommon(const Token& token, PreloadRequestStream& requests)
|
| {
|
| switch (token.type()) {
|
| case HTMLToken::Character: {
|
| @@ -282,6 +334,12 @@ void TokenPreloadScanner::scanCommon(const Token& token, Vector<OwnPtr<PreloadRe
|
| m_cssScanner.reset();
|
| m_inStyle = false;
|
| }
|
| +#if ENABLE(PICTURE)
|
| + else if (match(tagImpl, pictureTag)) {
|
| + m_inPicture = false;
|
| + appendBundleRequest(requests, false, true);
|
| + }
|
| +#endif
|
| return;
|
| }
|
| case HTMLToken::StartTag: {
|
| @@ -296,6 +354,12 @@ void TokenPreloadScanner::scanCommon(const Token& token, Vector<OwnPtr<PreloadRe
|
| m_inStyle = true;
|
| return;
|
| }
|
| +#if ENABLE(PICTURE)
|
| + if (match(tagImpl, pictureTag)) {
|
| + m_inPicture = true;
|
| + appendBundleRequest(requests, true, false);
|
| + }
|
| +#endif
|
| if (match(tagImpl, baseTag)) {
|
| // The first <base> element is the one that wins.
|
| if (!m_predictedBaseElementURL.isEmpty())
|
| @@ -304,8 +368,15 @@ void TokenPreloadScanner::scanCommon(const Token& token, Vector<OwnPtr<PreloadRe
|
| return;
|
| }
|
|
|
| - StartTagScanner scanner(tagImpl);
|
| + StartTagScanner scanner(tagImpl
|
| +#if ENABLE(PICTURE)
|
| + , m_inPicture
|
| +#endif
|
| + );
|
| scanner.processAttributes(token.attributes());
|
| +#if ENABLE(PICTURE)
|
| + m_inPicture = scanner.inPicture();
|
| +#endif
|
| OwnPtr<PreloadRequest> request = scanner.createPreloadRequest(m_predictedBaseElementURL);
|
| if (request)
|
| requests.append(request.release());
|
|
|