Title: [210129] trunk/Source/WebCore
Revision
210129
Author
[email protected]
Date
2016-12-22 18:24:28 -0800 (Thu, 22 Dec 2016)

Log Message

[iOS] Move QuickLook from WebCore/platform to WebCore/loader
https://bugs.webkit.org/show_bug.cgi?id=166449

Reviewed by Darin Adler.

QuickLook.mm knows about ResourceLoader, so it's a layering violation to have it in
platform/. Move it to loader/ios/.

* WebCore.xcodeproj/project.pbxproj:
* loader/ios/QuickLook.h: Renamed from Source/WebCore/platform/network/ios/QuickLook.h.
* loader/ios/QuickLook.mm: Renamed from Source/WebCore/platform/network/ios/QuickLook.mm.

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (210128 => 210129)


--- trunk/Source/WebCore/ChangeLog	2016-12-23 02:21:02 UTC (rev 210128)
+++ trunk/Source/WebCore/ChangeLog	2016-12-23 02:24:28 UTC (rev 210129)
@@ -1,3 +1,17 @@
+2016-12-22  Andy Estes  <[email protected]>
+
+        [iOS] Move QuickLook from WebCore/platform to WebCore/loader
+        https://bugs.webkit.org/show_bug.cgi?id=166449
+
+        Reviewed by Darin Adler.
+
+        QuickLook.mm knows about ResourceLoader, so it's a layering violation to have it in
+        platform/. Move it to loader/ios/.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * loader/ios/QuickLook.h: Renamed from Source/WebCore/platform/network/ios/QuickLook.h.
+        * loader/ios/QuickLook.mm: Renamed from Source/WebCore/platform/network/ios/QuickLook.mm.
+
 2016-12-22  Michael Catanzaro  <[email protected]>
 
         Unreviewed, fix unused parameter warning in GLES build

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (210128 => 210129)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2016-12-23 02:21:02 UTC (rev 210128)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2016-12-23 02:24:28 UTC (rev 210129)
@@ -1690,8 +1690,6 @@
 		4415292E0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4415292C0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		4415292F0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4415292D0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp */; };
 		442ABCD617D9262F00D30715 /* SynchronousLoaderClientCFNet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 442ABCD517D9262F00D30715 /* SynchronousLoaderClientCFNet.cpp */; };
-		442AF7A9102CDDEA008FD4D3 /* QuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = 442AF7A7102CDDEA008FD4D3 /* QuickLook.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		442AF7AA102CDDEA008FD4D3 /* QuickLook.mm in Sources */ = {isa = PBXBuildFile; fileRef = 442AF7A8102CDDEA008FD4D3 /* QuickLook.mm */; };
 		443817FF1A91B2F8006E04F2 /* CoreMediaSoftLink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 443817FD1A91B2F8006E04F2 /* CoreMediaSoftLink.cpp */; };
 		443818001A91B2F8006E04F2 /* CoreMediaSoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 443817FE1A91B2F8006E04F2 /* CoreMediaSoftLink.h */; };
 		443917FF1A91B2F8006E04F2 /* QuickLookSoftLink.mm in Sources */ = {isa = PBXBuildFile; fileRef = 443917FD1A91B2F8006E04F2 /* QuickLookSoftLink.mm */; };
@@ -3928,6 +3926,8 @@
 		A149786E1ABAF33800CEF7E4 /* ContentFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A149786C1ABAF33800CEF7E4 /* ContentFilter.cpp */; };
 		A149786F1ABAF33800CEF7E4 /* ContentFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A149786D1ABAF33800CEF7E4 /* ContentFilter.h */; };
 		A14978711ABAF3A500CEF7E4 /* PlatformContentFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = A14978701ABAF3A500CEF7E4 /* PlatformContentFilter.h */; };
+		A15E31F31E0CB0B2004B371C /* QuickLook.mm in Sources */ = {isa = PBXBuildFile; fileRef = A15E31F21E0CB0AA004B371C /* QuickLook.mm */; };
+		A15E31F41E0CB0B5004B371C /* QuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = A15E31F11E0CB0AA004B371C /* QuickLook.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		A17C81220F2A5CF7005DAAEB /* HTMLElementFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A17C81200F2A5CF7005DAAEB /* HTMLElementFactory.cpp */; };
 		A17C81230F2A5CF7005DAAEB /* HTMLElementFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = A17C81210F2A5CF7005DAAEB /* HTMLElementFactory.h */; };
 		A182D5B71BE722670087A7CC /* SettingsCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = A182D5B61BE722620087A7CC /* SettingsCocoa.mm */; };
@@ -8891,8 +8891,6 @@
 		4415292C0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPlugInImageElement.h; sourceTree = "<group>"; };
 		4415292D0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLPlugInImageElement.cpp; sourceTree = "<group>"; };
 		442ABCD517D9262F00D30715 /* SynchronousLoaderClientCFNet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SynchronousLoaderClientCFNet.cpp; sourceTree = "<group>"; };
-		442AF7A7102CDDEA008FD4D3 /* QuickLook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickLook.h; sourceTree = "<group>"; };
-		442AF7A8102CDDEA008FD4D3 /* QuickLook.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QuickLook.mm; sourceTree = "<group>"; };
 		443817FD1A91B2F8006E04F2 /* CoreMediaSoftLink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CoreMediaSoftLink.cpp; sourceTree = "<group>"; };
 		443817FE1A91B2F8006E04F2 /* CoreMediaSoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreMediaSoftLink.h; sourceTree = "<group>"; };
 		443917FD1A91B2F8006E04F2 /* QuickLookSoftLink.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QuickLookSoftLink.mm; sourceTree = "<group>"; };
@@ -11600,6 +11598,8 @@
 		A149786C1ABAF33800CEF7E4 /* ContentFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentFilter.cpp; sourceTree = "<group>"; };
 		A149786D1ABAF33800CEF7E4 /* ContentFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentFilter.h; sourceTree = "<group>"; };
 		A14978701ABAF3A500CEF7E4 /* PlatformContentFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformContentFilter.h; sourceTree = "<group>"; };
+		A15E31F11E0CB0AA004B371C /* QuickLook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickLook.h; sourceTree = "<group>"; };
+		A15E31F21E0CB0AA004B371C /* QuickLook.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QuickLook.mm; sourceTree = "<group>"; };
 		A17C81200F2A5CF7005DAAEB /* HTMLElementFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLElementFactory.cpp; sourceTree = "<group>"; };
 		A17C81210F2A5CF7005DAAEB /* HTMLElementFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLElementFactory.h; sourceTree = "<group>"; };
 		A182D5B61BE722620087A7CC /* SettingsCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SettingsCocoa.mm; sourceTree = "<group>"; };
@@ -16817,8 +16817,6 @@
 			isa = PBXGroup;
 			children = (
 				443F04260E75C8FB007E5407 /* NetworkStateNotifierIOS.mm */,
-				442AF7A7102CDDEA008FD4D3 /* QuickLook.h */,
-				442AF7A8102CDDEA008FD4D3 /* QuickLook.mm */,
 				A10DBF4618F92317000D70C6 /* QuickLookHandleClient.h */,
 				7E428CE413E3407F003B661C /* ResourceHandleIOS.mm */,
 				7E7DE201195CEFCD0035363B /* ResourceRequestIOS.mm */,
