diff options
author | qsr@chromium.org <qsr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-13 17:39:47 +0000 |
---|---|---|
committer | qsr@chromium.org <qsr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-13 17:39:47 +0000 |
commit | d724b556b3ebe6edbeb300a00997421a5cce0f97 (patch) | |
tree | fae7aff56ae8cd6c5cae7d9eabb7d66fd4d0d4a1 /base/ios | |
parent | a2b7c2056f87263cf2fa4df840b61b178ea05196 (diff) | |
download | chromium_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.mm | 31 | ||||
-rw-r--r-- | base/ios/device_util_unittest.mm | 60 |
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 |