OLD | NEW |
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 | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights |
5 * reserved. | 5 * reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 image_ = nullptr; | 179 image_ = nullptr; |
180 } | 180 } |
181 } | 181 } |
182 | 182 |
183 DEFINE_TRACE(ImageLoader) { | 183 DEFINE_TRACE(ImageLoader) { |
184 visitor->Trace(image_); | 184 visitor->Trace(image_); |
185 visitor->Trace(image_resource_for_image_document_); | 185 visitor->Trace(image_resource_for_image_document_); |
186 visitor->Trace(element_); | 186 visitor->Trace(element_); |
187 } | 187 } |
188 | 188 |
189 void ImageLoader::SetImage(ImageResourceContent* new_image) { | 189 void ImageLoader::SetImageForTest(ImageResourceContent* new_image) { |
| 190 DCHECK(new_image); |
190 SetImageWithoutConsideringPendingLoadEvent(new_image); | 191 SetImageWithoutConsideringPendingLoadEvent(new_image); |
191 | 192 |
192 // Only consider updating the protection ref-count of the Element immediately | 193 // Only consider updating the protection ref-count of the Element immediately |
193 // before returning from this function as doing so might result in the | 194 // before returning from this function as doing so might result in the |
194 // destruction of this ImageLoader. | 195 // destruction of this ImageLoader. |
195 UpdatedHasPendingEvent(); | 196 UpdatedHasPendingEvent(); |
196 } | 197 } |
197 | 198 |
| 199 void ImageLoader::ClearImage() { |
| 200 SetImageWithoutConsideringPendingLoadEvent(nullptr); |
| 201 |
| 202 // Only consider updating the protection ref-count of the Element immediately |
| 203 // before returning from this function as doing so might result in the |
| 204 // destruction of this ImageLoader. |
| 205 UpdatedHasPendingEvent(); |
| 206 } |
| 207 |
| 208 void ImageLoader::SetImageForImageDocument(ImageResource* new_image_resource) { |
| 209 DCHECK(loading_image_document_); |
| 210 DCHECK(new_image_resource); |
| 211 DCHECK(new_image_resource->GetContent()); |
| 212 |
| 213 image_resource_for_image_document_ = new_image_resource; |
| 214 SetImageWithoutConsideringPendingLoadEvent(new_image_resource->GetContent()); |
| 215 |
| 216 // |has_pending_load_event_| is always false and |image_complete_| is |
| 217 // always true for ImageDocument loading, while the loading is just started. |
| 218 // TODO(hiroshige): clean up the behavior of flags. https://crbug.com/719759 |
| 219 has_pending_load_event_ = false; |
| 220 image_complete_ = true; |
| 221 |
| 222 // Only consider updating the protection ref-count of the Element immediately |
| 223 // before returning from this function as doing so might result in the |
| 224 // destruction of this ImageLoader. |
| 225 UpdatedHasPendingEvent(); |
| 226 } |
| 227 |
198 void ImageLoader::SetImageWithoutConsideringPendingLoadEvent( | 228 void ImageLoader::SetImageWithoutConsideringPendingLoadEvent( |
199 ImageResourceContent* new_image) { | 229 ImageResourceContent* new_image) { |
200 DCHECK(failed_load_url_.IsEmpty()); | 230 DCHECK(failed_load_url_.IsEmpty()); |
201 ImageResourceContent* old_image = image_.Get(); | 231 ImageResourceContent* old_image = image_.Get(); |
202 if (new_image != old_image) { | 232 if (new_image != old_image) { |
203 image_ = new_image; | |
204 if (has_pending_load_event_) { | 233 if (has_pending_load_event_) { |
205 LoadEventSender().CancelEvent(this); | 234 LoadEventSender().CancelEvent(this); |
206 has_pending_load_event_ = false; | 235 has_pending_load_event_ = false; |
207 } | 236 } |
208 if (has_pending_error_event_) { | 237 if (has_pending_error_event_) { |
209 ErrorEventSender().CancelEvent(this); | 238 ErrorEventSender().CancelEvent(this); |
210 has_pending_error_event_ = false; | 239 has_pending_error_event_ = false; |
211 } | 240 } |
212 image_complete_ = true; | 241 UpdateImageState(new_image); |
213 if (new_image) { | 242 if (new_image) { |
214 new_image->AddObserver(this); | 243 new_image->AddObserver(this); |
215 } | 244 } |
216 if (old_image) { | 245 if (old_image) { |
217 old_image->RemoveObserver(this); | 246 old_image->RemoveObserver(this); |
218 } | 247 } |
219 } | 248 } |
220 | 249 |
221 if (LayoutImageResource* image_resource = GetLayoutImageResource()) | 250 if (LayoutImageResource* image_resource = GetLayoutImageResource()) |
222 image_resource->ResetAnimation(); | 251 image_resource->ResetAnimation(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 ReferrerPolicy referrer_policy) { | 290 ReferrerPolicy referrer_policy) { |
262 std::unique_ptr<Task> task = | 291 std::unique_ptr<Task> task = |
263 Task::Create(this, update_behavior, referrer_policy); | 292 Task::Create(this, update_behavior, referrer_policy); |
264 pending_task_ = task->CreateWeakPtr(); | 293 pending_task_ = task->CreateWeakPtr(); |
265 Microtask::EnqueueMicrotask( | 294 Microtask::EnqueueMicrotask( |
266 WTF::Bind(&Task::Run, WTF::Passed(std::move(task)))); | 295 WTF::Bind(&Task::Run, WTF::Passed(std::move(task)))); |
267 load_delay_counter_ = | 296 load_delay_counter_ = |
268 IncrementLoadEventDelayCount::Create(element_->GetDocument()); | 297 IncrementLoadEventDelayCount::Create(element_->GetDocument()); |
269 } | 298 } |
270 | 299 |
| 300 void ImageLoader::UpdateImageState(ImageResourceContent* new_image) { |
| 301 image_ = new_image; |
| 302 has_pending_load_event_ = new_image; |
| 303 image_complete_ = !new_image; |
| 304 } |
| 305 |
271 void ImageLoader::DoUpdateFromElement(BypassMainWorldBehavior bypass_behavior, | 306 void ImageLoader::DoUpdateFromElement(BypassMainWorldBehavior bypass_behavior, |
272 UpdateFromElementBehavior update_behavior, | 307 UpdateFromElementBehavior update_behavior, |
273 const KURL& url, | 308 const KURL& url, |
274 ReferrerPolicy referrer_policy) { | 309 ReferrerPolicy referrer_policy) { |
275 // FIXME: According to | 310 // FIXME: According to |
276 // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-conten
t.html#the-img-element:the-img-element-55 | 311 // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-conten
t.html#the-img-element:the-img-element-55 |
277 // When "update image" is called due to environment changes and the load | 312 // When "update image" is called due to environment changes and the load |
278 // fails, onerror should not be called. That is currently not the case. | 313 // fails, onerror should not be called. That is currently not the case. |
279 // | 314 // |
280 // We don't need to call clearLoader here: Either we were called from the | 315 // We don't need to call clearLoader here: Either we were called from the |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 // cancelled by changing the src attribute. If newImage is null and | 384 // cancelled by changing the src attribute. If newImage is null and |
350 // has_pending_error_event_ is true, we know the error event has been just | 385 // has_pending_error_event_ is true, we know the error event has been just |
351 // posted by this load and we should not cancel the event. | 386 // posted by this load and we should not cancel the event. |
352 // FIXME: If both previous load and this one got blocked with an error, we | 387 // FIXME: If both previous load and this one got blocked with an error, we |
353 // can receive one error event instead of two. | 388 // can receive one error event instead of two. |
354 if (has_pending_error_event_ && new_image) { | 389 if (has_pending_error_event_ && new_image) { |
355 ErrorEventSender().CancelEvent(this); | 390 ErrorEventSender().CancelEvent(this); |
356 has_pending_error_event_ = false; | 391 has_pending_error_event_ = false; |
357 } | 392 } |
358 | 393 |
359 image_ = new_image; | 394 UpdateImageState(new_image); |
360 has_pending_load_event_ = new_image; | |
361 image_complete_ = !new_image; | |
362 | 395 |
363 UpdateLayoutObject(); | 396 UpdateLayoutObject(); |
364 // If newImage exists and is cached, addObserver() will result in the load | 397 // If newImage exists and is cached, addObserver() will result in the load |
365 // event being queued to fire. Ensure this happens after beforeload is | 398 // event being queued to fire. Ensure this happens after beforeload is |
366 // dispatched. | 399 // dispatched. |
367 if (new_image) { | 400 if (new_image) { |
368 new_image->AddObserver(this); | 401 new_image->AddObserver(this); |
369 } | 402 } |
370 if (old_image) { | 403 if (old_image) { |
371 old_image->RemoveObserver(this); | 404 old_image->RemoveObserver(this); |
(...skipping 23 matching lines...) Expand all Loading... |
395 // Prevent the creation of a ResourceLoader (and therefore a network request) | 428 // Prevent the creation of a ResourceLoader (and therefore a network request) |
396 // for ImageDocument loads. In this case, the image contents have already been | 429 // for ImageDocument loads. In this case, the image contents have already been |
397 // requested as a main resource and ImageDocumentParser will take care of | 430 // requested as a main resource and ImageDocumentParser will take care of |
398 // funneling the main resource bytes into image_, so just create an | 431 // funneling the main resource bytes into image_, so just create an |
399 // ImageResource to be populated later. | 432 // ImageResource to be populated later. |
400 if (loading_image_document_ && update_behavior != kUpdateForcedReload) { | 433 if (loading_image_document_ && update_behavior != kUpdateForcedReload) { |
401 ImageResource* image_resource = ImageResource::Create( | 434 ImageResource* image_resource = ImageResource::Create( |
402 ResourceRequest(ImageSourceToKURL(element_->ImageSourceURL()))); | 435 ResourceRequest(ImageSourceToKURL(element_->ImageSourceURL()))); |
403 image_resource->SetStatus(ResourceStatus::kPending); | 436 image_resource->SetStatus(ResourceStatus::kPending); |
404 image_resource->NotifyStartLoad(); | 437 image_resource->NotifyStartLoad(); |
405 image_resource_for_image_document_ = image_resource; | 438 SetImageForImageDocument(image_resource); |
406 SetImage(image_resource->GetContent()); | |
407 return; | 439 return; |
408 } | 440 } |
409 | 441 |
410 // If we have a pending task, we have to clear it -- either we're now loading | 442 // If we have a pending task, we have to clear it -- either we're now loading |
411 // immediately, or we need to reset the task's state. | 443 // immediately, or we need to reset the task's state. |
412 if (pending_task_) { | 444 if (pending_task_) { |
413 pending_task_->ClearLoader(); | 445 pending_task_->ClearLoader(); |
414 pending_task_.reset(); | 446 pending_task_.reset(); |
415 } | 447 } |
416 | 448 |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 } | 664 } |
633 | 665 |
634 void ImageLoader::DispatchPendingErrorEvents() { | 666 void ImageLoader::DispatchPendingErrorEvents() { |
635 ErrorEventSender().DispatchPendingEvents(); | 667 ErrorEventSender().DispatchPendingEvents(); |
636 } | 668 } |
637 | 669 |
638 void ImageLoader::ElementDidMoveToNewDocument() { | 670 void ImageLoader::ElementDidMoveToNewDocument() { |
639 if (load_delay_counter_) | 671 if (load_delay_counter_) |
640 load_delay_counter_->DocumentChanged(element_->GetDocument()); | 672 load_delay_counter_->DocumentChanged(element_->GetDocument()); |
641 ClearFailedLoadURL(); | 673 ClearFailedLoadURL(); |
642 SetImage(0); | 674 ClearImage(); |
643 } | 675 } |
644 | 676 |
645 } // namespace blink | 677 } // namespace blink |
OLD | NEW |