Title: [210789] trunk/Source
Revision
210789
Author
aes...@apple.com
Date
2017-01-16 14:14:27 -0800 (Mon, 16 Jan 2017)

Log Message

[QuickLook] Do some cleanup in QuickLookHandle
https://bugs.webkit.org/show_bug.cgi?id=166864

Reviewed by Darin Adler.

Source/WebCore:

* loader/ios/QuickLook.h: Stopped including QuickLookHandleClient.h and forward-declared
instead; changed setClient() to take a Ref<QuickLookHandleClient>&&; renamed nsResponse() to
previewResponse(); changed QuickLookHandle() to take a ResourceLoader& and const
ResourceResponse&; gave m_delegate a stronger type; removed unused m_quicklookFileHandle;
initialized m_finishedLoadingDataIntoConverter to false.
(WebCore::QuickLookHandle::firstRequestURL): Stopped exporting.
(WebCore::QuickLookHandle::setClient): Moved definition out-of-line.
* loader/ios/QuickLook.mm: Renamed WebResourceLoaderQuickLookDelegate to
WebPreviewConverterDelegate and stopped conforming to NSURLConnectionDelegate and
WebCoreResourceLoaderDelegate; removed @property quickLookHandle and initialized
_quickLookHandle in the initializer instead.
(-[WebPreviewConverter initWithResourceLoader:quickLookHandle:]): Changed to take references
to resourceLoader and quickLookHandle.
(-[WebPreviewConverter _sendDidReceiveResponseIfNecessary]): Stoped checking for a nil
_quickLookHandle, since it is never nil.
(-[WebResourceLoaderQuickLookDelegate connection:didReceiveDataArray:]): Deleted.
QLPreviewConverter never calls this method.
(-[WebPreviewConverter connection:didReceiveData:lengthReceived:]): Stopped checking for a
nil _resourceLoader, since it is never nil.
(-[WebPreviewConverter connectionDidFinishLoading:]): Ditto.
(-[WebPreviewConverter connection:didFailWithError:]): Ditto.
(WebCore::emptyClient): Changed to return a reference.
(WebCore::QuickLookHandle::QuickLookHandle): Moved creation of the delegate,
firstRequestURL, and response to here from QuickLookHandle::create(). Called
ResourceLoader::didCreateQuickLookHandle() here instead of in QuickLookHandle::create().
(WebCore::QuickLookHandle::create): Used std::make_unique to create the QuickLookHandle.
(WebCore::QuickLookHandle::didFinishLoading): Set m_finishedLoadingDataIntoConverter to true
instead of YES.
(WebCore::QuickLookHandle::setClient): Moved the client rvalue reference into m_client.
(WebCore::QuickLookHandle::~QuickLookHandle): Stopped clearing m_converter and calling
-detachHandle.
(WebCore::QuickLookHandle::previewRequestURL): Used dot syntax.
(WebCore::QuickLookHandle::previewResponse): Renamed from nsResponse().

Source/WebKit/mac:

* WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::didCreateQuickLookHandle): Changed to pass a
Ref<QuickLookHandleClient>&& to QuickLookHandle::setClient().

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (210788 => 210789)


