Changeset 211398 in webkit


Ignore:
Timestamp:
Jan 30, 2017 5:54:02 PM (7 years ago)
Author:
aestes@apple.com
Message:

[QuickLook] QLPreviewConverter and QuickLookHandle have different lifetime requirements
https://bugs.webkit.org/show_bug.cgi?id=167609

Reviewed by Andreas Kling.

Currently, QuickLookHandles are owned by DocumentLoader so that the underlying
QLPreviewConverter stays alive to service subresource requests. However, the QuickLookHandle
itself only needs to live long enough to handle the main resource load. And in a follow-on
patch we will need to create QLPreviewConverters independent of QuickLookHandle.

This patch moves ownership of QuickLookHandle from DocumentLoader to ResourceLoader. It also
creates a C++ wrapper around QLPreviewConverter and teaches QuickLookHandle to transfer
ownership of the wrapper to DocumentLoader once the main resource conversion is complete.

No change in behavior. Covered by existing tests.

  • WebCore.xcodeproj/project.pbxproj: Added PreviewConverter.{h,mm}.
  • loader/DocumentLoader.cpp:

(WebCore::DocumentLoader::setPreviewConverter): Renamed from setQuickLookHandle().
(WebCore::DocumentLoader::previewConverter): Renamed from quickLookHandle().
(WebCore::DocumentLoader::setQuickLookHandle): Renamed to setPreviewConverter().

  • loader/DocumentLoader.h:

(WebCore::DocumentLoader::quickLookHandle): Renamed to quickLookHandle().

  • loader/ResourceLoader.cpp:

(WebCore::ResourceLoader::willSendRequestInternal): Changed to call PreviewConverter::safeRequest().
(WebCore::ResourceLoader::isQuickLookResource): Changed to check if m_quickLookHandle is null.
(WebCore::ResourceLoader::didCreateQuickLookHandle): Deleted.

  • loader/ResourceLoader.h:
  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::shouldCreateQuickLookHandleForResponse): Changed to access m_quickLookHandle.
(WebCore::SubresourceLoader::didReceiveResponse): Ditto.
(WebCore::SubresourceLoader::didReceiveData): Ditto.
(WebCore::SubresourceLoader::didReceiveBuffer): Ditto.
(WebCore::SubresourceLoader::didFinishLoading): Ditto.
(WebCore::SubresourceLoader::didFail): Ditto.

  • loader/cache/CachedRawResource.cpp:

(WebCore::CachedRawResource::finishLoading): Wrapped the call to ResourceLoader::isQuickLookResource() in USE(QUICK_LOOK).

  • loader/ios/QuickLook.h: Renamed m_converter to m_previewLoader.
  • loader/ios/QuickLook.mm: Renamed WebPreviewConverter to WebPreviewLoader.

(WebCore::registerQLPreviewConverterIfNeeded): Created a PreviewConverter instead of a QLPreviewConverter.
(-[WebPreviewLoader initWithResourceLoader:resourceResponse:quickLookHandle:]): Ditto.
(-[WebPreviewLoader appendDataArray:]): Accessed the QLPreviewConverter from the PreviewConverter.
(-[WebPreviewLoader finishedAppending]): Ditto.
(-[WebPreviewLoader failed]): Ditto.
(-[WebPreviewLoader converter]): Renamed from platformConverter. Returns a pointer to the PreviewConverter.
(-[WebPreviewLoader _sendDidReceiveResponseIfNecessary]): Moved _converter to DocumentLoader.
(-[WebPreviewLoader connection:didFailWithError:]): Created a PreviewConverter instead of a QLPreviewConverter.
(WebCore::QuickLookHandle::QuickLookHandle): Called FrameLoaderClient::didCreateQuickLookHandle() instead of going through FrameLoader.
(WebCore::QuickLookHandle::didReceiveData): Renamed m_converter to m_previewLoader.
(WebCore::QuickLookHandle::didReceiveBuffer): Ditto.
(WebCore::QuickLookHandle::didFinishLoading): Ditto.
(WebCore::QuickLookHandle::didFail): Ditto.
(WebCore::QuickLookHandle::setClient): Ditto.
(WebCore::QuickLookHandle::previewFileName): Ditto.
(WebCore::QuickLookHandle::previewUTI): Ditto.
(WebCore::QuickLookHandle::willSendRequest): Deleted.

  • platform/ios/QuickLookSoftLink.h: Removed soft-linking of QLPreviewConverter and kQLPreviewOptionPasswordKey.
  • platform/ios/QuickLookSoftLink.mm: Ditto.
  • platform/network/ios/PreviewConverter.h: Added.

