void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, ReferrerPolicy referrerPolicy) { AtomicString imageSourceURL = m_element->imageSourceURL(); m_suppressErrorEvents = (updateBehavior == UpdateSizeChanged); if (updateBehavior == UpdateIgnorePreviousError) clearFailedLoadURL(); if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL) return; // Prevent the creation of a ResourceLoader (and therefore a network request) // for ImageDocument loads. In this case, the image contents have already been // requested as a main resource and ImageDocumentParser will take care of // funneling the main resource bytes into m_image, so just create an // ImageResource to be populated later. if (m_loadingImageDocument && updateBehavior != UpdateForcedReload) { setImage( ImageResource::create(imageSourceToKURL(m_element->imageSourceURL()))); m_image->setStatus(Resource::Pending); return; } // If we have a pending task, we have to clear it -- either we're now loading // immediately, or we need to reset the task's state. if (m_pendingTask) { m_pendingTask->clearLoader(); m_pendingTask.reset(); } KURL url = imageSourceToKURL(imageSourceURL); if (shouldLoadImmediately(url)) { doUpdateFromElement(DoNotBypassMainWorldCSP, updateBehavior, url, referrerPolicy); return; } // Allow the idiom "img.src=''; img.src='.." to clear down the image before an // asynchronous load completes. if (imageSourceURL.isEmpty()) { ImageResource* image = m_image.get(); if (image) { image->removeObserver(this); } m_image = nullptr; } // Don't load images for inactive documents. We don't want to slow down the // raw HTML parsing case by loading images we don't intend to display. Document& document = m_element->document(); if (document.isActive()) enqueueImageLoadingMicroTask(updateBehavior, referrerPolicy); }
void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior) { AtomicString imageSourceURL = m_element->imageSourceURL(); m_suppressErrorEvents = (updateBehavior == UpdateSizeChanged); if (updateBehavior == UpdateIgnorePreviousError) clearFailedLoadURL(); if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL) return; // If we have a pending task, we have to clear it -- either we're // now loading immediately, or we need to reset the task's state. if (m_pendingTask) { m_pendingTask->clearLoader(); m_pendingTask.clear(); } KURL url = imageSourceToKURL(imageSourceURL); if (shouldLoadImmediately(url)) { doUpdateFromElement(DoNotBypassMainWorldCSP, updateBehavior); return; } // Allow the idiom "img.src=''; img.src='.." to clear down the image before // an asynchronous load completes. if (imageSourceURL.isEmpty()) { ImageResource* image = m_image.get(); if (image) image->removeClient(this); m_image = nullptr; } // Don't load images for inactive documents. We don't want to slow down the // raw HTML parsing case by loading images we don't intend to display. Document& document = m_element->document(); if (document.isActive()) enqueueImageLoadingMicroTask(updateBehavior); }
void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, LoadType loadType) { AtomicString imageSourceURL = m_element->imageSourceURL(); if (updateBehavior == UpdateIgnorePreviousError) clearFailedLoadURL(); if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL) return; // If we have a pending task, we have to clear it -- either we're // now loading immediately, or we need to reset the task's state. if (m_pendingTask) { m_pendingTask->clearLoader(); m_pendingTask.clear(); } KURL url = imageSourceToKURL(imageSourceURL); if (imageSourceURL.isNull() || url.isNull() || shouldLoadImmediately(url, loadType)) { doUpdateFromElement(updateBehavior); return; } enqueueImageLoadingMicroTask(updateBehavior); }