Chromium Code Reviews| 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 |