summaryrefslogtreecommitdiffstats
path: root/base/ios
diff options
context:
space:
mode:
authorqsr@chromium.org <qsr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-13 17:39:47 +0000
committerqsr@chromium.org <qsr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-13 17:39:47 +0000
commitd724b556b3ebe6edbeb300a00997421a5cce0f97 (patch)
treefae7aff56ae8cd6c5cae7d9eabb7d66fd4d0d4a1 /base/ios
parenta2b7c2056f87263cf2fa4df840b61b178ea05196 (diff)
downloadchromium_src-d724b556b3ebe6edbeb300a00997421a5cce0f97.zip
chromium_src-d724b556b3ebe6edbeb300a00997421a5cce0f97.tar.gz
chromium_src-d724b556b3ebe6edbeb300a00997421a5cce0f97.tar.bz2
Fixing identifier for device returning a 0 identifierForVendor.
R=stuartmorgan@chromium.org Review URL: https://chromiumcodereview.appspot.com/11576008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172888 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/ios')
-rw-r--r--base/ios/device_util.mm31
-rw-r--r--base/ios/device_util_unittest.mm60
2 files changed, 80 insertions, 11 deletions
diff --git a/base/ios/device_util.mm b/base/ios/device_util.mm
index e6801ab..b538ea8 100644
--- a/base/ios/device_util.mm
+++ b/base/ios/device_util.mm
@@ -24,9 +24,33 @@
namespace {
// Client ID key in the user preferences.
-NSString* const kClientIdPreferenceKey = @"ChromiumClientID";
+NSString* const kLegacyClientIdPreferenceKey = @"ChromiumClientID";
+NSString* const kClientIdPreferenceKey = @"ChromeClientID";
// Default salt for device ids.
const char kDefaultSalt[] = "Salt";
+// Zero UUID returned on buggy iOS devices.
+NSString* const kZeroUUID = @"00000000-0000-0000-0000-000000000000";
+
+NSString* GenerateClientId() {
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+
+ // Try to migrate from legacy client id.
+ NSString* client_id = [defaults stringForKey:kLegacyClientIdPreferenceKey];
+
+ // Some iOS6 devices return a buggy identifierForVendor:
+ // http://openradar.appspot.com/12377282. If this is the case, revert to
+ // generating a new one.
+ if (!client_id || [client_id isEqualToString:kZeroUUID]) {
+ if (base::ios::IsRunningOnIOS6OrLater()) {
+ client_id = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
+ if ([client_id isEqualToString:kZeroUUID])
+ client_id = base::SysUTF8ToNSString(ios::device_util::GetRandomId());
+ } else {
+ client_id = base::SysUTF8ToNSString(ios::device_util::GetRandomId());
+ }
+ }
+ return client_id;
+}
} // namespace
@@ -104,10 +128,7 @@ std::string GetDeviceIdentifier(const char* salt) {
NSString* client_id = [defaults stringForKey:kClientIdPreferenceKey];
if (!client_id) {
- if (base::ios::IsRunningOnIOS6OrLater())
- client_id = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
- else
- client_id = base::SysUTF8ToNSString(GetRandomId());
+ client_id = GenerateClientId();
[defaults setObject:client_id forKey:kClientIdPreferenceKey];
[defaults synchronize];
}
diff --git a/base/ios/device_util_unittest.mm b/base/ios/device_util_unittest.mm
index b8ba10f..12bfe09 100644
--- a/base/ios/device_util_unittest.mm
+++ b/base/ios/device_util_unittest.mm
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
#include "base/ios/device_util.h"
#include "base/ios/ios_util.h"
@@ -18,6 +18,13 @@ namespace {
typedef PlatformTest DeviceUtilTest;
+void CleanNSUserDefaultsForDeviceId() {
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults removeObjectForKey:@"ChromeClientID"];
+ [defaults removeObjectForKey:@"ChromiumClientID"];
+ [defaults synchronize];
+}
+
TEST_F(DeviceUtilTest, GetPlatform) {
GTEST_ASSERT_GT(ios::device_util::GetPlatform().length(), 0U);
}
@@ -39,19 +46,60 @@ TEST_F(DeviceUtilTest, GetRandomId) {
}
TEST_F(DeviceUtilTest, GetDeviceIdentifier) {
+ CleanNSUserDefaultsForDeviceId();
+
std::string default_id = ios::device_util::GetDeviceIdentifier(NULL);
std::string other_id = ios::device_util::GetDeviceIdentifier("ForTest");
EXPECT_NE(default_id, other_id);
- NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
- [defaults removeObjectForKey:@"ChromiumClientID"];
- [defaults synchronize];
+ CleanNSUserDefaultsForDeviceId();
std::string new_default_id = ios::device_util::GetDeviceIdentifier(NULL);
- if (base::ios::IsRunningOnIOS6OrLater())
+ if (base::ios::IsRunningOnIOS6OrLater() &&
+ ![[[[UIDevice currentDevice] identifierForVendor] UUIDString]
+ isEqualToString:@"00000000-0000-0000-0000-000000000000"]) {
EXPECT_EQ(default_id, new_default_id);
- else
+ } else {
EXPECT_NE(default_id, new_default_id);
+ }
+
+ CleanNSUserDefaultsForDeviceId();
+}
+
+TEST_F(DeviceUtilTest, CheckMigration) {
+ CleanNSUserDefaultsForDeviceId();
+
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setObject:@"10000000-0000-0000-0000-000000000000"
+ forKey:@"ChromeClientID"];
+ [defaults synchronize];
+ std::string expected_id = ios::device_util::GetDeviceIdentifier(NULL);
+ [defaults removeObjectForKey:@"ChromeClientID"];
+ [defaults setObject:@"10000000-0000-0000-0000-000000000000"
+ forKey:@"ChromiumClientID"];
+ [defaults synchronize];
+ std::string new_id = ios::device_util::GetDeviceIdentifier(NULL);
+ EXPECT_EQ(expected_id, new_id);
+
+ CleanNSUserDefaultsForDeviceId();
+}
+
+TEST_F(DeviceUtilTest, CheckMigrationFromZero) {
+ CleanNSUserDefaultsForDeviceId();
+
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setObject:@"00000000-0000-0000-0000-000000000000"
+ forKey:@"ChromeClientID"];
+ [defaults synchronize];
+ std::string zero_id = ios::device_util::GetDeviceIdentifier(NULL);
+ [defaults removeObjectForKey:@"ChromeClientID"];
+ [defaults setObject:@"00000000-0000-0000-0000-000000000000"
+ forKey:@"ChromiumClientID"];
+ [defaults synchronize];
+ std::string new_id = ios::device_util::GetDeviceIdentifier(NULL);
+ EXPECT_NE(zero_id, new_id);
+
+ CleanNSUserDefaultsForDeviceId();
}
} // namespace