Changeset 210864 in webkit
- Timestamp:
- Jan 18, 2017, 12:29:26 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 14 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r210862 r210864 1 2017-01-18 Andy Estes <aestes@apple.com> 2 3 [QuickLook] Support password-protected documents 4 https://bugs.webkit.org/show_bug.cgi?id=167153 5 <rdar://problem/28544527> 6 7 Reviewed by Alex Christensen. 8 9 * platform/ios-simulator/TestExpectations: Temporarily skipped the new test until the 10 necessary support is available in QuickLook.framework. 11 * quicklook/password-protected-expected.html: Added. 12 * quicklook/password-protected.html: Added. 13 * quicklook/resources/password-protected.pages: Added. 14 1 15 2017-01-18 Youenn Fablet <youenn@apple.com> 2 16 -
trunk/LayoutTests/platform/ios-simulator/TestExpectations
r210848 r210864 2831 2831 # editing/caret/ios/emoji.html is used instead. 2832 2832 editing/caret/emoji.html [ Failure ] 2833 2834 # Requires changes to QuickLook.framework tracked by rdar://problem/28544527 2835 quicklook/password-protected.html [ Skip ] -
trunk/Source/WebCore/ChangeLog
r210862 r210864 1 2017-01-18 Andy Estes <aestes@apple.com> 2 3 [QuickLook] Support password-protected documents 4 https://bugs.webkit.org/show_bug.cgi?id=167153 5 <rdar://problem/28544527> 6 7 Reviewed by Alex Christensen. 8 9 Added support for previewing password-protected documents. If a document is 10 password-protected, QLPreviewConverter will call -connection:didFailWithError: with an error 11 code of kQLReturnPasswordProtected. When this happens, QuickLookHandle will ask the client 12 for a password, create a new QLPreviewConverter with the password specified in an options 13 dictionary, and replay the buffered input data into the converter. QLPreviewConverter will 14 then send the converted document data to its delegate as usual. 15 16 Password entry UI will be added later; this patch implements the necessary QuickLookHandle 17 logic and adds support for testing. 18 19 Test: quicklook/password-protected.html 20 21 * PlatformMac.cmake: 22 * WebCore.xcodeproj/project.pbxproj: 23 * loader/ios/QuickLook.h: Declared setClientForTesting(). 24 * loader/ios/QuickLook.mm: 25 (testingClient): Created a static RefPtr to hold the testing client. 26 (testingOrEmptyClient): Returns the testing client if it's set, otherwise returns the empty client. 27 (-[WebPreviewConverter initWithResourceLoader:resourceResponse:quickLookHandle:]): 28 Initialized _client to testingOrEmptyClient(), stored the ResourceResponse's nsURLResponse() 29 in _originalResponse, and initialized _bufferedDataArray. 30 (-[WebPreviewConverter setClient:]): Ignore the new client if there is already a testing client. 31 (-[WebPreviewConverter appendDataArray:]): Stored the data array in _bufferedDataArray. 32 (-[WebPreviewConverter _sendDidReceiveResponseIfNecessary]): Cleared _bufferedDataArray. 33 (-[WebPreviewConverter connection:didReceiveData:lengthReceived:]): Changed the 34 UNUSED_PARAM() to an ASSERT_UNUSED(). 35 (-[WebPreviewConverter connectionDidFinishLoading:]): Ditto. 36 (-[WebPreviewConverter connection:didFailWithError:]): If the error code is 37 kQLReturnPasswordProtected and the domain is QuickLookErrorDomain, request a password from 38 the client then create a new QLPreviewConverter with the password specified in the options dictionary. 39 (WebCore::QuickLookHandle::setClientForTesting): Set testingClient() to the specified client. 40 * platform/ios/QuickLookSoftLink.h: Soft-linked kQLPreviewOptionPasswordKey. 41 * platform/ios/QuickLookSoftLink.mm: Ditto. 42 * platform/network/ios/QuickLookHandleClient.h: 43 (WebCore::QuickLookHandleClient::supportsPasswordEntry): Added. Tells QuickLookHandle 44 whether the client supports password entry. 45 (WebCore::QuickLookHandleClient::didRequestPassword): Added. Asks the client to specify a 46 password in the completionHandler lambda. 47 * platform/spi/ios/QuickLookSPI.h: Declared kQLReturnPasswordProtected for the public SDK 48 and asserted that its value is 4. 49 * testing/Internals.cpp: 50 (WebCore::Internals::resetToConsistentState): Reset the MockQuickLookHandleClient password 51 to the empty string and uninstalled the testing client. 52 (WebCore::Internals::setQuickLookPassword): Installed the testing client and set a password 53 on the MockQuickLookHandleClient. 54 * testing/Internals.h: 55 * testing/Internals.idl: Defined Internals.setQuickLookPassword(). 56 * testing/MockQuickLookHandleClient.cpp: Added. 57 (WebCore::MockQuickLookHandleClient::singleton): Returned a shared MockQuickLookHandleClient. 58 (WebCore::MockQuickLookHandleClient::didRequestPassword): Dispatched a lambda on the 59 main-or-Web-thread run loop to call the completionHandler with the specified password. 60 This simulates the delay that would happen when prompting the user for a password. 61 * testing/MockQuickLookHandleClient.h: Added. 62 1 63 2017-01-18 Youenn Fablet <youenn@apple.com> 2 64 -
trunk/Source/WebCore/PlatformMac.cmake
r210532 r210864 748 748 testing/MockContentFilter.cpp 749 749 testing/MockContentFilterSettings.cpp 750 testing/MockQuickLookHandleClient.cpp 750 751 751 752 testing/cocoa/WebArchiveDumpSupport.mm -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r210844 r210864 3890 3890 A136A00C1134DBD200CC8D50 /* XMLHttpRequestProgressEventThrottle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A136A00A1134DBD200CC8D50 /* XMLHttpRequestProgressEventThrottle.cpp */; }; 3891 3891 A136A00D1134DBD200CC8D50 /* XMLHttpRequestProgressEventThrottle.h in Headers */ = {isa = PBXBuildFile; fileRef = A136A00B1134DBD200CC8D50 /* XMLHttpRequestProgressEventThrottle.h */; }; 3892 A140618B1E2ECA0A0032B34E /* MockQuickLookHandleClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A14061891E2ECA0A0032B34E /* MockQuickLookHandleClient.cpp */; }; 3893 A140618C1E2ECA0A0032B34E /* MockQuickLookHandleClient.h in Headers */ = {isa = PBXBuildFile; fileRef = A140618A1E2ECA0A0032B34E /* MockQuickLookHandleClient.h */; }; 3892 3894 A14090FB1AA51E1D0091191A /* ContentFilterUnblockHandlerCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = A14090FA1AA51E1D0091191A /* ContentFilterUnblockHandlerCocoa.mm */; }; 3893 3895 A14090FD1AA51E480091191A /* ContentFilterUnblockHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A14090FC1AA51E480091191A /* ContentFilterUnblockHandler.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 11555 11557 A136A00A1134DBD200CC8D50 /* XMLHttpRequestProgressEventThrottle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XMLHttpRequestProgressEventThrottle.cpp; sourceTree = "<group>"; }; 11556 11558 A136A00B1134DBD200CC8D50 /* XMLHttpRequestProgressEventThrottle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLHttpRequestProgressEventThrottle.h; sourceTree = "<group>"; }; 11559 A14061891E2ECA0A0032B34E /* MockQuickLookHandleClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockQuickLookHandleClient.cpp; sourceTree = "<group>"; }; 11560 A140618A1E2ECA0A0032B34E /* MockQuickLookHandleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockQuickLookHandleClient.h; sourceTree = "<group>"; }; 11557 11561 A14090FA1AA51E1D0091191A /* ContentFilterUnblockHandlerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ContentFilterUnblockHandlerCocoa.mm; sourceTree = "<group>"; }; 11558 11562 A14090FC1AA51E480091191A /* ContentFilterUnblockHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentFilterUnblockHandler.h; sourceTree = "<group>"; }; … … 16613 16617 2DAAE32C19DCAF6000E002D2 /* MockPageOverlayClient.cpp */, 16614 16618 2DAAE32D19DCAF6000E002D2 /* MockPageOverlayClient.h */, 16619 A14061891E2ECA0A0032B34E /* MockQuickLookHandleClient.cpp */, 16620 A140618A1E2ECA0A0032B34E /* MockQuickLookHandleClient.h */, 16615 16621 EB081CD81696084400553730 /* TypeConversions.h */, 16616 16622 EB081CD91696084400553730 /* TypeConversions.idl */, … … 24808 24814 417DA6DA13734E6E007C57FB /* Internals.h in Headers */, 24809 24815 A7BF7EE014C9175A0014489D /* InternalSettings.h in Headers */, 24816 A140618C1E2ECA0A0032B34E /* MockQuickLookHandleClient.h in Headers */, 24810 24817 53E29E5F167A8A1900586D3D /* InternalSettingsGenerated.h in Headers */, 24811 24818 51714EB11CF665CE004723C4 /* JSGCObservation.h in Headers */, … … 28736 28743 51058ADD1D6792C1009A538C /* MockGamepadProvider.cpp in Sources */, 28737 28744 CDF4B7311E03D00700E235A2 /* MockCDMFactory.cpp in Sources */, 28745 A140618B1E2ECA0A0032B34E /* MockQuickLookHandleClient.cpp in Sources */, 28738 28746 2D6F3E901C1ECB270061DBD4 /* MockPageOverlay.cpp in Sources */, 28739 28747 CDF4B7321E03D06000E235A2 /* JSMockCDMFactory.cpp in Sources */, -
trunk/Source/WebCore/loader/ios/QuickLook.h
r210796 r210864 83 83 84 84 WEBCORE_EXPORT void setClient(Ref<QuickLookHandleClient>&&); 85 WEBCORE_EXPORT static void setClientForTesting(RefPtr<QuickLookHandleClient>&&); 85 86 86 87 WEBCORE_EXPORT String previewFileName() const; -
trunk/Source/WebCore/loader/ios/QuickLook.mm
r210796 r210864 179 179 } 180 180 181 static RefPtr<QuickLookHandleClient>& testingClient() 182 { 183 static NeverDestroyed<RefPtr<QuickLookHandleClient>> testingClient; 184 return testingClient.get(); 185 } 186 181 187 static QuickLookHandleClient& emptyClient() 182 188 { 183 189 static NeverDestroyed<QuickLookHandleClient> emptyClient; 184 190 return emptyClient.get(); 191 } 192 193 static QuickLookHandleClient& testingOrEmptyClient() 194 { 195 if (testingClient()) 196 return *testingClient(); 197 return emptyClient(); 185 198 } 186 199 … … 189 202 QuickLookHandle* _handle; 190 203 RefPtr<QuickLookHandleClient> _client; 204 RetainPtr<NSURLResponse> _originalResponse; 191 205 RetainPtr<QLPreviewConverter> _platformConverter; 192 206 RetainPtr<NSURLResponse> _previewResponse; 207 RetainPtr<NSMutableArray> _bufferedDataArray; 193 208 BOOL _hasSentDidReceiveResponse; 194 209 BOOL _hasFailed; … … 215 230 _resourceLoader = &resourceLoader; 216 231 _handle = &quickLookHandle; 217 _client = &emptyClient(); 218 _platformConverter = adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:self response:resourceResponse.nsURLResponse() options:nil]); 232 _client = &testingOrEmptyClient(); 233 _originalResponse = resourceResponse.nsURLResponse(); 234 _platformConverter = adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:self response:_originalResponse.get() options:nil]); 219 235 _previewResponse = [_platformConverter previewResponse]; 236 _bufferedDataArray = adoptNS([[NSMutableArray alloc] init]); 220 237 221 238 LOG(Network, "WebPreviewConverter created with preview file name \"%s\".", [_platformConverter previewFileName]); … … 225 242 - (void)setClient:(Ref<QuickLookHandleClient>&&)client 226 243 { 227 _client = WTFMove(client); 244 if (!testingClient()) 245 _client = WTFMove(client); 228 246 } 229 247 … … 232 250 LOG(Network, "WebPreviewConverter appending data array with count %ld.", dataArray.count); 233 251 [_platformConverter appendDataArray:dataArray]; 252 [_bufferedDataArray addObjectsFromArray:dataArray]; 234 253 _client->didReceiveDataArray((CFArrayRef)dataArray); 235 254 } … … 256 275 - (void)_sendDidReceiveResponseIfNecessary 257 276 { 277 [_bufferedDataArray removeAllObjects]; 278 258 279 if (_hasSentDidReceiveResponse || _hasFailed) 259 280 return; … … 276 297 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived 277 298 { 278 UNUSED_PARAM(connection);299 ASSERT_UNUSED(connection, !connection); 279 300 [self _sendDidReceiveResponseIfNecessary]; 280 301 if (_hasFailed) … … 289 310 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 290 311 { 291 UNUSED_PARAM(connection);312 ASSERT_UNUSED(connection, !connection); 292 313 if (_hasFailed) 293 314 return; … … 299 320 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 300 321 { 301 UNUSED_PARAM(connection); 322 ASSERT_UNUSED(connection, !connection); 323 324 if (error.code == kQLReturnPasswordProtected && [error.domain isEqualToString:@"QuickLookErrorDomain"]) { 325 if (!_client->supportsPasswordEntry()) { 326 _resourceLoader->didFail(_resourceLoader->cannotShowURLError()); 327 return; 328 } 329 330 _client->didRequestPassword([retainedSelf = retainPtr(self)] (const String& password) { 331 NSDictionary *passwordOption = @{ (NSString *)kQLPreviewOptionPasswordKey : password }; 332 auto converterWithPassword = adoptNS([allocQLPreviewConverterInstance() initWithConnection:nil delegate:retainedSelf.get() response:retainedSelf->_originalResponse.get() options:passwordOption]); 333 [converterWithPassword appendDataArray:retainedSelf->_bufferedDataArray.get()]; 334 [converterWithPassword finishedAppendingData]; 335 retainedSelf->_previewResponse = [converterWithPassword previewResponse]; 336 retainedSelf->_platformConverter = WTFMove(converterWithPassword); 337 }); 338 return; 339 } 340 302 341 [self _sendDidReceiveResponseIfNecessary]; 303 342 if (!_hasFailed) … … 388 427 } 389 428 429 void QuickLookHandle::setClientForTesting(RefPtr<QuickLookHandleClient>&& client) 430 { 431 testingClient() = WTFMove(client); 432 } 433 390 434 String QuickLookHandle::previewFileName() const 391 435 { -
trunk/Source/WebCore/platform/ios/QuickLookSoftLink.h
r183598 r210864 1 1 /* 2 * Copyright (C) 2015 Apple Inc. All rights reserved.2 * Copyright (C) 2015-2017 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 44 44 #define QLPreviewScheme get_QuickLook_QLPreviewScheme() 45 45 46 SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, QuickLook, kQLPreviewOptionPasswordKey, CFStringRef) 47 #define kQLPreviewOptionPasswordKey get_QuickLook_kQLPreviewOptionPasswordKey() 48 46 49 #endif // USE(QUICK_LOOK) -
trunk/Source/WebCore/platform/ios/QuickLookSoftLink.mm
r183598 r210864 1 1 /* 2 * Copyright (C) 2015 Apple Inc. All rights reserved.2 * Copyright (C) 2015-2017 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 41 41 SOFT_LINK_POINTER_FOR_SOURCE(WebCore, QuickLook, QLPreviewScheme, NSString *) 42 42 43 SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, QuickLook, kQLPreviewOptionPasswordKey, CFStringRef) 44 43 45 #endif // USE(QUICK_LOOK) -
trunk/Source/WebCore/platform/network/ios/QuickLookHandleClient.h
r167207 r210864 1 1 /* 2 * Copyright (C) 2014 Apple Inc. All rights reserved.2 * Copyright (C) 2014-2017 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #ifndef QuickLookHandleClient_h 27 #define QuickLookHandleClient_h 26 #pragma once 28 27 29 28 #if USE(QUICK_LOOK) 30 29 31 30 #include <CoreFoundation/CoreFoundation.h> 31 #include <wtf/Function.h> 32 32 #include <wtf/RefCounted.h> 33 #include <wtf/text/WTFString.h> 33 34 34 35 namespace WebCore { … … 40 41 virtual void didFinishLoading() { } 41 42 virtual void didFail() { } 43 virtual bool supportsPasswordEntry() const { return false; } 44 virtual void didRequestPassword(Function<void(const String&)>&& completionHandler) { completionHandler(""); } 42 45 }; 43 46 … … 45 48 46 49 #endif // USE(QUICK_LOOK) 47 48 #endif // QuickLookHandleClient_h -
trunk/Source/WebCore/platform/spi/ios/QuickLookSPI.h
r205488 r210864 1 1 /* 2 * Copyright (C) 2014-201 6Apple Inc. All rights reserved.2 * Copyright (C) 2014-2017 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 48 48 @end 49 49 50 #define kQLReturnPasswordProtected 1 << 2 51 50 52 #endif 53 54 static_assert(kQLReturnPasswordProtected == 4, "kQLReturnPasswordProtected should equal 4."); 51 55 52 56 WTF_EXTERN_C_BEGIN -
trunk/Source/WebCore/testing/Internals.cpp
r210859 r210864 225 225 #endif 226 226 227 #if USE(QUICK_LOOK) 228 #include "MockQuickLookHandleClient.h" 229 #include "QuickLook.h" 230 #endif 231 227 232 using JSC::CallData; 228 233 using JSC::CallType; … … 425 430 426 431 page.setShowAllPlugins(false); 432 433 #if USE(QUICK_LOOK) 434 MockQuickLookHandleClient::singleton().setPassword(""); 435 QuickLookHandle::setClientForTesting(nullptr); 436 #endif 427 437 } 428 438 … … 3653 3663 } 3654 3664 3665 #if USE(QUICK_LOOK) 3666 void Internals::setQuickLookPassword(const String& password) 3667 { 3668 auto& quickLookHandleClient = MockQuickLookHandleClient::singleton(); 3669 QuickLookHandle::setClientForTesting(&quickLookHandleClient); 3670 quickLookHandleClient.setPassword(password); 3671 } 3672 #endif 3673 3655 3674 } // namespace WebCore -
trunk/Source/WebCore/testing/Internals.h
r210560 r210864 532 532 Vector<String> accessKeyModifiers() const; 533 533 534 #if USE(QUICK_LOOK) 535 void setQuickLookPassword(const String&); 536 #endif 537 534 538 private: 535 539 explicit Internals(Document&); -
trunk/Source/WebCore/testing/Internals.idl
r210560 r210864 1 1 /* 2 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2013-201 6Apple Inc. All rights reserved.3 * Copyright (C) 2013-2017 Apple Inc. All rights reserved. 4 4 * 5 5 * Redistribution and use in source and binary forms, with or without … … 505 505 506 506 sequence<DOMString> accessKeyModifiers(); 507 }; 507 508 #if defined(WTF_PLATFORM_IOS) && WTF_PLATFORM_IOS 509 void setQuickLookPassword(DOMString password); 510 #endif 511 }; -
trunk/Source/WebCore/testing/MockQuickLookHandleClient.cpp
r210863 r210864 1 1 /* 2 * Copyright (C) 201 4Apple Inc. All rights reserved.2 * Copyright (C) 2017 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #i fndef QuickLookHandleClient_h27 # define QuickLookHandleClient_h26 #include "config.h" 27 #include "MockQuickLookHandleClient.h" 28 28 29 29 #if USE(QUICK_LOOK) 30 30 31 #include < CoreFoundation/CoreFoundation.h>32 #include <wtf/R efCounted.h>31 #include <wtf/MainThread.h> 32 #include <wtf/RunLoop.h> 33 33 34 34 namespace WebCore { 35 35 36 class QuickLookHandleClient : public RefCounted<QuickLookHandleClient> { 37 public: 38 virtual ~QuickLookHandleClient() { } 39 virtual void didReceiveDataArray(CFArrayRef) { } 40 virtual void didFinishLoading() { } 41 virtual void didFail() { } 42 }; 36 MockQuickLookHandleClient& MockQuickLookHandleClient::singleton() 37 { 38 static NeverDestroyed<MockQuickLookHandleClient> sharedClient; 39 return sharedClient.get(); 40 } 41 42 void MockQuickLookHandleClient::didRequestPassword(Function<void(const String&)>&& completionHandler) 43 { 44 ASSERT(isMainThread()); 45 RunLoop::current().dispatch([completionHandler = WTFMove(completionHandler), password = m_password] { 46 completionHandler(password); 47 }); 48 } 43 49 44 50 } // namespace WebCore 45 51 46 52 #endif // USE(QUICK_LOOK) 47 48 #endif // QuickLookHandleClient_h -
trunk/Source/WebCore/testing/MockQuickLookHandleClient.h
r210863 r210864 1 1 /* 2 * Copyright (C) 201 4Apple Inc. All rights reserved.2 * Copyright (C) 2017 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #ifndef QuickLookHandleClient_h 27 #define QuickLookHandleClient_h 26 #pragma once 28 27 29 28 #if USE(QUICK_LOOK) 30 29 31 #include <CoreFoundation/CoreFoundation.h>32 #include <wtf/ RefCounted.h>30 #include "QuickLookHandleClient.h" 31 #include <wtf/NeverDestroyed.h> 33 32 34 33 namespace WebCore { 35 34 36 class QuickLookHandleClient : public RefCounted<QuickLookHandleClient>{35 class MockQuickLookHandleClient final : public QuickLookHandleClient { 37 36 public: 38 virtual ~QuickLookHandleClient() { } 39 virtual void didReceiveDataArray(CFArrayRef) { } 40 virtual void didFinishLoading() { } 41 virtual void didFail() { } 37 static MockQuickLookHandleClient& singleton(); 38 39 void setPassword(const String& password) { m_password = password; } 40 41 bool supportsPasswordEntry() const override { return true; } 42 void didRequestPassword(Function<void(const String&)>&&) override; 43 44 private: 45 friend class NeverDestroyed<MockQuickLookHandleClient>; 46 MockQuickLookHandleClient() = default; 47 48 String m_password; 42 49 }; 43 50 … … 45 52 46 53 #endif // USE(QUICK_LOOK) 47 48 #endif // QuickLookHandleClient_h
Note:
See TracChangeset
for help on using the changeset viewer.