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

Side by Side Diff: Source/core/loader/ImageLoader.cpp

Issue 1224323003: Oilpan: simplify ImageLoaderClient handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: add unregistration of weakly held clients Created 5 years, 5 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserv ed. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserv ed.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 } 160 }
161 161
162 void ImageLoader::dispose() 162 void ImageLoader::dispose()
163 { 163 {
164 WTF_LOG(Timers, "~ImageLoader %p; m_hasPendingLoadEvent=%d, m_hasPendingErro rEvent=%d", 164 WTF_LOG(Timers, "~ImageLoader %p; m_hasPendingLoadEvent=%d, m_hasPendingErro rEvent=%d",
165 this, m_hasPendingLoadEvent, m_hasPendingErrorEvent); 165 this, m_hasPendingLoadEvent, m_hasPendingErrorEvent);
166 166
167 if (m_pendingTask) 167 if (m_pendingTask)
168 m_pendingTask->clearLoader(); 168 m_pendingTask->clearLoader();
169 169
170 #if ENABLE(OILPAN)
171 for (const auto& client : m_clients)
172 willRemoveClient(*client);
173 #endif
174
170 if (m_image) 175 if (m_image)
171 m_image->removeClient(this); 176 m_image->removeClient(this);
172 177
173 ASSERT(m_hasPendingLoadEvent || !loadEventSender().hasPendingEvents(this)); 178 ASSERT(m_hasPendingLoadEvent || !loadEventSender().hasPendingEvents(this));
174 if (m_hasPendingLoadEvent) 179 if (m_hasPendingLoadEvent)
175 loadEventSender().cancelEvent(this); 180 loadEventSender().cancelEvent(this);
176 181
177 ASSERT(m_hasPendingErrorEvent || !errorEventSender().hasPendingEvents(this)) ; 182 ASSERT(m_hasPendingErrorEvent || !errorEventSender().hasPendingEvents(this)) ;
178 if (m_hasPendingErrorEvent) 183 if (m_hasPendingErrorEvent)
179 errorEventSender().cancelEvent(this); 184 errorEventSender().cancelEvent(this);
180 } 185 }
181 186
187 #if ENABLE(OILPAN)
188 void ImageLoader::clearWeakMembers(Visitor* visitor)
189 {
190 Vector<ImageLoaderClient*> deadClients;
191 for (const auto& client : m_clients) {
192 if (!Heap::isHeapObjectAlive(client)) {
193 willRemoveClient(*client);
194 deadClients.append(client);
195 }
196 }
197 for (unsigned i = 0; i < deadClients.size(); ++i)
198 m_clients.remove(deadClients[i]);
199 }
200 #endif
201
182 DEFINE_TRACE(ImageLoader) 202 DEFINE_TRACE(ImageLoader)
183 { 203 {
184 visitor->trace(m_element); 204 visitor->trace(m_element);
205 #if ENABLE(OILPAN)
206 visitor->template registerWeakMembers<ImageLoader, &ImageLoader::clearWeakMe mbers>(this);
207 #endif
185 } 208 }
186 209
187 void ImageLoader::setImage(ImageResource* newImage) 210 void ImageLoader::setImage(ImageResource* newImage)
188 { 211 {
189 setImageWithoutConsideringPendingLoadEvent(newImage); 212 setImageWithoutConsideringPendingLoadEvent(newImage);
190 213
191 // Only consider updating the protection ref-count of the Element immediatel y before returning 214 // Only consider updating the protection ref-count of the Element immediatel y before returning
192 // from this function as doing so might result in the destruction of this Im ageLoader. 215 // from this function as doing so might result in the destruction of this Im ageLoader.
193 updatedHasPendingEvent(); 216 updatedHasPendingEvent();
194 } 217 }
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 // from this function as doing so might result in the destruction of this Im ageLoader. 609 // from this function as doing so might result in the destruction of this Im ageLoader.
587 updatedHasPendingEvent(); 610 updatedHasPendingEvent();
588 } 611 }
589 612
590 void ImageLoader::addClient(ImageLoaderClient* client) 613 void ImageLoader::addClient(ImageLoaderClient* client)
591 { 614 {
592 if (client->requestsHighLiveResourceCachePriority()) { 615 if (client->requestsHighLiveResourceCachePriority()) {
593 if (m_image && !m_highPriorityClientCount++) 616 if (m_image && !m_highPriorityClientCount++)
594 memoryCache()->updateDecodedResource(m_image.get(), UpdateForPropert yChange, MemoryCacheLiveResourcePriorityHigh); 617 memoryCache()->updateDecodedResource(m_image.get(), UpdateForPropert yChange, MemoryCacheLiveResourcePriorityHigh);
595 } 618 }
596 #if ENABLE(OILPAN)
597 m_clients.add(client, adoptPtr(new ImageLoaderClientRemover(*this, *client)) );
598 #else
599 m_clients.add(client); 619 m_clients.add(client);
600 #endif
601 } 620 }
602 621
603 void ImageLoader::willRemoveClient(ImageLoaderClient& client) 622 void ImageLoader::willRemoveClient(ImageLoaderClient& client)
604 { 623 {
605 if (client.requestsHighLiveResourceCachePriority()) { 624 if (client.requestsHighLiveResourceCachePriority()) {
606 ASSERT(m_highPriorityClientCount); 625 ASSERT(m_highPriorityClientCount);
607 m_highPriorityClientCount--; 626 m_highPriorityClientCount--;
608 if (m_image && !m_highPriorityClientCount) 627 if (m_image && !m_highPriorityClientCount)
609 memoryCache()->updateDecodedResource(m_image.get(), UpdateForPropert yChange, MemoryCacheLiveResourcePriorityLow); 628 memoryCache()->updateDecodedResource(m_image.get(), UpdateForPropert yChange, MemoryCacheLiveResourcePriorityLow);
610 } 629 }
(...skipping 27 matching lines...) Expand all
638 void ImageLoader::elementDidMoveToNewDocument() 657 void ImageLoader::elementDidMoveToNewDocument()
639 { 658 {
640 if (m_loadDelayCounter) 659 if (m_loadDelayCounter)
641 m_loadDelayCounter->documentChanged(m_element->document()); 660 m_loadDelayCounter->documentChanged(m_element->document());
642 clearFailedLoadURL(); 661 clearFailedLoadURL();
643 setImage(0); 662 setImage(0);
644 } 663 }
645 664
646 void ImageLoader::sourceImageChanged() 665 void ImageLoader::sourceImageChanged()
647 { 666 {
648 #if ENABLE(OILPAN)
649 for (auto& client : m_clients)
650 client.key->notifyImageSourceChanged();
651 #else
652 for (auto& client : m_clients) { 667 for (auto& client : m_clients) {
653 ImageLoaderClient* handle = client; 668 ImageLoaderClient* handle = client;
654 handle->notifyImageSourceChanged(); 669 handle->notifyImageSourceChanged();
655 } 670 }
656 #endif
657 } 671 }
658 672
659 #if ENABLE(OILPAN) 673 } // namespace blink
660 ImageLoader::ImageLoaderClientRemover::~ImageLoaderClientRemover()
661 {
662 m_loader.willRemoveClient(m_client);
663 }
664 #endif
665 }
OLDNEW
« Source/core/loader/ImageLoader.h ('K') | « Source/core/loader/ImageLoader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698