Changeset 251623 in webkit


Ignore:
Timestamp:
Oct 25, 2019 6:48:04 PM (4 years ago)
Author:
aestes@apple.com
Message:

[Quick Look] Move the QLPreviewConverter delegate into PreviewConverter and vend a C++ client interface
https://bugs.webkit.org/show_bug.cgi?id=203396

Reviewed by Alex Christensen.

Source/WebCore:

PreviewConverter existed as a thin wrapper around QLPreviewConverter for use by
LegacyPreviewLoader and Quick Look NSData loading in WebKitLegacy. This patch makes two
changes to this arrangement:

  1. The QLPreviewConverter delegate and the bulk of the conversion state machine was moved

into PreviewConverter, which now vends a C++ client interface. LegacyPreviewLoader is now a
client of its PreviewConverter, retaining the responsiility of interacting with the
ResourceLoader and LegacyPreviewLoaderClient.

  1. The Quick Look NSData loading code for WebKitLegacy now uses QLPreviewConverter API

directly rather than creating a PreviewConverter. This code path does not require a delegate
nor any of the other logic in PreviewConverter.

This change also organizes PreviewConverter into a cross-platform .cpp file and an
iOS-specific .mm file for the direct usage of QLPreviewConverter API. LegacyPreviewConverter
was also organized such that it can be changed from .mm to .cpp in a future patch.

No change in behavior. Covered by existing API and layout tests.

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • loader/DocumentLoader.cpp:

(WebCore::DocumentLoader::setPreviewConverter):

  • loader/DocumentLoader.h: Changed m_previewConverter from std::unique_ptr to RefPtr.
  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::didReceiveResponse): Used makeUnique directly instead of
LegacyPreviewLoader::create().

  • loader/ios/LegacyPreviewLoader.h: Privately inherited from PreviewConverterClient and

PreviewConverterProvider and migrated WebPreviewLoader ivars to member variables.

  • loader/ios/LegacyPreviewLoader.mm:

(WebCore::makeClient):
(WebCore::LegacyPreviewLoader::didReceiveBuffer):
(WebCore::LegacyPreviewLoader::didFinishLoading):
(WebCore::LegacyPreviewLoader::didFail):
(WebCore::LegacyPreviewLoader::previewConverterDidStartConverting):
(WebCore::LegacyPreviewLoader::previewConverterDidReceiveData):
(WebCore::LegacyPreviewLoader::previewConverterDidFinishConverting):
(WebCore::LegacyPreviewLoader::previewConverterDidFailUpdating):
(WebCore::LegacyPreviewLoader::previewConverterDidFailConverting):
(WebCore::LegacyPreviewLoader::providePasswordForPreviewConverter):
(WebCore::LegacyPreviewLoader::provideMainResourceForPreviewConverter):
(WebCore::LegacyPreviewLoader::LegacyPreviewLoader):
(WebCore::LegacyPreviewLoader::didReceiveData):
(WebCore::LegacyPreviewLoader::didReceiveResponse):
(testingClient): Deleted.
(emptyClient): Deleted.
(-[WebPreviewLoader initWithResourceLoader:resourceResponse:]): Deleted.
(-[WebPreviewLoader appendDataArray:]): Deleted.
(-[WebPreviewLoader finishedAppending]): Deleted.
(-[WebPreviewLoader failed]): Deleted.
(-[WebPreviewLoader _loadPreviewIfNeeded]): Deleted.
(-[WebPreviewLoader connection:didReceiveData:lengthReceived:]): Deleted.
(-[WebPreviewLoader connectionDidFinishLoading:]): Deleted.
(isQuickLookPasswordError): Deleted.
(-[WebPreviewLoader connection:didFailWithError:]): Deleted.
(WebCore::LegacyPreviewLoader::~LegacyPreviewLoader): Deleted.
(WebCore::LegacyPreviewLoader::create): Deleted.

  • platform/PreviewConverter.cpp: Added.

(WebCore::PreviewConverter::supportsMIMEType):
(WebCore::PreviewConverter::previewResponse const):
(WebCore::PreviewConverter::previewError const):
(WebCore::PreviewConverter::previewData const):
(WebCore::PreviewConverter::updateMainResource):
(WebCore::PreviewConverter::appendFromBuffer):
(WebCore::PreviewConverter::finishUpdating):
(WebCore::PreviewConverter::failedUpdating):
(WebCore::PreviewConverter::hasClient const):
(WebCore::PreviewConverter::addClient):
(WebCore::PreviewConverter::removeClient):
(WebCore::sharedPasswordForTesting):
(WebCore::PreviewConverter::passwordForTesting):
(WebCore::PreviewConverter::setPasswordForTesting):
(WebCore::PreviewConverter::iterateClients):
(WebCore::PreviewConverter::didAddClient):
(WebCore::PreviewConverter::didFailConvertingWithError):
(WebCore::PreviewConverter::didFailUpdating):
(WebCore::PreviewConverter::replayToClient):
(WebCore::PreviewConverter::delegateDidReceiveData):
(WebCore::PreviewConverter::delegateDidFinishLoading):
(WebCore::PreviewConverter::delegateDidFailWithError):

  • platform/PreviewConverter.h:

