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

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

Issue 2210473002: Mark ResourceClient/ImageResourceObserver finished just before notifying (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Wrap by 80 cols and Rebase. Created 4 years, 3 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 DEFINE_TRACE(ImageResource) 88 DEFINE_TRACE(ImageResource)
89 { 89 {
90 visitor->trace(m_multipartParser); 90 visitor->trace(m_multipartParser);
91 Resource::trace(visitor); 91 Resource::trace(visitor);
92 ImageObserver::trace(visitor); 92 ImageObserver::trace(visitor);
93 MultipartImageResourceParser::Client::trace(visitor); 93 MultipartImageResourceParser::Client::trace(visitor);
94 } 94 }
95 95
96 void ImageResource::checkNotify() 96 void ImageResource::checkNotify()
97 { 97 {
98 notifyObserversInternal(MarkFinishedOption::ShouldMarkFinished);
99 Resource::checkNotify();
100 }
101
102 void ImageResource::notifyObserversInternal(MarkFinishedOption markFinishedOptio n)
103 {
98 if (isLoading()) 104 if (isLoading())
99 return; 105 return;
100 106
101 ImageResourceObserverWalker walker(m_observers); 107 ImageResourceObserverWalker walker(m_observers);
102 while (auto* observer = walker.next()) { 108 while (auto* observer = walker.next()) {
109 if (markFinishedOption == MarkFinishedOption::ShouldMarkFinished)
110 markObserverFinished(observer);
103 observer->imageNotifyFinished(this); 111 observer->imageNotifyFinished(this);
104 } 112 }
105
106 Resource::checkNotify();
107 } 113 }
108 114
109 void ImageResource::markClientsAndObserversFinished() 115 void ImageResource::markObserverFinished(ImageResourceObserver* observer)
110 { 116 {
111 HashCountedSet<ImageResourceObserver*> observers; 117 if (m_observers.contains(observer)) {
112 m_observers.swap(observers); 118 m_finishedObservers.add(observer);
113 for (const auto& it : observers) 119 m_observers.remove(observer);
114 m_finishedObservers.add(it.key, it.value); 120 }
115
116 Resource::markClientsAndObserversFinished();
117 } 121 }
118 122
119 void ImageResource::didAddClient(ResourceClient* client) 123 void ImageResource::didAddClient(ResourceClient* client)
120 { 124 {
121 DCHECK((m_multipartParser && isLoading()) || !data() || m_image); 125 DCHECK((m_multipartParser && isLoading()) || !data() || m_image);
122 Resource::didAddClient(client); 126 Resource::didAddClient(client);
123 } 127 }
124 128
125 void ImageResource::addObserver(ImageResourceObserver* observer) 129 void ImageResource::addObserver(ImageResourceObserver* observer)
126 { 130 {
(...skipping 12 matching lines...) Expand all
139 // not called in |appendData()|, which means |m_image| might not be created 143 // not called in |appendData()|, which means |m_image| might not be created
140 // even when |data()| exists. This is intentional since creating a |m_image| 144 // even when |data()| exists. This is intentional since creating a |m_image|
141 // on receiving data might destroy an existing image in a previous part. 145 // on receiving data might destroy an existing image in a previous part.
142 DCHECK((m_multipartParser && isLoading()) || !data() || m_image); 146 DCHECK((m_multipartParser && isLoading()) || !data() || m_image);
143 147
144 if (m_image && !m_image->isNull()) { 148 if (m_image && !m_image->isNull()) {
145 observer->imageChanged(this); 149 observer->imageChanged(this);
146 } 150 }
147 151
148 if (isLoaded()) { 152 if (isLoaded()) {
153 markObserverFinished(observer);
149 observer->imageNotifyFinished(this); 154 observer->imageNotifyFinished(this);
150 if (m_observers.contains(observer)) {
151 m_finishedObservers.add(observer);
152 m_observers.remove(observer);
153 }
154 } 155 }
155 } 156 }
156 157
157 void ImageResource::removeObserver(ImageResourceObserver* observer) 158 void ImageResource::removeObserver(ImageResourceObserver* observer)
158 { 159 {
159 ASSERT(observer); 160 ASSERT(observer);
160 161
161 if (m_observers.contains(observer)) 162 if (m_observers.contains(observer))
162 m_observers.remove(observer); 163 m_observers.remove(observer);
163 else if (m_finishedObservers.contains(observer)) 164 else if (m_finishedObservers.contains(observer))
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 m_multipartParsingState = MultipartParsingState::ParsingFirstPart; 575 m_multipartParsingState = MultipartParsingState::ParsingFirstPart;
575 return; 576 return;
576 } 577 }
577 updateImageAndClearBuffer(); 578 updateImageAndClearBuffer();
578 579
579 if (m_multipartParsingState == MultipartParsingState::ParsingFirstPart) { 580 if (m_multipartParsingState == MultipartParsingState::ParsingFirstPart) {
580 m_multipartParsingState = MultipartParsingState::FinishedParsingFirstPar t; 581 m_multipartParsingState = MultipartParsingState::FinishedParsingFirstPar t;
581 // Notify finished when the first part ends. 582 // Notify finished when the first part ends.
582 if (!errorOccurred()) 583 if (!errorOccurred())
583 setStatus(Cached); 584 setStatus(Cached);
584 checkNotify(); 585 // We will also notify clients/observers of the finish in
586 // Resource::finish()/error() so we don't mark them finished here.
587 notifyObserversInternal(MarkFinishedOption::DoNotMarkFinished);
588 notifyClientsInternal(MarkFinishedOption::DoNotMarkFinished);
585 if (loader()) 589 if (loader())
586 loader()->didFinishLoadingFirstPartInMultipart(); 590 loader()->didFinishLoadingFirstPartInMultipart();
587 } 591 }
588 } 592 }
589 593
590 void ImageResource::multipartDataReceived(const char* bytes, size_t size) 594 void ImageResource::multipartDataReceived(const char* bytes, size_t size)
591 { 595 {
592 ASSERT(m_multipartParser); 596 ASSERT(m_multipartParser);
593 Resource::appendData(bytes, size); 597 Resource::appendData(bytes, size);
594 } 598 }
595 599
596 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) 600 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
597 { 601 {
598 if (response().wasFetchedViaServiceWorker()) 602 if (response().wasFetchedViaServiceWorker())
599 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 603 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
600 if (!getImage()->currentFrameHasSingleSecurityOrigin()) 604 if (!getImage()->currentFrameHasSingleSecurityOrigin())
601 return false; 605 return false;
602 if (passesAccessControlCheck(securityOrigin)) 606 if (passesAccessControlCheck(securityOrigin))
603 return true; 607 return true;
604 return !securityOrigin->taintsCanvas(response().url()); 608 return !securityOrigin->taintsCanvas(response().url());
605 } 609 }
606 610
607 } // namespace blink 611 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ImageResource.h ('k') | third_party/WebKit/Source/core/fetch/Resource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698