@@ -19636,6 +19634,15 @@
 			path = wak;
 			sourceTree = "<group>";
 		};
+		A15E31F01E0CB075004B371C /* ios */ = {
+			isa = PBXGroup;
+			children = (
+				A15E31F11E0CB0AA004B371C /* QuickLook.h */,
+				A15E31F21E0CB0AA004B371C /* QuickLook.mm */,
+			);
+			path = ios;
+			sourceTree = "<group>";
+		};
 		A172182419DE182B00464D17 /* ios */ = {
 			isa = PBXGroup;
 			children = (
@@ -22335,6 +22342,7 @@
 				7EE6847312D26E5500E79415 /* cf */,
 				7E4DE10B198B10810051CB02 /* cocoa */,
 				5126E6B60A2E3AEF005C29FA /* icon */,
+				A15E31F01E0CB075004B371C /* ios */,
 				93A1EAA20A5634D8006960A0 /* mac */,
 				A149786C1ABAF33800CEF7E4 /* ContentFilter.cpp */,
 				A149786D1ABAF33800CEF7E4 /* ContentFilter.h */,
@@ -26049,6 +26057,7 @@
 				1221E06D1C03D224006A1A00 /* JSAnimationTimeline.h in Headers */,
 				1AE96A8B1D1A0DDD00B86768 /* JSApplePayPaymentAuthorizedEvent.h in Headers */,
 				CDF4B7301E03CA4A00E235A2 /* JSMockCDMFactory.h in Headers */,
+				A15E31F41E0CB0B5004B371C /* QuickLook.h in Headers */,
 				1AE96A8D1D1A0DDD00B86768 /* JSApplePayPaymentMethodSelectedEvent.h in Headers */,
 				1AE96A8F1D1A0DDD00B86768 /* JSApplePaySession.h in Headers */,
 				1AE96A911D1A0DDD00B86768 /* JSApplePayShippingContactSelectedEvent.h in Headers */,
@@ -27180,7 +27189,6 @@
 				10FB084B14E15C7E00A3DB98 /* PublicURLManager.h in Headers */,
 				550A0BCA085F6039007353D6 /* QualifiedName.h in Headers */,
 				CE12523D1A1676CD00864480 /* QuartzCoreSPI.h in Headers */,
-				442AF7A9102CDDEA008FD4D3 /* QuickLook.h in Headers */,
 				A10DBF4718F92317000D70C6 /* QuickLookHandleClient.h in Headers */,
 				937F4CCC1A2D48C100BB39F5 /* QuickLookMacSPI.h in Headers */,
 				443918001A91B2F8006E04F2 /* QuickLookSoftLink.h in Headers */,
@@ -30891,7 +30899,6 @@
 				0081FEFF16B0A2B6008AAA7A /* PublicSuffixMac.mm in Sources */,
 				CDEE393717974259001D7580 /* PublicURLManager.cpp in Sources */,
 				550A0BC9085F6039007353D6 /* QualifiedName.cpp in Sources */,
-				442AF7AA102CDDEA008FD4D3 /* QuickLook.mm in Sources */,
 				443917FF1A91B2F8006E04F2 /* QuickLookSoftLink.mm in Sources */,
 				072AE1E6183C0741000A5988 /* QuickTimePluginReplacement.mm in Sources */,
 				379E371613736A6600B9E919 /* QuotedPrintable.cpp in Sources */,
@@ -31515,6 +31522,7 @@
 				CDA07FBD18E0A16A004699FA /* SystemSleepListener.cpp in Sources */,
 				CDA07FC118E0A22B004699FA /* SystemSleepListenerMac.mm in Sources */,
 				5D5975B419635F1100D00878 /* SystemVersion.mm in Sources */,
+				A15E31F31E0CB0B2004B371C /* QuickLook.mm in Sources */,
 				463EB6221B8789E00096ED51 /* TagCollection.cpp in Sources */,
 				F55B3DD51251F12D003EF269 /* TelephoneInputType.cpp in Sources */,
 				7CC564BA18BAC720001B9652 /* TelephoneNumberDetectorCocoa.cpp in Sources */,

Copied: trunk/Source/WebCore/loader/ios/QuickLook.h (from rev 210128, trunk/Source/WebCore/platform/network/ios/QuickLook.h) (0 => 210129)


--- trunk/Source/WebCore/loader/ios/QuickLook.h	                        (rev 0)
+++ trunk/Source/WebCore/loader/ios/QuickLook.h	2016-12-23 02:24:28 UTC (rev 210129)
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef QuickLook_h
+#define QuickLook_h
+
+#if USE(QUICK_LOOK)
+
+#import "QuickLookHandleClient.h"
+#import "ResourceRequest.h"
+#import <objc/objc-runtime.h>
+#import <wtf/RefPtr.h>
+
+#if USE(CFURLCONNECTION)
+#include "CFNetworkSPI.h"
+#endif
+
+OBJC_CLASS NSData;
+OBJC_CLASS NSDictionary;
+OBJC_CLASS NSFileHandle;
+OBJC_CLASS NSSet;
+OBJC_CLASS NSString;
+OBJC_CLASS NSURL;
+OBJC_CLASS NSURLConnection;
+OBJC_CLASS NSURLRequest;
+OBJC_CLASS NSURLResponse;
+OBJC_CLASS QLPreviewConverter;
+
+namespace WebCore {
+
+class QuickLookHandleClient;
+class ResourceHandle;
+class ResourceLoader;
+class ResourceResponse;
+class SynchronousResourceHandleCFURLConnectionDelegate;
+
+WEBCORE_EXPORT NSSet *QLPreviewGetSupportedMIMETypesSet();
+
+// Used for setting the permissions on the saved QL content
+NSDictionary *QLFileAttributes();
+NSDictionary *QLDirectoryAttributes();
+
+WEBCORE_EXPORT void addQLPreviewConverterWithFileForURL(NSURL *, id converter, NSString *fileName);
+WEBCORE_EXPORT NSString *qlPreviewConverterFileNameForURL(NSURL *);
+WEBCORE_EXPORT NSString *qlPreviewConverterUTIForURL(NSURL *);
+WEBCORE_EXPORT void removeQLPreviewConverterForURL(NSURL *);
+
+WEBCORE_EXPORT RetainPtr<NSURLRequest> registerQLPreviewConverterIfNeeded(NSURL *, NSString *mimeType, NSData *);
+
+const URL safeQLURLForDocumentURLAndResourceURL(const URL& documentURL, const String& resourceURL);
+
+WEBCORE_EXPORT const char* QLPreviewProtocol();
+
+WEBCORE_EXPORT NSString *createTemporaryFileForQuickLook(NSString *fileName);
+
+class QuickLookHandle {
+    WTF_MAKE_NONCOPYABLE(QuickLookHandle);
+public:
+    WEBCORE_EXPORT static bool shouldCreateForMIMEType(const String&);
+
+    static std::unique_ptr<QuickLookHandle> create(ResourceHandle*, NSURLConnection *, NSURLResponse *, id delegate);
+#if USE(CFURLCONNECTION)
+    static std::unique_ptr<QuickLookHandle> create(ResourceHandle*, SynchronousResourceHandleCFURLConnectionDelegate*, CFURLResponseRef);
+#endif
+    // FIXME: Use of ResourceLoader here is a platform violation.
+    WEBCORE_EXPORT static std::unique_ptr<QuickLookHandle> create(ResourceLoader&, const ResourceResponse&);
+
+    WEBCORE_EXPORT ~QuickLookHandle();
+
+    WEBCORE_EXPORT bool didReceiveDataArray(CFArrayRef);
+    WEBCORE_EXPORT bool didReceiveData(CFDataRef);
+    WEBCORE_EXPORT bool didFinishLoading();
+    WEBCORE_EXPORT void didFail();
+
+    WEBCORE_EXPORT NSURLResponse *nsResponse();
+#if USE(CFURLCONNECTION)
+    CFURLResponseRef cfResponse();
+#endif
+
+    void setClient(PassRefPtr<QuickLookHandleClient> client) { m_client = client; }
+
+    WEBCORE_EXPORT String previewFileName() const;
+    WEBCORE_EXPORT String previewUTI() const;
+    NSURL *firstRequestURL() const { return m_firstRequestURL.get(); }
+    WEBCORE_EXPORT NSURL *previewRequestURL() const;
+    QLPreviewConverter *converter() const { return m_converter.get(); }
+
+private:
+    QuickLookHandle(NSURL *, NSURLConnection *, NSURLResponse *, id delegate);
+
+    RetainPtr<NSURL> m_firstRequestURL;
+    RetainPtr<QLPreviewConverter> m_converter;
+    RetainPtr<id> m_delegate;
+    bool m_finishedLoadingDataIntoConverter;
+    RetainPtr<NSFileHandle *> m_quicklookFileHandle;
+    RetainPtr<NSURLResponse> m_nsResponse;
+    RefPtr<QuickLookHandleClient> m_client;
+};
+
+} // namespace WebCore
+
+#endif // USE(QUICK_LOOK)
+
+#endif // QuickLook_h

Copied: trunk/Source/WebCore/loader/ios/QuickLook.mm (from rev 210128, trunk/Source/WebCore/platform/network/ios/QuickLook.mm) (0 => 210129)


--- trunk/Source/WebCore/loader/ios/QuickLook.mm	                        (rev 0)
+++ trunk/Source/WebCore/loader/ios/QuickLook.mm	2016-12-23 02:24:28 UTC (rev 210129)
@@ -0,0 +1,522 @@
+/*
+ * Copyright (C) 2009-2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "QuickLook.h"
+
+#if USE(QUICK_LOOK)
+
+#import "DocumentLoader.h"
+#import "FileSystemIOS.h"
+#import "Logging.h"
+#import "NSFileManagerSPI.h"
+#import "ResourceError.h"
+#import "ResourceHandle.h"
+#import "ResourceLoader.h"
+#import "RuntimeApplicationChecks.h"
+#import "SynchronousResourceHandleCFURLConnectionDelegate.h"
+#import "WebCoreResourceHandleAsDelegate.h"
+#import "WebCoreURLResponseIOS.h"
+#import <Foundation/Foundation.h>
+#import <wtf/NeverDestroyed.h>
+#import <wtf/StdLibExtras.h>
+#import <wtf/Threading.h>
+#import <wtf/Vector.h>
+#import <wtf/text/WTFString.h>
+
+#import "QuickLookSoftLink.h"
+
+using namespace WebCore;
+
+NSSet *WebCore::QLPreviewGetSupportedMIMETypesSet()
+{
+    static NeverDestroyed<RetainPtr<NSSet>> set = QLPreviewGetSupportedMIMETypes();
+    return set.get().get();
+}
+
+NSDictionary *WebCore::QLFileAttributes()
+{
+    // Set file perms to owner read/write only
+    NSNumber *filePOSIXPermissions = [NSNumber numberWithInteger:(WEB_UREAD | WEB_UWRITE)];
+    static NSDictionary *dictionary = adoptNS([[NSDictionary alloc] initWithObjectsAndKeys:
+                                        NSUserName(), NSFileOwnerAccountName,
+                                        filePOSIXPermissions, NSFilePosixPermissions,
+                                        nullptr]).leakRef();
+    return dictionary;
+}
+
+NSDictionary *WebCore::QLDirectoryAttributes()
+{
+    // Set file perms to owner read/write/execute only
+    NSNumber *directoryPOSIXPermissions = [NSNumber numberWithInteger:(WEB_UREAD | WEB_UWRITE | WEB_UEXEC)];
+    static NSDictionary *dictionary = adoptNS([[NSDictionary alloc] initWithObjectsAndKeys:
+                                                NSUserName(), NSFileOwnerAccountName,
+                                                directoryPOSIXPermissions, NSFilePosixPermissions,
+                                                nullptr]).leakRef();
+    return dictionary;
+}
+
+static Lock& qlPreviewConverterDictionaryMutex()
+{
+    static NeverDestroyed<Lock> mutex;
+    return mutex;
+}
+
+static NSMutableDictionary *QLPreviewConverterDictionary()
+{
+    static NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
+    return dictionary;
+}
+
+static NSMutableDictionary *QLContentDictionary()
+{
+    static NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc] init];
+    return contentDictionary;
+}
+
+void WebCore::addQLPreviewConverterWithFileForURL(NSURL *url, id converter, NSString *fileName)
+{
+    ASSERT(url);
+    ASSERT(converter);
+    LockHolder lock(qlPreviewConverterDictionaryMutex());
+    [QLPreviewConverterDictionary() setObject:converter forKey:url];
+    [QLContentDictionary() setObject:(fileName ? fileName : @"") forKey:url];
+}
+
+NSString *WebCore::qlPreviewConverterFileNameForURL(NSURL *url)
+{
+    return [QLContentDictionary() objectForKey:url];
+}
+
+NSString *WebCore::qlPreviewConverterUTIForURL(NSURL *url)
+{
+    id converter = nil;
+    {
+        LockHolder lock(qlPreviewConverterDictionaryMutex());
+        converter = [QLPreviewConverterDictionary() objectForKey:url];
+    }
+    if (!converter)
+        return nil;
+    return [converter previewUTI];
+}
+
+void WebCore::removeQLPreviewConverterForURL(NSURL *url)
+{
+    LockHolder lock(qlPreviewConverterDictionaryMutex());
+    [QLPreviewConverterDictionary() removeObjectForKey:url];
+
+    // Delete the file when we remove the preview converter
+    NSString *filename = qlPreviewConverterFileNameForURL(url);
+    if ([filename length])
+        [[NSFileManager defaultManager] _web_removeFileOnlyAtPath:filename];
+    [QLContentDictionary() removeObjectForKey:url];
+}
+
+RetainPtr<NSURLRequest> WebCore::registerQLPreviewConverterIfNeeded(NSURL *url, NSString *mimeType, NSData *data)
+{
+    RetainPtr<NSString> updatedMIMEType = adoptNS(QLTypeCopyBestMimeTypeForURLAndMimeType(url, mimeType));
+
+    if ([QLPreviewGetSupportedMIMETypesSet() containsObject:updatedMIMEType.get()]) {
+        RetainPtr<NSString> uti = adoptNS(QLTypeCopyUTIForURLAndMimeType(url, updatedMIMEType.get()));
+
+        RetainPtr<QLPreviewConverter> converter = adoptNS([allocQLPreviewConverterInstance() initWithData:data name:nil uti:uti.get() options:nil]);
+        NSURLRequest *request = [converter previewRequest];
+
+        // We use [request URL] here instead of url since it will be
+        // the URL that the WebDataSource will see during -dealloc.
+        addQLPreviewConverterWithFileForURL([request URL], converter.get(), nil);
+
+        return request;
+    }
+
+    return nil;
+}
+
+const URL WebCore::safeQLURLForDocumentURLAndResourceURL(const URL& documentURL, const String& resourceURL)
+{
+    id converter = nil;
+    NSURL *nsDocumentURL = documentURL;
+    {
+        LockHolder lock(qlPreviewConverterDictionaryMutex());
+        converter = [QLPreviewConverterDictionary() objectForKey:nsDocumentURL];
+    }
+
+    if (!converter)
+        return URL(ParsedURLString, resourceURL);
+
+    RetainPtr<NSURLRequest> request = adoptNS([[NSURLRequest alloc] initWithURL:[NSURL URLWithString:resourceURL]]);
+    NSURLRequest *safeRequest = [converter safeRequestForRequest:request.get()];
+    return [safeRequest URL];
+}
+
+static Vector<char> createQLPreviewProtocol()
+{
+    Vector<char> previewProtocol;
+    const char* qlPreviewScheme = [QLPreviewScheme UTF8String];
+    previewProtocol.append(qlPreviewScheme, strlen(qlPreviewScheme) + 1);
+    return previewProtocol;
+}
+
+const char* WebCore::QLPreviewProtocol()
+{
+    static NeverDestroyed<Vector<char>> previewProtocol(createQLPreviewProtocol());
+    return previewProtocol.get().data();
+}
+
+#if USE(CFURLCONNECTION)
+// The way QuickLook works is we pass it an NSURLConnectionDelegate callback object at creation
+// time. Then we pass it all the data as we receive it. Once we've downloaded the full URL,
+// QuickLook turns around and send us, through this delegate, the HTML version of the file which we
+// pass on to WebCore. The flag m_finishedLoadingDataIntoConverter in QuickLookHandle decides
+// whether to pass the data to QuickLook or WebCore.
+//
+// This works fine when using NS APIs, but when using CFNetwork, we don't have a NSURLConnectionDelegate.
+// So we create WebQuickLookHandleAsDelegate as an intermediate delegate object and pass it to
+// QLPreviewConverter. The proxy delegate then forwards the messages on to the CFNetwork code.
+@interface WebQuickLookHandleAsDelegate : NSObject <NSURLConnectionDelegate, WebCoreResourceLoaderDelegate> {
+    RefPtr<SynchronousResourceHandleCFURLConnectionDelegate> m_connectionDelegate;
+}
+
+- (id)initWithConnectionDelegate:(SynchronousResourceHandleCFURLConnectionDelegate*)connectionDelegate;
+@end
+
+@implementation WebQuickLookHandleAsDelegate
+- (id)initWithConnectionDelegate:(SynchronousResourceHandleCFURLConnectionDelegate*)connectionDelegate
+{
+    self = [super init];
+    if (!self)
+        return nil;
+    m_connectionDelegate = connectionDelegate;
+    return self;
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveDataArray:(NSArray *)dataArray
+{
+    UNUSED_PARAM(connection);
+    if (!m_connectionDelegate)
+        return;
+    LOG(Network, "WebQuickLookHandleAsDelegate::didReceiveDataArray()");
+    m_connectionDelegate->didReceiveDataArray(reinterpret_cast<CFArrayRef>(dataArray));
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived
+{
+    UNUSED_PARAM(connection);
+    if (!m_connectionDelegate)
+        return;
+    LOG(Network, "WebQuickLookHandleAsDelegate::didReceiveData() - data length = %ld", (long)[data length]);
+
+    // 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;
+    m_connectionDelegate->didReceiveData(reinterpret_cast<CFDataRef>(data), static_cast<int>(lengthReceived));
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)connection
+{
+    UNUSED_PARAM(connection);
+    if (!m_connectionDelegate)
+        return;
+    LOG(Network, "WebQuickLookHandleAsDelegate::didFinishLoading()");
+    m_connectionDelegate->didFinishLoading();
+}
+
+- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
+{
+    UNUSED_PARAM(connection);
+    if (!m_connectionDelegate)
+        return;
+    LOG(Network, "WebQuickLookHandleAsDelegate::didFail()");
+    m_connectionDelegate->didFail(reinterpret_cast<CFErrorRef>(error));
+}
+
+- (void)detachHandle
+{
+    m_connectionDelegate = nullptr;
+}
+@end
+#endif
+
+@interface WebResourceLoaderQuickLookDelegate : NSObject <NSURLConnectionDelegate, WebCoreResourceLoaderDelegate> {
+    RefPtr<ResourceLoader> _resourceLoader;
+    BOOL _hasSentDidReceiveResponse;
+    BOOL _hasFailed;
+}
+@property (nonatomic) QuickLookHandle* quickLookHandle;
+@end
+
+@implementation WebResourceLoaderQuickLookDelegate
+
+- (id)initWithResourceLoader:(PassRefPtr<ResourceLoader>)resourceLoader
+{
+    self = [super init];
+    if (!self)
+        return nil;
+
+    _resourceLoader = resourceLoader;
+    return self;
+}
+
+- (void)_sendDidReceiveResponseIfNecessary
+{
+    if (_hasSentDidReceiveResponse || _hasFailed || !_quickLookHandle)
+        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]) {
+        _hasFailed = YES;
+        _resourceLoader->didFail(_resourceLoader->cannotShowURLError());
+        return;
+    }
+
+    ResourceResponse response(nsResponse);
+    response.setIsQuickLook(true);
+
+    _hasSentDidReceiveResponse = YES;
+    _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;
+
+    // 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);
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)connection
+{
+    UNUSED_PARAM(connection);
+    if (!_resourceLoader || _hasFailed)
+        return;
+
+    ASSERT(_hasSentDidReceiveResponse);
+    _resourceLoader->didFinishLoading(0);
+}
+
+- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
+{
+    UNUSED_PARAM(connection);
+
+    [self _sendDidReceiveResponseIfNecessary];
+    if (_hasFailed)
+        return;
+
+    if (_resourceLoader)
+        _resourceLoader->didFail(ResourceError(error));
+}
+
+- (void)detachHandle
+{
+    _resourceLoader = nullptr;
+    _quickLookHandle = nullptr;
+}
+
+@end
+
+namespace WebCore {
+
+NSString *createTemporaryFileForQuickLook(NSString *fileName)
+{
+    NSString *downloadDirectory = createTemporaryDirectory(@"QuickLookContent");
+    if (!downloadDirectory)
+        return nil;
+
+    NSString *contentPath = [downloadDirectory stringByAppendingPathComponent:fileName];
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    NSString *uniqueContentPath = [fileManager _web_pathWithUniqueFilenameForPath:contentPath];
+
+    BOOL success = [fileManager _web_createFileAtPathWithIntermediateDirectories:uniqueContentPath
+                                                                        contents:nil
+                                                                      attributes:QLFileAttributes()
+                                                             directoryAttributes:QLDirectoryAttributes()];
+
+    return success ? uniqueContentPath : nil;
+}
+
+static inline QuickLookHandleClient* emptyClient()
+{
+    static NeverDestroyed<QuickLookHandleClient> emptyClient;
+    return &emptyClient.get();
+}
+
+QuickLookHandle::QuickLookHandle(NSURL *firstRequestURL, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
+    : m_firstRequestURL(firstRequestURL)
+    , m_converter(adoptNS([allocQLPreviewConverterInstance() initWithConnection:connection delegate:delegate response:nsResponse options:nil]))
+    , m_delegate(delegate)
+    , m_finishedLoadingDataIntoConverter(false)
+    , m_nsResponse([m_converter previewResponse])
+    , m_client(emptyClient())
+{
+    LOG(Network, "QuickLookHandle::QuickLookHandle() - previewFileName: %s", [m_converter previewFileName]);
+}
+
+std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
+{
+    ASSERT_ARG(handle, handle);
+    if (handle->firstRequest().requester() != ResourceRequest::Requester::Main || ![QLPreviewGetSupportedMIMETypesSet() containsObject:[nsResponse MIMEType]])
+        return nullptr;
+
+    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], connection, nsResponse, delegate));
+    handle->client()->didCreateQuickLookHandle(*quickLookHandle);
+    return quickLookHandle;
+}
+
+#if USE(CFURLCONNECTION)
+std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, SynchronousResourceHandleCFURLConnectionDelegate* connectionDelegate, CFURLResponseRef cfResponse)
+{
+    ASSERT_ARG(handle, handle);
+    if (handle->firstRequest().requester() != ResourceRequest::Requester::Main || ![QLPreviewGetSupportedMIMETypesSet() containsObject:(NSString *)CFURLResponseGetMIMEType(cfResponse)])
+        return nullptr;
+
+    NSURLResponse *nsResponse = [NSURLResponse _responseWithCFURLResponse:cfResponse];
+    WebQuickLookHandleAsDelegate *delegate = [[[WebQuickLookHandleAsDelegate alloc] initWithConnectionDelegate:connectionDelegate] autorelease];
+    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], nil, nsResponse, delegate));
+    handle->client()->didCreateQuickLookHandle(*quickLookHandle);
+    return quickLookHandle;
+}
+
+CFURLResponseRef QuickLookHandle::cfResponse()
+{
+    return [m_nsResponse _CFURLResponse];
+}
+#endif
+
+bool QuickLookHandle::shouldCreateForMIMEType(const String& mimeType)
+{
+    return [QLPreviewGetSupportedMIMETypesSet() containsObject:mimeType];
+}
+
+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], nil, response.nsURLResponse(), delegate.get()));
+    [delegate setQuickLookHandle:quickLookHandle.get()];
+    loader.didCreateQuickLookHandle(*quickLookHandle);
+    return quickLookHandle;
+}
+
+NSURLResponse *QuickLookHandle::nsResponse()
+{
+    return m_nsResponse.get();
+}
+
+bool QuickLookHandle::didReceiveDataArray(CFArrayRef cfDataArray)
+{
+    if (m_finishedLoadingDataIntoConverter)
+        return false;
+
+    LOG(Network, "QuickLookHandle::didReceiveDataArray()");
+    [m_converter appendDataArray:(NSArray *)cfDataArray];
+    m_client->didReceiveDataArray(cfDataArray);
+    return true;
+}
+
+bool QuickLookHandle::didReceiveData(CFDataRef cfData)
+{
+    if (m_finishedLoadingDataIntoConverter)
+        return false;
+    
+    return didReceiveDataArray(adoptCF(CFArrayCreate(kCFAllocatorDefault, (const void**)&cfData, 1, &kCFTypeArrayCallBacks)).get());
+}
+
+bool QuickLookHandle::didFinishLoading()
+{
+    if (m_finishedLoadingDataIntoConverter)
+        return false;
+
+    LOG(Network, "QuickLookHandle::didFinishLoading()");
+    m_finishedLoadingDataIntoConverter = YES;
+    [m_converter finishedAppendingData];
+    m_client->didFinishLoading();
+    return true;
+}
+
+void QuickLookHandle::didFail()
+{
+    LOG(Network, "QuickLookHandle::didFail()");
+    m_client->didFail();
+    [m_converter finishConverting];
+    m_converter = nullptr;
+}
+
+QuickLookHandle::~QuickLookHandle()
+{
+    LOG(Network, "QuickLookHandle::~QuickLookHandle()");
+    m_converter = nullptr;
+
+    [m_delegate detachHandle];
+}
+
+String QuickLookHandle::previewFileName() const
+{
+    return [m_converter previewFileName];
+}
+
+String QuickLookHandle::previewUTI() const
+{
+    return [m_converter previewUTI];
+}
+
+NSURL *QuickLookHandle::previewRequestURL() const
+{
+    return [[m_converter previewRequest] URL];
+}
+
+}
+
+#endif // USE(QUICK_LOOK)

Deleted: trunk/Source/WebCore/platform/network/ios/QuickLook.h (210128 => 210129)


--- trunk/Source/WebCore/platform/network/ios/QuickLook.h	2016-12-23 02:21:02 UTC (rev 210128)
+++ trunk/Source/WebCore/platform/network/ios/QuickLook.h	2016-12-23 02:24:28 UTC (rev 210129)
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef QuickLook_h
-#define QuickLook_h
-
-#if USE(QUICK_LOOK)
-
-#import "QuickLookHandleClient.h"
-#import "ResourceRequest.h"
-#import <objc/objc-runtime.h>
-#import <wtf/RefPtr.h>
-
-#if USE(CFURLCONNECTION)
-#include "CFNetworkSPI.h"
-#endif
-
-OBJC_CLASS NSData;
-OBJC_CLASS NSDictionary;
-OBJC_CLASS NSFileHandle;
-OBJC_CLASS NSSet;
-OBJC_CLASS NSString;
-OBJC_CLASS NSURL;
-OBJC_CLASS NSURLConnection;
-OBJC_CLASS NSURLRequest;
-OBJC_CLASS NSURLResponse;
-OBJC_CLASS QLPreviewConverter;
-
-namespace WebCore {
-
-class QuickLookHandleClient;
-class ResourceHandle;
-class ResourceLoader;
-class ResourceResponse;
-class SynchronousResourceHandleCFURLConnectionDelegate;
-
-WEBCORE_EXPORT NSSet *QLPreviewGetSupportedMIMETypesSet();
-
-// Used for setting the permissions on the saved QL content
-NSDictionary *QLFileAttributes();
-NSDictionary *QLDirectoryAttributes();
-
-WEBCORE_EXPORT void addQLPreviewConverterWithFileForURL(NSURL *, id converter, NSString *fileName);
-WEBCORE_EXPORT NSString *qlPreviewConverterFileNameForURL(NSURL *);
-WEBCORE_EXPORT NSString *qlPreviewConverterUTIForURL(NSURL *);
-WEBCORE_EXPORT void removeQLPreviewConverterForURL(NSURL *);
-
-WEBCORE_EXPORT RetainPtr<NSURLRequest> registerQLPreviewConverterIfNeeded(NSURL *, NSString *mimeType, NSData *);
-
-const URL safeQLURLForDocumentURLAndResourceURL(const URL& documentURL, const String& resourceURL);
-
-WEBCORE_EXPORT const char* QLPreviewProtocol();
-
-WEBCORE_EXPORT NSString *createTemporaryFileForQuickLook(NSString *fileName);
-
-class QuickLookHandle {
-    WTF_MAKE_NONCOPYABLE(QuickLookHandle);
-public:
-    WEBCORE_EXPORT static bool shouldCreateForMIMEType(const String&);
-
-    static std::unique_ptr<QuickLookHandle> create(ResourceHandle*, NSURLConnection *, NSURLResponse *, id delegate);
-#if USE(CFURLCONNECTION)
-    static std::unique_ptr<QuickLookHandle> create(ResourceHandle*, SynchronousResourceHandleCFURLConnectionDelegate*, CFURLResponseRef);
-#endif
-    // FIXME: Use of ResourceLoader here is a platform violation.
-    WEBCORE_EXPORT static std::unique_ptr<QuickLookHandle> create(ResourceLoader&, const ResourceResponse&);
-
-    WEBCORE_EXPORT ~QuickLookHandle();
-
-    WEBCORE_EXPORT bool didReceiveDataArray(CFArrayRef);
-    WEBCORE_EXPORT bool didReceiveData(CFDataRef);
-    WEBCORE_EXPORT bool didFinishLoading();
-    WEBCORE_EXPORT void didFail();
-
-    WEBCORE_EXPORT NSURLResponse *nsResponse();
-#if USE(CFURLCONNECTION)
-    CFURLResponseRef cfResponse();
-#endif
-
-    void setClient(PassRefPtr<QuickLookHandleClient> client) { m_client = client; }
-
-    WEBCORE_EXPORT String previewFileName() const;
-    WEBCORE_EXPORT String previewUTI() const;
-    NSURL *firstRequestURL() const { return m_firstRequestURL.get(); }
-    WEBCORE_EXPORT NSURL *previewRequestURL() const;
-    QLPreviewConverter *converter() const { return m_converter.get(); }
-
-private:
-    QuickLookHandle(NSURL *, NSURLConnection *, NSURLResponse *, id delegate);
-
-    RetainPtr<NSURL> m_firstRequestURL;
-    RetainPtr<QLPreviewConverter> m_converter;
-    RetainPtr<id> m_delegate;
-    bool m_finishedLoadingDataIntoConverter;
-    RetainPtr<NSFileHandle *> m_quicklookFileHandle;
-    RetainPtr<NSURLResponse> m_nsResponse;
-    RefPtr<QuickLookHandleClient> m_client;
-};
-
-} // namespace WebCore
-
-#endif // USE(QUICK_LOOK)
-
-#endif // QuickLook_h

Deleted: trunk/Source/WebCore/platform/network/ios/QuickLook.mm (210128 => 210129)


--- trunk/Source/WebCore/platform/network/ios/QuickLook.mm	2016-12-23 02:21:02 UTC (rev 210128)
+++ trunk/Source/WebCore/platform/network/ios/QuickLook.mm	2016-12-23 02:24:28 UTC (rev 210129)
@@ -1,522 +0,0 @@
-/*
- * Copyright (C) 2009-2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import "config.h"
-#import "QuickLook.h"
-
-#if USE(QUICK_LOOK)
-
-#import "DocumentLoader.h"
-#import "FileSystemIOS.h"
-#import "Logging.h"
-#import "NSFileManagerSPI.h"
-#import "ResourceError.h"
-#import "ResourceHandle.h"
-#import "ResourceLoader.h"
-#import "RuntimeApplicationChecks.h"
-#import "SynchronousResourceHandleCFURLConnectionDelegate.h"
-#import "WebCoreResourceHandleAsDelegate.h"
-#import "WebCoreURLResponseIOS.h"
-#import <Foundation/Foundation.h>
-#import <wtf/NeverDestroyed.h>
-#import <wtf/StdLibExtras.h>
-#import <wtf/Threading.h>
-#import <wtf/Vector.h>
-#import <wtf/text/WTFString.h>
-
-#import "QuickLookSoftLink.h"
-
-using namespace WebCore;
-
-NSSet *WebCore::QLPreviewGetSupportedMIMETypesSet()
-{
-    static NeverDestroyed<RetainPtr<NSSet>> set = QLPreviewGetSupportedMIMETypes();
-    return set.get().get();
-}
-
-NSDictionary *WebCore::QLFileAttributes()
-{
-    // Set file perms to owner read/write only
-    NSNumber *filePOSIXPermissions = [NSNumber numberWithInteger:(WEB_UREAD | WEB_UWRITE)];
-    static NSDictionary *dictionary = adoptNS([[NSDictionary alloc] initWithObjectsAndKeys:
-                                        NSUserName(), NSFileOwnerAccountName,
-                                        filePOSIXPermissions, NSFilePosixPermissions,
-                                        nullptr]).leakRef();
-    return dictionary;
-}
-
-NSDictionary *WebCore::QLDirectoryAttributes()
-{
-    // Set file perms to owner read/write/execute only
-    NSNumber *directoryPOSIXPermissions = [NSNumber numberWithInteger:(WEB_UREAD | WEB_UWRITE | WEB_UEXEC)];
-    static NSDictionary *dictionary = adoptNS([[NSDictionary alloc] initWithObjectsAndKeys:
-                                                NSUserName(), NSFileOwnerAccountName,
-                                                directoryPOSIXPermissions, NSFilePosixPermissions,
-                                                nullptr]).leakRef();
-    return dictionary;
-}
-
-static Lock& qlPreviewConverterDictionaryMutex()
-{
-    static NeverDestroyed<Lock> mutex;
-    return mutex;
-}
-
-static NSMutableDictionary *QLPreviewConverterDictionary()
-{
-    static NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
-    return dictionary;
-}
-
-static NSMutableDictionary *QLContentDictionary()
-{
-    static NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc] init];
-    return contentDictionary;
-}
-
-void WebCore::addQLPreviewConverterWithFileForURL(NSURL *url, id converter, NSString *fileName)
-{
-    ASSERT(url);
-    ASSERT(converter);
-    LockHolder lock(qlPreviewConverterDictionaryMutex());
-    [QLPreviewConverterDictionary() setObject:converter forKey:url];
-    [QLContentDictionary() setObject:(fileName ? fileName : @"") forKey:url];
-}
-
-NSString *WebCore::qlPreviewConverterFileNameForURL(NSURL *url)
-{
-    return [QLContentDictionary() objectForKey:url];
-}
-
-NSString *WebCore::qlPreviewConverterUTIForURL(NSURL *url)
-{
-    id converter = nil;
-    {
-        LockHolder lock(qlPreviewConverterDictionaryMutex());
-        converter = [QLPreviewConverterDictionary() objectForKey:url];
-    }
-    if (!converter)
-        return nil;
-    return [converter previewUTI];
-}
-
-void WebCore::removeQLPreviewConverterForURL(NSURL *url)
-{
-    LockHolder lock(qlPreviewConverterDictionaryMutex());
-    [QLPreviewConverterDictionary() removeObjectForKey:url];
-
-    // Delete the file when we remove the preview converter
-    NSString *filename = qlPreviewConverterFileNameForURL(url);
-    if ([filename length])
-        [[NSFileManager defaultManager] _web_removeFileOnlyAtPath:filename];
-    [QLContentDictionary() removeObjectForKey:url];
-}
-
-RetainPtr<NSURLRequest> WebCore::registerQLPreviewConverterIfNeeded(NSURL *url, NSString *mimeType, NSData *data)
-{
-    RetainPtr<NSString> updatedMIMEType = adoptNS(QLTypeCopyBestMimeTypeForURLAndMimeType(url, mimeType));
-
-    if ([QLPreviewGetSupportedMIMETypesSet() containsObject:updatedMIMEType.get()]) {
-        RetainPtr<NSString> uti = adoptNS(QLTypeCopyUTIForURLAndMimeType(url, updatedMIMEType.get()));
-
-        RetainPtr<QLPreviewConverter> converter = adoptNS([allocQLPreviewConverterInstance() initWithData:data name:nil uti:uti.get() options:nil]);
-        NSURLRequest *request = [converter previewRequest];
-
-        // We use [request URL] here instead of url since it will be
-        // the URL that the WebDataSource will see during -dealloc.
-        addQLPreviewConverterWithFileForURL([request URL], converter.get(), nil);
-
-        return request;
-    }
-
-    return nil;
-}
-
-const URL WebCore::safeQLURLForDocumentURLAndResourceURL(const URL& documentURL, const String& resourceURL)
-{
-    id converter = nil;
-    NSURL *nsDocumentURL = documentURL;
-    {
-        LockHolder lock(qlPreviewConverterDictionaryMutex());
-        converter = [QLPreviewConverterDictionary() objectForKey:nsDocumentURL];
-    }
-
-    if (!converter)
-        return URL(ParsedURLString, resourceURL);
-
-    RetainPtr<NSURLRequest> request = adoptNS([[NSURLRequest alloc] initWithURL:[NSURL URLWithString:resourceURL]]);
-    NSURLRequest *safeRequest = [converter safeRequestForRequest:request.get()];
-    return [safeRequest URL];
-}
-
-static Vector<char> createQLPreviewProtocol()
-{
-    Vector<char> previewProtocol;
-    const char* qlPreviewScheme = [QLPreviewScheme UTF8String];
-    previewProtocol.append(qlPreviewScheme, strlen(qlPreviewScheme) + 1);
-    return previewProtocol;
-}
-
-const char* WebCore::QLPreviewProtocol()
-{
-    static NeverDestroyed<Vector<char>> previewProtocol(createQLPreviewProtocol());
-    return previewProtocol.get().data();
-}
-
-#if USE(CFURLCONNECTION)
-// The way QuickLook works is we pass it an NSURLConnectionDelegate callback object at creation
-// time. Then we pass it all the data as we receive it. Once we've downloaded the full URL,
-// QuickLook turns around and send us, through this delegate, the HTML version of the file which we
-// pass on to WebCore. The flag m_finishedLoadingDataIntoConverter in QuickLookHandle decides
-// whether to pass the data to QuickLook or WebCore.
-//
-// This works fine when using NS APIs, but when using CFNetwork, we don't have a NSURLConnectionDelegate.
-// So we create WebQuickLookHandleAsDelegate as an intermediate delegate object and pass it to
-// QLPreviewConverter. The proxy delegate then forwards the messages on to the CFNetwork code.
-@interface WebQuickLookHandleAsDelegate : NSObject <NSURLConnectionDelegate, WebCoreResourceLoaderDelegate> {
-    RefPtr<SynchronousResourceHandleCFURLConnectionDelegate> m_connectionDelegate;
-}
-
-- (id)initWithConnectionDelegate:(SynchronousResourceHandleCFURLConnectionDelegate*)connectionDelegate;
-@end
-
-@implementation WebQuickLookHandleAsDelegate
-- (id)initWithConnectionDelegate:(SynchronousResourceHandleCFURLConnectionDelegate*)connectionDelegate
-{
-    self = [super init];
-    if (!self)
-        return nil;
-    m_connectionDelegate = connectionDelegate;
-    return self;
-}
-
-- (void)connection:(NSURLConnection *)connection didReceiveDataArray:(NSArray *)dataArray
-{
-    UNUSED_PARAM(connection);
-    if (!m_connectionDelegate)
-        return;
-    LOG(Network, "WebQuickLookHandleAsDelegate::didReceiveDataArray()");
-    m_connectionDelegate->didReceiveDataArray(reinterpret_cast<CFArrayRef>(dataArray));
-}
-
-- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived
-{
-    UNUSED_PARAM(connection);
-    if (!m_connectionDelegate)
-        return;
-    LOG(Network, "WebQuickLookHandleAsDelegate::didReceiveData() - data length = %ld", (long)[data length]);
-
-    // 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;
-    m_connectionDelegate->didReceiveData(reinterpret_cast<CFDataRef>(data), static_cast<int>(lengthReceived));
-}
-
-- (void)connectionDidFinishLoading:(NSURLConnection *)connection
-{
-    UNUSED_PARAM(connection);
-    if (!m_connectionDelegate)
-        return;
-    LOG(Network, "WebQuickLookHandleAsDelegate::didFinishLoading()");
-    m_connectionDelegate->didFinishLoading();
-}
-
-- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
-{
-    UNUSED_PARAM(connection);
-    if (!m_connectionDelegate)
-        return;
-    LOG(Network, "WebQuickLookHandleAsDelegate::didFail()");
-    m_connectionDelegate->didFail(reinterpret_cast<CFErrorRef>(error));
-}
-
-- (void)detachHandle
-{
-    m_connectionDelegate = nullptr;
-}
-@end
-#endif
-
-@interface WebResourceLoaderQuickLookDelegate : NSObject <NSURLConnectionDelegate, WebCoreResourceLoaderDelegate> {
-    RefPtr<ResourceLoader> _resourceLoader;
-    BOOL _hasSentDidReceiveResponse;
-    BOOL _hasFailed;
-}
-@property (nonatomic) QuickLookHandle* quickLookHandle;
-@end
-
-@implementation WebResourceLoaderQuickLookDelegate
-
-- (id)initWithResourceLoader:(PassRefPtr<ResourceLoader>)resourceLoader
-{
-    self = [super init];
-    if (!self)
-        return nil;
-
-    _resourceLoader = resourceLoader;
-    return self;
-}
-
-- (void)_sendDidReceiveResponseIfNecessary
-{
-    if (_hasSentDidReceiveResponse || _hasFailed || !_quickLookHandle)
-        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]) {
-        _hasFailed = YES;
-        _resourceLoader->didFail(_resourceLoader->cannotShowURLError());
-        return;
-    }
-
-    ResourceResponse response(nsResponse);
-    response.setIsQuickLook(true);
-
-    _hasSentDidReceiveResponse = YES;
-    _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;
-
-    // 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);
-}
-
-- (void)connectionDidFinishLoading:(NSURLConnection *)connection
-{
-    UNUSED_PARAM(connection);
-    if (!_resourceLoader || _hasFailed)
-        return;
-
-    ASSERT(_hasSentDidReceiveResponse);
-    _resourceLoader->didFinishLoading(0);
-}
-
-- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
-{
-    UNUSED_PARAM(connection);
-
-    [self _sendDidReceiveResponseIfNecessary];
-    if (_hasFailed)
-        return;
-
-    if (_resourceLoader)
-        _resourceLoader->didFail(ResourceError(error));
-}
-
-- (void)detachHandle
-{
-    _resourceLoader = nullptr;
-    _quickLookHandle = nullptr;
-}
-
-@end
-
-namespace WebCore {
-
-NSString *createTemporaryFileForQuickLook(NSString *fileName)
-{
-    NSString *downloadDirectory = createTemporaryDirectory(@"QuickLookContent");
-    if (!downloadDirectory)
-        return nil;
-
-    NSString *contentPath = [downloadDirectory stringByAppendingPathComponent:fileName];
-    NSFileManager *fileManager = [NSFileManager defaultManager];
-    NSString *uniqueContentPath = [fileManager _web_pathWithUniqueFilenameForPath:contentPath];
-
-    BOOL success = [fileManager _web_createFileAtPathWithIntermediateDirectories:uniqueContentPath
-                                                                        contents:nil
-                                                                      attributes:QLFileAttributes()
-                                                             directoryAttributes:QLDirectoryAttributes()];
-
-    return success ? uniqueContentPath : nil;
-}
-
-static inline QuickLookHandleClient* emptyClient()
-{
-    static NeverDestroyed<QuickLookHandleClient> emptyClient;
-    return &emptyClient.get();
-}
-
-QuickLookHandle::QuickLookHandle(NSURL *firstRequestURL, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
-    : m_firstRequestURL(firstRequestURL)
-    , m_converter(adoptNS([allocQLPreviewConverterInstance() initWithConnection:connection delegate:delegate response:nsResponse options:nil]))
-    , m_delegate(delegate)
-    , m_finishedLoadingDataIntoConverter(false)
-    , m_nsResponse([m_converter previewResponse])
-    , m_client(emptyClient())
-{
-    LOG(Network, "QuickLookHandle::QuickLookHandle() - previewFileName: %s", [m_converter previewFileName]);
-}
-
-std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, NSURLConnection *connection, NSURLResponse *nsResponse, id delegate)
-{
-    ASSERT_ARG(handle, handle);
-    if (handle->firstRequest().requester() != ResourceRequest::Requester::Main || ![QLPreviewGetSupportedMIMETypesSet() containsObject:[nsResponse MIMEType]])
-        return nullptr;
-
-    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], connection, nsResponse, delegate));
-    handle->client()->didCreateQuickLookHandle(*quickLookHandle);
-    return quickLookHandle;
-}
-
-#if USE(CFURLCONNECTION)
-std::unique_ptr<QuickLookHandle> QuickLookHandle::create(ResourceHandle* handle, SynchronousResourceHandleCFURLConnectionDelegate* connectionDelegate, CFURLResponseRef cfResponse)
-{
-    ASSERT_ARG(handle, handle);
-    if (handle->firstRequest().requester() != ResourceRequest::Requester::Main || ![QLPreviewGetSupportedMIMETypesSet() containsObject:(NSString *)CFURLResponseGetMIMEType(cfResponse)])
-        return nullptr;
-
-    NSURLResponse *nsResponse = [NSURLResponse _responseWithCFURLResponse:cfResponse];
-    WebQuickLookHandleAsDelegate *delegate = [[[WebQuickLookHandleAsDelegate alloc] initWithConnectionDelegate:connectionDelegate] autorelease];
-    std::unique_ptr<QuickLookHandle> quickLookHandle(new QuickLookHandle([handle->firstRequest().nsURLRequest(DoNotUpdateHTTPBody) URL], nil, nsResponse, delegate));
-    handle->client()->didCreateQuickLookHandle(*quickLookHandle);
-    return quickLookHandle;
-}
-
-CFURLResponseRef QuickLookHandle::cfResponse()
-{
-    return [m_nsResponse _CFURLResponse];
-}
-#endif
-
-bool QuickLookHandle::shouldCreateForMIMEType(const String& mimeType)
-{
-    return [QLPreviewGetSupportedMIMETypesSet() containsObject:mimeType];
-}
-
-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], nil, response.nsURLResponse(), delegate.get()));
-    [delegate setQuickLookHandle:quickLookHandle.get()];
-    loader.didCreateQuickLookHandle(*quickLookHandle);
-    return quickLookHandle;
-}
-
-NSURLResponse *QuickLookHandle::nsResponse()
-{
-    return m_nsResponse.get();
-}
-
-bool QuickLookHandle::didReceiveDataArray(CFArrayRef cfDataArray)
-{
-    if (m_finishedLoadingDataIntoConverter)
-        return false;
-
-    LOG(Network, "QuickLookHandle::didReceiveDataArray()");
-    [m_converter appendDataArray:(NSArray *)cfDataArray];
-    m_client->didReceiveDataArray(cfDataArray);
-    return true;
-}
-
-bool QuickLookHandle::didReceiveData(CFDataRef cfData)
-{
-    if (m_finishedLoadingDataIntoConverter)
-        return false;
-    
-    return didReceiveDataArray(adoptCF(CFArrayCreate(kCFAllocatorDefault, (const void**)&cfData, 1, &kCFTypeArrayCallBacks)).get());
-}
-
-bool QuickLookHandle::didFinishLoading()
-{
-    if (m_finishedLoadingDataIntoConverter)
-        return false;
-
-    LOG(Network, "QuickLookHandle::didFinishLoading()");
-    m_finishedLoadingDataIntoConverter = YES;
-    [m_converter finishedAppendingData];
-    m_client->didFinishLoading();
-    return true;
-}
-
-void QuickLookHandle::didFail()
-{
-    LOG(Network, "QuickLookHandle::didFail()");
-    m_client->didFail();
-    [m_converter finishConverting];
-    m_converter = nullptr;
-}
-
-QuickLookHandle::~QuickLookHandle()
-{
-    LOG(Network, "QuickLookHandle::~QuickLookHandle()");
-    m_converter = nullptr;
-
-    [m_delegate detachHandle];
-}
-
-String QuickLookHandle::previewFileName() const
-{
-    return [m_converter previewFileName];
-}
-
-String QuickLookHandle::previewUTI() const
-{
-    return [m_converter previewUTI];
-}
-
-NSURL *QuickLookHandle::previewRequestURL() const
-{
-    return [[m_converter previewRequest] URL];
-}
-
-}
-
-#endif // USE(QUICK_LOOK)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to