(WebCore::PreviewConverter::PreviewConverter): Deleted.
(WebCore::PreviewConverter::platformConverter const): Deleted.

  • platform/PreviewConverterClient.h: Copied from Source/WebCore/platform/PreviewConverter.h.
  • platform/PreviewConverterProvider.h: Copied from Source/WebCore/platform/PreviewConverter.h.
  • platform/ios/PreviewConverterIOS.mm:

(-[WebPreviewConverterDelegate initWithDelegate:]):
(-[WebPreviewConverterDelegate connection:didReceiveData:lengthReceived:]):
(-[WebPreviewConverterDelegate connectionDidFinishLoading:]):
(-[WebPreviewConverterDelegate connection:didFailWithError:]):
(WebCore::PreviewConverter::PreviewConverter):
(WebCore::PreviewConverter::platformSupportedMIMETypes):
(WebCore::PreviewConverter::safeRequest const):
(WebCore::PreviewConverter::platformPreviewResponse const):
(WebCore::PreviewConverter::platformAppend):
(WebCore::PreviewConverter::platformFinishedAppending):
(WebCore::PreviewConverter::platformFailedAppending):
(WebCore::PreviewConverter::isPlatformPasswordError const):
(WebCore::optionsWithPassword):
(WebCore::PreviewConverter::platformUnlockWithPassword):
(WebCore::PreviewConverter::supportsMIMEType): Deleted.
(WebCore::PreviewConverter::previewRequest const): Deleted.
(WebCore::PreviewConverter::previewResponse const): Deleted.

  • platform/ios/QuickLook.mm:

(WebCore::registerQLPreviewConverterIfNeeded): Used QLPreviewConverter directly.

Source/WebCore/PAL:

  • pal/spi/ios/QuickLookSPI.h:

Source/WTF:

  • wtf/FeatureDefines.h: Defined ENABLE_PREVIEW_CONVERTER.