--- trunk/Source/WebCore/ChangeLog	2017-01-16 21:11:53 UTC (rev 210788)
+++ trunk/Source/WebCore/ChangeLog	2017-01-16 22:14:27 UTC (rev 210789)
@@ -1,3 +1,44 @@
+2017-01-16  Andy Estes  <aes...@apple.com>
+
+        [QuickLook] Do some cleanup in QuickLookHandle
+        https://bugs.webkit.org/show_bug.cgi?id=166864
+
+        Reviewed by Darin Adler.
+
+        * loader/ios/QuickLook.h: Stopped including QuickLookHandleClient.h and forward-declared
+        instead; changed setClient() to take a Ref<QuickLookHandleClient>&&; renamed nsResponse() to
+        previewResponse(); changed QuickLookHandle() to take a ResourceLoader& and const
+        ResourceResponse&; gave m_delegate a stronger type; removed unused m_quicklookFileHandle;
+        initialized m_finishedLoadingDataIntoConverter to false.
+        (WebCore::QuickLookHandle::firstRequestURL): Stopped exporting.
+        (WebCore::QuickLookHandle::setClient): Moved definition out-of-line.
+        * loader/ios/QuickLook.mm: Renamed WebResourceLoaderQuickLookDelegate to
+        WebPreviewConverterDelegate and stopped conforming to NSURLConnectionDelegate and
+        WebCoreResourceLoaderDelegate; removed @property quickLookHandle and initialized
+        _quickLookHandle in the initializer instead.
+        (-[WebPreviewConverter initWithResourceLoader:quickLookHandle:]): Changed to take references
+        to resourceLoader and quickLookHandle.
+        (-[WebPreviewConverter _sendDidReceiveResponseIfNecessary]): Stoped checking for a nil
+        _quickLookHandle, since it is never nil.
+        (-[WebResourceLoaderQuickLookDelegate connection:didReceiveDataArray:]): Deleted.
+        QLPreviewConverter never calls this method.
+        (-[WebPreviewConverter connection:didReceiveData:lengthReceived:]): Stopped checking for a
+        nil _resourceLoader, since it is never nil.
+        (-[WebPreviewConverter connectionDidFinishLoading:]): Ditto.
+        (-[WebPreviewConverter connection:didFailWithError:]): Ditto.
+        (WebCore::emptyClient): Changed to return a reference.
+        (WebCore::QuickLookHandle::QuickLookHandle): Moved creation of the delegate,
+        firstRequestURL, and response to here from QuickLookHandle::create(). Called
+        ResourceLoader::didCreateQuickLookHandle() here instead of in QuickLookHandle::create().
+        (WebCore::QuickLookHandle::create): Used std::make_unique to create the QuickLookHandle.
+        (WebCore::QuickLookHandle::didFinishLoading): Set m_finishedLoadingDataIntoConverter to true
+        instead of YES.
+        (WebCore::QuickLookHandle::setClient): Moved the client rvalue reference into m_client.
+        (WebCore::QuickLookHandle::~QuickLookHandle): Stopped clearing m_converter and calling
+        -detachHandle.
+        (WebCore::QuickLookHandle::previewRequestURL): Used dot syntax.
+        (WebCore::QuickLookHandle::previewResponse): Renamed from nsResponse().
+
 2017-01-16  Simon Fraser  <simon.fra...@apple.com>
 
         Remove CSSPropertyNames.in from the project. It's not used any more,

Modified: trunk/Source/WebCore/loader/ios/QuickLook.h (210788 => 210789)


--- trunk/Source/WebCore/loader/ios/QuickLook.h	2017-01-16 21:11:53 UTC (rev 210788)
+++ trunk/Source/WebCore/loader/ios/QuickLook.h	2017-01-16 22:14:27 UTC (rev 210789)
@@ -27,16 +27,14 @@
 
 #if USE(QUICK_LOOK)
 
-#include "QuickLookHandleClient.h"
 #include <objc/objc.h>
 #include <wtf/Forward.h>
-#include <wtf/RefPtr.h>
+#include <wtf/Ref.h>
 #include <wtf/RetainPtr.h>
 
 OBJC_CLASS NSArray;
 OBJC_CLASS NSData;
 OBJC_CLASS NSDictionary;
-OBJC_CLASS NSFileHandle;
 OBJC_CLASS NSSet;
 OBJC_CLASS NSString;
 OBJC_CLASS NSURL;
@@ -43,9 +41,11 @@
 OBJC_CLASS NSURLRequest;
 OBJC_CLASS NSURLResponse;
 OBJC_CLASS QLPreviewConverter;
