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

Side by Side Diff: third_party/WebKit/Source/core/loader/ImageLoader.cpp

Issue 2202473002: DO NOT COMMIT: Experimental removal of encoded image data Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: (rebase) Created 4 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserv ed. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserv ed.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 147
148 ImageLoader::ImageLoader(Element* element) 148 ImageLoader::ImageLoader(Element* element)
149 : m_element(element) 149 : m_element(element)
150 , m_derefElementTimer(this, &ImageLoader::timerFired) 150 , m_derefElementTimer(this, &ImageLoader::timerFired)
151 , m_hasPendingLoadEvent(false) 151 , m_hasPendingLoadEvent(false)
152 , m_hasPendingErrorEvent(false) 152 , m_hasPendingErrorEvent(false)
153 , m_imageComplete(true) 153 , m_imageComplete(true)
154 , m_loadingImageDocument(false) 154 , m_loadingImageDocument(false)
155 , m_elementIsProtected(false) 155 , m_elementIsProtected(false)
156 , m_suppressErrorEvents(false) 156 , m_suppressErrorEvents(false)
157 , m_suppressEvents(false)
157 { 158 {
158 RESOURCE_LOADING_DVLOG(1) << "new ImageLoader " << this; 159 RESOURCE_LOADING_DVLOG(1) << "new ImageLoader " << this;
159 ThreadState::current()->registerPreFinalizer(this); 160 ThreadState::current()->registerPreFinalizer(this);
160 } 161 }
161 162
162 ImageLoader::~ImageLoader() 163 ImageLoader::~ImageLoader()
163 { 164 {
164 } 165 }
165 166
166 void ImageLoader::dispose() 167 void ImageLoader::dispose()
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(element.fa stGetAttribute(HTMLNames::crossoriginAttr)); 226 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(element.fa stGetAttribute(HTMLNames::crossoriginAttr));
226 if (crossOrigin != CrossOriginAttributeNotSet) 227 if (crossOrigin != CrossOriginAttributeNotSet)
227 request.setCrossOriginAccessControl(element.document().getSecurityOrigin (), crossOrigin); 228 request.setCrossOriginAccessControl(element.document().getSecurityOrigin (), crossOrigin);
228 229
229 if (clientHintsPreferences.shouldSendResourceWidth() && isHTMLImageElement(e lement)) 230 if (clientHintsPreferences.shouldSendResourceWidth() && isHTMLImageElement(e lement))
230 request.setResourceWidth(toHTMLImageElement(element).getResourceWidth()) ; 231 request.setResourceWidth(toHTMLImageElement(element).getResourceWidth()) ;
231 } 232 }
232 233
233 inline void ImageLoader::dispatchErrorEvent() 234 inline void ImageLoader::dispatchErrorEvent()
234 { 235 {
236 if (m_suppressEvents) {
237 return;
238 }
235 m_hasPendingErrorEvent = true; 239 m_hasPendingErrorEvent = true;
236 errorEventSender().dispatchEventSoon(this); 240 errorEventSender().dispatchEventSoon(this);
237 } 241 }
238 242
239 inline void ImageLoader::crossSiteOrCSPViolationOccurred(AtomicString imageSourc eURL) 243 inline void ImageLoader::crossSiteOrCSPViolationOccurred(AtomicString imageSourc eURL)
240 { 244 {
241 m_failedLoadURL = imageSourceURL; 245 m_failedLoadURL = imageSourceURL;
242 } 246 }
243 247
244 inline void ImageLoader::clearFailedLoadURL() 248 inline void ImageLoader::clearFailedLoadURL()
(...skipping 27 matching lines...) Expand all
272 Document& document = m_element->document(); 276 Document& document = m_element->document();
273 if (!document.isActive()) 277 if (!document.isActive())
274 return; 278 return;
275 279
276 AtomicString imageSourceURL = m_element->imageSourceURL(); 280 AtomicString imageSourceURL = m_element->imageSourceURL();
277 ImageResource* newImage = nullptr; 281 ImageResource* newImage = nullptr;
278 if (!url.isNull()) { 282 if (!url.isNull()) {
279 // Unlike raw <img>, we block mixed content inside of <picture> or <img srcset>. 283 // Unlike raw <img>, we block mixed content inside of <picture> or <img srcset>.
280 ResourceLoaderOptions resourceLoaderOptions = ResourceFetcher::defaultRe sourceOptions(); 284 ResourceLoaderOptions resourceLoaderOptions = ResourceFetcher::defaultRe sourceOptions();
281 ResourceRequest resourceRequest(url); 285 ResourceRequest resourceRequest(url);
282 if (updateBehavior == UpdateForcedReload) { 286 switch (updateBehavior) {
287 case UpdateForcedReload:
283 resourceRequest.setCachePolicy(WebCachePolicy::BypassingCache); 288 resourceRequest.setCachePolicy(WebCachePolicy::BypassingCache);
284 resourceRequest.setLoFiState(WebURLRequest::LoFiOff); 289 resourceRequest.setLoFiState(WebURLRequest::LoFiOff);
290 break;
291 case UpdateMyReload:
292 resourceRequest.setCachePolicy(WebCachePolicy::ReturnCacheDataElseLo ad);
293 resourceRequest.setLoFiState(WebURLRequest::LoFiOff);
294 break;
295 default:
296 break;
285 } 297 }
286 298
287 if (referrerPolicy != ReferrerPolicyDefault) 299 if (referrerPolicy != ReferrerPolicyDefault)
288 resourceRequest.setHTTPReferrer(SecurityPolicy::generateReferrer(ref errerPolicy, url, document.outgoingReferrer())); 300 resourceRequest.setHTTPReferrer(SecurityPolicy::generateReferrer(ref errerPolicy, url, document.outgoingReferrer()));
289 301
290 if (isHTMLPictureElement(element()->parentNode()) || !element()->fastGet Attribute(HTMLNames::srcsetAttr).isNull()) 302 if (isHTMLPictureElement(element()->parentNode()) || !element()->fastGet Attribute(HTMLNames::srcsetAttr).isNull())
291 resourceRequest.setRequestContext(WebURLRequest::RequestContextImage Set); 303 resourceRequest.setRequestContext(WebURLRequest::RequestContextImage Set);
292 FetchRequest request(resourceRequest, element()->localName(), resourceLo aderOptions); 304 FetchRequest request(resourceRequest, element()->localName(), resourceLo aderOptions);
293 configureRequest(request, bypassBehavior, *m_element, document.clientHin tsPreferences()); 305 configureRequest(request, bypassBehavior, *m_element, document.clientHin tsPreferences());
294 306
(...skipping 25 matching lines...) Expand all
320 // Cancel error events that belong to the previous load, which is now ca ncelled by changing the src attribute. 332 // Cancel error events that belong to the previous load, which is now ca ncelled by changing the src attribute.
321 // If newImage is null and m_hasPendingErrorEvent is true, we know the e rror event has been just posted by 333 // If newImage is null and m_hasPendingErrorEvent is true, we know the e rror event has been just posted by
322 // this load and we should not cancel the event. 334 // this load and we should not cancel the event.
323 // FIXME: If both previous load and this one got blocked with an error, we can receive one error event instead of two. 335 // FIXME: If both previous load and this one got blocked with an error, we can receive one error event instead of two.
324 if (m_hasPendingErrorEvent && newImage) { 336 if (m_hasPendingErrorEvent && newImage) {
325 errorEventSender().cancelEvent(this); 337 errorEventSender().cancelEvent(this);
326 m_hasPendingErrorEvent = false; 338 m_hasPendingErrorEvent = false;
327 } 339 }
328 340
329 m_image = newImage; 341 m_image = newImage;
330 m_hasPendingLoadEvent = newImage; 342 m_hasPendingLoadEvent = newImage && !m_suppressEvents;
331 m_imageComplete = !newImage; 343 m_imageComplete = !newImage;
332 344
333 updateLayoutObject(); 345 updateLayoutObject();
334 // If newImage exists and is cached, addObserver() will result in the lo ad event 346 // If newImage exists and is cached, addObserver() will result in the lo ad event
335 // being queued to fire. Ensure this happens after beforeload is dispatc hed. 347 // being queued to fire. Ensure this happens after beforeload is dispatc hed.
336 if (newImage) { 348 if (newImage) {
337 newImage->addObserver(this); 349 newImage->addObserver(this);
338 } 350 }
339 if (oldImage) { 351 if (oldImage) {
340 oldImage->removeObserver(this); 352 oldImage->removeObserver(this);
341 } 353 }
342 } 354 }
343 355
344 if (LayoutImageResource* imageResource = layoutImageResource()) 356 if (LayoutImageResource* imageResource = layoutImageResource())
345 imageResource->resetAnimation(); 357 imageResource->resetAnimation();
346 358
347 // Only consider updating the protection ref-count of the Element immediatel y before returning 359 // Only consider updating the protection ref-count of the Element immediatel y before returning
348 // from this function as doing so might result in the destruction of this Im ageLoader. 360 // from this function as doing so might result in the destruction of this Im ageLoader.
349 updatedHasPendingEvent(); 361 updatedHasPendingEvent();
350 } 362 }
351 363
352 void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, Re ferrerPolicy referrerPolicy) 364 void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, Re ferrerPolicy referrerPolicy)
353 { 365 {
354 AtomicString imageSourceURL = m_element->imageSourceURL(); 366 AtomicString imageSourceURL = m_element->imageSourceURL();
355 m_suppressErrorEvents = (updateBehavior == UpdateSizeChanged); 367 m_suppressErrorEvents = (updateBehavior == UpdateSizeChanged);
368 m_suppressEvents = (updateBehavior == UpdateMyReload);
356 369
357 if (updateBehavior == UpdateIgnorePreviousError) 370 if (updateBehavior == UpdateIgnorePreviousError)
358 clearFailedLoadURL(); 371 clearFailedLoadURL();
359 372
360 if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL) 373 if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL)
361 return; 374 return;
362 375
363 // Prevent the creation of a ResourceLoader (and therefore a network 376 // Prevent the creation of a ResourceLoader (and therefore a network
364 // request) for ImageDocument loads. In this case, the image contents have a lready 377 // request) for ImageDocument loads. In this case, the image contents have a lready
365 // been requested as a main resource and ImageDocumentParser will take care of 378 // been requested as a main resource and ImageDocumentParser will take care of
366 // funneling the main resource bytes into m_image, so just create an ImageRe source 379 // funneling the main resource bytes into m_image, so just create an ImageRe source
367 // to be populated later. 380 // to be populated later.
368 if (m_loadingImageDocument && updateBehavior != UpdateForcedReload) { 381 if (m_loadingImageDocument && updateBehavior != UpdateForcedReload && update Behavior != UpdateMyReload) {
369 setImage(ImageResource::create(imageSourceToKURL(m_element->imageSourceU RL()))); 382 setImage(ImageResource::create(imageSourceToKURL(m_element->imageSourceU RL())));
370 m_image->setStatus(Resource::Pending); 383 m_image->setStatus(Resource::Pending);
371 return; 384 return;
372 } 385 }
373 386
374 // If we have a pending task, we have to clear it -- either we're 387 // If we have a pending task, we have to clear it -- either we're
375 // now loading immediately, or we need to reset the task's state. 388 // now loading immediately, or we need to reset the task's state.
376 if (m_pendingTask) { 389 if (m_pendingTask) {
377 m_pendingTask->clearLoader(); 390 m_pendingTask->clearLoader();
378 m_pendingTask.clear(); 391 m_pendingTask.clear();
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 599
587 bool ImageLoader::getImageAnimationPolicy(ImageAnimationPolicy& policy) 600 bool ImageLoader::getImageAnimationPolicy(ImageAnimationPolicy& policy)
588 { 601 {
589 if (!element()->document().settings()) 602 if (!element()->document().settings())
590 return false; 603 return false;
591 604
592 policy = element()->document().settings()->imageAnimationPolicy(); 605 policy = element()->document().settings()->imageAnimationPolicy();
593 return true; 606 return true;
594 } 607 }
595 608
609 void ImageLoader::requireReloading()
610 {
611 updateFromElement(UpdateMyReload);
612 }
613
596 void ImageLoader::dispatchPendingLoadEvents() 614 void ImageLoader::dispatchPendingLoadEvents()
597 { 615 {
598 loadEventSender().dispatchPendingEvents(); 616 loadEventSender().dispatchPendingEvents();
599 } 617 }
600 618
601 void ImageLoader::dispatchPendingErrorEvents() 619 void ImageLoader::dispatchPendingErrorEvents()
602 { 620 {
603 errorEventSender().dispatchPendingEvents(); 621 errorEventSender().dispatchPendingEvents();
604 } 622 }
605 623
606 void ImageLoader::elementDidMoveToNewDocument() 624 void ImageLoader::elementDidMoveToNewDocument()
607 { 625 {
608 if (m_loadDelayCounter) 626 if (m_loadDelayCounter)
609 m_loadDelayCounter->documentChanged(m_element->document()); 627 m_loadDelayCounter->documentChanged(m_element->document());
610 clearFailedLoadURL(); 628 clearFailedLoadURL();
611 setImage(0); 629 setImage(0);
612 } 630 }
613 631
614 } // namespace blink 632 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/loader/ImageLoader.h ('k') | third_party/WebKit/Source/core/style/StyleFetchedImage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698