Location:
trunk/Source
Files:
1 added
15 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r251518 r251623  
     12019-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
    1102019-10-23  Yusuke Suzuki  <ysuzuki@apple.com>
    211
  • trunk/Source/WTF/wtf/FeatureDefines.h

    r251517 r251623  
    218218#endif
    219219
     220#if !defined(ENABLE_PREVIEW_CONVERTER)
     221#if PLATFORM(IOS)
     222#define ENABLE_PREVIEW_CONVERTER 1
     223#endif
     224#endif
     225
    220226#endif /* PLATFORM(IOS_FAMILY) */
    221227
  • trunk/Source/WebCore/ChangeLog

    r251620 r251623  
     12019-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
    11202019-10-25  Yury Semikhatsky  <yurys@chromium.org>
    2121
  • trunk/Source/WebCore/PAL/ChangeLog

    r251160 r251623  
     12019-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
    1102019-10-15  Peng Liu  <peng.liu6@apple.com>
    211
  • trunk/Source/WebCore/PAL/pal/spi/ios/QuickLookSPI.h

    r233266 r251623  
    4040- (id)initWithConnection:(NSURLConnection *)connection delegate:(id)delegate response:(NSURLResponse *)response options:(NSDictionary *)options;
    4141- (id)initWithData:(NSData *)data name:(NSString *)name uti:(NSString *)uti options:(NSDictionary *)options;
     42- (void)appendData:(NSData *)data;
    4243- (void)appendDataArray:(NSArray *)dataArray;
    4344- (void)finishConverting;
  • trunk/Source/WebCore/Sources.txt

    r251620 r251623  
    17421742platform/PlatformSpeechSynthesizer.cpp
    17431743platform/PlatformStrategies.cpp
     1744platform/PreviewConverter.cpp
    17441745platform/ProcessIdentifier.cpp
    17451746platform/ReferrerPolicy.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r251620 r251623  
    29862986                A19D934B1AA11B1E00B46C24 /* NetworkExtensionContentFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A19D93491AA11B1E00B46C24 /* NetworkExtensionContentFilter.h */; };
    29872987                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 */; };
    29882990                A1AFEDE61F8BFF6D0087013F /* MockPaymentCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = A1AFEDE41F8BFF6D0087013F /* MockPaymentCoordinator.h */; };
    29892991                A1AFEDE71F8BFF6D0087013F /* MockPaymentCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1AFEDE51F8BFF6D0087013F /* MockPaymentCoordinator.cpp */; };
     
    1131511317                A19D93491AA11B1E00B46C24 /* NetworkExtensionContentFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkExtensionContentFilter.h; sourceTree = "<group>"; };
    1131611318                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>"; };
    1131711322                A1AFEDE41F8BFF6D0087013F /* MockPaymentCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockPaymentCoordinator.h; sourceTree = "<group>"; };
    1131811323                A1AFEDE51F8BFF6D0087013F /* MockPaymentCoordinator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MockPaymentCoordinator.cpp; sourceTree = "<group>"; };
     
    2572225727                                ABC128760B33AA6D00C693D5 /* PopupMenuClient.h */,
    2572325728                                BC3BE12A0E98092F00835588 /* PopupMenuStyle.h */,
     25729                                A1ADAF792360EF6C009CB776 /* PreviewConverter.cpp */,
    2572425730                                A1C150781E3F2B3E0032C98C /* PreviewConverter.h */,
     25731                                A1ADAF7B2360FD3D009CB776 /* PreviewConverterClient.h */,
     25732                                A1ADAF7C2360FD3E009CB776 /* PreviewConverterProvider.h */,
    2572525733                                51F645D21FECDBC800B54DED /* ProcessIdentifier.cpp */,
    2572625734                                51F645D31FECDBC800B54DED /* ProcessIdentifier.h */,
     
    3148631494                                C0F2A44113869AAB0066C534 /* preprocessor.pm in Headers */,
    3148731495                                A1C1507A1E3F2B3E0032C98C /* PreviewConverter.h in Headers */,
     31496                                A1ADAF7D2360FD3E009CB776 /* PreviewConverterClient.h in Headers */,
     31497                                A1ADAF7E2360FD3E009CB776 /* PreviewConverterProvider.h in Headers */,
    3148831498                                E4605FEC2166480900E53046 /* PrewarmInformation.h in Headers */,
    3148931499                                B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */,
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r251439 r251623  
    21392139}
    21402140
    2141 void DocumentLoader::setPreviewConverter(std::unique_ptr<PreviewConverter>&& previewConverter)
     2141void DocumentLoader::setPreviewConverter(RefPtr<PreviewConverter>&& previewConverter)
    21422142{
    21432143    m_previewConverter = WTFMove(previewConverter);
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r251409 r251623  
    353353
    354354#if USE(QUICK_LOOK)
    355     void setPreviewConverter(std::unique_ptr<PreviewConverter>&&);
     355    void setPreviewConverter(RefPtr<PreviewConverter>&&);
    356356    PreviewConverter* previewConverter() const;
    357357#endif
     
    592592
    593593#if USE(QUICK_LOOK)
    594     std::unique_ptr<PreviewConverter> m_previewConverter;
     594    RefPtr<PreviewConverter> m_previewConverter;
    595595#endif
    596596
  • trunk/Source/WebCore/loader/SubresourceLoader.cpp

    r251594 r251623  
    335335#if USE(QUICK_LOOK)
    336336    if (shouldCreatePreviewLoaderForResponse(response)) {
    337         m_previewLoader = LegacyPreviewLoader::create(*this, response);
     337        m_previewLoader = makeUnique<LegacyPreviewLoader>(*this, response);
    338338        if (m_previewLoader->didReceiveResponse(response))
    339339            return;
  • trunk/Source/WebCore/loader/ios/LegacyPreviewLoader.h

    r251488 r251623  
    2626#pragma once
    2727
     28#include "PreviewConverterClient.h"
     29#include "PreviewConverterProvider.h"
    2830#include <wtf/Forward.h>
    2931#include <wtf/Noncopyable.h>
    3032#include <wtf/RetainPtr.h>
    31 
    32 OBJC_CLASS WebPreviewLoader;
     33#include <wtf/WeakPtr.h>
    3334
    3435namespace WebCore {
     
    3940class SharedBuffer;
    4041
    41 class LegacyPreviewLoader {
     42class LegacyPreviewLoader final : private PreviewConverterClient, private PreviewConverterProvider {
    4243    WTF_MAKE_FAST_ALLOCATED;
    4344    WTF_MAKE_NONCOPYABLE(LegacyPreviewLoader);
    4445public:
    45     static std::unique_ptr<LegacyPreviewLoader> create(ResourceLoader&, const ResourceResponse&);
     46    LegacyPreviewLoader(ResourceLoader&, const ResourceResponse&);
    4647    ~LegacyPreviewLoader();
    4748
     
    5556
    5657private:
    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;
    5966
    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;
    6175    bool m_finishedLoadingDataIntoConverter { false };
     76    bool m_hasProcessedResponse { false };
     77    bool m_needsToCallDidFinishLoading { false };
     78    bool m_shouldDecidePolicyBeforeLoading;
    6279};
    6380
  • trunk/Source/WebCore/loader/ios/LegacyPreviewLoader.mm

    r251488 r251623  
    3939#import "ResourceLoader.h"
    4040#import "Settings.h"
    41 #import <pal/spi/ios/QuickLookSPI.h>
    4241#import <wtf/NeverDestroyed.h>
    4342
    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
     43namespace WebCore {
    6944
    7045static RefPtr<LegacyPreviewLoaderClient>& testingClient()
     
    8055}
    8156
    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     else
    98         _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;
     57static 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
     66bool 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
     78bool 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
     90void 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
     102void 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);
    163138        }
    164139
    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 { });
    171146        }
    172147    });
    173148}
    174149
    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 {
     150void 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
     169void 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
     186void LegacyPreviewLoader::previewConverterDidFailUpdating(PreviewConverter&)
     187{
     188    if (auto resourceLoader = m_resourceLoader.get())
     189        resourceLoader->didFail(resourceLoader->cannotShowURLError());
     190}
     191
     192void 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
     204void 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
     227void LegacyPreviewLoader::provideMainResourceForPreviewConverter(PreviewConverter& converter, CompletionHandler<void(const SharedBuffer*)>&& completionHandler)
     228{
     229    ASSERT_UNUSED(converter, &converter == m_converter);
     230    completionHandler(m_originalData.ptr());
     231}
     232
     233LegacyPreviewLoader::~LegacyPreviewLoader() = default;
    258234
    259235LegacyPreviewLoader::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() }
    269241{
    270242    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
     247bool LegacyPreviewLoader::didReceiveData(const char* data, unsigned length)
     248{
     249    return didReceiveBuffer(SharedBuffer::create(data, length).get());
    272250}
    273251
    274252bool LegacyPreviewLoader::didReceiveResponse(const ResourceResponse&)
    275253{
    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;
    315255}
    316256
  • trunk/Source/WebCore/platform/PreviewConverter.h

    r251502 r251623  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2017-2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    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>
    2733#include <wtf/RetainPtr.h>
     34#include <wtf/WeakPtr.h>
    2835#include <wtf/text/WTFString.h>
    2936
    30 OBJC_CLASS NSData;
    3137OBJC_CLASS QLPreviewConverter;
     38OBJC_CLASS WebPreviewConverterDelegate;
    3239
    3340namespace WebCore {
    3441
     42class ResourceError;
    3543class ResourceRequest;
    36 class ResourceResponse;
     44class SharedBuffer;
     45class SharedBufferDataView;
     46struct PreviewConverterClient;
     47struct PreviewConverterProvider;
    3748
    38 class PreviewConverter {
     49struct 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
     57class PreviewConverter final : private PreviewPlatformDelegate, public RefCounted<PreviewConverter> {
    3958    WTF_MAKE_FAST_ALLOCATED;
    4059    WTF_MAKE_NONCOPYABLE(PreviewConverter);
    4160public:
    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    }
    4465
    4566    WEBCORE_EXPORT static bool supportsMIMEType(const String& mimeType);
    4667
    47     QLPreviewConverter *platformConverter() const { return m_platformConverter.get(); }
     68    ~PreviewConverter();
     69
    4870    ResourceRequest safeRequest(const ResourceRequest&) const;
    49     ResourceRequest previewRequest() const;
    5071    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&);
    5387
    5488private:
     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;
    55131    RetainPtr<QLPreviewConverter> m_platformConverter;
     132#endif
    56133};
    57134
    58135} // namespace WebCore
     136
     137#endif // ENABLE(PREVIEW_CONVERTER)
  • trunk/Source/WebCore/platform/PreviewConverterClient.h

    r251622 r251623  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #include <objc/objc.h>
    27 #include <wtf/RetainPtr.h>
    28 #include <wtf/text/WTFString.h>
     26#pragma once
    2927
    30 OBJC_CLASS NSData;
    31 OBJC_CLASS QLPreviewConverter;
     28#include <wtf/CompletionHandler.h>
     29#include <wtf/Forward.h>
     30#include <wtf/WeakPtr.h>
    3231
    3332namespace WebCore {
    3433
    35 class ResourceRequest;
    36 class ResourceResponse;
     34class PreviewConverter;
     35class ResourceError;
     36class SharedBuffer;
    3737
    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 = { });
     38struct PreviewConverterClient : CanMakeWeakPtr<PreviewConverterClient> {
     39    virtual ~PreviewConverterClient() = default;
    4440
    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;
    5648};
    5749
  • trunk/Source/WebCore/platform/PreviewConverterProvider.h

    r251622 r251623  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #include <objc/objc.h>
    27 #include <wtf/RetainPtr.h>
    28 #include <wtf/text/WTFString.h>
     26#pragma once
    2927
    30 OBJC_CLASS NSData;
    31 OBJC_CLASS QLPreviewConverter;
     28#include <wtf/WeakPtr.h>
    3229
    3330namespace WebCore {
    3431
    35 class ResourceRequest;
    36 class ResourceResponse;
     32struct PreviewConverterProvider : CanMakeWeakPtr<PreviewConverterProvider> {
     33    virtual ~PreviewConverterProvider() = default;
    3734
    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;
    5637};
    5738
  • trunk/Source/WebCore/platform/ios/PreviewConverterIOS.mm

    r251502 r251623  
    11/*
    2  * Copyright (C) 2017-2019 Apple Inc. All rights reserved.
     2 * Copyright (C) 2009-2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727#import "PreviewConverter.h"
    2828
    29 #if USE(QUICK_LOOK)
     29#if ENABLE(PREVIEW_CONVERTER) && USE(QUICK_LOOK)
    3030
     31#import "PreviewConverterClient.h"
     32#import "PreviewConverterProvider.h"
    3133#import "QuickLook.h"
     34#import "ResourceError.h"
    3235#import "ResourceRequest.h"
    3336#import "ResourceResponse.h"
     37#import "SharedBuffer.h"
    3438#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
    3681
    3782namespace WebCore {
    3883
    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)]) }
     84PreviewConverter::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]) }
    4990{
    5091}
    5192
    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)]) }
     93HashSet<String, ASCIICaseInsensitiveHash> PreviewConverter::platformSupportedMIMETypes()
    5494{
    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;
    7399}
    74100
     
    78104}
    79105
    80 ResourceRequest PreviewConverter::previewRequest() const
     106ResourceResponse PreviewConverter::platformPreviewResponse() const
    81107{
    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;
    88111}
    89112
     
    98121}
    99122
     123void PreviewConverter::platformAppend(const SharedBufferDataView& data)
     124{
     125    [m_platformConverter appendData:data.createNSData().get()];
     126}
     127
     128void PreviewConverter::platformFinishedAppending()
     129{
     130    [m_platformConverter finishedAppendingData];
     131}
     132
     133void PreviewConverter::platformFailedAppending()
     134{
     135    [m_platformConverter finishConverting];
     136}
     137
     138bool PreviewConverter::isPlatformPasswordError(const ResourceError& error) const
     139{
     140    return error.errorCode() == kQLReturnPasswordProtected && error.domain() == "QuickLookErrorDomain";
     141}
     142
     143static NSDictionary *optionsWithPassword(const String& password)
     144{
     145    if (password.isNull())
     146        return nil;
     147   
     148    return @{ (NSString *)PAL::get_QuickLook_kQLPreviewOptionPasswordKey() : password };
     149}
     150
     151void 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
    100156} // namespace WebCore
    101157
    102 #endif // USE(QUICK_LOOK)
     158#endif // ENABLE(PREVIEW_CONVERTER) && USE(QUICK_LOOK)
  • trunk/Source/WebCore/platform/ios/QuickLook.mm

    r250738 r251623  
    2929#if USE(QUICK_LOOK)
    3030
    31 #import "PreviewConverter.h"
    3231#import "ResourceRequest.h"
    3332#import <pal/ios/QuickLookSoftLink.h>
     
    8483        RetainPtr<NSString> uti = adoptNS(PAL::softLink_QuickLook_QLTypeCopyUTIForURLAndMimeType(url, updatedMIMEType.get()));
    8584
    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];
    8887
    8988        // We use [request URL] here instead of url since it will be
    9089        // the URL that the WebDataSource will see during -dealloc.
    91         addQLPreviewConverterWithFileForURL(previewRequest.url(), converter->platformConverter(), nil);
     90        addQLPreviewConverterWithFileForURL(previewRequest.url(), converter.get(), nil);
    9291
    9392        return previewRequest.nsURLRequest(HTTPBodyUpdatePolicy::DoNotUpdateHTTPBody);
Note: See TracChangeset for help on using the changeset viewer.