+OBJC_CLASS WebPreviewConverterDelegate;
 
 namespace WebCore {
 
+class QuickLookHandleClient;
 class ResourceLoader;
 class ResourceResponse;
 class SharedBuffer;
@@ -82,28 +82,27 @@
     bool didFinishLoading();
     void didFail();
 
-    WEBCORE_EXPORT NSURLResponse *nsResponse();
+    WEBCORE_EXPORT void setClient(Ref<QuickLookHandleClient>&&);
 
-    void setClient(PassRefPtr<QuickLookHandleClient> client) { m_client = client; }
-
     WEBCORE_EXPORT String previewFileName() const;
     WEBCORE_EXPORT String previewUTI() const;
+    WEBCORE_EXPORT NSURL *previewRequestURL() const;
+    NSURLResponse *previewResponse() const;
     NSURL *firstRequestURL() const { return m_firstRequestURL.get(); }
-    WEBCORE_EXPORT NSURL *previewRequestURL() const;
     QLPreviewConverter *converter() const { return m_converter.get(); }
 
 private:
-    QuickLookHandle(NSURL *, NSURLResponse *, id delegate);
+    friend std::unique_ptr<QuickLookHandle> std::make_unique<QuickLookHandle>(ResourceLoader&, const ResourceResponse&);
+    QuickLookHandle(ResourceLoader&, const ResourceResponse&);
 
     void didReceiveDataArray(NSArray *);
 
     RetainPtr<NSURL> m_firstRequestURL;
+    RetainPtr<WebPreviewConverterDelegate> m_delegate;
     RetainPtr<QLPreviewConverter> m_converter;
-    RetainPtr<id> m_delegate;
-    bool m_finishedLoadingDataIntoConverter;
-    RetainPtr<NSFileHandle *> m_quicklookFileHandle;
-    RetainPtr<NSURLResponse> m_nsResponse;
-    RefPtr<QuickLookHandleClient> m_client;
+    RetainPtr<NSURLResponse> m_previewResponse;
+    Ref<QuickLookHandleClient> m_client;
+    bool m_finishedLoadingDataIntoConverter { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/loader/ios/QuickLook.mm (210788 => 210789)


--- trunk/Source/WebCore/loader/ios/QuickLook.mm	2017-01-16 21:11:53 UTC (rev 210788)
+++ trunk/Source/WebCore/loader/ios/QuickLook.mm	2017-01-16 22:14:27 UTC (rev 210789)
@@ -31,11 +31,10 @@
 #import "FileSystemIOS.h"
 #import "Logging.h"
 #import "NSFileManagerSPI.h"
+#import "QuickLookHandleClient.h"
 #import "ResourceError.h"
 #import "ResourceLoader.h"
 #import "SharedBuffer.h"
-#import "WebCoreResourceHandleAsDelegate.h"
-#import <Foundation/Foundation.h>
 #import <wtf/NeverDestroyed.h>
 #import <wtf/Vector.h>
 #import <wtf/text/WTFString.h>
@@ -179,41 +178,42 @@
     return previewProtocol.get().data();
 }
 
-@interface WebResourceLoaderQuickLookDelegate : NSObject <NSURLConnectionDelegate, WebCoreResourceLoaderDelegate> {
+@interface WebPreviewConverterDelegate : NSObject {
     RefPtr<ResourceLoader> _resourceLoader;
+    QuickLookHandle* _quickLookHandle;
     BOOL _hasSentDidReceiveResponse;
     BOOL _hasFailed;
 }
-@property (nonatomic) QuickLookHandle* quickLookHandle;
 @end
 
-@implementation WebResourceLoaderQuickLookDelegate
+@implementation WebPreviewConverterDelegate
 
-- (id)initWithResourceLoader:(PassRefPtr<ResourceLoader>)resourceLoader
+- (id)initWithResourceLoader:(ResourceLoader&)resourceLoader quickLookHandle:(QuickLookHandle&)quickLookHandle
 {
     self = [super init];
     if (!self)
         return nil;
 
-    _resourceLoader = resourceLoader;
+    _resourceLoader = &resourceLoader;
+    _quickLookHandle = &quickLookHandle;
     return self;
 }
 
 - (void)_sendDidReceiveResponseIfNecessary
 {
-    if (_hasSentDidReceiveResponse || _hasFailed || !_quickLookHandle)
+    if (_hasSentDidReceiveResponse || _hasFailed)
         return;
 
     // QuickLook might fail to convert a document without calling connection:didFailWithError: (see <rdar://problem/17927972>).
     // A nil MIME type is an indication of such a failure, so stop loading the resource and ignore subsequent delegate messages.
-    NSURLResponse *nsResponse = _quickLookHandle->nsResponse();
-    if (![nsResponse MIMEType]) {
+    NSURLResponse *previewResponse = _quickLookHandle->previewResponse();
+    if (!previewResponse.MIMEType) {
         _hasFailed = YES;
         _resourceLoader->didFail(_resourceLoader->cannotShowURLError());
         return;
     }
 
-    ResourceResponse response(nsResponse);
+    ResourceResponse response { previewResponse };
     response.setIsQuickLook(true);
 
     _hasSentDidReceiveResponse = YES;
@@ -220,28 +220,9 @@
     _resourceLoader->didReceiveResponse(response);
 }
 
-#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
-- (void)connection:(NSURLConnection *)connection didReceiveDataArray:(NSArray *)dataArray
-{
-    UNUSED_PARAM(connection);
-    if (!_resourceLoader)
-        return;
-
-    [self _sendDidReceiveResponseIfNecessary];
-    if (_hasFailed)
-        return;
-
-    if (_resourceLoader)
-        _resourceLoader->didReceiveDataArray(reinterpret_cast<CFArrayRef>(dataArray));
-}
-#endif
-
 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived
 {
     UNUSED_PARAM(connection);
-    if (!_resourceLoader)
-        return;
-
     [self _sendDidReceiveResponseIfNecessary];
     if (_hasFailed)
         return;
@@ -248,17 +229,14 @@
 
     // QuickLook code sends us a nil data at times. The check below is the same as the one in
     // ResourceHandleMac.cpp added for a different bug.
-    if (![data length])
-        return;
-
-    if (_resourceLoader)
-        _resourceLoader->didReceiveData(reinterpret_cast<const char*>([data bytes]), [data length], lengthReceived, DataPayloadBytes);
+    if (auto dataLength = data.length)
+        _resourceLoader->didReceiveData(reinterpret_cast<const char*>(data.bytes), dataLength, lengthReceived, DataPayloadBytes);
 }
 
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
     UNUSED_PARAM(connection);
-    if (!_resourceLoader || _hasFailed)
+    if (_hasFailed)
         return;
 
     ASSERT(_hasSentDidReceiveResponse);
@@ -268,21 +246,11 @@
 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
     UNUSED_PARAM(connection);
-
     [self _sendDidReceiveResponseIfNecessary];
-    if (_hasFailed)
-        return;
-
-    if (_resourceLoader)
-        _resourceLoader->didFail(ResourceError(error));
+    if (!_hasFailed)
+        _resourceLoader->didFail(error);
 }
 
-- (void)detachHandle
-{
-    _resourceLoader = nullptr;
-    _quickLookHandle = nullptr;
-}
-
 @end
 
 namespace WebCore {
@@ -305,21 +273,21 @@
     return success ? uniqueContentPath : nil;
 }
 
-static inline QuickLookHandleClient* emptyClient()
+static inline QuickLookHandleClient& emptyClient()
 {
-    static NeverDestroyed<QuickLookHandleClient> emptyClient;
-    return &emptyClient.get();
+    static auto& emptyClient = adoptRef(*new QuickLookHandleClient()).leakRef();
+    return emptyClient;
 }
 
-QuickLookHandle::QuickLookHandle(NSURL *firstRequestURL, NSURLResponse *nsResponse, id delegate)
-    : m_firstRequestURL(firstRequestURL)
-    , m_converter(adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:delegate response:nsResponse options:nil]))
-    , m_delegate(delegate)
-    , m_finishedLoadingDataIntoConverter(false)
-    , m_nsResponse([m_converter previewResponse])
-    , m_client(emptyClient())
+QuickLookHandle::QuickLookHandle(ResourceLoader& loader, const ResourceResponse& response)
+    : m_firstRequestURL { loader.originalRequest().nsURLRequest(DoNotUpdateHTTPBody).URL }
+    , m_delegate { adoptNS([[WebPreviewConverterDelegate alloc] initWithResourceLoader:loader quickLookHandle:*this]) }
+    , m_converter { adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:m_delegate.get() response:response.nsURLResponse() options:nil]) }
+    , m_previewResponse { [m_converter previewResponse] }
+    , m_client { emptyClient() }
 {
     LOG(Network, "QuickLookHandle::QuickLookHandle() - previewFileName: %s", [m_converter previewFileName]);
+    loader.didCreateQuickLookHandle(*this);
 }
 
 bool QuickLookHandle::shouldCreateForMIMEType(const String& mimeType)
