Changeset 251623 in webkit
- Timestamp:
- Oct 25, 2019 6:48:04 PM (4 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 15 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r251518 r251623 1 2019-10-25 Andy Estes <aestes@apple.com> 2 3 [Quick Look] Move the QLPreviewConverter delegate into PreviewConverter and vend a C++ client interface 4 https://bugs.webkit.org/show_bug.cgi?id=203396 5 6 Reviewed by Alex Christensen. 7 8 * wtf/FeatureDefines.h: Defined ENABLE_PREVIEW_CONVERTER. 9 1 10 2019-10-23 Yusuke Suzuki <ysuzuki@apple.com> 2 11 -
trunk/Source/WTF/wtf/FeatureDefines.h
r251517 r251623 218 218 #endif 219 219 220 #if !defined(ENABLE_PREVIEW_CONVERTER) 221 #if PLATFORM(IOS) 222 #define ENABLE_PREVIEW_CONVERTER 1 223 #endif 224 #endif 225 220 226 #endif /* PLATFORM(IOS_FAMILY) */ 221 227 -
trunk/Source/WebCore/ChangeLog
r251620 r251623 1 2019-10-25 Andy Estes <aestes@apple.com> 2 3 [Quick Look] Move the QLPreviewConverter delegate into PreviewConverter and vend a C++ client interface 4 https://bugs.webkit.org/show_bug.cgi?id=203396 5 6 Reviewed by Alex Christensen. 7 8 PreviewConverter existed as a thin wrapper around QLPreviewConverter for use by 9 LegacyPreviewLoader and Quick Look NSData loading in WebKitLegacy. This patch makes two 10 changes to this arrangement: 11 12 1. The QLPreviewConverter delegate and the bulk of the conversion state machine was moved 13 into PreviewConverter, which now vends a C++ client interface. LegacyPreviewLoader is now a 14 client of its PreviewConverter, retaining the responsiility of interacting with the 15 ResourceLoader and LegacyPreviewLoaderClient. 16 17 2. The Quick Look NSData loading code for WebKitLegacy now uses QLPreviewConverter API 18 directly rather than creating a PreviewConverter. This code path does not require a delegate 19 nor any of the other logic in PreviewConverter. 20 21 This change also organizes PreviewConverter into a cross-platform .cpp file and an 22 iOS-specific .mm file for the direct usage of QLPreviewConverter API. LegacyPreviewConverter 23 was also organized such that it can be changed from .mm to .cpp in a future patch. 24 25 No change in behavior. Covered by existing API and layout tests. 26 27 * Sources.txt: 28 * WebCore.xcodeproj/project.pbxproj: 29 30 * loader/DocumentLoader.cpp: 31 (WebCore::DocumentLoader::setPreviewConverter): 32 * loader/DocumentLoader.h: Changed m_previewConverter from std::unique_ptr to RefPtr. 33 34 * loader/SubresourceLoader.cpp: 35 (WebCore::SubresourceLoader::didReceiveResponse): Used makeUnique directly instead of 36 LegacyPreviewLoader::create(). 37 38 * loader/ios/LegacyPreviewLoader.h: Privately inherited from PreviewConverterClient and 39 PreviewConverterProvider and migrated WebPreviewLoader ivars to member variables. 40 41 * loader/ios/LegacyPreviewLoader.mm: 42 (WebCore::makeClient): 43 (WebCore::LegacyPreviewLoader::didReceiveBuffer): 44 (WebCore::LegacyPreviewLoader::didFinishLoading): 45 (WebCore::LegacyPreviewLoader::didFail): 46 (WebCore::LegacyPreviewLoader::previewConverterDidStartConverting): 47 (WebCore::LegacyPreviewLoader::previewConverterDidReceiveData): 48 (WebCore::LegacyPreviewLoader::previewConverterDidFinishConverting): 49 (WebCore::LegacyPreviewLoader::previewConverterDidFailUpdating): 50 (WebCore::LegacyPreviewLoader::previewConverterDidFailConverting): 51 (WebCore::LegacyPreviewLoader::providePasswordForPreviewConverter): 52 (WebCore::LegacyPreviewLoader::provideMainResourceForPreviewConverter): 53 (WebCore::LegacyPreviewLoader::LegacyPreviewLoader): 54 (WebCore::LegacyPreviewLoader::didReceiveData): 55 (WebCore::LegacyPreviewLoader::didReceiveResponse): 56 (testingClient): Deleted. 57 (emptyClient): Deleted. 58 (-[WebPreviewLoader initWithResourceLoader:resourceResponse:]): Deleted. 59 (-[WebPreviewLoader appendDataArray:]): Deleted. 60 (-[WebPreviewLoader finishedAppending]): Deleted. 61 (-[WebPreviewLoader failed]): Deleted. 62 (-[WebPreviewLoader _loadPreviewIfNeeded]): Deleted. 63 (-[WebPreviewLoader connection:didReceiveData:lengthReceived:]): Deleted. 64 (-[WebPreviewLoader connectionDidFinishLoading:]): Deleted. 65 (isQuickLookPasswordError): Deleted. 66 (-[WebPreviewLoader connection:didFailWithError:]): Deleted. 67 (WebCore::LegacyPreviewLoader::~LegacyPreviewLoader): Deleted. 68 (WebCore::LegacyPreviewLoader::create): Deleted. 69 70 * platform/PreviewConverter.cpp: Added. 71 (WebCore::PreviewConverter::supportsMIMEType): 72 (WebCore::PreviewConverter::previewResponse const): 73 (WebCore::PreviewConverter::previewError const): 74 (WebCore::PreviewConverter::previewData const): 75 (WebCore::PreviewConverter::updateMainResource): 76 (WebCore::PreviewConverter::appendFromBuffer): 77 (WebCore::PreviewConverter::finishUpdating): 78 (WebCore::PreviewConverter::failedUpdating): 79 (WebCore::PreviewConverter::hasClient const): 80 (WebCore::PreviewConverter::addClient): 81 (WebCore::PreviewConverter::removeClient): 82 (WebCore::sharedPasswordForTesting): 83 (WebCore::PreviewConverter::passwordForTesting): 84 (WebCore::PreviewConverter::setPasswordForTesting): 85 (WebCore::PreviewConverter::iterateClients): 86 (WebCore::PreviewConverter::didAddClient): 87 (WebCore::PreviewConverter::didFailConvertingWithError): 88 (WebCore::PreviewConverter::didFailUpdating): 89 (WebCore::PreviewConverter::replayToClient): 90 (WebCore::PreviewConverter::delegateDidReceiveData): 91 (WebCore::PreviewConverter::delegateDidFinishLoading): 92 (WebCore::PreviewConverter::delegateDidFailWithError): 93 * platform/PreviewConverter.h: 94 (WebCore::PreviewConverter::PreviewConverter): Deleted. 95 (WebCore::PreviewConverter::platformConverter const): Deleted. 96 * platform/PreviewConverterClient.h: Copied from Source/WebCore/platform/PreviewConverter.h. 97 * platform/PreviewConverterProvider.h: Copied from Source/WebCore/platform/PreviewConverter.h. 98 * platform/ios/PreviewConverterIOS.mm: 99 (-[WebPreviewConverterDelegate initWithDelegate:]): 100 (-[WebPreviewConverterDelegate connection:didReceiveData:lengthReceived:]): 101 (-[WebPreviewConverterDelegate connectionDidFinishLoading:]): 102 (-[WebPreviewConverterDelegate connection:didFailWithError:]): 103 (WebCore::PreviewConverter::PreviewConverter): 104 (WebCore::PreviewConverter::platformSupportedMIMETypes): 105 (WebCore::PreviewConverter::safeRequest const): 106 (WebCore::PreviewConverter::platformPreviewResponse const): 107 (WebCore::PreviewConverter::platformAppend): 108 (WebCore::PreviewConverter::platformFinishedAppending): 109 (WebCore::PreviewConverter::platformFailedAppending): 110 (WebCore::PreviewConverter::isPlatformPasswordError const): 111 (WebCore::optionsWithPassword): 112 (WebCore::PreviewConverter::platformUnlockWithPassword): 113 (WebCore::PreviewConverter::supportsMIMEType): Deleted. 114 (WebCore::PreviewConverter::previewRequest const): Deleted. 115 (WebCore::PreviewConverter::previewResponse const): Deleted. 116 117 * platform/ios/QuickLook.mm: 118 (WebCore::registerQLPreviewConverterIfNeeded): Used QLPreviewConverter directly. 119 1 120 2019-10-25 Yury Semikhatsky <yurys@chromium.org> 2 121 -
trunk/Source/WebCore/PAL/ChangeLog
r251160 r251623 1 2019-10-25 Andy Estes <aestes@apple.com> 2 3 [Quick Look] Move the QLPreviewConverter delegate into PreviewConverter and vend a C++ client interface 4 https://bugs.webkit.org/show_bug.cgi?id=203396 5 6 Reviewed by Alex Christensen. 7 8 * pal/spi/ios/QuickLookSPI.h: 9 1 10 2019-10-15 Peng Liu <peng.liu6@apple.com> 2 11 -
trunk/Source/WebCore/PAL/pal/spi/ios/QuickLookSPI.h
r233266 r251623 40 40 - (id)initWithConnection:(NSURLConnection *)connection delegate:(id)delegate response:(NSURLResponse *)response options:(NSDictionary *)options; 41 41 - (id)initWithData:(NSData *)data name:(NSString *)name uti:(NSString *)uti options:(NSDictionary *)options; 42 - (void)appendData:(NSData *)data; 42 43 - (void)appendDataArray:(NSArray *)dataArray; 43 44 - (void)finishConverting; -
trunk/Source/WebCore/Sources.txt
r251620 r251623 1742 1742 platform/PlatformSpeechSynthesizer.cpp 1743 1743 platform/PlatformStrategies.cpp 1744 platform/PreviewConverter.cpp 1744 1745 platform/ProcessIdentifier.cpp 1745 1746 platform/ReferrerPolicy.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r251620 r251623 2986 2986 A19D934B1AA11B1E00B46C24 /* NetworkExtensionContentFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A19D93491AA11B1E00B46C24 /* NetworkExtensionContentFilter.h */; }; 2987 2987 A1AA9AB91D23911500FEADB3 /* ContentFilterBlockedPage.html in Resources */ = {isa = PBXBuildFile; fileRef = A1AA9AB81D23911500FEADB3 /* ContentFilterBlockedPage.html */; }; 2988 A1ADAF7D2360FD3E009CB776 /* PreviewConverterClient.h in Headers */ = {isa = PBXBuildFile; fileRef = A1ADAF7B2360FD3D009CB776 /* PreviewConverterClient.h */; }; 2989 A1ADAF7E2360FD3E009CB776 /* PreviewConverterProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = A1ADAF7C2360FD3E009CB776 /* PreviewConverterProvider.h */; }; 2988 2990 A1AFEDE61F8BFF6D0087013F /* MockPaymentCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = A1AFEDE41F8BFF6D0087013F /* MockPaymentCoordinator.h */; }; 2989 2991 A1AFEDE71F8BFF6D0087013F /* MockPaymentCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1AFEDE51F8BFF6D0087013F /* MockPaymentCoordinator.cpp */; }; … … 11315 11317 A19D93491AA11B1E00B46C24 /* NetworkExtensionContentFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkExtensionContentFilter.h; sourceTree = "<group>"; }; 11316 11318 A1AA9AB81D23911500FEADB3 /* ContentFilterBlockedPage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = ContentFilterBlockedPage.html; sourceTree = "<group>"; }; 11319 A1ADAF792360EF6C009CB776 /* PreviewConverter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PreviewConverter.cpp; sourceTree = "<group>"; }; 11320 A1ADAF7B2360FD3D009CB776 /* PreviewConverterClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewConverterClient.h; sourceTree = "<group>"; }; 11321 A1ADAF7C2360FD3E009CB776 /* PreviewConverterProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewConverterProvider.h; sourceTree = "<group>"; }; 11317 11322 A1AFEDE41F8BFF6D0087013F /* MockPaymentCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockPaymentCoordinator.h; sourceTree = "<group>"; }; 11318 11323 A1AFEDE51F8BFF6D0087013F /* MockPaymentCoordinator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MockPaymentCoordinator.cpp; sourceTree = "<group>"; }; … … 25722 25727 ABC128760B33AA6D00C693D5 /* PopupMenuClient.h */, 25723 25728 BC3BE12A0E98092F00835588 /* PopupMenuStyle.h */, 25729 A1ADAF792360EF6C009CB776 /* PreviewConverter.cpp */, 25724 25730 A1C150781E3F2B3E0032C98C /* PreviewConverter.h */, 25731 A1ADAF7B2360FD3D009CB776 /* PreviewConverterClient.h */, 25732 A1ADAF7C2360FD3E009CB776 /* PreviewConverterProvider.h */, 25725 25733 51F645D21FECDBC800B54DED /* ProcessIdentifier.cpp */, 25726 25734 51F645D31FECDBC800B54DED /* ProcessIdentifier.h */, … … 31486 31494 C0F2A44113869AAB0066C534 /* preprocessor.pm in Headers */, 31487 31495 A1C1507A1E3F2B3E0032C98C /* PreviewConverter.h in Headers */, 31496 A1ADAF7D2360FD3E009CB776 /* PreviewConverterClient.h in Headers */, 31497 A1ADAF7E2360FD3E009CB776 /* PreviewConverterProvider.h in Headers */, 31488 31498 E4605FEC2166480900E53046 /* PrewarmInformation.h in Headers */, 31489 31499 B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */, -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r251439 r251623 2139 2139 } 2140 2140 2141 void DocumentLoader::setPreviewConverter( std::unique_ptr<PreviewConverter>&& previewConverter)2141 void DocumentLoader::setPreviewConverter(RefPtr<PreviewConverter>&& previewConverter) 2142 2142 { 2143 2143 m_previewConverter = WTFMove(previewConverter); -
trunk/Source/WebCore/loader/DocumentLoader.h
r251409 r251623 353 353 354 354 #if USE(QUICK_LOOK) 355 void setPreviewConverter( std::unique_ptr<PreviewConverter>&&);355 void setPreviewConverter(RefPtr<PreviewConverter>&&); 356 356 PreviewConverter* previewConverter() const; 357 357 #endif … … 592 592 593 593 #if USE(QUICK_LOOK) 594 std::unique_ptr<PreviewConverter> m_previewConverter;594 RefPtr<PreviewConverter> m_previewConverter; 595 595 #endif 596 596 -
trunk/Source/WebCore/loader/SubresourceLoader.cpp
r251594 r251623 335 335 #if USE(QUICK_LOOK) 336 336 if (shouldCreatePreviewLoaderForResponse(response)) { 337 m_previewLoader = LegacyPreviewLoader::create(*this, response);337 m_previewLoader = makeUnique<LegacyPreviewLoader>(*this, response); 338 338 if (m_previewLoader->didReceiveResponse(response)) 339 339 return; -
trunk/Source/WebCore/loader/ios/LegacyPreviewLoader.h
r251488 r251623 26 26 #pragma once 27 27 28 #include "PreviewConverterClient.h" 29 #include "PreviewConverterProvider.h" 28 30 #include <wtf/Forward.h> 29 31 #include <wtf/Noncopyable.h> 30 32 #include <wtf/RetainPtr.h> 31 32 OBJC_CLASS WebPreviewLoader; 33 #include <wtf/WeakPtr.h> 33 34 34 35 namespace WebCore { … … 39 40 class SharedBuffer; 40 41 41 class LegacyPreviewLoader {42 class LegacyPreviewLoader final : private PreviewConverterClient, private PreviewConverterProvider { 42 43 WTF_MAKE_FAST_ALLOCATED; 43 44 WTF_MAKE_NONCOPYABLE(LegacyPreviewLoader); 44 45 public: 45 static std::unique_ptr<LegacyPreviewLoader> create(ResourceLoader&, const ResourceResponse&);46 LegacyPreviewLoader(ResourceLoader&, const ResourceResponse&); 46 47 ~LegacyPreviewLoader(); 47 48 … … 55 56 56 57 private: 57 friend std::unique_ptr<LegacyPreviewLoader> std::make_unique<LegacyPreviewLoader>(ResourceLoader&, const ResourceResponse&); 58 LegacyPreviewLoader(ResourceLoader&, const ResourceResponse&); 58 // PreviewConverterClient 59 void previewConverterDidStartUpdating(PreviewConverter&) final { }; 60 void previewConverterDidFinishUpdating(PreviewConverter&) final { }; 61 void previewConverterDidFailUpdating(PreviewConverter&) final; 62 void previewConverterDidStartConverting(PreviewConverter&) final; 63 void previewConverterDidReceiveData(PreviewConverter&, const SharedBuffer&) final; 64 void previewConverterDidFinishConverting(PreviewConverter&) final; 65 void previewConverterDidFailConverting(PreviewConverter&) final; 59 66 60 RetainPtr<WebPreviewLoader> m_previewLoader; 67 // PreviewConverterProvider 68 void provideMainResourceForPreviewConverter(PreviewConverter&, CompletionHandler<void(const SharedBuffer*)>&&) final; 69 void providePasswordForPreviewConverter(PreviewConverter&, CompletionHandler<void(const String&)>&&) final; 70 71 RefPtr<PreviewConverter> m_converter; 72 Ref<LegacyPreviewLoaderClient> m_client; 73 Ref<SharedBuffer> m_originalData; 74 WeakPtr<ResourceLoader> m_resourceLoader; 61 75 bool m_finishedLoadingDataIntoConverter { false }; 76 bool m_hasProcessedResponse { false }; 77 bool m_needsToCallDidFinishLoading { false }; 78 bool m_shouldDecidePolicyBeforeLoading; 62 79 }; 63 80 -
trunk/Source/WebCore/loader/ios/LegacyPreviewLoader.mm
r251488 r251623 39 39 #import "ResourceLoader.h" 40 40 #import "Settings.h" 41 #import <pal/spi/ios/QuickLookSPI.h>42 41 #import <wtf/NeverDestroyed.h> 43 42 44 using namespace WebCore; 45 46 @interface WebPreviewLoader : NSObject { 47 WeakPtr<ResourceLoader> _resourceLoader; 48 ResourceResponse _response; 49 RefPtr<LegacyPreviewLoaderClient> _client; 50 std::unique_ptr<PreviewConverter> _converter; 51 RetainPtr<NSMutableArray> _bufferedDataArray; 52 BOOL _hasLoadedPreview; 53 BOOL _hasProcessedResponse; 54 RefPtr<SharedBuffer> _bufferedData; 55 long long _lengthReceived; 56 BOOL _needsToCallDidFinishLoading; 57 } 58 59 - (instancetype)initWithResourceLoader:(ResourceLoader&)resourceLoader resourceResponse:(const ResourceResponse&)resourceResponse; 60 - (void)appendDataArray:(NSArray<NSData *> *)dataArray; 61 - (void)finishedAppending; 62 - (void)failed; 63 64 @property (nonatomic, readonly) BOOL shouldDecidePolicyBeforeLoading; 65 66 @end 67 68 @implementation WebPreviewLoader 43 namespace WebCore { 69 44 70 45 static RefPtr<LegacyPreviewLoaderClient>& testingClient() … … 80 55 } 81 56 82 - (instancetype)initWithResourceLoader:(ResourceLoader&)resourceLoader resourceResponse:(const ResourceResponse&)resourceResponse 83 { 84 if ( !(self = [super init]))85 return nil;86 87 _resourceLoader = makeWeakPtr(resourceLoader);88 _response = resourceResponse;89 _converter = makeUnique<PreviewConverter>(self, _response); 90 _bufferedDataArray = adoptNS([[NSMutableArray alloc] init]); 91 _shouldDecidePolicyBeforeLoading = resourceLoader.frame()->settings().shouldDecidePolicyBeforeLoadingQuickLookPreview(); 92 93 if ( testingClient())94 _client = testingClient();95 else if (auto client = resourceLoader.frameLoader()->client().createPreviewLoaderClient(_converter->previewFileName(), _converter->previewUTI())) 96 _client = WTFMove(client);97 else98 _client = &emptyClient();99 100 LOG(Network, "WebPreviewConverter created with preview file name \"%s\".", _converter->previewFileName().utf8().data());101 return self; 102 } 103 104 - (void)appendDataArray:(NSArray<NSData *> *)dataArray 105 { 106 LOG(Network, "WebPreviewConverter appending data array with count %ld.", dataArray.count);107 [_converter->platformConverter() appendDataArray:dataArray]; 108 [_bufferedDataArray addObjectsFromArray:dataArray];109 _client->didReceiveDataArray((CFArrayRef)dataArray);110 } 111 112 - (void)finishedAppending 113 { 114 LOG(Network, "WebPreviewConverter finished appending data."); 115 [_converter->platformConverter() finishedAppendingData]; 116 _client->didFinishLoading(); 117 } 118 119 - (void)failed 120 { 121 LOG(Network, "WebPreviewConverter failed.");122 [_converter->platformConverter() finishConverting];123 _client->didFail();124 } 125 126 - (void)_loadPreviewIfNeeded 127 { 128 if (!_resourceLoader) 129 return;130 131 ASSERT(!_resourceLoader->reachedTerminalState());132 if (_hasLoadedPreview) 133 return;134 135 _hasLoadedPreview = YES; 136 [_bufferedDataArray removeAllObjects];137 138 ResourceResponse response { _converter->previewResponse() };139 response.setIsQuickLook(true);140 ASSERT(response.mimeType().length()); 141 142 _resourceLoader->documentLoader()->setPreviewConverter(WTFMove(_converter));143 144 if (_shouldDecidePolicyBeforeLoading) {145 _hasProcessedResponse = YES;146 _resourceLoader->didReceivePreviewResponse(response); 147 return;148 }149 150 _hasProcessedResponse = NO; 151 _resourceLoader->didReceiveResponse(response, [self, retainedSelf = retainPtr(self)] {152 _hasProcessedResponse = YES; 153 154 if (! _resourceLoader)155 return; 156 157 if ( _resourceLoader->reachedTerminalState())158 return; 159 160 if ( auto bufferedData = WTFMove(_bufferedData)) {161 _resourceLoader->didReceiveData(bufferedData->data(), bufferedData->size(), _lengthReceived, DataPayloadBytes);162 _lengthReceived = 0;57 static Ref<LegacyPreviewLoaderClient> makeClient(const ResourceLoader& loader, const String& previewFileName, const String& previewType) 58 { 59 if (auto client = testingClient()) 60 return client.releaseNonNull(); 61 if (auto client = loader.frameLoader()->client().createPreviewLoaderClient(previewFileName, previewType)) 62 return client.releaseNonNull(); 63 return emptyClient(); 64 } 65 66 bool LegacyPreviewLoader::didReceiveBuffer(const SharedBuffer& buffer) 67 { 68 if (m_finishedLoadingDataIntoConverter) 69 return false; 70 71 LOG(Network, "LegacyPreviewLoader appending buffer with size %ld.", buffer.size()); 72 m_originalData->append(buffer); 73 m_converter->updateMainResource(); 74 m_client->didReceiveDataArray((__bridge CFArrayRef)buffer.createNSDataArray().get()); 75 return true; 76 } 77 78 bool LegacyPreviewLoader::didFinishLoading() 79 { 80 if (m_finishedLoadingDataIntoConverter) 81 return false; 82 83 LOG(Network, "LegacyPreviewLoader finished appending data."); 84 m_finishedLoadingDataIntoConverter = true; 85 m_converter->finishUpdating(); 86 m_client->didFinishLoading(); 87 return true; 88 } 89 90 void LegacyPreviewLoader::didFail() 91 { 92 if (m_finishedLoadingDataIntoConverter) 93 return; 94 95 LOG(Network, "LegacyPreviewLoader failed."); 96 m_finishedLoadingDataIntoConverter = true; 97 m_converter->failedUpdating(); 98 m_client->didFail(); 99 m_converter = nullptr; 100 } 101 102 void LegacyPreviewLoader::previewConverterDidStartConverting(PreviewConverter& converter) 103 { 104 auto resourceLoader = m_resourceLoader.get(); 105 if (!resourceLoader) 106 return; 107 108 if (resourceLoader->reachedTerminalState()) 109 return; 110 111 ASSERT(!m_hasProcessedResponse); 112 m_originalData->clear(); 113 resourceLoader->documentLoader()->setPreviewConverter(WTFMove(m_converter)); 114 auto response { converter.previewResponse() }; 115 116 if (m_shouldDecidePolicyBeforeLoading) { 117 m_hasProcessedResponse = true; 118 resourceLoader->didReceivePreviewResponse(response); 119 return; 120 } 121 122 resourceLoader->didReceiveResponse(response, [this, weakThis = makeWeakPtr(static_cast<PreviewConverterClient&>(*this)), converter = makeRef(converter)] { 123 if (!weakThis) 124 return; 125 126 m_hasProcessedResponse = true; 127 128 auto resourceLoader = m_resourceLoader.get(); 129 if (!resourceLoader) 130 return; 131 132 if (resourceLoader->reachedTerminalState()) 133 return; 134 135 if (!converter->previewData().isEmpty()) { 136 auto bufferSize = converter->previewData().size(); 137 resourceLoader->didReceiveBuffer(converter->previewData().copy(), bufferSize, DataPayloadBytes); 163 138 } 164 139 165 if ( _resourceLoader->reachedTerminalState())166 return; 167 168 if ( _needsToCallDidFinishLoading) {169 _needsToCallDidFinishLoading = NO;170 _resourceLoader->didFinishLoading(NetworkLoadMetrics { });140 if (resourceLoader->reachedTerminalState()) 141 return; 142 143 if (m_needsToCallDidFinishLoading) { 144 m_needsToCallDidFinishLoading = false; 145 resourceLoader->didFinishLoading(NetworkLoadMetrics { }); 171 146 } 172 147 }); 173 148 } 174 149 175 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived 176 { 177 if (!_resourceLoader) 178 return; 179 180 ASSERT_UNUSED(connection, !connection); 181 if (_resourceLoader->reachedTerminalState()) 182 return; 183 184 [self _loadPreviewIfNeeded]; 185 186 auto dataLength = data.length; 187 188 // QuickLook code sends us a nil data at times. The check below is the same as the one in 189 // ResourceHandleMac.cpp added for a different bug. 190 if (!dataLength) 191 return; 192 193 if (_hasProcessedResponse) { 194 _resourceLoader->didReceiveData(reinterpret_cast<const char*>(data.bytes), dataLength, lengthReceived, DataPayloadBytes); 195 return; 196 } 197 198 if (!_bufferedData) 199 _bufferedData = SharedBuffer::create(data); 200 else 201 _bufferedData->append(data); 202 _lengthReceived += lengthReceived; 203 } 204 205 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 206 { 207 if (!_resourceLoader) 208 return; 209 210 ASSERT_UNUSED(connection, !connection); 211 if (_resourceLoader->reachedTerminalState()) 212 return; 213 214 ASSERT(_hasLoadedPreview); 215 216 if (!_hasProcessedResponse) { 217 _needsToCallDidFinishLoading = YES; 218 return; 219 } 220 221 _resourceLoader->didFinishLoading(NetworkLoadMetrics { }); 222 } 223 224 static inline bool isQuickLookPasswordError(NSError *error) 225 { 226 return error.code == kQLReturnPasswordProtected && [error.domain isEqualToString:@"QuickLookErrorDomain"]; 227 } 228 229 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 230 { 231 if (!_resourceLoader) 232 return; 233 234 ASSERT_UNUSED(connection, !connection); 235 if (_resourceLoader->reachedTerminalState()) 236 return; 237 238 if (!isQuickLookPasswordError(error)) { 239 _resourceLoader->didFail(error); 240 return; 241 } 242 243 if (!_client->supportsPasswordEntry()) { 244 _resourceLoader->didFail(_resourceLoader->cannotShowURLError()); 245 return; 246 } 247 248 _client->didRequestPassword([self, retainedSelf = retainPtr(self)] (const String& password) { 249 _converter = makeUnique<PreviewConverter>(self, _response, password); 250 [_converter->platformConverter() appendDataArray:_bufferedDataArray.get()]; 251 [_converter->platformConverter() finishedAppendingData]; 252 }); 253 } 254 255 @end 256 257 namespace WebCore { 150 void LegacyPreviewLoader::previewConverterDidReceiveData(PreviewConverter&, const SharedBuffer& data) 151 { 152 auto resourceLoader = m_resourceLoader.get(); 153 if (!resourceLoader) 154 return; 155 156 if (resourceLoader->reachedTerminalState()) 157 return; 158 159 if (data.isEmpty()) 160 return; 161 162 if (!m_hasProcessedResponse) 163 return; 164 165 auto dataCopy = data.copy(); 166 resourceLoader->didReceiveBuffer(WTFMove(dataCopy), dataCopy->size(), DataPayloadBytes); 167 } 168 169 void LegacyPreviewLoader::previewConverterDidFinishConverting(PreviewConverter&) 170 { 171 auto resourceLoader = m_resourceLoader.get(); 172 if (!resourceLoader) 173 return; 174 175 if (resourceLoader->reachedTerminalState()) 176 return; 177 178 if (!m_hasProcessedResponse) { 179 m_needsToCallDidFinishLoading = true; 180 return; 181 } 182 183 resourceLoader->didFinishLoading(NetworkLoadMetrics { }); 184 } 185 186 void LegacyPreviewLoader::previewConverterDidFailUpdating(PreviewConverter&) 187 { 188 if (auto resourceLoader = m_resourceLoader.get()) 189 resourceLoader->didFail(resourceLoader->cannotShowURLError()); 190 } 191 192 void LegacyPreviewLoader::previewConverterDidFailConverting(PreviewConverter& converter) 193 { 194 auto resourceLoader = m_resourceLoader.get(); 195 if (!resourceLoader) 196 return; 197 198 if (resourceLoader->reachedTerminalState()) 199 return; 200 201 resourceLoader->didFail(converter.previewError()); 202 } 203 204 void LegacyPreviewLoader::providePasswordForPreviewConverter(PreviewConverter& converter, CompletionHandler<void(const String&)>&& completionHandler) 205 { 206 ASSERT_UNUSED(converter, &converter == m_converter); 207 208 auto resourceLoader = m_resourceLoader.get(); 209 if (!resourceLoader) { 210 completionHandler({ }); 211 return; 212 } 213 214 if (resourceLoader->reachedTerminalState()) { 215 completionHandler({ }); 216 return; 217 } 218 219 if (!m_client->supportsPasswordEntry()) { 220 completionHandler({ }); 221 return; 222 } 223 224 m_client->didRequestPassword(WTFMove(completionHandler)); 225 } 226 227 void LegacyPreviewLoader::provideMainResourceForPreviewConverter(PreviewConverter& converter, CompletionHandler<void(const SharedBuffer*)>&& completionHandler) 228 { 229 ASSERT_UNUSED(converter, &converter == m_converter); 230 completionHandler(m_originalData.ptr()); 231 } 232 233 LegacyPreviewLoader::~LegacyPreviewLoader() = default; 258 234 259 235 LegacyPreviewLoader::LegacyPreviewLoader(ResourceLoader& loader, const ResourceResponse& response) 260 : m_previewLoader { adoptNS([[WebPreviewLoader alloc] initWithResourceLoader:loader resourceResponse:response]) } 261 { 262 } 263 264 LegacyPreviewLoader::~LegacyPreviewLoader() 265 { 266 } 267 268 std::unique_ptr<LegacyPreviewLoader> LegacyPreviewLoader::create(ResourceLoader& loader, const ResourceResponse& response) 236 : m_converter { PreviewConverter::create(response, *this) } 237 , m_client { makeClient(loader, m_converter->previewFileName(), m_converter->previewUTI()) } 238 , m_originalData { SharedBuffer::create() } 239 , m_resourceLoader { makeWeakPtr(loader) } 240 , m_shouldDecidePolicyBeforeLoading { loader.frame()->settings().shouldDecidePolicyBeforeLoadingQuickLookPreview() } 269 241 { 270 242 ASSERT(PreviewConverter::supportsMIMEType(response.mimeType())); 271 return makeUnique<LegacyPreviewLoader>(loader, response); 243 m_converter->addClient(*this); 244 LOG(Network, "LegacyPreviewLoader created with preview file name \"%s\".", m_converter->previewFileName().utf8().data()); 245 } 246 247 bool LegacyPreviewLoader::didReceiveData(const char* data, unsigned length) 248 { 249 return didReceiveBuffer(SharedBuffer::create(data, length).get()); 272 250 } 273 251 274 252 bool LegacyPreviewLoader::didReceiveResponse(const ResourceResponse&) 275 253 { 276 return ![m_previewLoader shouldDecidePolicyBeforeLoading]; 277 } 278 279 bool LegacyPreviewLoader::didReceiveData(const char* data, unsigned length) 280 { 281 if (m_finishedLoadingDataIntoConverter) 282 return false; 283 284 [m_previewLoader appendDataArray:@[ [NSData dataWithBytes:data length:length] ]]; 285 return true; 286 } 287 288 bool LegacyPreviewLoader::didReceiveBuffer(const SharedBuffer& buffer) 289 { 290 if (m_finishedLoadingDataIntoConverter) 291 return false; 292 293 [m_previewLoader appendDataArray:buffer.createNSDataArray().get()]; 294 return true; 295 } 296 297 bool LegacyPreviewLoader::didFinishLoading() 298 { 299 if (m_finishedLoadingDataIntoConverter) 300 return false; 301 302 m_finishedLoadingDataIntoConverter = true; 303 [m_previewLoader finishedAppending]; 304 return true; 305 } 306 307 void LegacyPreviewLoader::didFail() 308 { 309 if (m_finishedLoadingDataIntoConverter) 310 return; 311 312 m_finishedLoadingDataIntoConverter = true; 313 [m_previewLoader failed]; 314 m_previewLoader = nullptr; 254 return !m_shouldDecidePolicyBeforeLoading; 315 255 } 316 256 -
trunk/Source/WebCore/platform/PreviewConverter.h
r251502 r251623 1 1 /* 2 * Copyright (C) 2017 Apple Inc. All rights reserved.2 * Copyright (C) 2017-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #include <objc/objc.h> 26 #pragma once 27 28 #if ENABLE(PREVIEW_CONVERTER) 29 30 #include "ResourceError.h" 31 #include "ResourceResponse.h" 32 #include <wtf/RefCounted.h> 27 33 #include <wtf/RetainPtr.h> 34 #include <wtf/WeakPtr.h> 28 35 #include <wtf/text/WTFString.h> 29 36 30 OBJC_CLASS NSData;31 37 OBJC_CLASS QLPreviewConverter; 38 OBJC_CLASS WebPreviewConverterDelegate; 32 39 33 40 namespace WebCore { 34 41 42 class ResourceError; 35 43 class ResourceRequest; 36 class ResourceResponse; 44 class SharedBuffer; 45 class SharedBufferDataView; 46 struct PreviewConverterClient; 47 struct PreviewConverterProvider; 37 48 38 class PreviewConverter { 49 struct PreviewPlatformDelegate : CanMakeWeakPtr<PreviewPlatformDelegate> { 50 virtual ~PreviewPlatformDelegate() = default; 51 52 virtual void delegateDidReceiveData(const SharedBuffer&) = 0; 53 virtual void delegateDidFinishLoading() = 0; 54 virtual void delegateDidFailWithError(const ResourceError&) = 0; 55 }; 56 57 class PreviewConverter final : private PreviewPlatformDelegate, public RefCounted<PreviewConverter> { 39 58 WTF_MAKE_FAST_ALLOCATED; 40 59 WTF_MAKE_NONCOPYABLE(PreviewConverter); 41 60 public: 42 PreviewConverter(id delegate, const ResourceResponse&, const String& password = { }); 43 PreviewConverter(NSData *, const String& uti, const String& password = { }); 61 static Ref<PreviewConverter> create(const ResourceResponse& response, PreviewConverterProvider& provider) 62 { 63 return adoptRef(*new PreviewConverter(response, provider)); 64 } 44 65 45 66 WEBCORE_EXPORT static bool supportsMIMEType(const String& mimeType); 46 67 47 QLPreviewConverter *platformConverter() const { return m_platformConverter.get(); } 68 ~PreviewConverter(); 69 48 70 ResourceRequest safeRequest(const ResourceRequest&) const; 49 ResourceRequest previewRequest() const;50 71 ResourceResponse previewResponse() const; 51 String previewFileName() const; 52 String previewUTI() const; 72 WEBCORE_EXPORT String previewFileName() const; 73 WEBCORE_EXPORT String previewUTI() const; 74 const ResourceError& previewError() const; 75 const SharedBuffer& previewData() const; 76 77 void failedUpdating(); 78 void finishUpdating(); 79 void updateMainResource(); 80 81 bool hasClient(PreviewConverterClient&) const; 82 void addClient(PreviewConverterClient&); 83 void removeClient(PreviewConverterClient&); 84 85 WEBCORE_EXPORT static const String& passwordForTesting(); 86 WEBCORE_EXPORT static void setPasswordForTesting(const String&); 53 87 54 88 private: 89 static HashSet<String, ASCIICaseInsensitiveHash> platformSupportedMIMETypes(); 90 91 PreviewConverter(const ResourceResponse&, PreviewConverterProvider&); 92 93 ResourceResponse platformPreviewResponse() const; 94 bool isPlatformPasswordError(const ResourceError&) const; 95 96 template<typename T> void iterateClients(T&& callback); 97 void appendFromBuffer(const SharedBuffer&); 98 void didAddClient(PreviewConverterClient&); 99 void didFailConvertingWithError(const ResourceError&); 100 void replayToClient(PreviewConverterClient&); 101 102 void platformAppend(const SharedBufferDataView&); 103 void platformFailedAppending(); 104 void platformFinishedAppending(); 105 void platformUnlockWithPassword(const String&); 106 107 // PreviewPlatformDelegate 108 void delegateDidReceiveData(const SharedBuffer&) final; 109 void delegateDidFinishLoading() final; 110 void delegateDidFailWithError(const ResourceError&) final; 111 112 enum class State : uint8_t { 113 Updating, 114 FailedUpdating, 115 Converting, 116 FailedConverting, 117 FinishedConverting, 118 }; 119 120 Ref<SharedBuffer> m_previewData; 121 ResourceError m_previewError; 122 ResourceResponse m_originalResponse; 123 State m_state { State::Updating }; 124 Vector<WeakPtr<PreviewConverterClient>, 1> m_clients; 125 WeakPtr<PreviewConverterProvider> m_provider; 126 bool m_isInClientCallback { false }; 127 size_t m_lengthAppended { 0 }; 128 129 #if USE(QUICK_LOOK) 130 RetainPtr<WebPreviewConverterDelegate> m_platformDelegate; 55 131 RetainPtr<QLPreviewConverter> m_platformConverter; 132 #endif 56 133 }; 57 134 58 135 } // namespace WebCore 136 137 #endif // ENABLE(PREVIEW_CONVERTER) -
trunk/Source/WebCore/platform/PreviewConverterClient.h
r251622 r251623 1 1 /* 2 * Copyright (C) 201 7Apple Inc. All rights reserved.2 * Copyright (C) 2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #include <objc/objc.h> 27 #include <wtf/RetainPtr.h> 28 #include <wtf/text/WTFString.h> 26 #pragma once 29 27 30 OBJC_CLASS NSData; 31 OBJC_CLASS QLPreviewConverter; 28 #include <wtf/CompletionHandler.h> 29 #include <wtf/Forward.h> 30 #include <wtf/WeakPtr.h> 32 31 33 32 namespace WebCore { 34 33 35 class ResourceRequest; 36 class ResourceResponse; 34 class PreviewConverter; 35 class ResourceError; 36 class SharedBuffer; 37 37 38 class PreviewConverter { 39 WTF_MAKE_FAST_ALLOCATED; 40 WTF_MAKE_NONCOPYABLE(PreviewConverter); 41 public: 42 PreviewConverter(id delegate, const ResourceResponse&, const String& password = { }); 43 PreviewConverter(NSData *, const String& uti, const String& password = { }); 38 struct PreviewConverterClient : CanMakeWeakPtr<PreviewConverterClient> { 39 virtual ~PreviewConverterClient() = default; 44 40 45 WEBCORE_EXPORT static bool supportsMIMEType(const String& mimeType); 46 47 QLPreviewConverter *platformConverter() const { return m_platformConverter.get(); } 48 ResourceRequest safeRequest(const ResourceRequest&) const; 49 ResourceRequest previewRequest() const; 50 ResourceResponse previewResponse() const; 51 String previewFileName() const; 52 String previewUTI() const; 53 54 private: 55 RetainPtr<QLPreviewConverter> m_platformConverter; 41 virtual void previewConverterDidStartUpdating(PreviewConverter&) = 0; 42 virtual void previewConverterDidFinishUpdating(PreviewConverter&) = 0; 43 virtual void previewConverterDidFailUpdating(PreviewConverter&) = 0; 44 virtual void previewConverterDidStartConverting(PreviewConverter&) = 0; 45 virtual void previewConverterDidReceiveData(PreviewConverter&, const SharedBuffer& newData) = 0; 46 virtual void previewConverterDidFinishConverting(PreviewConverter&) = 0; 47 virtual void previewConverterDidFailConverting(PreviewConverter&) = 0; 56 48 }; 57 49 -
trunk/Source/WebCore/platform/PreviewConverterProvider.h
r251622 r251623 1 1 /* 2 * Copyright (C) 201 7Apple Inc. All rights reserved.2 * Copyright (C) 2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #include <objc/objc.h> 27 #include <wtf/RetainPtr.h> 28 #include <wtf/text/WTFString.h> 26 #pragma once 29 27 30 OBJC_CLASS NSData; 31 OBJC_CLASS QLPreviewConverter; 28 #include <wtf/WeakPtr.h> 32 29 33 30 namespace WebCore { 34 31 35 class ResourceRequest; 36 class ResourceResponse;32 struct PreviewConverterProvider : CanMakeWeakPtr<PreviewConverterProvider> { 33 virtual ~PreviewConverterProvider() = default; 37 34 38 class PreviewConverter { 39 WTF_MAKE_FAST_ALLOCATED; 40 WTF_MAKE_NONCOPYABLE(PreviewConverter); 41 public: 42 PreviewConverter(id delegate, const ResourceResponse&, const String& password = { }); 43 PreviewConverter(NSData *, const String& uti, const String& password = { }); 44 45 WEBCORE_EXPORT static bool supportsMIMEType(const String& mimeType); 46 47 QLPreviewConverter *platformConverter() const { return m_platformConverter.get(); } 48 ResourceRequest safeRequest(const ResourceRequest&) const; 49 ResourceRequest previewRequest() const; 50 ResourceResponse previewResponse() const; 51 String previewFileName() const; 52 String previewUTI() const; 53 54 private: 55 RetainPtr<QLPreviewConverter> m_platformConverter; 35 virtual void provideMainResourceForPreviewConverter(PreviewConverter&, CompletionHandler<void(const SharedBuffer*)>&&) = 0; 36 virtual void providePasswordForPreviewConverter(PreviewConverter&, CompletionHandler<void(const String&)>&&) = 0; 56 37 }; 57 38 -
trunk/Source/WebCore/platform/ios/PreviewConverterIOS.mm
r251502 r251623 1 1 /* 2 * Copyright (C) 20 17-2019 Apple Inc. All rights reserved.2 * Copyright (C) 2009-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 27 27 #import "PreviewConverter.h" 28 28 29 #if USE(QUICK_LOOK)29 #if ENABLE(PREVIEW_CONVERTER) && USE(QUICK_LOOK) 30 30 31 #import "PreviewConverterClient.h" 32 #import "PreviewConverterProvider.h" 31 33 #import "QuickLook.h" 34 #import "ResourceError.h" 32 35 #import "ResourceRequest.h" 33 36 #import "ResourceResponse.h" 37 #import "SharedBuffer.h" 34 38 #import <pal/ios/QuickLookSoftLink.h> 35 #import <pal/spi/ios/QuickLookSPI.h> 39 40 @interface WebPreviewConverterDelegate : NSObject 41 - (instancetype)initWithDelegate:(WebCore::PreviewPlatformDelegate&)delegate; 42 @end 43 44 @implementation WebPreviewConverterDelegate { 45 WeakPtr<WebCore::PreviewPlatformDelegate> _delegate; 46 } 47 48 - (instancetype)initWithDelegate:(WebCore::PreviewPlatformDelegate&)delegate 49 { 50 if (!(self = [super init])) 51 return nil; 52 53 _delegate = makeWeakPtr(delegate); 54 return self; 55 } 56 57 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived 58 { 59 ASSERT_UNUSED(connection, !connection); 60 ASSERT_UNUSED(lengthReceived, lengthReceived >= 0); 61 ASSERT(data.length == static_cast<NSUInteger>(lengthReceived)); 62 if (auto delegate = _delegate.get()) 63 delegate->delegateDidReceiveData(WebCore::SharedBuffer::create(data).get()); 64 } 65 66 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 67 { 68 ASSERT_UNUSED(connection, !connection); 69 if (auto delegate = _delegate.get()) 70 delegate->delegateDidFinishLoading(); 71 } 72 73 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 74 { 75 ASSERT_UNUSED(connection, !connection); 76 if (auto delegate = _delegate.get()) 77 delegate->delegateDidFailWithError(error); 78 } 79 80 @end 36 81 37 82 namespace WebCore { 38 83 39 static NSDictionary *optionsWithPassword(const String& password) 40 { 41 if (password.isNull()) 42 return nil; 43 44 return @{ (NSString *)PAL::get_QuickLook_kQLPreviewOptionPasswordKey() : password }; 45 } 46 47 PreviewConverter::PreviewConverter(id delegate, const ResourceResponse& response, const String& password) 48 : m_platformConverter { adoptNS([PAL::allocQLPreviewConverterInstance() initWithConnection:nil delegate:delegate response:response.nsURLResponse() options:optionsWithPassword(password)]) } 84 PreviewConverter::PreviewConverter(const ResourceResponse& response, PreviewConverterProvider& provider) 85 : m_previewData { SharedBuffer::create() } 86 , m_originalResponse { response } 87 , m_provider { makeWeakPtr(provider) } 88 , m_platformDelegate { adoptNS([[WebPreviewConverterDelegate alloc] initWithDelegate:*this]) } 89 , m_platformConverter { adoptNS([PAL::allocQLPreviewConverterInstance() initWithConnection:nil delegate:m_platformDelegate.get() response:m_originalResponse.nsURLResponse() options:nil]) } 49 90 { 50 91 } 51 92 52 PreviewConverter::PreviewConverter(NSData *data, const String& uti, const String& password) 53 : m_platformConverter { adoptNS([PAL::allocQLPreviewConverterInstance() initWithData:data name:nil uti:uti options:optionsWithPassword(password)]) } 93 HashSet<String, ASCIICaseInsensitiveHash> PreviewConverter::platformSupportedMIMETypes() 54 94 { 55 } 56 57 bool PreviewConverter::supportsMIMEType(const String& mimeType) 58 { 59 if (equalLettersIgnoringASCIICase(mimeType, "text/html") || equalLettersIgnoringASCIICase(mimeType, "text/plain")) 60 return false; 61 62 static std::once_flag onceFlag; 63 static NeverDestroyed<HashSet<String, ASCIICaseInsensitiveHash>> supportedMIMETypes; 64 std::call_once(onceFlag, [] { 65 for (NSString *mimeType in QLPreviewGetSupportedMIMETypesSet()) 66 supportedMIMETypes->add(mimeType); 67 }); 68 69 if (mimeType.isNull()) 70 return false; 71 72 return supportedMIMETypes->contains(mimeType); 95 HashSet<String, ASCIICaseInsensitiveHash> supportedMIMETypes; 96 for (NSString *mimeType in QLPreviewGetSupportedMIMETypesSet()) 97 supportedMIMETypes.add(mimeType); 98 return supportedMIMETypes; 73 99 } 74 100 … … 78 104 } 79 105 80 ResourceRe quest PreviewConverter::previewRequest() const106 ResourceResponse PreviewConverter::platformPreviewResponse() const 81 107 { 82 return [m_platformConverter previewRequest]; 83 } 84 85 ResourceResponse PreviewConverter::previewResponse() const 86 { 87 return [m_platformConverter previewResponse]; 108 ResourceResponse response { [m_platformConverter previewResponse] }; 109 ASSERT(response.url().protocolIs(QLPreviewProtocol)); 110 return response; 88 111 } 89 112 … … 98 121 } 99 122 123 void PreviewConverter::platformAppend(const SharedBufferDataView& data) 124 { 125 [m_platformConverter appendData:data.createNSData().get()]; 126 } 127 128 void PreviewConverter::platformFinishedAppending() 129 { 130 [m_platformConverter finishedAppendingData]; 131 } 132 133 void PreviewConverter::platformFailedAppending() 134 { 135 [m_platformConverter finishConverting]; 136 } 137 138 bool PreviewConverter::isPlatformPasswordError(const ResourceError& error) const 139 { 140 return error.errorCode() == kQLReturnPasswordProtected && error.domain() == "QuickLookErrorDomain"; 141 } 142 143 static NSDictionary *optionsWithPassword(const String& password) 144 { 145 if (password.isNull()) 146 return nil; 147 148 return @{ (NSString *)PAL::get_QuickLook_kQLPreviewOptionPasswordKey() : password }; 149 } 150 151 void PreviewConverter::platformUnlockWithPassword(const String& password) 152 { 153 m_platformConverter = adoptNS([PAL::allocQLPreviewConverterInstance() initWithConnection:nil delegate:m_platformDelegate.get() response:m_originalResponse.nsURLResponse() options:optionsWithPassword(password)]); 154 } 155 100 156 } // namespace WebCore 101 157 102 #endif // USE(QUICK_LOOK)158 #endif // ENABLE(PREVIEW_CONVERTER) && USE(QUICK_LOOK) -
trunk/Source/WebCore/platform/ios/QuickLook.mm
r250738 r251623 29 29 #if USE(QUICK_LOOK) 30 30 31 #import "PreviewConverter.h"32 31 #import "ResourceRequest.h" 33 32 #import <pal/ios/QuickLookSoftLink.h> … … 84 83 RetainPtr<NSString> uti = adoptNS(PAL::softLink_QuickLook_QLTypeCopyUTIForURLAndMimeType(url, updatedMIMEType.get())); 85 84 86 auto converter = makeUnique<PreviewConverter>(data, uti.get());87 ResourceRequest previewRequest = converter->previewRequest();85 auto converter = adoptNS([PAL::allocQLPreviewConverterInstance() initWithData:data name:nil uti:uti.get() options:nil]); 86 ResourceRequest previewRequest = [converter previewRequest]; 88 87 89 88 // We use [request URL] here instead of url since it will be 90 89 // the URL that the WebDataSource will see during -dealloc. 91 addQLPreviewConverterWithFileForURL(previewRequest.url(), converter ->platformConverter(), nil);90 addQLPreviewConverterWithFileForURL(previewRequest.url(), converter.get(), nil); 92 91 93 92 return previewRequest.nsURLRequest(HTTPBodyUpdatePolicy::DoNotUpdateHTTPBody);
Note: See TracChangeset
for help on using the changeset viewer.