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

Unified Diff: third_party/WebKit/Source/core/loader/ImageLoader.cpp

Issue 2613853002: Phase III Step 2: Call imageNotifyFinished() and image load event after SVG loading completes (Closed)
Patch Set: Rebase Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/loader/ImageLoader.cpp
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
index 490377410ba0ff4f4e74b179e9bbc9350a0aff91..6009426ade2710d17bf7552ab58d6ac0692e1096 100644
--- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -177,6 +177,7 @@ void ImageLoader::Dispose() {
if (image_) {
image_->RemoveObserver(this);
image_ = nullptr;
+ delay_until_image_notify_finished_ = nullptr;
}
}
@@ -201,6 +202,7 @@ void ImageLoader::SetImageWithoutConsideringPendingLoadEvent(
ImageResourceContent* old_image = image_.Get();
if (new_image != old_image) {
image_ = new_image;
+ delay_until_image_notify_finished_ = nullptr;
fs 2017/05/05 10:52:42 Clearing this is tied either to a change to |compl
hiroshige 2017/05/08 17:22:06 Also when |image_| is changed (to non-null), like
fs 2017/05/08 18:52:33 Acknowledged.
hiroshige 2017/05/09 00:46:31 I found another issue that motivates me to introdu
if (has_pending_load_event_) {
LoadEventSender().CancelEvent(this);
has_pending_load_event_ = false;
@@ -264,7 +266,7 @@ inline void ImageLoader::EnqueueImageLoadingMicroTask(
pending_task_ = task->CreateWeakPtr();
Microtask::EnqueueMicrotask(
WTF::Bind(&Task::Run, WTF::Passed(std::move(task))));
- load_delay_counter_ =
+ delay_until_do_update_from_element_ =
IncrementLoadEventDelayCount::Create(element_->GetDocument());
}
@@ -283,7 +285,7 @@ void ImageLoader::DoUpdateFromElement(BypassMainWorldBehavior bypass_behavior,
pending_task_.reset();
// Make sure to only decrement the count when we exit this function
std::unique_ptr<IncrementLoadEventDelayCount> load_delay_counter;
- load_delay_counter.swap(load_delay_counter_);
+ load_delay_counter.swap(delay_until_do_update_from_element_);
Document& document = element_->GetDocument();
if (!document.IsActive())
@@ -359,6 +361,7 @@ void ImageLoader::DoUpdateFromElement(BypassMainWorldBehavior bypass_behavior,
image_ = new_image;
has_pending_load_event_ = new_image;
image_complete_ = !new_image;
+ delay_until_image_notify_finished_ = nullptr;
UpdateLayoutObject();
// If newImage exists and is cached, addObserver() will result in the load
@@ -428,6 +431,7 @@ void ImageLoader::UpdateFromElement(UpdateFromElementBehavior update_behavior,
image->RemoveObserver(this);
}
image_ = nullptr;
+ delay_until_image_notify_finished_ = nullptr;
}
// Don't load images for inactive documents. We don't want to slow down the
@@ -470,6 +474,20 @@ bool ImageLoader::ShouldLoadImmediately(const KURL& url) const {
return (isHTMLObjectElement(element_) || isHTMLEmbedElement(element_));
}
+void ImageLoader::ImageChanged(ImageResourceContent* content, const IntRect*) {
+ DCHECK_EQ(content, image_.Get());
+ if (image_complete_ || !content->IsLoading() ||
+ delay_until_image_notify_finished_)
+ return;
+
+ Document& document = element_->GetDocument();
+ if (!document.IsActive())
+ return;
+
+ delay_until_image_notify_finished_ =
+ IncrementLoadEventDelayCount::Create(document);
+}
+
void ImageLoader::ImageNotifyFinished(ImageResourceContent* resource) {
RESOURCE_LOADING_DVLOG(1)
<< "ImageLoader::imageNotifyFinished " << this
@@ -479,6 +497,7 @@ void ImageLoader::ImageNotifyFinished(ImageResourceContent* resource) {
DCHECK_EQ(resource, image_.Get());
image_complete_ = true;
+ delay_until_image_notify_finished_ = nullptr;
// Update ImageAnimationPolicy for m_image.
if (image_)
@@ -636,8 +655,14 @@ void ImageLoader::DispatchPendingErrorEvents() {
}
void ImageLoader::ElementDidMoveToNewDocument() {
- if (load_delay_counter_)
- load_delay_counter_->DocumentChanged(element_->GetDocument());
+ if (delay_until_do_update_from_element_) {
+ delay_until_do_update_from_element_->DocumentChanged(
+ element_->GetDocument());
+ }
+ if (delay_until_image_notify_finished_) {
+ delay_until_image_notify_finished_->DocumentChanged(
+ element_->GetDocument());
+ }
ClearFailedLoadURL();
SetImage(0);
}

Powered by Google App Engine
This is Rietveld 408576698