Changeset 167207 in webkit


Ignore:
Timestamp:
Apr 13, 2014 7:57:33 PM (10 years ago)
Author:
aestes@apple.com
Message:

[QuickLook] Move file system-related code into WebKit
https://bugs.webkit.org/show_bug.cgi?id=131597

Reviewed by Dan Bernstein.

Source/WebCore:

QuickLookHandle should not be responsible for saving a copy of the
original document to disk as it might be running in a process that
either can't write to disk or can only write into a sandboxed
container. To account for this, we need to separate the concern of
quick look conversion from that of original document saving so that
each activity can run in the appropriate process.

Created a new interface between WebCore and WebKit by adding a client
(QuickLookHandleClient) to QuickLookHandle which is notified of incoming
bytes. A new function on FrameLoaderClient tells WebKit when a new
QuickLookHandle is created, giving WebKit the opportunity to register a
handle client. Moved the existing file system-related code as well as
code only needed by WebKit1 in QuickLookHandle into a new WebKit1
QuickLookHandleClient subclass.

  • WebCore.exp.in:
  • WebCore.xcodeproj/project.pbxproj: Made QuickLookHandleClient.h Private.
  • loader/FrameLoaderClient.h:

(WebCore::FrameLoaderClient::didCreateQuickLookHandle): Added.

  • loader/ResourceLoader.cpp:

(WebCore::ResourceLoader::didCreateQuickLookHandle): Called FrameLoaderClient::didCreateQuickLookHandle().

  • loader/ResourceLoader.h:
  • platform/network/ResourceHandle.h: Made m_quickLook a unique_ptr.

(WebCore::ResourceHandle::setQuickLookHandle): Changed to take a unique_ptr.

  • platform/network/ResourceHandleClient.h:

(WebCore::ResourceHandleClient::didCreateQuickLookHandle): Added.

  • platform/network/ios/QuickLook.h: Added m_client, gave m_converter a stronger type, and made m_nsResponse a RetainPtr.

(WebCore::QuickLookHandle::setClient): Added.
(WebCore::QuickLookHandle::firstRequestURL): Added.
(WebCore::QuickLookHandle::converter): Added.

  • platform/network/ios/QuickLook.mm:

(WebCore::registerQLPreviewConverterIfNeeded):
(WebCore::createTemporaryFileForQuickLook): Made non-static.
(WebCore::emptyClient): Returned a shared empty QuickLookHandleClient.
(WebCore::QuickLookHandle::QuickLookHandle): Removed file system and WebKit1-only code.
(WebCore::QuickLookHandle::create): Changed to return a unique_ptr.
(WebCore::QuickLookHandle::nsResponse):
(WebCore::QuickLookHandle::didReceiveDataArray): Removed file system code and called QuickLookHandleClient::didReceiveDataArray() instead.
(WebCore::QuickLookHandle::didReceiveData): Removed file system code and called QuickLookHandleClient::didReceiveData() instead.
(WebCore::QuickLookHandle::didFinishLoading): Removed file system code and called QuickLookHandleClient::didFinishLoading() instead.
(WebCore::QuickLookHandle::didFail): Removed file system and WebKit1-only code, calling QuickLookHandleClient::didFail() instead.
(WebCore::QuickLookHandle::~QuickLookHandle): Removed file system and WebKit1-only code. Cleared our reference to m_client.
(WebCore::QuickLookHandle::previewFileName): Retrieved from m_converter.
(WebCore::QuickLookHandle::previewRequestURL): Ditto.

  • platform/network/ios/QuickLookHandleClient.h: Added.

(WebCore::QuickLookHandleClient::~QuickLookHandleClient):
(WebCore::QuickLookHandleClient::didReceiveDataArray):
(WebCore::QuickLookHandleClient::didReceiveData):
(WebCore::QuickLookHandleClient::didFinishLoading):
(WebCore::QuickLookHandleClient::didFail):

Source/WebKit/mac:

Moved file system and WebKit1-only code from QuickLookHandle into a new
QuickLookHandleClient subclass.

  • WebCoreSupport/WebFrameLoaderClient.h:
  • WebCoreSupport/WebFrameLoaderClient.mm:

Source/WebKit2:

  • WebProcess/Network/WebResourceLoader.h: Made m_quickLookHandle a unique_ptr.
  • WebProcess/ios/WebResourceLoaderIOS.mm:

