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

Side by Side Diff: third_party/WebKit/Source/core/fetch/ImageResource.cpp

Issue 1843533005: Call imageNotifyFinished() just before ResourceClient::notifyFinished() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase, Reflect yhirano's comment Created 4 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
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
6 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. 6 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 } 94 }
95 95
96 DEFINE_TRACE(ImageResource) 96 DEFINE_TRACE(ImageResource)
97 { 97 {
98 visitor->trace(m_multipartParser); 98 visitor->trace(m_multipartParser);
99 Resource::trace(visitor); 99 Resource::trace(visitor);
100 ImageObserver::trace(visitor); 100 ImageObserver::trace(visitor);
101 MultipartImageResourceParser::Client::trace(visitor); 101 MultipartImageResourceParser::Client::trace(visitor);
102 } 102 }
103 103
104 void ImageResource::notifyObserver(ImageResourceObserver* observer, bool isNotif yingFinish, const IntRect* changeRect) 104 void ImageResource::checkNotify()
105 { 105 {
106 if (isNotifyingFinish) { 106 if (isLoading())
107 return;
108
109 ImageResourceObserverWalker walker(m_observers);
110 while (auto* observer = walker.next()) {
107 observer->imageNotifyFinished(this); 111 observer->imageNotifyFinished(this);
108 if (m_observers.contains(observer)) { 112 }
109 m_finishedObservers.add(observer); 113
110 m_observers.remove(observer); 114 Resource::checkNotify();
115 }
116
117 void ImageResource::markClientsAndObserversFinished()
118 {
119 while (!m_observers.isEmpty()) {
120 HashCountedSet<ImageResourceObserver*>::iterator it = m_observers.begin( );
121 for (int i = it->value; i; i--) {
122 m_finishedObservers.add(it->key);
123 m_observers.remove(it);
111 } 124 }
112 } 125 }
113 126
114 observer->imageChanged(this, changeRect); 127 Resource::markClientsAndObserversFinished();
115 } 128 }
116 129
117 void ImageResource::addObserver(ImageResourceObserver* observer) 130 void ImageResource::addObserver(ImageResourceObserver* observer)
118 { 131 {
119 willAddClientOrObserver(); 132 willAddClientOrObserver();
120 133
121 m_observers.add(observer); 134 m_observers.add(observer);
122 135
123 if (!m_revalidatingRequest.isNull()) 136 if (!m_revalidatingRequest.isNull())
124 return; 137 return;
125 138
126 if (m_data && !m_image && !errorOccurred()) { 139 if (m_data && !m_image && !errorOccurred()) {
127 createImage(); 140 createImage();
128 m_image->setData(m_data, true); 141 m_image->setData(m_data, true);
129 } 142 }
130 143
131 if (m_image && !m_image->isNull()) { 144 if (m_image && !m_image->isNull()) {
132 bool isNotifyingFinish = !isLoading() && !stillNeedsLoad(); 145 observer->imageChanged(this);
133 notifyObserver(observer, isNotifyingFinish); 146 }
147
148 if (isLoaded()) {
149 observer->imageNotifyFinished(this);
150 if (m_observers.contains(observer)) {
151 m_finishedObservers.add(observer);
152 m_observers.remove(observer);
153 }
134 } 154 }
135 } 155 }
136 156
137 void ImageResource::removeObserver(ImageResourceObserver* observer) 157 void ImageResource::removeObserver(ImageResourceObserver* observer)
138 { 158 {
139 ASSERT(observer); 159 ASSERT(observer);
140 160
141 if (m_observers.contains(observer)) 161 if (m_observers.contains(observer))
142 m_observers.remove(observer); 162 m_observers.remove(observer);
143 else if (m_finishedObservers.contains(observer)) 163 else if (m_finishedObservers.contains(observer))
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 return size; 305 return size;
286 306
287 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed . 307 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed .
288 LayoutSize minimumSize(size.width() > LayoutUnit() ? LayoutUnit(1) : LayoutU nit(), 308 LayoutSize minimumSize(size.width() > LayoutUnit() ? LayoutUnit(1) : LayoutU nit(),
289 LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())) ; 309 LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())) ;
290 size.scale(multiplier); 310 size.scale(multiplier);
291 size.clampToMinimumSize(minimumSize); 311 size.clampToMinimumSize(minimumSize);
292 return size; 312 return size;
293 } 313 }
294 314
295 void ImageResource::notifyObservers(bool isNotifyingFinish, const IntRect* chang eRect) 315 void ImageResource::notifyObservers(const IntRect* changeRect)
296 { 316 {
297 ImageResourceObserverWalker finishedWalker(m_finishedObservers); 317 ImageResourceObserverWalker finishedWalker(m_finishedObservers);
298 while (auto* observer = finishedWalker.next()) { 318 while (auto* observer = finishedWalker.next()) {
299 notifyObserver(observer, false, changeRect); 319 observer->imageChanged(this, changeRect);
300 } 320 }
301 321
302 ImageResourceObserverWalker walker(m_observers); 322 ImageResourceObserverWalker walker(m_observers);
303 while (auto* observer = walker.next()) { 323 while (auto* observer = walker.next()) {
304 notifyObserver(observer, isNotifyingFinish, changeRect); 324 observer->imageChanged(this, changeRect);
305 } 325 }
306 } 326 }
307 327
308 void ImageResource::clear() 328 void ImageResource::clear()
309 { 329 {
310 prune(); 330 prune();
311 clearImage(); 331 clearImage();
312 setEncodedSize(0); 332 setEncodedSize(0);
313 } 333 }
314 334
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 if (sizeAvailable || allDataReceived) { 384 if (sizeAvailable || allDataReceived) {
365 if (!m_image || m_image->isNull()) { 385 if (!m_image || m_image->isNull()) {
366 error(errorOccurred() ? getStatus() : DecodeError); 386 error(errorOccurred() ? getStatus() : DecodeError);
367 if (memoryCache()->contains(this)) 387 if (memoryCache()->contains(this))
368 memoryCache()->remove(this); 388 memoryCache()->remove(this);
369 return; 389 return;
370 } 390 }
371 391
372 // It would be nice to only redraw the decoded band of the image, but wi th the current design 392 // It would be nice to only redraw the decoded band of the image, but wi th the current design
373 // (decoding delayed until painting) that seems hard. 393 // (decoding delayed until painting) that seems hard.
374 notifyObservers(allDataReceived); 394 notifyObservers();
375 } 395 }
376 } 396 }
377 397
378 void ImageResource::finish() 398 void ImageResource::finish()
379 { 399 {
380 if (m_multipartParser) { 400 if (m_multipartParser) {
381 m_multipartParser->finish(); 401 m_multipartParser->finish();
382 if (m_data) { 402 if (m_data) {
383 clearImage(); 403 clearImage();
384 updateImage(true); 404 updateImage(true);
385 m_data.clear(); 405 m_data.clear();
386 } 406 }
387 } else { 407 } else {
388 updateImage(true); 408 updateImage(true);
389 } 409 }
390 Resource::finish(); 410 Resource::finish();
391 } 411 }
392 412
393 void ImageResource::error(Resource::Status status) 413 void ImageResource::error(Resource::Status status)
394 { 414 {
395 if (m_multipartParser) 415 if (m_multipartParser)
396 m_multipartParser->cancel(); 416 m_multipartParser->cancel();
397 clear(); 417 clear();
398 Resource::error(status); 418 Resource::error(status);
399 notifyObservers(true); 419 notifyObservers();
400 } 420 }
401 421
402 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle) 422 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle)
403 { 423 {
404 ASSERT(!handle); 424 ASSERT(!handle);
405 ASSERT(!m_multipartParser); 425 ASSERT(!m_multipartParser);
406 // If there's no boundary, just handle the request normally. 426 // If there's no boundary, just handle the request normally.
407 if (response.isMultipart() && !response.multipartBoundary().isEmpty()) 427 if (response.isMultipart() && !response.multipartBoundary().isEmpty())
408 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this); 428 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
409 Resource::responseReceived(response, handle); 429 Resource::responseReceived(response, handle);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 return false; 475 return false;
456 } 476 }
457 477
458 return true; 478 return true;
459 } 479 }
460 480
461 void ImageResource::animationAdvanced(const blink::Image* image) 481 void ImageResource::animationAdvanced(const blink::Image* image)
462 { 482 {
463 if (!image || image != m_image) 483 if (!image || image != m_image)
464 return; 484 return;
465 notifyObservers(false); 485 notifyObservers();
466 } 486 }
467 487
468 void ImageResource::updateImageAnimationPolicy() 488 void ImageResource::updateImageAnimationPolicy()
469 { 489 {
470 if (!m_image) 490 if (!m_image)
471 return; 491 return;
472 492
473 ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed; 493 ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed;
474 494
475 ImageResourceObserverWalker finishedWalker(m_finishedObservers); 495 ImageResourceObserverWalker finishedWalker(m_finishedObservers);
(...skipping 21 matching lines...) Expand all
497 m_resourceRequest.setCachePolicy(ResourceRequestCachePolicy::BypassingCache) ; 517 m_resourceRequest.setCachePolicy(ResourceRequestCachePolicy::BypassingCache) ;
498 m_resourceRequest.setLoFiState(WebURLRequest::LoFiOff); 518 m_resourceRequest.setLoFiState(WebURLRequest::LoFiOff);
499 error(Resource::LoadError); 519 error(Resource::LoadError);
500 load(fetcher); 520 load(fetcher);
501 } 521 }
502 522
503 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect ) 523 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect )
504 { 524 {
505 if (!image || image != m_image) 525 if (!image || image != m_image)
506 return; 526 return;
507 notifyObservers(false, &rect); 527 notifyObservers(&rect);
508 } 528 }
509 529
510 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response) 530 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response)
511 { 531 {
512 ASSERT(m_multipartParser); 532 ASSERT(m_multipartParser);
513 533
514 m_response = response; 534 m_response = response;
515 if (m_multipartParsingState == MultipartParsingState::WaitingForFirstPart) { 535 if (m_multipartParsingState == MultipartParsingState::WaitingForFirstPart) {
516 // We have nothing to do because we don't have any data. 536 // We have nothing to do because we don't have any data.
517 m_multipartParsingState = MultipartParsingState::ParsingFirstPart; 537 m_multipartParsingState = MultipartParsingState::ParsingFirstPart;
(...skipping 25 matching lines...) Expand all
543 if (response().wasFetchedViaServiceWorker()) 563 if (response().wasFetchedViaServiceWorker())
544 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 564 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
545 if (!getImage()->currentFrameHasSingleSecurityOrigin()) 565 if (!getImage()->currentFrameHasSingleSecurityOrigin())
546 return false; 566 return false;
547 if (passesAccessControlCheck(securityOrigin)) 567 if (passesAccessControlCheck(securityOrigin))
548 return true; 568 return true;
549 return !securityOrigin->taintsCanvas(response().url()); 569 return !securityOrigin->taintsCanvas(response().url());
550 } 570 }
551 571
552 } // namespace blink 572 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ImageResource.h ('k') | third_party/WebKit/Source/core/fetch/ImageResourceObserver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698