@@ -330,19 +298,9 @@
 std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceLoader& loader, const ResourceResponse& response)
 {
     ASSERT(shouldCreateForMIMEType(response.mimeType()));
-
-    RetainPtr<WebResourceLoaderQuickLookDelegate> delegate = adoptNS([[WebResourceLoaderQuickLookDelegate alloc] initWithResourceLoader:&loader]);
-    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([loader.originalRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], response.nsURLResponse(), delegate.get()));
-    [delegate setQuickLookHandle:quickLookHandle.get()];
-    loader.didCreateQuickLookHandle(*quickLookHandle);
-    return quickLookHandle;
+    return std::make_unique<QuickLookHandle>(loader, response);
 }
 
-NSURLResponse *QuickLookHandle::nsResponse()
-{
-    return m_nsResponse.get();
-}
-
 bool QuickLookHandle::didReceiveData(const char* data, unsigned length)
 {
     if (m_finishedLoadingDataIntoConverter)
@@ -375,7 +333,7 @@
         return false;
 
     LOG(Network, "QuickLookHandle::didFinishLoading()");
-    m_finishedLoadingDataIntoConverter = YES;
+    m_finishedLoadingDataIntoConverter = true;
     [m_converter finishedAppendingData];
     m_client->didFinishLoading();
     return true;
@@ -389,12 +347,14 @@
     m_converter = nullptr;
 }
 