(WebKit::WebResourceLoader::setUpQuickLookHandleIfNeeded):

Location:
trunk/Source
Files:
1 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r167200 r167207  
     12014-04-13  Andy Estes  <aestes@apple.com>
     2
     3        [QuickLook] Move file system-related code into WebKit
     4        https://bugs.webkit.org/show_bug.cgi?id=131597
     5
     6        Reviewed by Dan Bernstein.
     7
     8        QuickLookHandle should not be responsible for saving a copy of the
     9        original document to disk as it might be running in a process that
     10        either can't write to disk or can only write into a sandboxed
     11        container. To account for this, we need to separate the concern of
     12        quick look conversion from that of original document saving so that
     13        each activity can run in the appropriate process.
     14
     15        Created a new interface between WebCore and WebKit by adding a client
     16        (QuickLookHandleClient) to QuickLookHandle which is notified of incoming
     17        bytes. A new function on FrameLoaderClient tells WebKit when a new
     18        QuickLookHandle is created, giving WebKit the opportunity to register a
     19        handle client. Moved the existing file system-related code as well as
     20        code only needed by WebKit1 in QuickLookHandle into a new WebKit1
     21        QuickLookHandleClient subclass.
     22
     23        * WebCore.exp.in:
     24        * WebCore.xcodeproj/project.pbxproj: Made QuickLookHandleClient.h Private.
     25        * loader/FrameLoaderClient.h:
     26        (WebCore::FrameLoaderClient::didCreateQuickLookHandle): Added.
     27        * loader/ResourceLoader.cpp:
     28        (WebCore::ResourceLoader::didCreateQuickLookHandle): Called FrameLoaderClient::didCreateQuickLookHandle().
     29        * loader/ResourceLoader.h:
     30        * platform/network/ResourceHandle.h: Made m_quickLook a unique_ptr.
     31        (WebCore::ResourceHandle::setQuickLookHandle): Changed to take a unique_ptr.
     32        * platform/network/ResourceHandleClient.h:
     33        (WebCore::ResourceHandleClient::didCreateQuickLookHandle): Added.
     34        * platform/network/ios/QuickLook.h: Added m_client, gave m_converter a stronger type, and made m_nsResponse a RetainPtr.
     35        (WebCore::QuickLookHandle::setClient): Added.
     36        (WebCore::QuickLookHandle::firstRequestURL): Added.
     37        (WebCore::QuickLookHandle::converter): Added.
     38        * platform/network/ios/QuickLook.mm:
     39        (WebCore::registerQLPreviewConverterIfNeeded):
     40        (WebCore::createTemporaryFileForQuickLook): Made non-static.
     41        (WebCore::emptyClient): Returned a shared empty QuickLookHandleClient.
     42        (WebCore::QuickLookHandle::QuickLookHandle): Removed file system and WebKit1-only code.
     43        (WebCore::QuickLookHandle::create): Changed to return a unique_ptr.
     44        (WebCore::QuickLookHandle::nsResponse):
     45        (WebCore::QuickLookHandle::didReceiveDataArray): Removed file system code and called QuickLookHandleClient::didReceiveDataArray() instead.
     46        (WebCore::QuickLookHandle::didReceiveData): Removed file system code and called QuickLookHandleClient::didReceiveData() instead.
     47        (WebCore::QuickLookHandle::didFinishLoading): Removed file system code and called QuickLookHandleClient::didFinishLoading() instead.
     48        (WebCore::QuickLookHandle::didFail): Removed file system and WebKit1-only code, calling QuickLookHandleClient::didFail() instead.
     49        (WebCore::QuickLookHandle::~QuickLookHandle): Removed file system and WebKit1-only code. Cleared our reference to m_client.
     50        (WebCore::QuickLookHandle::previewFileName): Retrieved from m_converter.
     51        (WebCore::QuickLookHandle::previewRequestURL): Ditto.
     52        * platform/network/ios/QuickLookHandleClient.h: Added.
     53        (WebCore::QuickLookHandleClient::~QuickLookHandleClient):
     54        (WebCore::QuickLookHandleClient::didReceiveDataArray):
     55        (WebCore::QuickLookHandleClient::didReceiveData):
     56        (WebCore::QuickLookHandleClient::didFinishLoading):
     57        (WebCore::QuickLookHandleClient::didFail):
     58
    1592014-04-10  Pratik Solanki  <psolanki@apple.com>
    260
  • trunk/Source/WebCore/WebCore.exp.in

    r167172 r167207  
    32193219__ZN7WebCore27qlPreviewConverterUTIForURLEP5NSURL
    32203220__ZN7WebCore30removeQLPreviewConverterForURLEP5NSURL
     3221__ZN7WebCore31createTemporaryFileForQuickLookEP8NSString
    32213222__ZN7WebCore32qlPreviewConverterFileNameForURLEP5NSURL
    32223223__ZN7WebCore33QLPreviewGetSupportedMIMETypesSetEv
    32233224__ZN7WebCore34registerQLPreviewConverterIfNeededEP5NSURLP8NSStringP6NSData
     3225__ZN7WebCore35addQLPreviewConverterWithFileForURLEP5NSURLP11objc_objectP8NSString
     3226__ZNK7WebCore15QuickLookHandle15previewFileNameEv
     3227__ZNK7WebCore15QuickLookHandle17previewRequestURLEv
    32243228#endif
    32253229
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r167145 r167207  
    36083608                A10BB5851484E3A700B2E87A /* RenderSVGRect.h in Headers */ = {isa = PBXBuildFile; fileRef = A10BB5831484E3A700B2E87A /* RenderSVGRect.h */; };
    36093609                A10BB58B1484E3B300B2E87A /* RenderSVGShape.h in Headers */ = {isa = PBXBuildFile; fileRef = A10BB5891484E3B300B2E87A /* RenderSVGShape.h */; };
     3610                A10DBF4718F92317000D70C6 /* QuickLookHandleClient.h in Headers */ = {isa = PBXBuildFile; fileRef = A10DBF4618F92317000D70C6 /* QuickLookHandleClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    36103611                A10DC76A14747BAB005E2471 /* StyleGridData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A10DC76814747BAB005E2471 /* StyleGridData.cpp */; };
    36113612                A10DC76B14747BAB005E2471 /* StyleGridData.h in Headers */ = {isa = PBXBuildFile; fileRef = A10DC76914747BAB005E2471 /* StyleGridData.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1066810669                A10BB5881484E3B300B2E87A /* RenderSVGShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGShape.cpp; sourceTree = "<group>"; };
    1066910670                A10BB5891484E3B300B2E87A /* RenderSVGShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGShape.h; sourceTree = "<group>"; };
     10671                A10DBF4618F92317000D70C6 /* QuickLookHandleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickLookHandleClient.h; sourceTree = "<group>"; };
    1067010672                A10DC76814747BAB005E2471 /* StyleGridData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StyleGridData.cpp; path = style/StyleGridData.cpp; sourceTree = "<group>"; };
    1067110673                A10DC76914747BAB005E2471 /* StyleGridData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StyleGridData.h; path = style/StyleGridData.h; sourceTree = "<group>"; };
     
    1548315485                                442AF7A7102CDDEA008FD4D3 /* QuickLook.h */,
    1548415486                                442AF7A8102CDDEA008FD4D3 /* QuickLook.mm */,
     15487                                A10DBF4618F92317000D70C6 /* QuickLookHandleClient.h */,
    1548515488                                7E428CE413E3407F003B661C /* ResourceHandleIOS.mm */,
    1548615489                                44A20DB80F84166C00B3E1FE /* WebCoreURLResponseIOS.h */,
     
    2580825811                                B2227A570D00BF220071B782 /* SVGParserUtilities.h in Headers */,
    2580925812                                2D3A0E3613A7D76100E85AF0 /* SVGParsingError.h in Headers */,
     25813                                A10DBF4718F92317000D70C6 /* QuickLookHandleClient.h in Headers */,
    2581025814                                84C6784D1214814700A92902 /* SVGPathBlender.h in Headers */,
    2581125815                                8476C9EB11DF6A2900555B02 /* SVGPathBuilder.h in Headers */,
  • trunk/Source/WebCore/loader/FrameLoaderClient.h

    r165676 r167207  
    9898    class Widget;
    9999
     100#if USE(QUICK_LOOK)
     101    class QuickLookHandle;
     102#endif
     103
    100104    typedef std::function<void (PolicyAction)> FramePolicyFunction;
    101105
     
    335339        // FIXME (bug 116233): We need to get rid of EmptyFrameLoaderClient completely, then this will no longer be needed.
    336340        virtual bool isEmptyFrameLoaderClient() { return false; }
     341
     342#if USE(QUICK_LOOK)
     343        virtual void didCreateQuickLookHandle(QuickLookHandle&) { }
     344#endif
    337345    };
    338346
  • trunk/Source/WebCore/loader/ResourceLoader.cpp

    r167183 r167207  
    607607#endif
    608608
    609 }
     609#if USE(QUICK_LOOK)
     610void ResourceLoader::didCreateQuickLookHandle(QuickLookHandle& handle)
     611{
     612    frameLoader()->client().didCreateQuickLookHandle(handle);
     613}
     614#endif
     615
     616}
  • trunk/Source/WebCore/loader/ResourceLoader.h

    r167188 r167207  
    5050class ResourceBuffer;
    5151
     52#if USE(QUICK_LOOK)
     53class QuickLookHandle;
     54#endif
     55
    5256class ResourceLoader : public RefCounted<ResourceLoader>, protected ResourceHandleClient {
    5357public:
     
    147151#endif
    148152
     153#if USE(QUICK_LOOK)
     154    virtual void didCreateQuickLookHandle(QuickLookHandle&) override;
     155#endif
     156
    149157    const URL& url() const { return m_request.url(); }
    150158    ResourceHandle* handle() const { return m_handle.get(); }
  • trunk/Source/WebCore/platform/network/ResourceHandle.h

    r167190 r167207  
    151151#if USE(QUICK_LOOK)
    152152    QuickLookHandle* quickLookHandle() { return m_quickLook.get(); }
    153     void setQuickLookHandle(PassOwnPtr<QuickLookHandle> handle) { m_quickLook = handle; }
     153    void setQuickLookHandle(std::unique_ptr<QuickLookHandle> handle) { m_quickLook = std::move(handle); }
    154154#endif
    155155
     
    293293
    294294#if USE(QUICK_LOOK)
    295     OwnPtr<QuickLookHandle> m_quickLook;
     295    std::unique_ptr<QuickLookHandle> m_quickLook;
    296296#endif
    297297};
  • trunk/Source/WebCore/platform/network/ResourceHandleClient.h

    r165676 r167207  
    5050    class ResourceResponse;
    5151    class SharedBuffer;
     52
     53#if USE(QUICK_LOOK)
     54    class QuickLookHandle;
     55#endif
    5256
    5357    enum CacheStoragePolicy {
     
    125129#endif
    126130
     131#if USE(QUICK_LOOK)
     132        virtual void didCreateQuickLookHandle(QuickLookHandle&) { }
     133#endif
    127134    };
    128135
  • trunk/Source/WebCore/platform/network/ios/QuickLook.h

    r167055 r167207  
    2929#if USE(QUICK_LOOK)
    3030
     31#import "QuickLookHandleClient.h"
    3132#import "ResourceRequest.h"
    3233#import <objc/objc-runtime.h>
    3334#import <wtf/PassOwnPtr.h>
     35#import <wtf/RefPtr.h>
    3436
    35 #ifdef __OBJC__
    36 @class NSData;
    37 @class NSDictionary;
    38 @class NSFileHandle;
    39 @class NSSet;
    40 @class NSString;
    41 @class NSURL;
    42 @class NSURLConnection;
    43 @class NSURLResponse;
    44 #else
    45 class NSData;
    46 class NSDictionary;
    47 class NSFileHandle;
    48 class NSSet;
    49 class NSString;
    50 class NSURL;
    51 class NSURLConnection;
    52 class NSURLResponse;
    53 #endif
     37OBJC_CLASS NSData;
     38OBJC_CLASS NSDictionary;
     39OBJC_CLASS NSFileHandle;
     40OBJC_CLASS NSSet;
     41OBJC_CLASS NSString;
     42OBJC_CLASS NSURL;
     43OBJC_CLASS NSURLConnection;
     44OBJC_CLASS NSURLResponse;
     45OBJC_CLASS QLPreviewConverter;
    5446
    5547#if USE(CFNETWORK)
     
    6052namespace WebCore {
    6153
     54class QuickLookHandleClient;
    6255class ResourceHandle;
    6356class ResourceLoader;
     
    8578const char* QLPreviewProtocol();
    8679
     80NSString *createTemporaryFileForQuickLook(NSString *fileName);
    8781
    8882class QuickLookHandle {
    8983    WTF_MAKE_NONCOPYABLE(QuickLookHandle);
    9084public:
    91     static PassOwnPtr<QuickLookHandle> create(ResourceHandle*, NSURLConnection *, NSURLResponse *, id delegate);
     85    static std::unique_ptr<QuickLookHandle> create(ResourceHandle*, NSURLConnection *, NSURLResponse *, id delegate);
    9286#if USE(CFNETWORK)
    93     static PassOwnPtr<QuickLookHandle> create(ResourceHandle*, SynchronousResourceHandleCFURLConnectionDelegate*, CFURLResponseRef);
     87    static std::unique_ptr<QuickLookHandle> create(ResourceHandle*, SynchronousResourceHandleCFURLConnectionDelegate*, CFURLResponseRef);
    9488#endif
    95     static PassOwnPtr<QuickLookHandle> create(ResourceLoader*, NSURLResponse *, id delegate);
     89    static std::unique_ptr<QuickLookHandle> create(ResourceLoader*, NSURLResponse *, id delegate);
    9690    ~QuickLookHandle();
    9791
     
    106100#endif
    107101
     102    void setClient(PassRefPtr<QuickLookHandleClient> client) { m_client = client; }
     103
     104    NSString *previewFileName() const;
     105    NSURL *firstRequestURL() const { return m_firstRequestURL.get(); }
     106    NSURL *previewRequestURL() const;
     107    QLPreviewConverter *converter() const { return m_converter.get(); }
     108
    108109private:
    109110    QuickLookHandle(NSURL *, NSURLConnection *, NSURLResponse *, id delegate);
    110111
    111112    RetainPtr<NSURL> m_firstRequestURL;
    112     RetainPtr<id> m_converter;
     113    RetainPtr<QLPreviewConverter> m_converter;
    113114    RetainPtr<id> m_delegate;
    114115    bool m_finishedLoadingDataIntoConverter;
    115116    RetainPtr<NSFileHandle *> m_quicklookFileHandle;
    116     NSURLResponse *m_nsResponse;
     117    RetainPtr<NSURLResponse> m_nsResponse;
     118    RefPtr<QuickLookHandleClient> m_client;
    117119};
    118120
  • trunk/Source/WebCore/platform/network/ios/QuickLook.mm

    r167055 r167207  
    196196
    197197        RetainPtr<id> converter = adoptNS([[QLPreviewConverterClass() alloc] initWithData:data name:nil uti:uti.get() options:nil]);
    198         NSURLRequest *request = [converter.get() previewRequest];
     198        NSURLRequest *request = [converter previewRequest];
    199199
    200200        // We use [request URL] here instead of url since it will be
     
    322322namespace WebCore {
    323323
    324 static NSString *createTemporaryFileForQuickLook(NSString *fileName)
     324NSString *createTemporaryFileForQuickLook(NSString *fileName)
    325325{
    326326    NSString *downloadDirectory = createTemporaryDirectory(@"QuickLookContent");
     
    340340}
    341341
     342static inline QuickLookHandleClient* emptyClient()
     343{
     344    static NeverDestroyed<QuickLookHandleClient> emptyClient;
     345    return &emptyClient.get();
     346}
    342347
    343348QuickLookHandle::QuickLookHandle(NSURL *firstRequestURL, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
    344349    : m_firstRequestURL(firstRequestURL)
    345350    , m_converter(adoptNS([[QLPreviewConverterClass() alloc] initWithConnection:connection delegate:delegate response:nsResponse options:nil]))
    346     , m_delegate(adoptNS([delegate retain]))
     351    , m_delegate(delegate)
    347352    , m_finishedLoadingDataIntoConverter(false)
    348     , m_nsResponse([m_converter.get() previewResponse])
    349 {
    350     NSURL *previewRequestURL = [[m_converter.get() previewRequest] URL];
    351     if (!applicationIsMobileSafari()) {
    352         // This keeps the QLPreviewConverter alive to serve any subresource requests.
    353         // It is removed by -[WebDataSource dealloc].
    354         addQLPreviewConverterWithFileForURL(previewRequestURL, m_converter.get(), nil);
    355         return;
    356     }
    357 
    358     // QuickLook consumes the incoming data, we need to store it so that it can be opened in the handling application.
    359     NSString *quicklookContentPath = createTemporaryFileForQuickLook([m_converter.get() previewFileName]);
    360     LOG(Network, "QuickLookHandle::QuickLookHandle() - quicklookContentPath: %s", [quicklookContentPath UTF8String]);
    361 
    362     if (quicklookContentPath) {
    363         m_quicklookFileHandle = adoptNS([[NSFileHandle fileHandleForWritingAtPath:quicklookContentPath] retain]);
    364         // We must use the generated URL from m_converter's NSURLRequest object
    365         // so that it matches the URL removed from -[WebDataSource dealloc].
    366         addQLPreviewConverterWithFileForURL(previewRequestURL, m_converter.get(), quicklookContentPath);
    367     }
    368 }
    369 
    370 PassOwnPtr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
    371 {
    372     if (handle->firstRequest().isMainResourceRequest() && [WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:[nsResponse MIMEType]])
    373         return adoptPtr(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], connection, nsResponse, delegate));
    374 
    375     return nullptr;
     353    , m_nsResponse([m_converter previewResponse])
     354    , m_client(emptyClient())
     355{
     356    LOG(Network, "QuickLookHandle::QuickLookHandle() - previewFileName: %s", [m_converter previewFileName]);
     357}
     358
     359std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
     360{
     361    ASSERT_ARG(handle, handle);
     362    if (!handle->firstRequest().isMainResourceRequest() || ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:[nsResponse MIMEType]])
     363        return nullptr;
     364
     365    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], connection, nsResponse, delegate));
     366    handle->client()->didCreateQuickLookHandle(*quickLookHandle);
     367    return std::move(quickLookHandle);
    376368}
    377369
    378370#if USE(CFNETWORK)
    379 PassOwnPtr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, SynchronousResourceHandleCFURLConnectionDelegate* connectionDelegate, CFURLResponseRef cfResponse)
    380 {
    381     if (handle->firstRequest().isMainResourceRequest() && [WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:(NSString *)CFURLResponseGetMIMEType(cfResponse)]) {
    382         NSURLResponse *nsResponse = [NSURLResponse _responseWithCFURLResponse:cfResponse];
    383         WebQuickLookHandleAsDelegate *delegate = [[[WebQuickLookHandleAsDelegate alloc] initWithConnectionDelegate:connectionDelegate] autorelease];
    384         return adoptPtr(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], nil, nsResponse, delegate));
    385     }
    386 
    387     return nullptr;
     371std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, SynchronousResourceHandleCFURLConnectionDelegate* connectionDelegate, CFURLResponseRef cfResponse)
     372{
     373    ASSERT_ARG(handle, handle);
     374    if (!handle->firstRequest().isMainResourceRequest() || ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:(NSString *)CFURLResponseGetMIMEType(cfResponse)])
     375        return nullptr;
     376
     377    NSURLResponse *nsResponse = [NSURLResponse _responseWithCFURLResponse:cfResponse];
     378    WebQuickLookHandleAsDelegate *delegate = [[[WebQuickLookHandleAsDelegate alloc] initWithConnectionDelegate:connectionDelegate] autorelease];
     379    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], nil, nsResponse, delegate));
     380    handle->client()->didCreateQuickLookHandle(*quickLookHandle);
     381    return std::move(quickLookHandle);
    388382}
    389383
     
    394388#endif
    395389
    396 PassOwnPtr<QuickLookHandle> QuickLookHandle::create(ResourceLoader* loader, NSURLResponse *response, id delegate)
    397 {
    398     if (loader->request().isMainResourceRequest() && [WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:[response MIMEType]])
    399         return adoptPtr(new QuickLookHandle([loader->originalRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], nil, response, delegate));
    400 
    401     return nullptr;
     390std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceLoader* loader, NSURLResponse *response, id delegate)
     391{
     392    ASSERT_ARG(loader, loader);
     393    if (!loader->request().isMainResourceRequest() || ![WebCore::QLPreviewGetSupportedMIMETypesSet() containsObject:[response MIMEType]])
     394        return nullptr;
     395
     396    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([loader->originalRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], nil, response, delegate));
     397    loader->didCreateQuickLookHandle(*quickLookHandle);
     398    return std::move(quickLookHandle);
    402399}
    403400
    404401NSURLResponse *QuickLookHandle::nsResponse()
    405402{
    406     return m_nsResponse;
     403    return m_nsResponse.get();
    407404}
    408405
    409406bool QuickLookHandle::didReceiveDataArray(CFArrayRef cfDataArray)
    410407{
    411     NSArray * const dataArray = (NSArray *)cfDataArray;
    412 
    413408    if (m_finishedLoadingDataIntoConverter)
    414409        return false;
    415410
    416411    LOG(Network, "QuickLookHandle::didReceiveDataArray()");
    417     [m_converter.get() appendDataArray:dataArray];
    418     if (m_quicklookFileHandle) {
    419         for (NSData *data in dataArray)
    420             [m_quicklookFileHandle.get() writeData:data];
    421     }
     412    [m_converter appendDataArray:(NSArray *)cfDataArray];
     413    m_client->didReceiveDataArray(cfDataArray);
    422414    return true;
    423415}
     
    425417bool QuickLookHandle::didReceiveData(CFDataRef cfData)
    426418{
    427     NSData * const data = (NSData *)cfData;
    428 
    429419    if (m_finishedLoadingDataIntoConverter)
    430420        return false;
    431 
    432     LOG(Network, "QuickLookHandle::didReceiveData()");
    433     [m_converter.get() appendData:data];
    434     if (m_quicklookFileHandle)
    435         [m_quicklookFileHandle.get() writeData:data];
    436     return true;
     421   
     422    return didReceiveDataArray(adoptCF(CFArrayCreate(kCFAllocatorDefault, (const void**)&cfData, 1, &kCFTypeArrayCallBacks)).get());
    437423}
    438424
     
    444430    LOG(Network, "QuickLookHandle::didFinishLoading()");
    445431    m_finishedLoadingDataIntoConverter = YES;
    446     [m_converter.get() finishedAppendingData];
    447     if (m_quicklookFileHandle)
    448         [m_quicklookFileHandle.get() closeFile];
     432    [m_converter finishedAppendingData];
     433    m_client->didFinishLoading();
    449434    return true;
    450435}
     
    453438{
    454439    LOG(Network, "QuickLookHandle::didFail()");
    455     m_quicklookFileHandle = nullptr;
    456     // removeQLPreviewConverterForURL deletes the temporary file created.
    457     removeQLPreviewConverterForURL(m_firstRequestURL.get());
    458     [m_converter.get() finishConverting];
     440    m_client->didFail();
     441    [m_converter finishConverting];
    459442    m_converter = nullptr;
    460443}
     
    463446{
    464447    LOG(Network, "QuickLookHandle::~QuickLookHandle()");
    465     if (m_quicklookFileHandle) {
    466         m_quicklookFileHandle = nullptr;
    467         removeQLPreviewConverterForURL(m_firstRequestURL.get());
    468     }
    469448    m_converter = nullptr;
    470449
    471     [m_delegate.get() clearHandle];
     450    [m_delegate clearHandle];
     451}
     452
     453NSString *QuickLookHandle::previewFileName() const
     454{
     455    return [m_converter previewFileName];
     456}
     457
     458NSURL *QuickLookHandle::previewRequestURL() const
     459{
     460    return [[m_converter previewRequest] URL];
    472461}
    473462
  • trunk/Source/WebKit/mac/ChangeLog

    r167074 r167207  
     12014-04-13  Andy Estes  <aestes@apple.com>
     2
     3        [QuickLook] Move file system-related code into WebKit
     4        https://bugs.webkit.org/show_bug.cgi?id=131597
     5
     6        Reviewed by Dan Bernstein.
     7
     8        Moved file system and WebKit1-only code from QuickLookHandle into a new
     9        QuickLookHandleClient subclass.
     10
     11        * WebCoreSupport/WebFrameLoaderClient.h:
     12        * WebCoreSupport/WebFrameLoaderClient.mm:
     13
    1142014-04-09  Alexey Proskuryakov  <ap@apple.com>
    215
  • trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.h

    r165676 r167207  
    239239    virtual bool shouldPaintBrokenImage(const WebCore::URL&) const;
    240240
     241#if USE(QUICK_LOOK)
     242    virtual void didCreateQuickLookHandle(WebCore::QuickLookHandle&) override;
     243#endif
     244
    241245    RetainPtr<WebFrame> m_webFrame;
    242246
  • trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm

    r166853 r167207  
    153153#endif
    154154
     155#if USE(QUICK_LOOK)
     156#import <Foundation/NSFileManager_NSURLExtras.h>
     157#import <WebCore/FileSystemIOS.h>
     158#import <WebCore/QuickLook.h>
     159#import <WebCore/RuntimeApplicationChecksIOS.h>
     160#endif
     161
    155162using namespace WebCore;
    156163using namespace HTMLNames;
     
    23932400#endif
    23942401
     2402#if USE(QUICK_LOOK)
     2403void WebFrameLoaderClient::didCreateQuickLookHandle(WebCore::QuickLookHandle& handle)
     2404{
     2405    class QuickLookDocumentWriter : public WebCore::QuickLookHandleClient {
     2406    public:
     2407        explicit QuickLookDocumentWriter(const WebCore::QuickLookHandle& handle)
     2408            : m_firstRequestURL(handle.firstRequestURL())
     2409        {
     2410            NSURL *previewRequestURL = handle.previewRequestURL();
     2411            if (!applicationIsMobileSafari()) {
     2412                // This keeps the QLPreviewConverter alive to serve any subresource requests.
     2413                // It is removed by -[WebDataSource dealloc].
     2414                addQLPreviewConverterWithFileForURL(previewRequestURL, handle.converter(), nil);
     2415                return;
     2416            }
     2417
     2418            // QuickLook consumes the incoming data, we need to store it so that it can be opened in the handling application.
     2419            NSString *quicklookContentPath = createTemporaryFileForQuickLook(handle.previewFileName());
     2420
     2421            if (quicklookContentPath) {
     2422                m_fileHandle = [NSFileHandle fileHandleForWritingAtPath:quicklookContentPath];
     2423                // previewRequestURL should match the URL removed from -[WebDataSource dealloc].
     2424                addQLPreviewConverterWithFileForURL(previewRequestURL, handle.converter(), quicklookContentPath);
     2425            }
     2426        }
     2427
     2428        virtual ~QuickLookDocumentWriter()
     2429        {
     2430            if (m_fileHandle)
     2431                removeQLPreviewConverterForURL(m_firstRequestURL.get());
     2432        }
     2433
     2434    private:
     2435        RetainPtr<NSFileHandle> m_fileHandle;
     2436        RetainPtr<NSURL> m_firstRequestURL;
     2437
     2438        void didReceiveDataArray(CFArrayRef dataArray) override
     2439        {
     2440            if (m_fileHandle) {
     2441                for (NSData *data in (NSArray *)dataArray)
     2442                    [m_fileHandle writeData:data];
     2443            }
     2444        }
     2445
     2446        void didFinishLoading() override
     2447        {
     2448            [m_fileHandle closeFile];
     2449        }
     2450
     2451        void didFail() override
     2452        {
     2453            m_fileHandle = nil;
     2454            // removeQLPreviewConverterForURL deletes the temporary file created.
     2455            removeQLPreviewConverterForURL(m_firstRequestURL.get());
     2456        }
     2457    };
     2458    handle.setClient(adoptRef(new QuickLookDocumentWriter(handle)));
     2459}
     2460#endif
     2461
    23952462@implementation WebFramePolicyListener
    23962463
  • trunk/Source/WebKit2/ChangeLog

    r167202 r167207  
     12014-04-13  Andy Estes  <aestes@apple.com>
     2
     3        [QuickLook] Move file system-related code into WebKit
     4        https://bugs.webkit.org/show_bug.cgi?id=131597
     5
     6        Reviewed by Dan Bernstein.
     7
     8        * WebProcess/Network/WebResourceLoader.h: Made m_quickLookHandle a unique_ptr.
     9        * WebProcess/ios/WebResourceLoaderIOS.mm:
     10        (WebKit::WebResourceLoader::setUpQuickLookHandleIfNeeded):
     11
    1122014-04-13  Andy Estes  <aestes@apple.com>
    213
  • trunk/Source/WebKit2/WebProcess/Network/WebResourceLoader.h

    r167188 r167207  
    9696    void setUpQuickLookHandleIfNeeded(const WebCore::ResourceResponse&);
    9797
    98     OwnPtr<WebCore::QuickLookHandle> m_quickLookHandle;
     98    std::unique_ptr<WebCore::QuickLookHandle> m_quickLookHandle;
    9999#endif
    100100
Note: See TracChangeset for help on using the changeset viewer.