Bug 1305339 - part 1: use correct key to get and set quarantine information on 10.10+, r?mstange draft
authorGijs Kruitbosch <gijskruitbosch@gmail.com>
Mon, 03 Oct 2016 13:52:41 +0100
changeset 423228 400db5d7dcbc8fbf165c9e8049376d50001e8f1c
parent 423227 7aab5177276c20007036abd19efb56741d790ec2
child 423229 b93e035856cb15677c2940feb941e8de40592cea
push id31831
push usergijskruitbosch@gmail.com
push dateMon, 10 Oct 2016 15:24:01 +0000
reviewersmstange
bugs1305339
milestone52.0a1
Bug 1305339 - part 1: use correct key to get and set quarantine information on 10.10+, r?mstange kLSItemQuarantineProperties was deprecated in 10.10. AFAICT it was replaced by kCFURLQuarantinePropertiesKey, which was inconveniently new in 10.10. On my 10.11 machine, the Info.plist fix from the previous patch was not sufficient to get the data to actually show up when using the old (deprecated) key. I suspect the setter is a no-op with the old key. So here's code that uses the new key ("documented" in LSQuarantine.h, where conveniently the actual properties in the dictionary have kept their keys, but the dictionary key is now referenced as the CF one). MozReview-Commit-ID: IMsV6TLrYTP
xpcom/io/CocoaFileUtils.mm
--- a/xpcom/io/CocoaFileUtils.mm
+++ b/xpcom/io/CocoaFileUtils.mm
@@ -1,20 +1,26 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 // vim:set ts=2 sts=2 sw=2 et cin:
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "CocoaFileUtils.h"
+#include "nsCocoaFeatures.h"
 #include "nsCocoaUtils.h"
 #include <Cocoa/Cocoa.h>
 #include "nsObjCExceptions.h"
 #include "nsDebug.h"
 
+// Need to cope with us using old versions of the SDK and needing this on 10.10+
+#if !defined(MAC_OS_X_VERSION_10_10) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_10)
+const CFStringRef kCFURLQuarantinePropertiesKey = CFSTR("NSURLQuarantinePropertiesKey");
+#endif
+
 namespace CocoaFileUtils {
 
 nsresult RevealFileInFinder(CFURLRef url)
 {
   NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
 
   if (NS_WARN_IF(!url))
     return NS_ERROR_INVALID_ARG;
@@ -188,19 +194,26 @@ void AddOriginMetadataToFile(const CFStr
 void AddQuarantineMetadataToFile(const CFStringRef filePath,
                                  const CFURLRef sourceURL,
                                  const CFURLRef referrerURL) {
   CFURLRef fileURL = ::CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                                      filePath,
                                                      kCFURLPOSIXPathStyle,
                                                      false);
 
+  // The properties key changed in 10.10:
+  CFStringRef quarantinePropKey;
+  if (nsCocoaFeatures::OnYosemiteOrLater()) {
+    quarantinePropKey = kCFURLQuarantinePropertiesKey;
+  } else {
+    quarantinePropKey = kLSItemQuarantineProperties;
+  }
   CFDictionaryRef quarantineProps = NULL;
   Boolean success = ::CFURLCopyResourcePropertyForKey(fileURL,
-                                                      kLSItemQuarantineProperties,
+                                                      quarantinePropKey,
                                                       &quarantineProps,
                                                       NULL);
 
   // If there aren't any quarantine properties then the user probably
   // set up an exclusion and we don't need to add metadata.
   if (!success || !quarantineProps) {
     ::CFRelease(fileURL);
     return;
@@ -238,17 +251,17 @@ void AddQuarantineMetadataToFile(const C
   }
 
   if (!::CFDictionaryGetValue(mutQuarantineProps, kLSQuarantineDataURLKey)) {
     ::CFDictionarySetValue(mutQuarantineProps, kLSQuarantineDataURLKey, sourceURL);
   }
 
   // Set quarantine properties on file.
   ::CFURLSetResourcePropertyForKey(fileURL,
-                                   kLSItemQuarantineProperties,
+                                   quarantinePropKey,
                                    mutQuarantineProps,
                                    NULL);
 
   ::CFRelease(fileURL);
   ::CFRelease(mutQuarantineProps);
 }
 
 } // namespace CocoaFileUtils