OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |