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

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. 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 didAddObserver(observer);
yhirano 2016/04/04 11:07:30 [optional] I'm not sure if it's a good idea to hav
hiroshige 2016/04/05 06:00:50 Done.
149 }
150
151 void ImageResource::didAddObserver(ImageResourceObserver* observer)
152 {
153 if (isLoaded()) {
154 observer->imageNotifyFinished(this);
155 if (m_observers.contains(observer)) {
156 m_finishedObservers.add(observer);
157 m_observers.remove(observer);
158 }
134 } 159 }
135 } 160 }
136 161
137 void ImageResource::removeObserver(ImageResourceObserver* observer) 162 void ImageResource::removeObserver(ImageResourceObserver* observer)
138 { 163 {
139 ASSERT(observer); 164 ASSERT(observer);
140 165
141 if (m_observers.contains(observer)) 166 if (m_observers.contains(observer))
142 m_observers.remove(observer); 167 m_observers.remove(observer);
143 else if (m_finishedObservers.contains(observer)) 168 else if (m_finishedObservers.contains(observer))
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 return size; 310 return size;
286 311
287 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed . 312 // 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(), 313 LayoutSize minimumSize(size.width() > LayoutUnit() ? LayoutUnit(1) : LayoutU nit(),
289 LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())) ; 314 LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())) ;
290 size.scale(multiplier); 315 size.scale(multiplier);
291 size.clampToMinimumSize(minimumSize); 316 size.clampToMinimumSize(minimumSize);
292 return size; 317 return size;
293 } 318 }
294 319
295 void ImageResource::notifyObservers(bool isNotifyingFinish, const IntRect* chang eRect) 320 void ImageResource::notifyObservers(const IntRect* changeRect)
296 { 321 {
297 ImageResourceObserverWalker finishedWalker(m_finishedObservers); 322 ImageResourceObserverWalker finishedWalker(m_finishedObservers);
298 while (auto* observer = finishedWalker.next()) { 323 while (auto* observer = finishedWalker.next()) {
299 notifyObserver(observer, false, changeRect); 324 observer->imageChanged(this, changeRect);
300 } 325 }
301 326
302 ImageResourceObserverWalker walker(m_observers); 327 ImageResourceObserverWalker walker(m_observers);
303 while (auto* observer = walker.next()) { 328 while (auto* observer = walker.next()) {
304 notifyObserver(observer, isNotifyingFinish, changeRect); 329 observer->imageChanged(this, changeRect);
305 } 330 }
306 } 331 }
307 332
308 void ImageResource::clear() 333 void ImageResource::clear()
309 { 334 {
310 prune(); 335 prune();
311 clearImage(); 336 clearImage();
312 setEncodedSize(0); 337 setEncodedSize(0);
313 } 338 }
314 339
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 if (sizeAvailable || allDataReceived) { 389 if (sizeAvailable || allDataReceived) {
365 if (!m_image || m_image->isNull()) { 390 if (!m_image || m_image->isNull()) {
366 error(errorOccurred() ? getStatus() : DecodeError); 391 error(errorOccurred() ? getStatus() : DecodeError);
367 if (memoryCache()->contains(this)) 392 if (memoryCache()->contains(this))
368 memoryCache()->remove(this); 393 memoryCache()->remove(this);
369 return; 394 return;
370 } 395 }
371 396
372 // It would be nice to only redraw the decoded band of the image, but wi th the current design 397 // 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. 398 // (decoding delayed until painting) that seems hard.
374 notifyObservers(allDataReceived); 399 notifyObservers();
375 } 400 }
376 } 401 }
377 402
378 void ImageResource::finish() 403 void ImageResource::finish()
379 { 404 {
380 if (m_multipartParser) { 405 if (m_multipartParser) {
381 m_multipartParser->finish(); 406 m_multipartParser->finish();
382 if (m_data) { 407 if (m_data) {
383 clearImage(); 408 clearImage();
384 updateImage(true); 409 updateImage(true);
385 m_data.clear(); 410 m_data.clear();
386 } 411 }
387 } else { 412 } else {
388 updateImage(true); 413 updateImage(true);
389 } 414 }
390 Resource::finish(); 415 Resource::finish();
391 } 416 }
392 417
393 void ImageResource::error(Resource::Status status) 418 void ImageResource::error(Resource::Status status)
394 { 419 {
395 if (m_multipartParser) 420 if (m_multipartParser)
396 m_multipartParser->cancel(); 421 m_multipartParser->cancel();
397 clear(); 422 clear();
398 Resource::error(status); 423 Resource::error(status);
399 notifyObservers(true); 424 notifyObservers();
400 } 425 }
401 426
402 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle) 427 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle)
403 { 428 {
404 ASSERT(!handle); 429 ASSERT(!handle);
405 ASSERT(!m_multipartParser); 430 ASSERT(!m_multipartParser);
406 // If there's no boundary, just handle the request normally. 431 // If there's no boundary, just handle the request normally.
407 if (response.isMultipart() && !response.multipartBoundary().isEmpty()) 432 if (response.isMultipart() && !response.multipartBoundary().isEmpty())
408 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this); 433 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
409 Resource::responseReceived(response, handle); 434 Resource::responseReceived(response, handle);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 return false; 480 return false;
456 } 481 }
457 482
458 return true; 483 return true;
459 } 484 }
460 485
461 void ImageResource::animationAdvanced(const blink::Image* image) 486 void ImageResource::animationAdvanced(const blink::Image* image)
462 { 487 {
463 if (!image || image != m_image) 488 if (!image || image != m_image)
464 return; 489 return;
465 notifyObservers(false); 490 notifyObservers();
466 } 491 }
467 492
468 void ImageResource::updateImageAnimationPolicy() 493 void ImageResource::updateImageAnimationPolicy()
469 { 494 {
470 if (!m_image) 495 if (!m_image)
471 return; 496 return;
472 497
473 ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed; 498 ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed;
474 499
475 ImageResourceObserverWalker finishedWalker(m_finishedObservers); 500 ImageResourceObserverWalker finishedWalker(m_finishedObservers);
(...skipping 21 matching lines...) Expand all
497 m_resourceRequest.setCachePolicy(ResourceRequestCachePolicy::BypassingCache) ; 522 m_resourceRequest.setCachePolicy(ResourceRequestCachePolicy::BypassingCache) ;
498 m_resourceRequest.setLoFiState(WebURLRequest::LoFiOff); 523 m_resourceRequest.setLoFiState(WebURLRequest::LoFiOff);
499 error(Resource::LoadError); 524 error(Resource::LoadError);
500 load(fetcher); 525 load(fetcher);
501 } 526 }
502 527
503 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect ) 528 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect )
504 { 529 {
505 if (!image || image != m_image) 530 if (!image || image != m_image)
506 return; 531 return;
507 notifyObservers(false, &rect); 532 notifyObservers(&rect);
508 } 533 }
509 534
510 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response) 535 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response)
511 { 536 {
512 ASSERT(m_multipartParser); 537 ASSERT(m_multipartParser);
513 538
514 m_response = response; 539 m_response = response;
515 if (m_multipartParsingState == MultipartParsingState::WaitingForFirstPart) { 540 if (m_multipartParsingState == MultipartParsingState::WaitingForFirstPart) {
516 // We have nothing to do because we don't have any data. 541 // We have nothing to do because we don't have any data.
517 m_multipartParsingState = MultipartParsingState::ParsingFirstPart; 542 m_multipartParsingState = MultipartParsingState::ParsingFirstPart;
(...skipping 25 matching lines...) Expand all
543 if (response().wasFetchedViaServiceWorker()) 568 if (response().wasFetchedViaServiceWorker())
544 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 569 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
545 if (!getImage()->currentFrameHasSingleSecurityOrigin()) 570 if (!getImage()->currentFrameHasSingleSecurityOrigin())
546 return false; 571 return false;
547 if (passesAccessControlCheck(securityOrigin)) 572 if (passesAccessControlCheck(securityOrigin))
548 return true; 573 return true;
549 return !securityOrigin->taintsCanvas(response().url()); 574 return !securityOrigin->taintsCanvas(response().url());
550 } 575 }
551 576
552 } // namespace blink 577 } // 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