+void QuickLookHandle::setClient(Ref<QuickLookHandleClient>&& client)
+{
+    m_client = WTFMove(client);
+}
+
 QuickLookHandle::~QuickLookHandle()
 {
     LOG(Network, "QuickLookHandle::~QuickLookHandle()");
-    m_converter = nullptr;
-
-    [m_delegate detachHandle];
 }
 
 String QuickLookHandle::previewFileName() const
@@ -409,9 +369,14 @@
 
 NSURL *QuickLookHandle::previewRequestURL() const
 {
-    return [[m_converter previewRequest] URL];
+    return [m_converter previewRequest].URL;
 }
 
+NSURLResponse *QuickLookHandle::previewResponse() const
+{
+    return m_previewResponse.get();
 }
 
+}
+
 #endif // USE(QUICK_LOOK)

Modified: trunk/Source/WebKit/mac/ChangeLog (210788 => 210789)


--- trunk/Source/WebKit/mac/ChangeLog	2017-01-16 21:11:53 UTC (rev 210788)
+++ trunk/Source/WebKit/mac/ChangeLog	2017-01-16 22:14:27 UTC (rev 210789)
@@ -1,3 +1,14 @@
+2017-01-16  Andy Estes  <aes...@apple.com>
+
+        [QuickLook] Do some cleanup in QuickLookHandle
+        https://bugs.webkit.org/show_bug.cgi?id=166864
+
+        Reviewed by Darin Adler.
+
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (WebFrameLoaderClient::didCreateQuickLookHandle): Changed to pass a
+        Ref<QuickLookHandleClient>&& to QuickLookHandle::setClient().
+
 2017-01-15  Tim Horton  <timothy_hor...@apple.com>
 
         De-duplicate more (nearly) identical code in Editor(Mac|IOS).mm

Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm (210788 => 210789)


--- trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm	2017-01-16 21:11:53 UTC (rev 210788)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm	2017-01-16 22:14:27 UTC (rev 210789)
@@ -152,6 +152,7 @@
 #import <WebCore/FileSystemIOS.h>
 #import <WebCore/NSFileManagerSPI.h>
 #import <WebCore/QuickLook.h>
+#import <WebCore/QuickLookHandleClient.h>
 #endif
 
 #if HAVE(APP_LINKS)
@@ -2283,7 +2284,7 @@
             removeQLPreviewConverterForURL(m_firstRequestURL.get());
         }
     };
-    handle.setClient(adoptRef(new QuickLookDocumentWriter(handle)));
+    handle.setClient(adoptRef(*new QuickLookDocumentWriter(handle)));
 }
 #endif
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to