Changeset 243471 in webkit
- Timestamp:
- Mar 25, 2019 4:30:47 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r243460 r243471 1 2019-03-25 Andy Estes <aestes@apple.com> 2 3 [iOS] Break a reference cycle between PreviewLoader and ResourceLoader 4 https://bugs.webkit.org/show_bug.cgi?id=194964 5 <rdar://problem/48279441> 6 7 Reviewed by Alex Christensen. 8 9 When a document's QuickLook preview is loaded, a reference cycle is created between 10 WebPreviewLoader and ResourceLoader. Break the cycle by changing WebPreviewLoader to hold a 11 WeakPtr to its ResourceLoader ResourceLoader::releaseResources(). 12 13 Fixes leaks detected by `run-webkit-tests --leaks LayoutTests/quicklook`. Also covered by 14 existing API tests. 15 16 * loader/ResourceLoader.h: 17 * loader/ios/PreviewLoader.mm: 18 (-[WebPreviewLoader initWithResourceLoader:resourceResponse:]): 19 (-[WebPreviewLoader _sendDidReceiveResponseIfNecessary]): 20 (-[WebPreviewLoader connection:didReceiveData:lengthReceived:]): 21 (-[WebPreviewLoader connectionDidFinishLoading:]): 22 (-[WebPreviewLoader connection:didFailWithError:]): 23 1 24 2019-03-25 Alex Christensen <achristensen@webkit.org> 2 25 -
trunk/Source/WebCore/loader/ResourceLoader.h
r238933 r243471 54 54 class PreviewLoader; 55 55 56 class ResourceLoader : public RefCounted<ResourceLoader>, protected ResourceHandleClient {56 class ResourceLoader : public CanMakeWeakPtr<ResourceLoader>, public RefCounted<ResourceLoader>, protected ResourceHandleClient { 57 57 public: 58 58 virtual ~ResourceLoader() = 0; -
trunk/Source/WebCore/loader/ios/PreviewLoader.mm
r232179 r243471 43 43 44 44 @interface WebPreviewLoader : NSObject { 45 RefPtr<ResourceLoader> _resourceLoader;45 WeakPtr<ResourceLoader> _resourceLoader; 46 46 ResourceResponse _response; 47 47 RefPtr<PreviewLoaderClient> _client; … … 82 82 return nil; 83 83 84 _resourceLoader = &resourceLoader;84 _resourceLoader = makeWeakPtr(resourceLoader); 85 85 _response = resourceResponse; 86 86 _converter = std::make_unique<PreviewConverter>(self, _response); … … 122 122 - (void)_sendDidReceiveResponseIfNecessary 123 123 { 124 if (!_resourceLoader) 125 return; 126 124 127 ASSERT(!_resourceLoader->reachedTerminalState()); 125 128 if (_hasSentDidReceiveResponse) … … 138 141 _resourceLoader->didReceiveResponse(response, [self, retainedSelf = retainPtr(self)] { 139 142 _hasProcessedResponse = YES; 143 144 if (!_resourceLoader) 145 return; 140 146 141 147 if (_resourceLoader->reachedTerminalState()) … … 159 165 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived 160 166 { 167 if (!_resourceLoader) 168 return; 169 161 170 ASSERT_UNUSED(connection, !connection); 162 171 if (_resourceLoader->reachedTerminalState()) … … 186 195 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 187 196 { 197 if (!_resourceLoader) 198 return; 199 188 200 ASSERT_UNUSED(connection, !connection); 189 201 if (_resourceLoader->reachedTerminalState()) … … 207 219 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 208 220 { 221 if (!_resourceLoader) 222 return; 223 209 224 ASSERT_UNUSED(connection, !connection); 210 225 if (_resourceLoader->reachedTerminalState()) -
trunk/Source/WebKitLegacy/mac/ChangeLog
r243433 r243471 1 2019-03-25 Andy Estes <aestes@apple.com> 2 3 [iOS] Break a reference cycle between PreviewLoader and ResourceLoader 4 https://bugs.webkit.org/show_bug.cgi?id=194964 5 <rdar://problem/48279441> 6 7 Reviewed by Alex Christensen. 8 9 The WebDataSource._quickLookContent SPI accidentally relied on PreviewLoaders being leaked 10 to keep the temporary file referenced by WebQuickLookFileNameKey in existence. Since 11 PreviewLoaders are now being deleted properly, we teach WebDataSource to keep the 12 PreviewLoaderClient alive for its lifetime. This ensures that as long as 13 WebDataSource._quickLookContent can be called, the associated temp file will not be deleted 14 by WebKit. 15 16 * WebCoreSupport/WebFrameLoaderClient.mm: 17 (WebFrameLoaderClient::createPreviewLoaderClient): 18 * WebView/WebDataSource.mm: 19 (-[WebDataSource _quickLookPreviewLoaderClient]): 20 (-[WebDataSource _setQuickLookPreviewLoaderClient:]): 21 * WebView/WebDataSourceInternal.h: 22 1 23 2019-03-25 Gyuyoung Kim <gyuyoung.kim@webkit.org> 2 24 -
trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm
r242920 r243471 2244 2244 return nullptr; 2245 2245 2246 auto documentWriter = adoptRef(*new QuickLookDocumentWriter(filePath)); 2247 2246 2248 [m_webFrame provisionalDataSource]._quickLookContent = @{ WebQuickLookFileNameKey : filePath, WebQuickLookUTIKey : uti }; 2247 return adoptRef(*new QuickLookDocumentWriter(filePath)); 2249 [m_webFrame provisionalDataSource]._quickLookPreviewLoaderClient = documentWriter.ptr(); 2250 return documentWriter; 2248 2251 } 2249 2252 #endif -
trunk/Source/WebKitLegacy/mac/WebView/WebDataSource.mm
r239709 r243471 54 54 #import <WebCore/LegacyWebArchive.h> 55 55 #import <WebCore/MIMETypeRegistry.h> 56 #import <WebCore/PreviewLoaderClient.h> 56 57 #import <WebCore/ResourceRequest.h> 57 58 #import <WebCore/SharedBuffer.h> … … 109 110 #if USE(QUICK_LOOK) 110 111 RetainPtr<NSDictionary> _quickLookContent; 112 RefPtr<WebCore::PreviewLoaderClient> _quickLookPreviewLoaderClient; 111 113 #endif 112 114 }; … … 418 420 419 421 #if USE(QUICK_LOOK) 422 - (WebCore::PreviewLoaderClient*)_quickLookPreviewLoaderClient 423 { 424 return toPrivate(_private)->_quickLookPreviewLoaderClient.get(); 425 } 426 420 427 - (void)_setQuickLookContent:(NSDictionary *)quickLookContent 421 428 { 422 429 toPrivate(_private)->_quickLookContent = adoptNS([quickLookContent copy]); 430 } 431 432 - (void)_setQuickLookPreviewLoaderClient:(WebCore::PreviewLoaderClient*)quickLookPreviewLoaderClient 433 { 434 toPrivate(_private)->_quickLookPreviewLoaderClient = quickLookPreviewLoaderClient; 423 435 } 424 436 #endif -
trunk/Source/WebKitLegacy/mac/WebView/WebDataSourceInternal.h
r216816 r243471 31 31 32 32 namespace WebCore { 33 class DocumentLoader; 33 class DocumentLoader; 34 class PreviewLoaderClient; 34 35 } 35 36 … … 60 61 #if USE(QUICK_LOOK) 61 62 @property (nonatomic, copy, setter=_setQuickLookContent:) NSDictionary *_quickLookContent; 63 @property (nonatomic, setter=_setQuickLookPreviewLoaderClient:) WebCore::PreviewLoaderClient* _quickLookPreviewLoaderClient; 62 64 #endif 63 65 @end
Note: See TracChangeset
for help on using the changeset viewer.