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

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: tests Created 4 years, 4 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 } 85 }
86 86
87 DEFINE_TRACE(ImageResource) 87 DEFINE_TRACE(ImageResource)
88 { 88 {
89 visitor->trace(m_multipartParser); 89 visitor->trace(m_multipartParser);
90 Resource::trace(visitor); 90 Resource::trace(visitor);
91 ImageObserver::trace(visitor); 91 ImageObserver::trace(visitor);
92 MultipartImageResourceParser::Client::trace(visitor); 92 MultipartImageResourceParser::Client::trace(visitor);
93 } 93 }
94 94
95 void ImageResource::checkNotify() 95 void ImageResource::checkNotify(MarkFinishedOption markFinishedOption)
96 { 96 {
97 if (isLoading()) 97 if (isLoading())
98 return; 98 return;
99 99
100 ImageResourceObserverWalker walker(m_observers); 100 ImageResourceObserverWalker walker(m_observers);
101 while (auto* observer = walker.next()) { 101 while (auto* observer = walker.next()) {
102 if (markFinishedOption == MarkFinishedOption::ShouldMarkFinished)
103 markObserverFinished(observer);
102 observer->imageNotifyFinished(this); 104 observer->imageNotifyFinished(this);
103 } 105 }
104 106
105 Resource::checkNotify(); 107 Resource::checkNotify(markFinishedOption);
106 } 108 }
107 109
108 void ImageResource::markClientsAndObserversFinished() 110 void ImageResource::markObserverFinished(ImageResourceObserver* observer)
109 { 111 {
110 HashCountedSet<ImageResourceObserver*> observers; 112 if (m_observers.contains(observer)) {
111 m_observers.swap(observers); 113 m_finishedObservers.add(observer);
112 for (const auto& it : observers) 114 m_observers.remove(observer);
113 m_finishedObservers.add(it.key, it.value); 115 }
114
115 Resource::markClientsAndObserversFinished();
116 } 116 }
117 117
118 void ImageResource::didAddClient(ResourceClient* client) 118 void ImageResource::didAddClient(ResourceClient* client)
119 { 119 {
120 DCHECK((m_multipartParser && isLoading()) || !m_data || m_image); 120 DCHECK((m_multipartParser && isLoading()) || !m_data || m_image);
121 Resource::didAddClient(client); 121 Resource::didAddClient(client);
122 } 122 }
123 123
124 void ImageResource::addObserver(ImageResourceObserver* observer) 124 void ImageResource::addObserver(ImageResourceObserver* observer)
125 { 125 {
(...skipping 12 matching lines...) Expand all
138 // not called in |appendData()|, which means |m_image| might not be created 138 // not called in |appendData()|, which means |m_image| might not be created
139 // even when |m_data| exists. This is intentional since creating a |m_image| 139 // even when |m_data| exists. This is intentional since creating a |m_image|
140 // on receiving data might destroy an existing image in a previous part. 140 // on receiving data might destroy an existing image in a previous part.
141 DCHECK((m_multipartParser && isLoading()) || !m_data || m_image); 141 DCHECK((m_multipartParser && isLoading()) || !m_data || m_image);
142 142
143 if (m_image && !m_image->isNull()) { 143 if (m_image && !m_image->isNull()) {
144 observer->imageChanged(this); 144 observer->imageChanged(this);
145 } 145 }
146 146
147 if (isLoaded()) { 147 if (isLoaded()) {
148 markObserverFinished(observer);
148 observer->imageNotifyFinished(this); 149 observer->imageNotifyFinished(this);
149 if (m_observers.contains(observer)) {
150 m_finishedObservers.add(observer);
151 m_observers.remove(observer);
152 }
153 } 150 }
154 } 151 }
155 152
156 void ImageResource::removeObserver(ImageResourceObserver* observer) 153 void ImageResource::removeObserver(ImageResourceObserver* observer)
157 { 154 {
158 ASSERT(observer); 155 ASSERT(observer);
159 156
160 if (m_observers.contains(observer)) 157 if (m_observers.contains(observer))
161 m_observers.remove(observer); 158 m_observers.remove(observer);
162 else if (m_finishedObservers.contains(observer)) 159 else if (m_finishedObservers.contains(observer))
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 m_multipartParsingState = MultipartParsingState::ParsingFirstPart; 567 m_multipartParsingState = MultipartParsingState::ParsingFirstPart;
571 return; 568 return;
572 } 569 }
573 updateImageAndClearBuffer(); 570 updateImageAndClearBuffer();
574 571
575 if (m_multipartParsingState == MultipartParsingState::ParsingFirstPart) { 572 if (m_multipartParsingState == MultipartParsingState::ParsingFirstPart) {
576 m_multipartParsingState = MultipartParsingState::FinishedParsingFirstPar t; 573 m_multipartParsingState = MultipartParsingState::FinishedParsingFirstPar t;
577 // Notify finished when the first part ends. 574 // Notify finished when the first part ends.
578 if (!errorOccurred()) 575 if (!errorOccurred())
579 setStatus(Cached); 576 setStatus(Cached);
580 checkNotify(); 577 // We will also notify clients/observers of the finish in
578 // Resource::finish()/error() so we don't mark them finished here.
579 checkNotify(MarkFinishedOption::DoNotMarkFinished);
581 if (loader()) 580 if (loader())
582 loader()->didFinishLoadingFirstPartInMultipart(); 581 loader()->didFinishLoadingFirstPartInMultipart();
583 } 582 }
584 } 583 }
585 584
586 void ImageResource::multipartDataReceived(const char* bytes, size_t size) 585 void ImageResource::multipartDataReceived(const char* bytes, size_t size)
587 { 586 {
588 ASSERT(m_multipartParser); 587 ASSERT(m_multipartParser);
589 Resource::appendData(bytes, size); 588 Resource::appendData(bytes, size);
590 } 589 }
591 590
592 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) 591 bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin)
593 { 592 {
594 if (response().wasFetchedViaServiceWorker()) 593 if (response().wasFetchedViaServiceWorker())
595 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque; 594 return response().serviceWorkerResponseType() != WebServiceWorkerRespons eTypeOpaque;
596 if (!getImage()->currentFrameHasSingleSecurityOrigin()) 595 if (!getImage()->currentFrameHasSingleSecurityOrigin())
597 return false; 596 return false;
598 if (passesAccessControlCheck(securityOrigin)) 597 if (passesAccessControlCheck(securityOrigin))
599 return true; 598 return true;
600 return !securityOrigin->taintsCanvas(response().url()); 599 return !securityOrigin->taintsCanvas(response().url());
601 } 600 }
602 601
603 } // namespace blink 602 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698