(WebCore::PreviewConverter::platformConverter): Added. Returns the underlying QLPreviewConverter.

  • platform/network/ios/PreviewConverter.mm: Added.

(WebCore::optionsWithPassword): Creates a dictionary with the kQLPreviewOptionPasswordKey option set if password is non-null.
(WebCore::PreviewConverter::PreviewConverter): Added constructors for the delegate/response and data/uti cases.
(WebCore::PreviewConverter::safeRequest): Wraps -[QLPreviewConverter safeRequestForRequest:].
(WebCore::PreviewConverter::previewRequest): Wraps -[QLPreviewConverter previewRequest].
(WebCore::PreviewConverter::previewResponse): Wraps -[QLPreviewConverter previewResponse].
(WebCore::PreviewConverter::previewFileName): Wraps -[QLPreviewConverter previewFileName].
(WebCore::PreviewConverter::previewUTI): Wraps -[QLPreviewConverter previewUTI].

Location:
trunk/Source/WebCore
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r211395 r211398  
     12017-01-30  Andy Estes  <aestes@apple.com>
     2
     3        [QuickLook] QLPreviewConverter and QuickLookHandle have different lifetime requirements
     4        https://bugs.webkit.org/show_bug.cgi?id=167609
     5
     6        Reviewed by Andreas Kling.
     7       
     8        Currently, QuickLookHandles are owned by DocumentLoader so that the underlying
     9        QLPreviewConverter stays alive to service subresource requests. However, the QuickLookHandle
     10        itself only needs to live long enough to handle the main resource load. And in a follow-on
     11        patch we will need to create QLPreviewConverters independent of QuickLookHandle.
     12
     13        This patch moves ownership of QuickLookHandle from DocumentLoader to ResourceLoader. It also
     14        creates a C++ wrapper around QLPreviewConverter and teaches QuickLookHandle to transfer
     15        ownership of the wrapper to DocumentLoader once the main resource conversion is complete.
     16
     17        No change in behavior. Covered by existing tests.
     18
     19        * WebCore.xcodeproj/project.pbxproj: Added PreviewConverter.{h,mm}.
     20        * loader/DocumentLoader.cpp:
     21        (WebCore::DocumentLoader::setPreviewConverter): Renamed from setQuickLookHandle().
     22        (WebCore::DocumentLoader::previewConverter): Renamed from quickLookHandle().
     23        (WebCore::DocumentLoader::setQuickLookHandle): Renamed to setPreviewConverter().
     24        * loader/DocumentLoader.h:
     25        (WebCore::DocumentLoader::quickLookHandle): Renamed to quickLookHandle().
     26        * loader/ResourceLoader.cpp:
     27        (WebCore::ResourceLoader::willSendRequestInternal): Changed to call PreviewConverter::safeRequest().
     28        (WebCore::ResourceLoader::isQuickLookResource): Changed to check if m_quickLookHandle is null.
     29        (WebCore::ResourceLoader::didCreateQuickLookHandle): Deleted.
     30        * loader/ResourceLoader.h:
     31        * loader/SubresourceLoader.cpp:
     32        (WebCore::SubresourceLoader::shouldCreateQuickLookHandleForResponse): Changed to access m_quickLookHandle.
     33        (WebCore::SubresourceLoader::didReceiveResponse): Ditto.
     34        (WebCore::SubresourceLoader::didReceiveData): Ditto.
     35        (WebCore::SubresourceLoader::didReceiveBuffer): Ditto.
     36        (WebCore::SubresourceLoader::didFinishLoading): Ditto.
     37        (WebCore::SubresourceLoader::didFail): Ditto.
     38        * loader/cache/CachedRawResource.cpp:
     39        (WebCore::CachedRawResource::finishLoading): Wrapped the call to ResourceLoader::isQuickLookResource() in USE(QUICK_LOOK).
     40        * loader/ios/QuickLook.h: Renamed m_converter to m_previewLoader.
     41        * loader/ios/QuickLook.mm: Renamed WebPreviewConverter to WebPreviewLoader.
     42        (WebCore::registerQLPreviewConverterIfNeeded): Created a PreviewConverter instead of a QLPreviewConverter.
     43        (-[WebPreviewLoader initWithResourceLoader:resourceResponse:quickLookHandle:]): Ditto.
     44        (-[WebPreviewLoader appendDataArray:]): Accessed the QLPreviewConverter from the PreviewConverter.
     45        (-[WebPreviewLoader finishedAppending]): Ditto.
     46        (-[WebPreviewLoader failed]): Ditto.
     47        (-[WebPreviewLoader converter]): Renamed from platformConverter. Returns a pointer to the PreviewConverter.
     48        (-[WebPreviewLoader _sendDidReceiveResponseIfNecessary]): Moved _converter to DocumentLoader.
     49        (-[WebPreviewLoader connection:didFailWithError:]): Created a PreviewConverter instead of a QLPreviewConverter.
     50        (WebCore::QuickLookHandle::QuickLookHandle): Called FrameLoaderClient::didCreateQuickLookHandle() instead of going through FrameLoader.
     51        (WebCore::QuickLookHandle::didReceiveData): Renamed m_converter to m_previewLoader.
     52        (WebCore::QuickLookHandle::didReceiveBuffer): Ditto.
     53        (WebCore::QuickLookHandle::didFinishLoading): Ditto.
     54        (WebCore::QuickLookHandle::didFail): Ditto.
     55        (WebCore::QuickLookHandle::setClient): Ditto.
     56        (WebCore::QuickLookHandle::previewFileName): Ditto.
     57        (WebCore::QuickLookHandle::previewUTI): Ditto.
     58        (WebCore::QuickLookHandle::willSendRequest): Deleted.
     59        * platform/ios/QuickLookSoftLink.h: Removed soft-linking of QLPreviewConverter and kQLPreviewOptionPasswordKey.
     60        * platform/ios/QuickLookSoftLink.mm: Ditto.
     61        * platform/network/ios/PreviewConverter.h: Added.
     62        (WebCore::PreviewConverter::platformConverter): Added. Returns the underlying QLPreviewConverter.
     63        * platform/network/ios/PreviewConverter.mm: Added.
     64        (WebCore::optionsWithPassword): Creates a dictionary with the kQLPreviewOptionPasswordKey option set if password is non-null.
     65        (WebCore::PreviewConverter::PreviewConverter): Added constructors for the delegate/response and data/uti cases.
     66        (WebCore::PreviewConverter::safeRequest): Wraps -[QLPreviewConverter safeRequestForRequest:].
     67        (WebCore::PreviewConverter::previewRequest): Wraps -[QLPreviewConverter previewRequest].
     68        (WebCore::PreviewConverter::previewResponse): Wraps -[QLPreviewConverter previewResponse].
     69        (WebCore::PreviewConverter::previewFileName): Wraps -[QLPreviewConverter previewFileName].
     70        (WebCore::PreviewConverter::previewUTI): Wraps -[QLPreviewConverter previewUTI].
     71
    1722017-01-30  Chris Dumez  <cdumez@apple.com>
    273
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r211313 r211398  
    39673967                A1BF6B821AA96C7D00AF4A8A /* MockContentFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1BF6B801AA96C7D00AF4A8A /* MockContentFilter.cpp */; };
    39683968                A1BF6B831AA96C7D00AF4A8A /* MockContentFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A1BF6B811AA96C7D00AF4A8A /* MockContentFilter.h */; };
     3969                A1C150791E3F2B3E0032C98C /* PreviewConverter.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1C150771E3F2B3E0032C98C /* PreviewConverter.mm */; };
     3970                A1C1507A1E3F2B3E0032C98C /* PreviewConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A1C150781E3F2B3E0032C98C /* PreviewConverter.h */; };
    39693971                A1C7FAA2133A5D3500D6732D /* JSXPathResultCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1C7FAA1133A5D3500D6732D /* JSXPathResultCustom.cpp */; };
    39703972                A1DE712D18612AC100734192 /* TouchEvents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1DE712B18612AC100734192 /* TouchEvents.cpp */; };
     
    1167711679                A1BF6B801AA96C7D00AF4A8A /* MockContentFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockContentFilter.cpp; sourceTree = "<group>"; };
    1167811680                A1BF6B811AA96C7D00AF4A8A /* MockContentFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockContentFilter.h; sourceTree = "<group>"; };
     11681                A1C150771E3F2B3E0032C98C /* PreviewConverter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PreviewConverter.mm; sourceTree = "<group>"; };
     11682                A1C150781E3F2B3E0032C98C /* PreviewConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewConverter.h; sourceTree = "<group>"; };
    1167911683                A1C7FAA1133A5D3500D6732D /* JSXPathResultCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSXPathResultCustom.cpp; sourceTree = "<group>"; };
    1168011684                A1DE712B18612AC100734192 /* TouchEvents.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TouchEvents.cpp; sourceTree = "<group>"; };
     
    1693716941                                443F04260E75C8FB007E5407 /* NetworkStateNotifierIOS.mm */,
    1693816942                                A10DBF4618F92317000D70C6 /* QuickLookHandleClient.h */,
     16943                                A1C150781E3F2B3E0032C98C /* PreviewConverter.h */,
     16944                                A1C150771E3F2B3E0032C98C /* PreviewConverter.mm */,
    1693916945                                7E428CE413E3407F003B661C /* ResourceHandleIOS.mm */,
    1694016946                                7E7DE201195CEFCD0035363B /* ResourceRequestIOS.mm */,
     
    2855528561                                E1F1E8300C3C2BB9006DB391 /* XSLTExtensions.h in Headers */,
    2855628562                                93F199ED08245E59001E9ABC /* XSLTProcessor.h in Headers */,
     28563                                A1C1507A1E3F2B3E0032C98C /* PreviewConverter.h in Headers */,
    2855728564                                E1BE512E0CF6C512002EA959 /* XSLTUnicodeSort.h in Headers */,
    2855828565                                977E2E0F12F0FC9C00C13379 /* XSSAuditor.h in Headers */,
     
    2934929356                                45FEA5CF156DDE8C00654101 /* Decimal.cpp in Sources */,
    2935029357                                A8C228A211D5722E00D5A7D3 /* DecodedDataDocumentParser.cpp in Sources */,
     29358                                A1C150791E3F2B3E0032C98C /* PreviewConverter.mm in Sources */,
    2935129359                                4162A450101145AE00DFF3ED /* DedicatedWorkerGlobalScope.cpp in Sources */,
    2935229360                                41A3D58E101C152D00316D07 /* DedicatedWorkerThread.cpp in Sources */,
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r210859 r211398  
    8787
    8888#if USE(QUICK_LOOK)
     89#include "PreviewConverter.h"
    8990#include "QuickLook.h"
    9091#endif
     
    17231724#if USE(QUICK_LOOK)
    17241725
    1725 void DocumentLoader::setQuickLookHandle(std::unique_ptr<QuickLookHandle> quickLookHandle)
    1726 {
    1727     m_quickLookHandle = WTFMove(quickLookHandle);
     1726void DocumentLoader::setPreviewConverter(std::unique_ptr<PreviewConverter>&& previewConverter)
     1727{
     1728    m_previewConverter = WTFMove(previewConverter);
     1729}
     1730
     1731PreviewConverter* DocumentLoader::previewConverter() const
     1732{
     1733    return m_previewConverter.get();
    17281734}
    17291735
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r211097 r211398  
    7171class IconLoader;
    7272class Page;
    73 class QuickLookHandle;
     73class PreviewConverter;
    7474class ResourceLoader;
    7575class SharedBuffer;
     
    272272
    273273#if USE(QUICK_LOOK)
    274     WEBCORE_EXPORT void setQuickLookHandle(std::unique_ptr<QuickLookHandle>);
    275     QuickLookHandle* quickLookHandle() const { return m_quickLookHandle.get(); }
     274    void setPreviewConverter(std::unique_ptr<PreviewConverter>&&);
     275    PreviewConverter* previewConverter() const;
    276276#endif
    277277
     
    464464
    465465#if USE(QUICK_LOOK)
    466     std::unique_ptr<QuickLookHandle> m_quickLookHandle;
     466    std::unique_ptr<PreviewConverter> m_previewConverter;
    467467#endif
    468468
  • trunk/Source/WebCore/loader/ResourceLoader.cpp

    r211301 r211398  
    5757
    5858#if USE(QUICK_LOOK)
     59#include "PreviewConverter.h"
    5960#include "QuickLook.h"
    6061#endif
     
    377378
    378379#if USE(QUICK_LOOK)
    379     if (auto quickLookHandle = m_documentLoader->quickLookHandle())
    380         quickLookHandle->willSendRequest(request);
     380    if (auto previewConverter = m_documentLoader->previewConverter())
     381        request = previewConverter->safeRequest(request);
    381382#endif
    382383
     
    742743
    743744#if USE(QUICK_LOOK)
    744 void ResourceLoader::didCreateQuickLookHandle(QuickLookHandle& handle)
    745 {
    746     m_isQuickLookResource = true;
    747     frameLoader()->client().didCreateQuickLookHandle(handle);
     745bool ResourceLoader::isQuickLookResource() const
     746{
     747    return !!m_quickLookHandle;
    748748}
    749749#endif
  • trunk/Source/WebCore/loader/ResourceLoader.h

    r210835 r211398  
    118118
    119119#if USE(QUICK_LOOK)
    120     void didCreateQuickLookHandle(QuickLookHandle&);
    121 #endif
    122     bool isQuickLookResource() { return m_isQuickLookResource; }
     120    bool isQuickLookResource() const;
     121#endif
    123122
    124123    const URL& url() const { return m_request.url(); }
     
    175174    ResourceResponse m_response;
    176175    LoadTiming m_loadTiming;
     176#if USE(QUICK_LOOK)
     177    std::unique_ptr<QuickLookHandle> m_quickLookHandle;
     178#endif
    177179
    178180private:
     
    231233    ResourceRequest m_deferredRequest;
    232234    ResourceLoaderOptions m_options;
    233     bool m_isQuickLookResource { false };
    234235
    235236#if ENABLE(CONTENT_EXTENSIONS)
  • trunk/Source/WebCore/loader/SubresourceLoader.cpp

    r211301 r211398  
    263263        return false;
    264264
    265     if (m_documentLoader->quickLookHandle())
     265    if (m_quickLookHandle)
    266266        return false;
    267267
     
    278278#if USE(QUICK_LOOK)
    279279    if (shouldCreateQuickLookHandleForResponse(response)) {
    280         m_documentLoader->setQuickLookHandle(QuickLookHandle::create(*this, response));
     280        m_quickLookHandle = QuickLookHandle::create(*this, response);
    281281        return;
    282282    }
     
    357357{
    358358#if USE(QUICK_LOOK)
    359     if (auto quickLookHandle = m_documentLoader->quickLookHandle()) {
     359    if (auto quickLookHandle = m_quickLookHandle.get()) {
    360360        if (quickLookHandle->didReceiveData(data, length))
    361361            return;
     
    369369{
    370370#if USE(QUICK_LOOK)
    371     if (auto quickLookHandle = m_documentLoader->quickLookHandle()) {
     371    if (auto quickLookHandle = m_quickLookHandle.get()) {
    372372        if (quickLookHandle->didReceiveBuffer(buffer.get()))
    373373            return;
     
    514514{
    515515#if USE(QUICK_LOOK)
    516     if (auto quickLookHandle = m_documentLoader->quickLookHandle()) {
     516    if (auto quickLookHandle = m_quickLookHandle.get()) {
    517517        if (quickLookHandle->didFinishLoading())
    518518            return;
     
    565565{
    566566#if USE(QUICK_LOOK)
    567     if (auto quickLookHandle = m_documentLoader->quickLookHandle())
     567    if (auto quickLookHandle = m_quickLookHandle.get())
    568568        quickLookHandle->didFail();
    569569#endif
  • trunk/Source/WebCore/loader/cache/CachedRawResource.cpp

    r206903 r211398  
    9898    }
    9999
     100#if USE(QUICK_LOOK)
    100101    m_allowEncodedDataReplacement = !m_loader->isQuickLookResource();
     102#endif
    101103
    102104    CachedResource::finishLoading(data);
  • trunk/Source/WebCore/loader/ios/QuickLook.h

    r211355 r211398  
    2828#if USE(QUICK_LOOK)
    2929
    30 #include <objc/objc.h>
    3130#include <wtf/Forward.h>
    3231#include <wtf/RetainPtr.h>
     
    3736OBJC_CLASS NSURL;
    3837OBJC_CLASS NSURLRequest;
    39 OBJC_CLASS WebPreviewConverter;
     38OBJC_CLASS WebPreviewLoader;
    4039
    4140namespace WebCore {
     
    6059    ~QuickLookHandle();
    6160
    62     void willSendRequest(ResourceRequest&);
    6361    bool didReceiveData(const char* data, unsigned length);
    6462    bool didReceiveBuffer(const SharedBuffer&);
     
    7674    QuickLookHandle(ResourceLoader&, const ResourceResponse&);
    7775
    78     RetainPtr<WebPreviewConverter> m_converter;
     76    RetainPtr<WebPreviewLoader> m_previewLoader;
    7977    bool m_finishedLoadingDataIntoConverter { false };
    8078};
  • trunk/Source/WebCore/loader/ios/QuickLook.mm

    r211355 r211398  
    2929#if USE(QUICK_LOOK)
    3030
     31#import "DocumentLoader.h"
    3132#import "FileSystemIOS.h"
     33#import "FrameLoader.h"
     34#import "FrameLoaderClient.h"
    3235#import "Logging.h"
    3336#import "NSFileManagerSPI.h"
     37#import "PreviewConverter.h"
    3438#import "QuickLookHandleClient.h"
    3539#import "ResourceError.h"
     
    9296        RetainPtr<NSString> uti = adoptNS(QLTypeCopyUTIForURLAndMimeType(url, updatedMIMEType.get()));
    9397
    94         RetainPtr<QLPreviewConverter> converter = adoptNS([allocQLPreviewConverterInstance() initWithData:data name:nil uti:uti.get() options:nil]);
    95         NSURLRequest *request = [converter previewRequest];
     98        auto converter = std::make_unique<PreviewConverter>(data, uti.get());
     99        ResourceRequest previewRequest = converter->previewRequest();
    96100
    97101        // We use [request URL] here instead of url since it will be
    98102        // the URL that the WebDataSource will see during -dealloc.
    99         addQLPreviewConverterWithFileForURL([request URL], converter.get(), nil);
    100 
    101         return request;
     103        addQLPreviewConverterWithFileForURL(previewRequest.url(), converter->platformConverter(), nil);
     104
     105        return previewRequest.nsURLRequest(DoNotUpdateHTTPBody);
    102106    }
    103107
     
    138142}
    139143
    140 @interface WebPreviewConverter : NSObject {
     144@interface WebPreviewLoader : NSObject {
    141145    RefPtr<ResourceLoader> _resourceLoader;
     146    ResourceResponse _response;
    142147    QuickLookHandle* _handle;
    143148    RefPtr<QuickLookHandleClient> _client;
    144     RetainPtr<NSURLResponse> _originalResponse;
    145     RetainPtr<QLPreviewConverter> _platformConverter;
     149    std::unique_ptr<PreviewConverter> _converter;
    146150    RetainPtr<NSMutableArray> _bufferedDataArray;
    147151    BOOL _hasSentDidReceiveResponse;
     
    154158- (void)failed;
    155159
    156 @property (nonatomic, readonly) QLPreviewConverter *platformConverter;
     160@property (nonatomic, readonly) PreviewConverter* converter;
    157161
    158162@end
    159163
    160 @implementation WebPreviewConverter
     164@implementation WebPreviewLoader
    161165
    162166- (instancetype)initWithResourceLoader:(ResourceLoader&)resourceLoader resourceResponse:(const ResourceResponse&)resourceResponse quickLookHandle:(QuickLookHandle&)quickLookHandle
     
    167171
    168172    _resourceLoader = &resourceLoader;
     173    _response = resourceResponse;
    169174    _handle = &quickLookHandle;
    170175    _client = &testingOrEmptyClient();
    171     _originalResponse = resourceResponse.nsURLResponse();
    172     _platformConverter = adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:self response:_originalResponse.get() options:nil]);
     176    _converter = std::make_unique<PreviewConverter>(self, _response);
    173177    _bufferedDataArray = adoptNS([[NSMutableArray alloc] init]);
    174178
    175     LOG(Network, "WebPreviewConverter created with preview file name \"%s\".", [_platformConverter previewFileName]);
     179    LOG(Network, "WebPreviewConverter created with preview file name \"%s\".", _converter->previewFileName().utf8().data());
    176180    return self;
    177181}
     
    186190{
    187191    LOG(Network, "WebPreviewConverter appending data array with count %ld.", dataArray.count);
    188     [_platformConverter appendDataArray:dataArray];
     192    [_converter->platformConverter() appendDataArray:dataArray];
    189193    [_bufferedDataArray addObjectsFromArray:dataArray];
    190194    _client->didReceiveDataArray((CFArrayRef)dataArray);
     
    194198{
    195199    LOG(Network, "WebPreviewConverter finished appending data.");
    196     [_platformConverter finishedAppendingData];
     200    [_converter->platformConverter() finishedAppendingData];
    197201    _client->didFinishLoading();
    198202}
     
    201205{
    202206    LOG(Network, "WebPreviewConverter failed.");
    203     [_platformConverter finishConverting];
     207    [_converter->platformConverter() finishConverting];
    204208    _client->didFail();
    205209}
    206210
    207 - (QLPreviewConverter *)platformConverter
    208 {
    209     return _platformConverter.get();
     211- (PreviewConverter*)converter
     212{
     213    return _converter.get();
    210214}
    211215
     
    217221    [_bufferedDataArray removeAllObjects];
    218222
    219     ResourceResponse response { [_platformConverter previewResponse] };
     223    ResourceResponse response { _converter->previewResponse() };
    220224    response.setIsQuickLook(true);
    221225    ASSERT(response.mimeType().length());
     226
     227    _resourceLoader->documentLoader()->setPreviewConverter(WTFMove(_converter));
    222228
    223229    _hasSentDidReceiveResponse = YES;
     
    264270
    265271    _client->didRequestPassword([retainedSelf = retainPtr(self)] (const String& password) {
    266         NSDictionary *passwordOption = @{ (NSString *)kQLPreviewOptionPasswordKey : password };
    267         auto converterWithPassword = adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:retainedSelf.get() response:retainedSelf->_originalResponse.get() options:passwordOption]);
    268         [converterWithPassword appendDataArray:retainedSelf->_bufferedDataArray.get()];
    269         [converterWithPassword finishedAppendingData];
    270         retainedSelf->_platformConverter = WTFMove(converterWithPassword);
     272        auto converter = std::make_unique<PreviewConverter>(retainedSelf.get(), retainedSelf->_response, password);
     273        QLPreviewConverter *platformConverter = converter->platformConverter();
     274        [platformConverter appendDataArray:retainedSelf->_bufferedDataArray.get()];
     275        [platformConverter finishedAppendingData];
     276        retainedSelf->_converter = WTFMove(converter);
    271277    });
    272278}
     
    319325
    320326QuickLookHandle::QuickLookHandle(ResourceLoader& loader, const ResourceResponse& response)
    321     : m_converter { adoptNS([[WebPreviewConverter alloc] initWithResourceLoader:loader resourceResponse:response quickLookHandle:*this]) }
    322 {
    323     loader.didCreateQuickLookHandle(*this);
     327    : m_previewLoader { adoptNS([[WebPreviewLoader alloc] initWithResourceLoader:loader resourceResponse:response quickLookHandle:*this]) }
     328{
     329    loader.frameLoader()->client().didCreateQuickLookHandle(*this);
    324330}
    325331
     
    339345}
    340346
    341 void QuickLookHandle::willSendRequest(ResourceRequest& request)
    342 {
    343     if (request.url().protocolIs(QLPreviewProtocol()))
    344         request = [[m_converter platformConverter] safeRequestForRequest:request.nsURLRequest(DoNotUpdateHTTPBody)];
    345 }
    346 
    347347bool QuickLookHandle::didReceiveData(const char* data, unsigned length)
    348348{
     
    350350        return false;
    351351
    352     [m_converter appendDataArray:@[ [NSData dataWithBytes:data length:length] ]];
     352    [m_previewLoader appendDataArray:@[ [NSData dataWithBytes:data length:length] ]];
    353353    return true;
    354354}
     
    359359        return false;
    360360
    361     [m_converter appendDataArray:buffer.createNSDataArray().get()];
     361    [m_previewLoader appendDataArray:buffer.createNSDataArray().get()];
    362362    return true;
    363363}
     
    369369
    370370    m_finishedLoadingDataIntoConverter = true;
    371     [m_converter finishedAppending];
     371    [m_previewLoader finishedAppending];
    372372    return true;
    373373}
     
    375375void QuickLookHandle::didFail()
    376376{
    377     [m_converter failed];
    378     m_converter = nullptr;
     377    [m_previewLoader failed];
     378    m_previewLoader = nullptr;
    379379}
    380380
    381381void QuickLookHandle::setClient(Ref<QuickLookHandleClient>&& client)
    382382{
    383     [m_converter setClient:WTFMove(client)];
     383    [m_previewLoader setClient:WTFMove(client)];
    384384}
    385385
     
    391391String QuickLookHandle::previewFileName() const
    392392{
    393     return [m_converter platformConverter].previewFileName;
     393    return [m_previewLoader converter]->previewFileName();
    394394}
    395395
    396396String QuickLookHandle::previewUTI() const
    397397{
    398     return [m_converter platformConverter].previewUTI;
     398    return [m_previewLoader converter]->previewUTI();
    399399}
    400400
  • trunk/Source/WebCore/platform/ios/QuickLookSoftLink.h

    r210864 r211398  
    3030SOFT_LINK_FRAMEWORK_FOR_HEADER(WebCore, QuickLook)
    3131
    32 SOFT_LINK_CLASS_FOR_HEADER(WebCore, QuickLook, QLPreviewConverter)
    33 
    3432SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, QuickLook, QLPreviewGetSupportedMIMETypes, NSSet *, (), ())
    3533#define QLPreviewGetSupportedMIMETypes softLink_QuickLook_QLPreviewGetSupportedMIMETypes
     
    4442#define QLPreviewScheme get_QuickLook_QLPreviewScheme()
    4543
    46 SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, QuickLook, kQLPreviewOptionPasswordKey, CFStringRef)
    47 #define kQLPreviewOptionPasswordKey get_QuickLook_kQLPreviewOptionPasswordKey()
    48 
    4944#endif // USE(QUICK_LOOK)
  • trunk/Source/WebCore/platform/ios/QuickLookSoftLink.mm

    r210864 r211398  
    3232SOFT_LINK_FRAMEWORK_FOR_SOURCE(WebCore, QuickLook)
    3333
    34 SOFT_LINK_CLASS_FOR_SOURCE(WebCore, QuickLook, QLPreviewConverter)
    35 
    3634SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, QuickLook, QLPreviewGetSupportedMIMETypes, NSSet *, (), ())
    3735SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, QuickLook, QLTypeCopyBestMimeTypeForFileNameAndMimeType, NSString *, (NSString *fileName, NSString *mimeType), (fileName, mimeType))
     
    4139SOFT_LINK_POINTER_FOR_SOURCE(WebCore, QuickLook, QLPreviewScheme, NSString *)
    4240
    43 SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, QuickLook, kQLPreviewOptionPasswordKey, CFStringRef)
    44 
    4541#endif // USE(QUICK_LOOK)
Note: See TracChangeset for help on using the changeset viewer.