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

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

Issue 1728313003: Split ImageResourceClient into ResourceClient and ImageResourceObserver [2/2] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and reflect comment Created 4 years, 9 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 } 112 }
113 113
114 void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options) 114 void ImageResource::load(ResourceFetcher* fetcher, const ResourceLoaderOptions& options)
115 { 115 {
116 if (!fetcher || fetcher->autoLoadImages()) 116 if (!fetcher || fetcher->autoLoadImages())
117 Resource::load(fetcher, options); 117 Resource::load(fetcher, options);
118 else 118 else
119 setLoading(false); 119 setLoading(false);
120 } 120 }
121 121
122 void ImageResource::notifyObserver(ImageResourceObserver* observer, bool isNotif yingFinish, const IntRect* changeRect)
123 {
124 observer->imageChanged(isNotifyingFinish, this, changeRect);
125 if (isNotifyingFinish && m_observers.contains(observer)) {
126 m_finishedObservers.add(observer);
127 m_observers.remove(observer);
128 }
129 }
130
122 void ImageResource::addObserver(ImageResourceObserver* observer) 131 void ImageResource::addObserver(ImageResourceObserver* observer)
123 { 132 {
124 willAddClientOrObserver(); 133 willAddClientOrObserver();
125 134
126 m_observers.add(observer); 135 m_observers.add(observer);
127 136
128 if (!m_revalidatingRequest.isNull()) 137 if (!m_revalidatingRequest.isNull())
129 return; 138 return;
130 139
131 if (m_data && !m_image && !errorOccurred()) { 140 if (m_data && !m_image && !errorOccurred()) {
132 createImage(); 141 createImage();
133 m_image->setData(m_data, true); 142 m_image->setData(m_data, true);
134 } 143 }
135 144
136 if (m_image && !m_image->isNull()) 145 if (m_image && !m_image->isNull()) {
137 observer->imageChanged(this); 146 bool isNotifyingFinish = !isLoading() && !stillNeedsLoad();
147 notifyObserver(observer, isNotifyingFinish);
148 }
138 } 149 }
139 150
140 void ImageResource::removeObserver(ImageResourceObserver* observer) 151 void ImageResource::removeObserver(ImageResourceObserver* observer)
141 { 152 {
142 ASSERT(observer); 153 ASSERT(observer);
143 ASSERT(m_observers.contains(observer)); 154
144 m_observers.remove(observer); 155 if (m_observers.contains(observer))
156 m_observers.remove(observer);
157 else if (m_finishedObservers.contains(observer))
158 m_finishedObservers.remove(observer);
159 else
160 ASSERT_NOT_REACHED();
161
145 didRemoveClientOrObserver(); 162 didRemoveClientOrObserver();
146 } 163 }
147 164
165 static void priorityFromObserver(const ImageResourceObserver* observer, Resource Priority& priority)
166 {
167 ResourcePriority nextPriority = observer->computeResourcePriority();
168 if (nextPriority.visibility == ResourcePriority::NotVisible)
169 return;
170 priority.visibility = ResourcePriority::Visible;
171 priority.intraPriorityValue += nextPriority.intraPriorityValue;
172 }
173
148 ResourcePriority ImageResource::priorityFromObservers() 174 ResourcePriority ImageResource::priorityFromObservers()
149 { 175 {
150 ResourcePriority priority; 176 ResourcePriority priority;
151 ImageResourceObserverWalker w(m_observers); 177
178 ImageResourceObserverWalker w(m_finishedObservers);
esprehn 2016/03/22 23:31:49 ick, single letter variables. :(
hiroshige 2016/03/24 17:26:44 Done.
152 while (const auto* observer = w.next()) { 179 while (const auto* observer = w.next()) {
153 ResourcePriority nextPriority = observer->computeResourcePriority(); 180 priorityFromObserver(observer, priority);
154 if (nextPriority.visibility == ResourcePriority::NotVisible)
155 continue;
156 priority.visibility = ResourcePriority::Visible;
157 priority.intraPriorityValue += nextPriority.intraPriorityValue;
158 } 181 }
182
183 ImageResourceObserverWalker w2(m_observers);
esprehn 2016/03/22 23:31:49 can we do finishedWalker and walker or something?
hiroshige 2016/03/24 17:26:44 Done.
184 while (const auto* observer = w2.next()) {
185 priorityFromObserver(observer, priority);
186 }
187
159 return priority; 188 return priority;
160 } 189 }
161 190
162 bool ImageResource::isSafeToUnlock() const 191 bool ImageResource::isSafeToUnlock() const
163 { 192 {
164 // Note that |m_image| holds a reference to |m_data| in addition to the one held by the Resource parent class. 193 // Note that |m_image| holds a reference to |m_data| in addition to the one held by the Resource parent class.
165 return !m_image || (m_image->hasOneRef() && m_data->refCount() == 2); 194 return !m_image || (m_image->hasOneRef() && m_data->refCount() == 2);
166 } 195 }
167 196
168 void ImageResource::destroyDecodedDataForFailedRevalidation() 197 void ImageResource::destroyDecodedDataForFailedRevalidation()
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 return size; 299 return size;
271 300
272 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed . 301 // Don't let images that have a width/height >= 1 shrink below 1 when zoomed .
273 LayoutSize minimumSize(size.width() > LayoutUnit() ? LayoutUnit(1) : LayoutU nit(), 302 LayoutSize minimumSize(size.width() > LayoutUnit() ? LayoutUnit(1) : LayoutU nit(),
274 LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())) ; 303 LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())) ;
275 size.scale(multiplier); 304 size.scale(multiplier);
276 size.clampToMinimumSize(minimumSize); 305 size.clampToMinimumSize(minimumSize);
277 return size; 306 return size;
278 } 307 }
279 308
280 void ImageResource::notifyObservers(const IntRect* changeRect) 309 void ImageResource::notifyObservers(bool isNotifyingFinish, const IntRect* chang eRect)
281 { 310 {
282 ImageResourceObserverWalker w(m_observers); 311 ImageResourceObserverWalker w(m_finishedObservers);
esprehn 2016/03/22 23:31:49 ditto
hiroshige 2016/03/24 17:26:44 Done.
283 while (auto* observer = w.next()) { 312 while (auto* observer = w.next()) {
284 observer->imageChanged(this, changeRect); 313 notifyObserver(observer, false, changeRect);
314 }
315
316 ImageResourceObserverWalker w2(m_observers);
317 while (auto* observer = w2.next()) {
318 notifyObserver(observer, isNotifyingFinish, changeRect);
285 } 319 }
286 } 320 }
287 321
288 void ImageResource::clear() 322 void ImageResource::clear()
289 { 323 {
290 prune(); 324 prune();
291 clearImage(); 325 clearImage();
292 setEncodedSize(0); 326 setEncodedSize(0);
293 } 327 }
294 328
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 if (sizeAvailable || allDataReceived) { 378 if (sizeAvailable || allDataReceived) {
345 if (!m_image || m_image->isNull()) { 379 if (!m_image || m_image->isNull()) {
346 error(errorOccurred() ? getStatus() : DecodeError); 380 error(errorOccurred() ? getStatus() : DecodeError);
347 if (memoryCache()->contains(this)) 381 if (memoryCache()->contains(this))
348 memoryCache()->remove(this); 382 memoryCache()->remove(this);
349 return; 383 return;
350 } 384 }
351 385
352 // It would be nice to only redraw the decoded band of the image, but wi th the current design 386 // It would be nice to only redraw the decoded band of the image, but wi th the current design
353 // (decoding delayed until painting) that seems hard. 387 // (decoding delayed until painting) that seems hard.
354 notifyObservers(); 388 notifyObservers(allDataReceived);
355 } 389 }
356 } 390 }
357 391
358 void ImageResource::finish() 392 void ImageResource::finish()
359 { 393 {
360 if (m_multipartParser) { 394 if (m_multipartParser) {
361 m_multipartParser->finish(); 395 m_multipartParser->finish();
362 if (m_data) { 396 if (m_data) {
363 clearImage(); 397 clearImage();
364 updateImage(true); 398 updateImage(true);
365 m_data.clear(); 399 m_data.clear();
366 } 400 }
367 } else { 401 } else {
368 updateImage(true); 402 updateImage(true);
369 } 403 }
370 Resource::finish(); 404 Resource::finish();
371 } 405 }
372 406
373 void ImageResource::error(Resource::Status status) 407 void ImageResource::error(Resource::Status status)
374 { 408 {
375 if (m_multipartParser) 409 if (m_multipartParser)
376 m_multipartParser->cancel(); 410 m_multipartParser->cancel();
377 clear(); 411 clear();
378 Resource::error(status); 412 Resource::error(status);
379 notifyObservers(); 413 notifyObservers(true);
380 } 414 }
381 415
382 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle) 416 void ImageResource::responseReceived(const ResourceResponse& response, PassOwnPt r<WebDataConsumerHandle> handle)
383 { 417 {
384 ASSERT(!handle); 418 ASSERT(!handle);
385 ASSERT(!m_multipartParser); 419 ASSERT(!m_multipartParser);
386 // If there's no boundary, just handle the request normally. 420 // If there's no boundary, just handle the request normally.
387 if (response.isMultipart() && !response.multipartBoundary().isEmpty()) 421 if (response.isMultipart() && !response.multipartBoundary().isEmpty())
388 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this); 422 m_multipartParser = new MultipartImageResourceParser(response, response. multipartBoundary(), this);
389 Resource::responseReceived(response, handle); 423 Resource::responseReceived(response, handle);
(...skipping 26 matching lines...) Expand all
416 // to update MemoryCache. 450 // to update MemoryCache.
417 if (decodedSize() != 0) 451 if (decodedSize() != 0)
418 Resource::didAccessDecodedData(); 452 Resource::didAccessDecodedData();
419 } 453 }
420 454
421 bool ImageResource::shouldPauseAnimation(const blink::Image* image) 455 bool ImageResource::shouldPauseAnimation(const blink::Image* image)
422 { 456 {
423 if (!image || image != m_image) 457 if (!image || image != m_image)
424 return false; 458 return false;
425 459
426 ImageResourceObserverWalker w(m_observers); 460 ImageResourceObserverWalker w(m_finishedObservers);
427 while (auto* observer = w.next()) { 461 while (auto* observer = w.next()) {
428 if (observer->willRenderImage()) 462 if (observer->willRenderImage())
429 return false; 463 return false;
430 } 464 }
465
466 ImageResourceObserverWalker w2(m_observers);
467 while (auto* observer = w2.next()) {
468 if (observer->willRenderImage())
469 return false;
470 }
471
431 return true; 472 return true;
432 } 473 }
433 474
434 void ImageResource::animationAdvanced(const blink::Image* image) 475 void ImageResource::animationAdvanced(const blink::Image* image)
435 { 476 {
436 if (!image || image != m_image) 477 if (!image || image != m_image)
437 return; 478 return;
438 notifyObservers(); 479 notifyObservers(false);
439 } 480 }
440 481
441 void ImageResource::updateImageAnimationPolicy() 482 void ImageResource::updateImageAnimationPolicy()
442 { 483 {
443 if (!m_image) 484 if (!m_image)
444 return; 485 return;
445 486
446 ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed; 487 ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed;
447 ImageResourceObserverWalker w(m_observers); 488
489 ImageResourceObserverWalker w(m_finishedObservers);
448 while (auto* observer = w.next()) { 490 while (auto* observer = w.next()) {
449 if (observer->getImageAnimationPolicy(newPolicy)) 491 if (observer->getImageAnimationPolicy(newPolicy))
450 break; 492 break;
451 } 493 }
452 494
495 ImageResourceObserverWalker w2(m_observers);
496 while (auto* observer = w2.next()) {
497 if (observer->getImageAnimationPolicy(newPolicy))
498 break;
499 }
500
453 if (m_image->animationPolicy() != newPolicy) { 501 if (m_image->animationPolicy() != newPolicy) {
454 m_image->resetAnimation(); 502 m_image->resetAnimation();
455 m_image->setAnimationPolicy(newPolicy); 503 m_image->setAnimationPolicy(newPolicy);
456 } 504 }
457 } 505 }
458 506
459 void ImageResource::reloadIfLoFi(ResourceFetcher* fetcher) 507 void ImageResource::reloadIfLoFi(ResourceFetcher* fetcher)
460 { 508 {
461 if (!m_response.httpHeaderField("chrome-proxy").contains("q=low")) 509 if (!m_response.httpHeaderField("chrome-proxy").contains("q=low"))
462 return; 510 return;
463 m_resourceRequest.setCachePolicy(ResourceRequestCachePolicy::ReloadBypassing Cache); 511 m_resourceRequest.setCachePolicy(ResourceRequestCachePolicy::ReloadBypassing Cache);
464 m_resourceRequest.setLoFiState(WebURLRequest::LoFiOff); 512 m_resourceRequest.setLoFiState(WebURLRequest::LoFiOff);
465 error(Resource::LoadError); 513 error(Resource::LoadError);
466 load(fetcher, fetcher->defaultResourceOptions()); 514 load(fetcher, fetcher->defaultResourceOptions());
467 } 515 }
468 516
469 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect ) 517 void ImageResource::changedInRect(const blink::Image* image, const IntRect& rect )
470 { 518 {
471 if (!image || image != m_image) 519 if (!image || image != m_image)
472 return; 520 return;
473 notifyObservers(&rect); 521 notifyObservers(false, &rect);
474 } 522 }
475 523
476 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response, bool isFirstPart) 524 void ImageResource::onePartInMultipartReceived(const ResourceResponse& response, bool isFirstPart)
477 { 525 {
478 ASSERT(m_multipartParser); 526 ASSERT(m_multipartParser);
479 m_response = response; 527 m_response = response;
480 if (m_data) { 528 if (m_data) {
481 clear(); 529 clear();
482 updateImage(true); 530 updateImage(true);
483 m_data.clear(); 531 m_data.clear();
(...skipping 15 matching lines...) Expand all
499 if (response().wasFetchedViaServiceWorker()) 547 if (response().wasFetchedViaServiceWorker())
500 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 548 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
501 if (!getImage()->currentFrameHasSingleSecurityOrigin()) 549 if (!getImage()->currentFrameHasSingleSecurityOrigin())
502 return false; 550 return false;
503 if (passesAccessControlCheck(securityOrigin)) 551 if (passesAccessControlCheck(securityOrigin))
504 return true; 552 return true;
505 return !securityOrigin->taintsCanvas(response().url()); 553 return !securityOrigin->taintsCanvas(response().url());
506 } 554 }
507 555
508 } // namespace blink 556 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698