Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(742)

Side by Side Diff: Source/core/html/parser/HTMLPreloadScanner.cpp

Issue 236713005: Use SizesAttributeParser to get the right srcset resource (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@sizes_parser8
Patch Set: Fixed nits Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/html/HTMLImageElement.idl ('k') | Source/core/html/parser/HTMLSrcsetParser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/ 3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/
4 * Copyright (C) 2010 Google Inc. All Rights Reserved. 4 * Copyright (C) 2010 Google Inc. All Rights Reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 16 matching lines...) Expand all
27 27
28 #include "config.h" 28 #include "config.h"
29 #include "core/html/parser/HTMLPreloadScanner.h" 29 #include "core/html/parser/HTMLPreloadScanner.h"
30 30
31 #include "HTMLNames.h" 31 #include "HTMLNames.h"
32 #include "InputTypeNames.h" 32 #include "InputTypeNames.h"
33 #include "RuntimeEnabledFeatures.h" 33 #include "RuntimeEnabledFeatures.h"
34 #include "core/css/MediaList.h" 34 #include "core/css/MediaList.h"
35 #include "core/css/MediaQueryEvaluator.h" 35 #include "core/css/MediaQueryEvaluator.h"
36 #include "core/css/MediaValues.h" 36 #include "core/css/MediaValues.h"
37 #include "core/css/parser/SizesAttributeParser.h"
37 #include "core/html/LinkRelAttribute.h" 38 #include "core/html/LinkRelAttribute.h"
38 #include "core/html/parser/HTMLParserIdioms.h" 39 #include "core/html/parser/HTMLParserIdioms.h"
39 #include "core/html/parser/HTMLSrcsetParser.h" 40 #include "core/html/parser/HTMLSrcsetParser.h"
40 #include "core/html/parser/HTMLTokenizer.h" 41 #include "core/html/parser/HTMLTokenizer.h"
41 #include "platform/TraceEvent.h" 42 #include "platform/TraceEvent.h"
42 #include "wtf/MainThread.h" 43 #include "wtf/MainThread.h"
43 44
44 namespace WebCore { 45 namespace WebCore {
45 46
46 using namespace HTMLNames; 47 using namespace HTMLNames;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 return mediaQueryEvaluator.eval(mediaQueries.get()); 101 return mediaQueryEvaluator.eval(mediaQueries.get());
101 } 102 }
102 103
103 class TokenPreloadScanner::StartTagScanner { 104 class TokenPreloadScanner::StartTagScanner {
104 public: 105 public:
105 StartTagScanner(const StringImpl* tagImpl, PassRefPtr<MediaValues> mediaValu es) 106 StartTagScanner(const StringImpl* tagImpl, PassRefPtr<MediaValues> mediaValu es)
106 : m_tagImpl(tagImpl) 107 : m_tagImpl(tagImpl)
107 , m_linkIsStyleSheet(false) 108 , m_linkIsStyleSheet(false)
108 , m_matchedMediaAttribute(true) 109 , m_matchedMediaAttribute(true)
109 , m_inputIsImage(false) 110 , m_inputIsImage(false)
110 , m_encounteredImgSrc(false) 111 , m_imgSourceSize(0)
112 , m_sourceSizeSet(false)
111 , m_isCORSEnabled(false) 113 , m_isCORSEnabled(false)
112 , m_allowCredentials(DoNotAllowStoredCredentials) 114 , m_allowCredentials(DoNotAllowStoredCredentials)
113 , m_mediaValues(mediaValues) 115 , m_mediaValues(mediaValues)
114 { 116 {
115 if (!match(m_tagImpl, imgTag) 117 if (!match(m_tagImpl, imgTag)
116 && !match(m_tagImpl, inputTag) 118 && !match(m_tagImpl, inputTag)
117 && !match(m_tagImpl, linkTag) 119 && !match(m_tagImpl, linkTag)
118 && !match(m_tagImpl, scriptTag)) 120 && !match(m_tagImpl, scriptTag))
119 m_tagImpl = 0; 121 m_tagImpl = 0;
122 if (RuntimeEnabledFeatures::pictureSizesEnabled())
123 m_imgSourceSize = SizesAttributeParser::findEffectiveSize(String(), m_mediaValues);
120 } 124 }
121 125
122 enum URLReplacement { 126 enum URLReplacement {
123 AllowURLReplacement, 127 AllowURLReplacement,
124 DisallowURLReplacement 128 DisallowURLReplacement
125 }; 129 };
126 130
127 void processAttributes(const HTMLToken::AttributeList& attributes) 131 void processAttributes(const HTMLToken::AttributeList& attributes)
128 { 132 {
129 ASSERT(isMainThread()); 133 ASSERT(isMainThread());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 { 168 {
165 if (match(attributeName, charsetAttr)) 169 if (match(attributeName, charsetAttr))
166 m_charset = attributeValue; 170 m_charset = attributeValue;
167 171
168 if (match(m_tagImpl, scriptTag)) { 172 if (match(m_tagImpl, scriptTag)) {
169 if (match(attributeName, srcAttr)) 173 if (match(attributeName, srcAttr))
170 setUrlToLoad(attributeValue, DisallowURLReplacement); 174 setUrlToLoad(attributeValue, DisallowURLReplacement);
171 else if (match(attributeName, crossoriginAttr)) 175 else if (match(attributeName, crossoriginAttr))
172 setCrossOriginAllowed(attributeValue); 176 setCrossOriginAllowed(attributeValue);
173 } else if (match(m_tagImpl, imgTag)) { 177 } else if (match(m_tagImpl, imgTag)) {
174 int effectiveSize = -1; // FIXME - hook up the real value from `size s` 178 if (match(attributeName, srcAttr) && m_imgSrcUrl.isNull()) {
175 if (match(attributeName, srcAttr) && !m_encounteredImgSrc) { 179 m_imgSrcUrl = attributeValue;
176 m_encounteredImgSrc = true; 180 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues->devi cePixelRatio(), m_imgSourceSize, attributeValue, m_srcsetImageCandidate), AllowU RLReplacement);
177 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues->devi cePixelRatio(), effectiveSize, attributeValue, m_srcsetImageCandidate), AllowURL Replacement);
178 } else if (match(attributeName, crossoriginAttr)) { 181 } else if (match(attributeName, crossoriginAttr)) {
179 setCrossOriginAllowed(attributeValue); 182 setCrossOriginAllowed(attributeValue);
180 } else if (match(attributeName, srcsetAttr) && m_srcsetImageCandidat e.isEmpty()) { 183 } else if (match(attributeName, srcsetAttr) && m_srcsetImageCandidat e.isEmpty()) {
181 m_srcsetImageCandidate = bestFitSourceForSrcsetAttribute(m_media Values->devicePixelRatio(), effectiveSize, attributeValue); 184 m_imgSrcsetAttributeValue = attributeValue;
182 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues->devi cePixelRatio(), effectiveSize, m_urlToLoad, m_srcsetImageCandidate), AllowURLRep lacement); 185 m_srcsetImageCandidate = bestFitSourceForSrcsetAttribute(m_media Values->devicePixelRatio(), m_imgSourceSize, attributeValue);
186 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues->devi cePixelRatio(), m_imgSourceSize, m_imgSrcUrl, m_srcsetImageCandidate), AllowURLR eplacement);
187 } else if (RuntimeEnabledFeatures::pictureSizesEnabled() && match(at tributeName, sizesAttr) && !m_sourceSizeSet) {
188 m_imgSourceSize = SizesAttributeParser::findEffectiveSize(attrib uteValue, m_mediaValues);
189 m_sourceSizeSet = true;
190 if (!m_srcsetImageCandidate.isEmpty()) {
191 m_srcsetImageCandidate = bestFitSourceForSrcsetAttribute(m_m ediaValues->devicePixelRatio(), m_imgSourceSize, m_imgSrcsetAttributeValue);
192 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues-> devicePixelRatio(), m_imgSourceSize, m_imgSrcUrl, m_srcsetImageCandidate), Allow URLReplacement);
193 }
183 } 194 }
184 } else if (match(m_tagImpl, linkTag)) { 195 } else if (match(m_tagImpl, linkTag)) {
185 if (match(attributeName, hrefAttr)) 196 if (match(attributeName, hrefAttr))
186 setUrlToLoad(attributeValue, DisallowURLReplacement); 197 setUrlToLoad(attributeValue, DisallowURLReplacement);
187 else if (match(attributeName, relAttr)) 198 else if (match(attributeName, relAttr))
188 m_linkIsStyleSheet = relAttributeIsStyleSheet(attributeValue); 199 m_linkIsStyleSheet = relAttributeIsStyleSheet(attributeValue);
189 else if (match(attributeName, mediaAttr)) 200 else if (match(attributeName, mediaAttr))
190 m_matchedMediaAttribute = mediaAttributeMatches(*m_mediaValues, attributeValue); 201 m_matchedMediaAttribute = mediaAttributeMatches(*m_mediaValues, attributeValue);
191 else if (match(attributeName, crossoriginAttr)) 202 else if (match(attributeName, crossoriginAttr))
192 setCrossOriginAllowed(attributeValue); 203 setCrossOriginAllowed(attributeValue);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 m_allowCredentials = DoNotAllowStoredCredentials; 277 m_allowCredentials = DoNotAllowStoredCredentials;
267 } 278 }
268 279
269 const StringImpl* m_tagImpl; 280 const StringImpl* m_tagImpl;
270 String m_urlToLoad; 281 String m_urlToLoad;
271 ImageCandidate m_srcsetImageCandidate; 282 ImageCandidate m_srcsetImageCandidate;
272 String m_charset; 283 String m_charset;
273 bool m_linkIsStyleSheet; 284 bool m_linkIsStyleSheet;
274 bool m_matchedMediaAttribute; 285 bool m_matchedMediaAttribute;
275 bool m_inputIsImage; 286 bool m_inputIsImage;
276 bool m_encounteredImgSrc; 287 String m_imgSrcUrl;
288 String m_imgSrcsetAttributeValue;
289 unsigned m_imgSourceSize;
290 bool m_sourceSizeSet;
277 bool m_isCORSEnabled; 291 bool m_isCORSEnabled;
278 StoredCredentials m_allowCredentials; 292 StoredCredentials m_allowCredentials;
279 RefPtr<MediaValues> m_mediaValues; 293 RefPtr<MediaValues> m_mediaValues;
280 }; 294 };
281 295
282 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassRefPtr<Med iaValues> mediaValues) 296 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassRefPtr<Med iaValues> mediaValues)
283 : m_documentURL(documentURL) 297 : m_documentURL(documentURL)
284 , m_inStyle(false) 298 , m_inStyle(false)
285 , m_templateCount(0) 299 , m_templateCount(0)
286 , m_mediaValues(mediaValues) 300 , m_mediaValues(mediaValues)
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 if (m_token.type() == HTMLToken::StartTag) 429 if (m_token.type() == HTMLToken::StartTag)
416 m_tokenizer->updateStateFor(attemptStaticStringCreation(m_token.name (), Likely8Bit)); 430 m_tokenizer->updateStateFor(attemptStaticStringCreation(m_token.name (), Likely8Bit));
417 m_scanner.scan(m_token, m_source, requests); 431 m_scanner.scan(m_token, m_source, requests);
418 m_token.clear(); 432 m_token.clear();
419 } 433 }
420 434
421 preloader->takeAndPreload(requests); 435 preloader->takeAndPreload(requests);
422 } 436 }
423 437
424 } 438 }
OLDNEW
« no previous file with comments | « Source/core/html/HTMLImageElement.idl ('k') | Source/core/html/parser/HTMLSrcsetParser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698