Remove base ios files Change-Id: Id3e521926bf1d7a26000b9d7bf8dc637f48914f7 Reviewed-on: https://gn-review.googlesource.com/1407 Reviewed-by: Brett Wilson <brettw@chromium.org> Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/base/critical_closure_internal_ios.mm b/base/critical_closure_internal_ios.mm deleted file mode 100644 index e35eca0..0000000 --- a/base/critical_closure_internal_ios.mm +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/critical_closure.h" - -#import <UIKit/UIKit.h> - -namespace base { -namespace internal { - -bool IsMultiTaskingSupported() { - return [[UIDevice currentDevice] isMultitaskingSupported]; -} - -CriticalClosure::CriticalClosure(OnceClosure closure) - : closure_(std::move(closure)) {} - -CriticalClosure::~CriticalClosure() {} - -void CriticalClosure::Run() { - std::move(closure_).Run(); -} - -} // namespace internal -} // namespace base
diff --git a/base/ios/OWNERS b/base/ios/OWNERS deleted file mode 100644 index bdb59ec..0000000 --- a/base/ios/OWNERS +++ /dev/null
@@ -1,3 +0,0 @@ -eugenebut@chromium.org -rohitrao@chromium.org -sdefresne@chromium.org
diff --git a/base/ios/block_types.h b/base/ios/block_types.h deleted file mode 100644 index e4dde79..0000000 --- a/base/ios/block_types.h +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_BLOCK_TYPES_H_ -#define BASE_IOS_BLOCK_TYPES_H_ - -// A generic procedural block type that takes no arguments and returns nothing. -typedef void (^ProceduralBlock)(void); - -// A block that takes no arguments and returns a bool. -typedef bool (^ConditionBlock)(void); - -#endif // BASE_IOS_BLOCK_TYPES_H_
diff --git a/base/ios/crb_protocol_observers.h b/base/ios/crb_protocol_observers.h deleted file mode 100644 index 8ff5878..0000000 --- a/base/ios/crb_protocol_observers.h +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_CRB_PROTOCOL_OBSERVERS_H_ -#define BASE_IOS_CRB_PROTOCOL_OBSERVERS_H_ - -#import <Foundation/Foundation.h> - -typedef void (^ExecutionWithObserverBlock)(id); - -// Implements a container for observers that implement a specific Objective-C -// protocol. The container forwards method invocations to its contained -// observers, so that sending a message to all the observers is as simple as -// sending the message to the container. -// It is safe for an observer to remove itself or another observer while being -// notified. It is also safe to add an other observer while being notified but -// the newly added observer will not be notified as part of the current -// notification dispatch. -@interface CRBProtocolObservers : NSObject - -// The Objective-C protocol that the observers in this container conform to. -@property(nonatomic, readonly) Protocol* protocol; - -// Returns a CRBProtocolObservers container for observers that conform to -// |protocol|. -+ (instancetype)observersWithProtocol:(Protocol*)protocol; - -// Adds |observer| to this container. -- (void)addObserver:(id)observer; - -// Remove |observer| from this container. -- (void)removeObserver:(id)observer; - -// Returns true if there are currently no observers. -- (BOOL)empty; - -// Executes callback on every observer. |callback| cannot be nil. -- (void)executeOnObservers:(ExecutionWithObserverBlock)callback; - -@end - -#endif // BASE_IOS_CRB_PROTOCOL_OBSERVERS_H_
diff --git a/base/ios/crb_protocol_observers.mm b/base/ios/crb_protocol_observers.mm deleted file mode 100644 index 1a3b9f7..0000000 --- a/base/ios/crb_protocol_observers.mm +++ /dev/null
@@ -1,191 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "base/ios/crb_protocol_observers.h" - -#include <objc/runtime.h> -#include <stddef.h> -#include <algorithm> -#include <vector> - -#include "base/logging.h" -#include "base/mac/scoped_nsobject.h" -#include "base/stl_util.h" - -@interface CRBProtocolObservers () { - base::scoped_nsobject<Protocol> _protocol; - // ivars declared here are private to the implementation but must be - // public for allowing the C++ |Iterator| class access to those ivars. - @public - // vector of weak pointers to observers. - std::vector<__unsafe_unretained id> _observers; - // The nested level of observer iteration. - // A depth of 0 means nobody is currently iterating on the list of observers. - int _invocationDepth; -} - -// Removes nil observers from the list and is called when the -// |_invocationDepth| reaches 0. -- (void)compact; - -@end - -namespace { - -class Iterator { - public: - explicit Iterator(CRBProtocolObservers* protocol_observers); - ~Iterator(); - id GetNext(); - - private: - CRBProtocolObservers* protocol_observers_; - size_t index_; - size_t max_index_; -}; - -Iterator::Iterator(CRBProtocolObservers* protocol_observers) - : protocol_observers_(protocol_observers), - index_(0), - max_index_(protocol_observers->_observers.size()) { - DCHECK(protocol_observers_); - ++protocol_observers->_invocationDepth; -} - -Iterator::~Iterator() { - if (protocol_observers_ && --protocol_observers_->_invocationDepth == 0) - [protocol_observers_ compact]; -} - -id Iterator::GetNext() { - if (!protocol_observers_) - return nil; - auto& observers = protocol_observers_->_observers; - // Skip nil elements. - size_t max_index = std::min(max_index_, observers.size()); - while (index_ < max_index && !observers[index_]) - ++index_; - return index_ < max_index ? observers[index_++] : nil; -} -} - -@interface CRBProtocolObservers () - -// Designated initializer. -- (id)initWithProtocol:(Protocol*)protocol; - -@end - -@implementation CRBProtocolObservers - -+ (instancetype)observersWithProtocol:(Protocol*)protocol { - return [[[self alloc] initWithProtocol:protocol] autorelease]; -} - -- (id)init { - NOTREACHED(); - return nil; -} - -- (id)initWithProtocol:(Protocol*)protocol { - self = [super init]; - if (self) { - _protocol.reset([protocol retain]); - } - return self; -} - -- (Protocol*)protocol { - return _protocol.get(); -} - -- (void)addObserver:(id)observer { - DCHECK(observer); - DCHECK([observer conformsToProtocol:self.protocol]); - - if (base::ContainsValue(_observers, observer)) - return; - - _observers.push_back(observer); -} - -- (void)removeObserver:(id)observer { - DCHECK(observer); - auto it = std::find(_observers.begin(), _observers.end(), observer); - if (it != _observers.end()) { - if (_invocationDepth) - *it = nil; - else - _observers.erase(it); - } -} - -- (BOOL)empty { - int count = 0; - for (id observer : _observers) { - if (observer != nil) - ++count; - } - return count == 0; -} - -#pragma mark - NSObject - -- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { - NSMethodSignature* signature = [super methodSignatureForSelector:selector]; - if (signature) - return signature; - - // Look for a required method in the protocol. protocol_getMethodDescription - // returns a struct whose fields are null if a method for the selector was - // not found. - struct objc_method_description description = - protocol_getMethodDescription(self.protocol, selector, YES, YES); - if (description.types) - return [NSMethodSignature signatureWithObjCTypes:description.types]; - - // Look for an optional method in the protocol. - description = protocol_getMethodDescription(self.protocol, selector, NO, YES); - if (description.types) - return [NSMethodSignature signatureWithObjCTypes:description.types]; - - // There is neither a required nor optional method with this selector in the - // protocol, so invoke -[NSObject doesNotRecognizeSelector:] to raise - // NSInvalidArgumentException. - [self doesNotRecognizeSelector:selector]; - return nil; -} - -- (void)forwardInvocation:(NSInvocation*)invocation { - DCHECK(invocation); - if (_observers.empty()) - return; - SEL selector = [invocation selector]; - Iterator it(self); - id observer; - while ((observer = it.GetNext()) != nil) { - if ([observer respondsToSelector:selector]) - [invocation invokeWithTarget:observer]; - } -} - -- (void)executeOnObservers:(ExecutionWithObserverBlock)callback { - DCHECK(callback); - if (_observers.empty()) - return; - Iterator it(self); - id observer; - while ((observer = it.GetNext()) != nil) - callback(observer); -} - -#pragma mark - Private - -- (void)compact { - DCHECK(!_invocationDepth); - _observers.erase(std::remove(_observers.begin(), _observers.end(), nil), - _observers.end()); -} - -@end
diff --git a/base/ios/crb_protocol_observers_unittest.mm b/base/ios/crb_protocol_observers_unittest.mm deleted file mode 100644 index 07f5cff..0000000 --- a/base/ios/crb_protocol_observers_unittest.mm +++ /dev/null
@@ -1,290 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "base/ios/crb_protocol_observers.h" -#include "base/ios/weak_nsobject.h" -#include "base/logging.h" -#include "base/mac/scoped_nsautorelease_pool.h" -#include "base/mac/scoped_nsobject.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/gtest_mac.h" -#include "testing/platform_test.h" - -@protocol TestObserver - -@required -- (void)requiredMethod; -- (void)reset; - -@optional -- (void)optionalMethod; -- (void)mutateByAddingObserver:(id<TestObserver>)observer; -- (void)mutateByRemovingObserver:(id<TestObserver>)observer; -- (void)nestedMutateByAddingObserver:(id<TestObserver>)observer; -- (void)nestedMutateByRemovingObserver:(id<TestObserver>)observer; - -@end - -// Implements only the required methods in the TestObserver protocol. -@interface TestPartialObserver : NSObject<TestObserver> -@property(nonatomic, readonly) BOOL requiredMethodInvoked; -@end - -// Implements all the methods in the TestObserver protocol. -@interface TestCompleteObserver : TestPartialObserver<TestObserver> -@property(nonatomic, readonly) BOOL optionalMethodInvoked; -@end - -@interface TestMutateObserver : TestCompleteObserver -- (instancetype)initWithObserver:(CRBProtocolObservers*)observer - NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; -@end - -namespace { - -class CRBProtocolObserversTest : public PlatformTest { - public: - CRBProtocolObserversTest() {} - - protected: - void SetUp() override { - PlatformTest::SetUp(); - - observers_.reset([[CRBProtocolObservers observersWithProtocol: - @protocol(TestObserver)] retain]); - - partial_observer_.reset([[TestPartialObserver alloc] init]); - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); - - complete_observer_.reset([[TestCompleteObserver alloc] init]); - EXPECT_FALSE([complete_observer_ requiredMethodInvoked]); - EXPECT_FALSE([complete_observer_ optionalMethodInvoked]); - - mutate_observer_.reset( - [[TestMutateObserver alloc] initWithObserver:observers_.get()]); - EXPECT_FALSE([mutate_observer_ requiredMethodInvoked]); - } - - base::scoped_nsobject<id> observers_; - base::scoped_nsobject<TestPartialObserver> partial_observer_; - base::scoped_nsobject<TestCompleteObserver> complete_observer_; - base::scoped_nsobject<TestMutateObserver> mutate_observer_; -}; - -// Verifies basic functionality of -[CRBProtocolObservers addObserver:] and -// -[CRBProtocolObservers removeObserver:]. -TEST_F(CRBProtocolObserversTest, AddRemoveObserver) { - // Add an observer and verify that the CRBProtocolObservers instance forwards - // an invocation to it. - [observers_ addObserver:partial_observer_]; - [observers_ requiredMethod]; - EXPECT_TRUE([partial_observer_ requiredMethodInvoked]); - - [partial_observer_ reset]; - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); - - // Remove the observer and verify that the CRBProtocolObservers instance no - // longer forwards an invocation to it. - [observers_ removeObserver:partial_observer_]; - [observers_ requiredMethod]; - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); -} - -// Verifies that CRBProtocolObservers correctly forwards the invocation of a -// required method in the protocol. -TEST_F(CRBProtocolObserversTest, RequiredMethods) { - [observers_ addObserver:partial_observer_]; - [observers_ addObserver:complete_observer_]; - [observers_ requiredMethod]; - EXPECT_TRUE([partial_observer_ requiredMethodInvoked]); - EXPECT_TRUE([complete_observer_ requiredMethodInvoked]); -} - -// Verifies that CRBProtocolObservers correctly forwards the invocation of an -// optional method in the protocol. -TEST_F(CRBProtocolObserversTest, OptionalMethods) { - [observers_ addObserver:partial_observer_]; - [observers_ addObserver:complete_observer_]; - [observers_ optionalMethod]; - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); - EXPECT_FALSE([complete_observer_ requiredMethodInvoked]); - EXPECT_TRUE([complete_observer_ optionalMethodInvoked]); -} - -// Verifies that CRBProtocolObservers only holds a weak reference to an -// observer. -TEST_F(CRBProtocolObserversTest, WeakReference) { - base::WeakNSObject<TestPartialObserver> weak_observer( - partial_observer_); - EXPECT_TRUE(weak_observer); - - [observers_ addObserver:partial_observer_]; - - { - // Need an autorelease pool here, because - // -[CRBProtocolObservers forwardInvocation:] creates a temporary - // autoreleased array that holds all the observers. - base::mac::ScopedNSAutoreleasePool pool; - [observers_ requiredMethod]; - EXPECT_TRUE([partial_observer_ requiredMethodInvoked]); - } - - partial_observer_.reset(); - EXPECT_FALSE(weak_observer.get()); -} - -// Verifies that an observer can safely remove itself as observer while being -// notified. -TEST_F(CRBProtocolObserversTest, SelfMutateObservers) { - [observers_ addObserver:mutate_observer_]; - EXPECT_FALSE([observers_ empty]); - - [observers_ requiredMethod]; - EXPECT_TRUE([mutate_observer_ requiredMethodInvoked]); - - [mutate_observer_ reset]; - - [observers_ nestedMutateByRemovingObserver:mutate_observer_]; - EXPECT_FALSE([mutate_observer_ requiredMethodInvoked]); - - [observers_ addObserver:partial_observer_]; - - [observers_ requiredMethod]; - EXPECT_FALSE([mutate_observer_ requiredMethodInvoked]); - EXPECT_TRUE([partial_observer_ requiredMethodInvoked]); - - [observers_ removeObserver:partial_observer_]; - EXPECT_TRUE([observers_ empty]); -} - -// Verifies that - [CRBProtocolObservers addObserver:] and -// - [CRBProtocolObservers removeObserver:] can be called while methods are -// being forwarded. -TEST_F(CRBProtocolObserversTest, MutateObservers) { - // Indirectly add an observer while forwarding an observer method. - [observers_ addObserver:mutate_observer_]; - - [observers_ mutateByAddingObserver:partial_observer_]; - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); - - // Check that methods are correctly forwared to the indirectly added observer. - [mutate_observer_ reset]; - [observers_ requiredMethod]; - EXPECT_TRUE([mutate_observer_ requiredMethodInvoked]); - EXPECT_TRUE([partial_observer_ requiredMethodInvoked]); - - [mutate_observer_ reset]; - [partial_observer_ reset]; - - // Indirectly remove an observer while forwarding an observer method. - [observers_ mutateByRemovingObserver:partial_observer_]; - - // Check that method is not forwared to the indirectly removed observer. - [observers_ requiredMethod]; - EXPECT_TRUE([mutate_observer_ requiredMethodInvoked]); - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); -} - -// Verifies that - [CRBProtocolObservers addObserver:] and -// - [CRBProtocolObservers removeObserver:] can be called while methods are -// being forwarded with a nested invocation depth > 0. -TEST_F(CRBProtocolObserversTest, NestedMutateObservers) { - // Indirectly add an observer while forwarding an observer method. - [observers_ addObserver:mutate_observer_]; - - [observers_ nestedMutateByAddingObserver:partial_observer_]; - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); - - // Check that methods are correctly forwared to the indirectly added observer. - [mutate_observer_ reset]; - [observers_ requiredMethod]; - EXPECT_TRUE([mutate_observer_ requiredMethodInvoked]); - EXPECT_TRUE([partial_observer_ requiredMethodInvoked]); - - [mutate_observer_ reset]; - [partial_observer_ reset]; - - // Indirectly remove an observer while forwarding an observer method. - [observers_ nestedMutateByRemovingObserver:partial_observer_]; - - // Check that method is not forwared to the indirectly removed observer. - [observers_ requiredMethod]; - EXPECT_TRUE([mutate_observer_ requiredMethodInvoked]); - EXPECT_FALSE([partial_observer_ requiredMethodInvoked]); -} - -} // namespace - -@implementation TestPartialObserver { - BOOL _requiredMethodInvoked; -} - -- (BOOL)requiredMethodInvoked { - return _requiredMethodInvoked; -} - -- (void)requiredMethod { - _requiredMethodInvoked = YES; -} - -- (void)reset { - _requiredMethodInvoked = NO; -} - -@end - -@implementation TestCompleteObserver { - BOOL _optionalMethodInvoked; -} - -- (BOOL)optionalMethodInvoked { - return _optionalMethodInvoked; -} - -- (void)optionalMethod { - _optionalMethodInvoked = YES; -} - -- (void)reset { - [super reset]; - _optionalMethodInvoked = NO; -} - -@end - -@implementation TestMutateObserver { - id _observers; // weak -} - -- (instancetype)initWithObserver:(CRBProtocolObservers*)observers { - self = [super init]; - if (self) { - _observers = observers; - } - return self; -} - -- (instancetype)init { - NOTREACHED(); - return nil; -} - -- (void)mutateByAddingObserver:(id<TestObserver>)observer { - [_observers addObserver:observer]; -} - -- (void)mutateByRemovingObserver:(id<TestObserver>)observer { - [_observers removeObserver:observer]; -} - -- (void)nestedMutateByAddingObserver:(id<TestObserver>)observer { - [_observers mutateByAddingObserver:observer]; -} - -- (void)nestedMutateByRemovingObserver:(id<TestObserver>)observer { - [_observers mutateByRemovingObserver:observer]; -} - -@end
diff --git a/base/ios/device_util.h b/base/ios/device_util.h deleted file mode 100644 index b1bed5c..0000000 --- a/base/ios/device_util.h +++ /dev/null
@@ -1,86 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_DEVICE_UTIL_H_ -#define BASE_IOS_DEVICE_UTIL_H_ - -#include <stdint.h> - -#include <string> - -namespace ios { -namespace device_util { - -// Returns the hardware version of the device the app is running on. -// -// The returned string is the string returned by sysctlbyname() with name -// "hw.machine". Possible (known) values include: -// -// iPhone1,1 -> iPhone 1G -// iPhone1,2 -> iPhone 3G -// iPhone2,1 -> iPhone 3GS -// iPhone3,1 -> iPhone 4/AT&T -// iPhone3,2 -> iPhone 4/Other Carrier? -// iPhone3,3 -> iPhone 4/Other Carrier? -// iPhone4,1 -> iPhone 4S -// -// iPod1,1 -> iPod touch 1G -// iPod2,1 -> iPod touch 2G -// iPod2,2 -> ? -// iPod3,1 -> iPod touch 3G -// iPod4,1 -> iPod touch 4G -// iPod5,1 -> ? -// -// iPad1,1 -> iPad 1G, WiFi -// iPad1,? -> iPad 1G, 3G <- needs 3G owner to test -// iPad2,1 -> iPad 2G, WiFi -// -// AppleTV2,1 -> AppleTV 2 -// -// i386 -> Simulator -// x86_64 -> Simulator -std::string GetPlatform(); - -// Returns true if the application is running on a device with 512MB or more -// RAM. -bool RamIsAtLeast512Mb(); - -// Returns true if the application is running on a device with 1024MB or more -// RAM. -bool RamIsAtLeast1024Mb(); - -// Returns true if the application is running on a device with |ram_in_mb| MB or -// more RAM. -// Use with caution! Actual RAM reported by devices is less than the commonly -// used powers-of-two values. For example, a 512MB device may report only 502MB -// RAM. The convenience methods above should be used in most cases because they -// correctly handle this issue. -bool RamIsAtLeast(uint64_t ram_in_mb); - -// Returns true if the device has only one core. -bool IsSingleCoreDevice(); - -// Returns the MAC address of the interface with name |interface_name|. -std::string GetMacAddress(const std::string& interface_name); - -// Returns a random UUID. -std::string GetRandomId(); - -// Returns an identifier for the device, using the given |salt|. A global -// identifier is generated the first time this method is called, and the salt -// is used to be able to generate distinct identifiers for the same device. If -// |salt| is NULL, a default value is used. Unless you are using this value for -// something that should be anonymous, you should probably pass NULL. -std::string GetDeviceIdentifier(const char* salt); - -// Returns a hashed version of |in_string| using |salt| (which must not be -// zero-length). Different salt values should result in differently hashed -// strings. -std::string GetSaltedString(const std::string& in_string, - const std::string& salt); - -} // namespace device_util -} // namespace ios - -#endif // BASE_IOS_DEVICE_UTIL_H_
diff --git a/base/ios/device_util.mm b/base/ios/device_util.mm deleted file mode 100644 index 5ec1e69..0000000 --- a/base/ios/device_util.mm +++ /dev/null
@@ -1,178 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/ios/device_util.h" - -#include <CommonCrypto/CommonDigest.h> -#import <UIKit/UIKit.h> -#include <ifaddrs.h> -#include <net/if_dl.h> -#include <stddef.h> -#include <string.h> -#include <sys/socket.h> -#include <sys/sysctl.h> - -#include <memory> - -#include "base/logging.h" -#include "base/mac/scoped_cftyperef.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "base/strings/sys_string_conversions.h" - -namespace { - -// Client ID key in the user preferences. -NSString* const kLegacyClientIdPreferenceKey = @"ChromiumClientID"; -NSString* const kClientIdPreferenceKey = @"ChromeClientID"; -// Current hardware type. This is used to detect that a device has been backed -// up and restored to another device, and allows regenerating a new device id. -NSString* const kHardwareTypePreferenceKey = @"ClientIDGenerationHardwareType"; -// 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]) { - client_id = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; - if ([client_id isEqualToString:kZeroUUID]) - client_id = base::SysUTF8ToNSString(ios::device_util::GetRandomId()); - } - return client_id; -} - -} // namespace - -namespace ios { -namespace device_util { - -std::string GetPlatform() { - std::string platform; - size_t size = 0; - sysctlbyname("hw.machine", NULL, &size, NULL, 0); - sysctlbyname("hw.machine", base::WriteInto(&platform, size), &size, NULL, 0); - return platform; -} - -bool RamIsAtLeast512Mb() { - // 512MB devices report anywhere from 502-504 MB, use 450 MB just to be safe. - return RamIsAtLeast(450); -} - -bool RamIsAtLeast1024Mb() { - // 1GB devices report anywhere from 975-999 MB, use 900 MB just to be safe. - return RamIsAtLeast(900); -} - -bool RamIsAtLeast(uint64_t ram_in_mb) { - uint64_t memory_size = 0; - size_t size = sizeof(memory_size); - if (sysctlbyname("hw.memsize", &memory_size, &size, NULL, 0) == 0) { - // Anything >= 500M, call high ram. - return memory_size >= ram_in_mb * 1024 * 1024; - } - return false; -} - -bool IsSingleCoreDevice() { - uint64_t cpu_number = 0; - size_t sizes = sizeof(cpu_number); - sysctlbyname("hw.physicalcpu", &cpu_number, &sizes, NULL, 0); - return cpu_number == 1; -} - -std::string GetMacAddress(const std::string& interface_name) { - std::string mac_string; - struct ifaddrs* addresses; - if (getifaddrs(&addresses) == 0) { - for (struct ifaddrs* address = addresses; address; - address = address->ifa_next) { - if ((address->ifa_addr->sa_family == AF_LINK) && - strcmp(interface_name.c_str(), address->ifa_name) == 0) { - const struct sockaddr_dl* found_address_struct = - reinterpret_cast<const struct sockaddr_dl*>(address->ifa_addr); - - // |found_address_struct->sdl_data| contains the interface name followed - // by the interface address. The address part can be accessed based on - // the length of the name, that is, |found_address_struct->sdl_nlen|. - const unsigned char* found_address = - reinterpret_cast<const unsigned char*>( - &found_address_struct->sdl_data[ - found_address_struct->sdl_nlen]); - - int found_address_length = found_address_struct->sdl_alen; - for (int i = 0; i < found_address_length; ++i) { - if (i != 0) - mac_string.push_back(':'); - base::StringAppendF(&mac_string, "%02X", found_address[i]); - } - break; - } - } - freeifaddrs(addresses); - } - return mac_string; -} - -std::string GetRandomId() { - base::ScopedCFTypeRef<CFUUIDRef> uuid_object( - CFUUIDCreate(kCFAllocatorDefault)); - base::ScopedCFTypeRef<CFStringRef> uuid_string( - CFUUIDCreateString(kCFAllocatorDefault, uuid_object)); - return base::SysCFStringRefToUTF8(uuid_string); -} - -std::string GetDeviceIdentifier(const char* salt) { - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - - NSString* last_seen_hardware = - [defaults stringForKey:kHardwareTypePreferenceKey]; - NSString* current_hardware = base::SysUTF8ToNSString(GetPlatform()); - if (!last_seen_hardware) { - last_seen_hardware = current_hardware; - [defaults setObject:current_hardware forKey:kHardwareTypePreferenceKey]; - [defaults synchronize]; - } - - NSString* client_id = [defaults stringForKey:kClientIdPreferenceKey]; - - if (!client_id || ![last_seen_hardware isEqualToString:current_hardware]) { - client_id = GenerateClientId(); - [defaults setObject:client_id forKey:kClientIdPreferenceKey]; - [defaults setObject:current_hardware forKey:kHardwareTypePreferenceKey]; - [defaults synchronize]; - } - - return GetSaltedString(base::SysNSStringToUTF8(client_id), - salt ? salt : kDefaultSalt); -} - -std::string GetSaltedString(const std::string& in_string, - const std::string& salt) { - DCHECK(salt.length()); - NSData* hash_data = [base::SysUTF8ToNSString(in_string + salt) - dataUsingEncoding:NSUTF8StringEncoding]; - - unsigned char hash[CC_SHA256_DIGEST_LENGTH]; - CC_SHA256([hash_data bytes], [hash_data length], hash); - CFUUIDBytes* uuid_bytes = reinterpret_cast<CFUUIDBytes*>(hash); - - base::ScopedCFTypeRef<CFUUIDRef> uuid_object( - CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, *uuid_bytes)); - base::ScopedCFTypeRef<CFStringRef> device_id( - CFUUIDCreateString(kCFAllocatorDefault, uuid_object)); - return base::SysCFStringRefToUTF8(device_id); -} - -} // namespace device_util -} // namespace ios
diff --git a/base/ios/device_util_unittest.mm b/base/ios/device_util_unittest.mm deleted file mode 100644 index 82d4217..0000000 --- a/base/ios/device_util_unittest.mm +++ /dev/null
@@ -1,143 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <UIKit/UIKit.h> - -#include "base/ios/device_util.h" -#include "base/strings/sys_string_conversions.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/gtest_mac.h" -#include "testing/platform_test.h" - -namespace { -// The behavior of most of these utility functions depends on what they are run -// on, so there is not much to unittest them. The APIs are run to make sure they -// don't choke. Additional checks are added for particular APIs when needed. - -typedef PlatformTest DeviceUtilTest; - -void CleanNSUserDefaultsForDeviceId() { - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - [defaults removeObjectForKey:@"ChromeClientID"]; - [defaults removeObjectForKey:@"ChromiumClientID"]; - [defaults removeObjectForKey:@"ClientIDGenerationHardwareType"]; - [defaults synchronize]; -} - -TEST_F(DeviceUtilTest, GetPlatform) { - GTEST_ASSERT_GT(ios::device_util::GetPlatform().length(), 0U); -} - -TEST_F(DeviceUtilTest, IsSingleCoreDevice) { - ios::device_util::IsSingleCoreDevice(); -} - -TEST_F(DeviceUtilTest, GetMacAddress) { - GTEST_ASSERT_GT(ios::device_util::GetMacAddress("en0").length(), 0U); -} - -TEST_F(DeviceUtilTest, GetRandomId) { - GTEST_ASSERT_GT(ios::device_util::GetRandomId().length(), 0U); -} - -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); - - CleanNSUserDefaultsForDeviceId(); - - std::string new_default_id = ios::device_util::GetDeviceIdentifier(NULL); - if (![[[[UIDevice currentDevice] identifierForVendor] UUIDString] - isEqualToString:@"00000000-0000-0000-0000-000000000000"]) { - EXPECT_EQ(default_id, new_default_id); - } 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(); -} - -TEST_F(DeviceUtilTest, GetSaltedStringEquals) { - std::string string1("The quick brown fox jumps over the lazy dog"); - std::string string2("The quick brown fox jumps over the lazy dog"); - std::string salt("salt"); - // Same string and same salt should result in the same salted string. - EXPECT_EQ(ios::device_util::GetSaltedString(string1, salt), - ios::device_util::GetSaltedString(string2, salt)); -} - -TEST_F(DeviceUtilTest, GetSaltedStringNotEquals) { - std::string string1("The quick brown fox jumps over the lazy dog"); - std::string string2("The lazy brown fox jumps over the quick dog"); - std::string salt("salt"); - // Different string and same salt should result in different salted strings. - EXPECT_NE(ios::device_util::GetSaltedString(string1, salt), - ios::device_util::GetSaltedString(string2, salt)); -} - -TEST_F(DeviceUtilTest, GetSaltedStringDifferentSalt) { - std::string string1("The quick brown fox jumps over the lazy dog"); - std::string salt1("salt"); - std::string salt2("pepper"); - // Same string with different salt should result in different salted strings. - EXPECT_NE(ios::device_util::GetSaltedString(string1, salt1), - ios::device_util::GetSaltedString(string1, salt2)); -} - -TEST_F(DeviceUtilTest, CheckDeviceMigration) { - CleanNSUserDefaultsForDeviceId(); - - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - [defaults setObject:@"10000000-0000-0000-0000-000000000000" - forKey:@"ChromeClientID"]; - [defaults synchronize]; - std::string base_id = ios::device_util::GetDeviceIdentifier(NULL); - [defaults setObject:@"Foo" forKey:@"ClientIDGenerationHardwareType"]; - [defaults synchronize]; - std::string new_id = ios::device_util::GetDeviceIdentifier(NULL); - EXPECT_NE(new_id, base_id); - - CleanNSUserDefaultsForDeviceId(); -} - -} // namespace
diff --git a/base/ios/ios_util.h b/base/ios/ios_util.h deleted file mode 100644 index 2464b1c..0000000 --- a/base/ios/ios_util.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_IOS_UTIL_H_ -#define BASE_IOS_IOS_UTIL_H_ - -#include <stdint.h> - -#include "base/base_export.h" -#include "base/files/file_path.h" - -namespace base { -namespace ios { - -// Returns whether the operating system is iOS 10 or later. -BASE_EXPORT bool IsRunningOnIOS10OrLater(); - -// Returns whether the operating system is iOS 11 or later. -BASE_EXPORT bool IsRunningOnIOS11OrLater(); - -// Returns whether the operating system is at the given version or later. -BASE_EXPORT bool IsRunningOnOrLater(int32_t major, - int32_t minor, - int32_t bug_fix); - -// Returns whether iOS is signalling that an RTL text direction should be used -// regardless of the current locale. This should not return true if the current -// language is a "real" RTL language such as Arabic or Urdu; it should only -// return true in cases where the RTL text direction has been forced (for -// example by using the "RTL Psuedolanguage" option when launching from XCode). -BASE_EXPORT bool IsInForcedRTL(); - -// Stores the |path| of the ICU dat file in a global to be referenced later by -// FilePathOfICUFile(). This should only be called once. -BASE_EXPORT void OverridePathOfEmbeddedICU(const char* path); - -// Returns the overriden path set by OverridePathOfEmbeddedICU(), otherwise -// returns invalid FilePath. -BASE_EXPORT FilePath FilePathOfEmbeddedICU(); - -} // namespace ios -} // namespace base - -#endif // BASE_IOS_IOS_UTIL_H_
diff --git a/base/ios/ios_util.mm b/base/ios/ios_util.mm deleted file mode 100644 index 2402d30..0000000 --- a/base/ios/ios_util.mm +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/ios/ios_util.h" - -#import <Foundation/Foundation.h> -#include <stddef.h> - -#include "base/macros.h" -#include "base/sys_info.h" - -namespace { - -// Return a 3 elements array containing the major, minor and bug fix version of -// the OS. -const int32_t* OSVersionAsArray() { - int32_t* digits = new int32_t[3]; - base::SysInfo::OperatingSystemVersionNumbers( - &digits[0], &digits[1], &digits[2]); - return digits; -} - -std::string* g_icudtl_path_override = nullptr; - -} // namespace - -namespace base { -namespace ios { - -bool IsRunningOnIOS10OrLater() { - static const bool is_running_on_or_later = IsRunningOnOrLater(10, 0, 0); - return is_running_on_or_later; -} - -bool IsRunningOnIOS11OrLater() { - static const bool is_running_on_or_later = IsRunningOnOrLater(11, 0, 0); - return is_running_on_or_later; -} - -bool IsRunningOnOrLater(int32_t major, int32_t minor, int32_t bug_fix) { - static const int32_t* current_version = OSVersionAsArray(); - int32_t version[] = {major, minor, bug_fix}; - for (size_t i = 0; i < arraysize(version); i++) { - if (current_version[i] != version[i]) - return current_version[i] > version[i]; - } - return true; -} - -bool IsInForcedRTL() { - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - return [defaults boolForKey:@"NSForceRightToLeftWritingDirection"]; -} - -void OverridePathOfEmbeddedICU(const char* path) { - DCHECK(!g_icudtl_path_override); - g_icudtl_path_override = new std::string(path); -} - -FilePath FilePathOfEmbeddedICU() { - if (g_icudtl_path_override) { - return FilePath(*g_icudtl_path_override); - } - return FilePath(); -} - -} // namespace ios -} // namespace base
diff --git a/base/ios/ns_error_util.h b/base/ios/ns_error_util.h deleted file mode 100644 index 1012292..0000000 --- a/base/ios/ns_error_util.h +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_NS_ERROR_UTIL_H_ -#define BASE_IOS_NS_ERROR_UTIL_H_ - -@class NSError; - -namespace base { -namespace ios { - -// Iterates through |error|'s underlying errors and returns the first error for -// which there is no underlying error. -NSError* GetFinalUnderlyingErrorFromError(NSError* error); - -// Returns a copy of |original_error| with |underlying_error| appended to the -// end of its underlying error chain. -NSError* ErrorWithAppendedUnderlyingError(NSError* original_error, - NSError* underlying_error); - -} // namespace ios -} // namespace base - -#endif // BASE_IOS_NS_ERROR_UTIL_H_
diff --git a/base/ios/ns_error_util.mm b/base/ios/ns_error_util.mm deleted file mode 100644 index c44d9ee..0000000 --- a/base/ios/ns_error_util.mm +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "base/ios/ns_error_util.h" - -#import <Foundation/Foundation.h> - -#include "base/logging.h" -#include "base/mac/scoped_nsobject.h" - -namespace base { -namespace ios { - -namespace { -// Iterates through |error|'s underlying errors and returns them in an array. -NSArray* GetFullErrorChainForError(NSError* error) { - NSMutableArray* error_chain = [NSMutableArray array]; - NSError* current_error = error; - while (current_error) { - DCHECK([current_error isKindOfClass:[NSError class]]); - [error_chain addObject:current_error]; - current_error = current_error.userInfo[NSUnderlyingErrorKey]; - } - return error_chain; -} -} // namespace - -NSError* GetFinalUnderlyingErrorFromError(NSError* error) { - DCHECK(error); - return [GetFullErrorChainForError(error) lastObject]; -} - -NSError* ErrorWithAppendedUnderlyingError(NSError* original_error, - NSError* underlying_error) { - DCHECK(original_error); - DCHECK(underlying_error); - NSArray* error_chain = GetFullErrorChainForError(original_error); - NSError* current_error = underlying_error; - for (NSInteger idx = error_chain.count - 1; idx >= 0; --idx) { - NSError* error = error_chain[idx]; - scoped_nsobject<NSMutableDictionary> user_info( - [error.userInfo mutableCopy]); - [user_info setObject:current_error forKey:NSUnderlyingErrorKey]; - current_error = [NSError errorWithDomain:error.domain - code:error.code - userInfo:user_info]; - } - return current_error; -} - -} // namespace ios -} // namespace base
diff --git a/base/ios/scoped_critical_action.h b/base/ios/scoped_critical_action.h deleted file mode 100644 index 2f7d16c..0000000 --- a/base/ios/scoped_critical_action.h +++ /dev/null
@@ -1,73 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_SCOPED_CRITICAL_ACTION_H_ -#define BASE_IOS_SCOPED_CRITICAL_ACTION_H_ - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/synchronization/lock.h" - -namespace base { -namespace ios { - -// This class attempts to allow the application to continue to run for a period -// of time after it transitions to the background. The construction of an -// instance of this class marks the beginning of a task that needs background -// running time when the application is moved to the background and the -// destruction marks the end of such a task. -// -// Note there is no guarantee that the task will continue to finish when the -// application is moved to the background. -// -// This class should be used at times where leaving a task unfinished might be -// detrimental to user experience. For example, it should be used to ensure that -// the application has enough time to save important data or at least attempt to -// save such data. -class ScopedCriticalAction { - public: - ScopedCriticalAction(); - ~ScopedCriticalAction(); - - private: - // Core logic; ScopedCriticalAction should not be reference counted so - // that it follows the normal pattern of stack-allocating ScopedFoo objects, - // but the expiration handler needs to have a reference counted object to - // refer to. - class Core : public base::RefCountedThreadSafe<Core> { - public: - Core(); - - // Informs the OS that the background task has started. This is a - // static method to ensure that the instance has a non-zero refcount. - static void StartBackgroundTask(scoped_refptr<Core> core); - // Informs the OS that the background task has completed. This is a - // static method to ensure that the instance has a non-zero refcount. - static void EndBackgroundTask(scoped_refptr<Core> core); - - private: - friend base::RefCountedThreadSafe<Core>; - ~Core(); - - // |UIBackgroundTaskIdentifier| returned by - // |beginBackgroundTaskWithExpirationHandler:| when marking the beginning of - // a long-running background task. It is defined as an |unsigned int| - // instead of a |UIBackgroundTaskIdentifier| so this class can be used in - // .cc files. - unsigned int background_task_id_; - Lock background_task_id_lock_; - - DISALLOW_COPY_AND_ASSIGN(Core); - }; - - // The instance of the core that drives the background task. - scoped_refptr<Core> core_; - - DISALLOW_COPY_AND_ASSIGN(ScopedCriticalAction); -}; - -} // namespace ios -} // namespace base - -#endif // BASE_IOS_SCOPED_CRITICAL_ACTION_H_
diff --git a/base/ios/scoped_critical_action.mm b/base/ios/scoped_critical_action.mm deleted file mode 100644 index dbfbd45..0000000 --- a/base/ios/scoped_critical_action.mm +++ /dev/null
@@ -1,77 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/ios/scoped_critical_action.h" - -#import <UIKit/UIKit.h> - -#include "base/logging.h" -#include "base/memory/ref_counted.h" -#include "base/synchronization/lock.h" - -namespace base { -namespace ios { - -ScopedCriticalAction::ScopedCriticalAction() - : core_(MakeRefCounted<ScopedCriticalAction::Core>()) { - ScopedCriticalAction::Core::StartBackgroundTask(core_); -} - -ScopedCriticalAction::~ScopedCriticalAction() { - ScopedCriticalAction::Core::EndBackgroundTask(core_); -} - -ScopedCriticalAction::Core::Core() - : background_task_id_(UIBackgroundTaskInvalid) {} - -ScopedCriticalAction::Core::~Core() { - DCHECK_EQ(background_task_id_, UIBackgroundTaskInvalid); -} - -// This implementation calls |beginBackgroundTaskWithExpirationHandler:| when -// instantiated and |endBackgroundTask:| when destroyed, creating a scope whose -// execution will continue (temporarily) even after the app is backgrounded. -// static -void ScopedCriticalAction::Core::StartBackgroundTask(scoped_refptr<Core> core) { - UIApplication* application = [UIApplication sharedApplication]; - if (!application) { - return; - } - - core->background_task_id_ = - [application beginBackgroundTaskWithExpirationHandler:^{ - DLOG(WARNING) << "Background task with id " << core->background_task_id_ - << " expired."; - // Note if |endBackgroundTask:| is not called for each task before time - // expires, the system kills the application. - EndBackgroundTask(core); - }]; - - if (core->background_task_id_ == UIBackgroundTaskInvalid) { - DLOG(WARNING) - << "beginBackgroundTaskWithExpirationHandler: returned an invalid ID"; - } else { - VLOG(3) << "Beginning background task with id " - << core->background_task_id_; - } -} - -// static -void ScopedCriticalAction::Core::EndBackgroundTask(scoped_refptr<Core> core) { - UIBackgroundTaskIdentifier task_id; - { - AutoLock lock_scope(core->background_task_id_lock_); - if (core->background_task_id_ == UIBackgroundTaskInvalid) { - return; - } - task_id = core->background_task_id_; - core->background_task_id_ = UIBackgroundTaskInvalid; - } - - VLOG(3) << "Ending background task with id " << task_id; - [[UIApplication sharedApplication] endBackgroundTask:task_id]; -} - -} // namespace ios -} // namespace base
diff --git a/base/ios/weak_nsobject.h b/base/ios/weak_nsobject.h deleted file mode 100644 index 498cdee..0000000 --- a/base/ios/weak_nsobject.h +++ /dev/null
@@ -1,187 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_IOS_WEAK_NSOBJECT_H_ -#define BASE_IOS_WEAK_NSOBJECT_H_ - -#import <Foundation/Foundation.h> -#import <objc/runtime.h> - -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/memory/ref_counted.h" -#include "base/threading/thread_checker.h" - -// WeakNSObject<> is patterned after scoped_nsobject<>, but instead of -// maintaining ownership of an NSObject subclass object, it will nil itself out -// when the object is deallocated. -// -// WeakNSProtocol<> has the same behavior as WeakNSObject, but can be used -// with protocols. -// -// Example usage (base::WeakNSObject<T>): -// scoped_nsobject<Foo> foo([[Foo alloc] init]); -// WeakNSObject<Foo> weak_foo; // No pointer -// weak_foo.reset(foo) // Now a weak reference is kept. -// [weak_foo description]; // Returns [foo description]. -// foo.reset(); // The reference is released. -// [weak_foo description]; // Returns nil, as weak_foo is pointing to nil. -// -// -// Implementation wise a WeakNSObject keeps a reference to a refcounted -// WeakContainer. There is one unique instance of a WeakContainer per watched -// NSObject, this relationship is maintained via the ObjectiveC associated -// object API, indirectly via an ObjectiveC CRBWeakNSProtocolSentinel class. -// -// Threading restrictions: -// - Several WeakNSObject pointing to the same underlying object must all be -// created and dereferenced on the same thread; -// - thread safety is enforced by the implementation, except in two cases: -// (1) it is allowed to copy a WeakNSObject on a different thread. However, -// that copy must return to the original thread before being dereferenced, -// (2) it is allowed to destroy a WeakNSObject on any thread; -// - the implementation assumes that the tracked object will be released on the -// same thread that the WeakNSObject is created on. -namespace base { - -// WeakContainer keeps a weak pointer to an object and clears it when it -// receives nullify() from the object's sentinel. -class WeakContainer : public base::RefCountedThreadSafe<WeakContainer> { - public: - explicit WeakContainer(id object); - - id object() { - DCHECK(checker_.CalledOnValidThread()); - return object_; - } - - void nullify() { - DCHECK(checker_.CalledOnValidThread()); - object_ = nil; - } - - private: - friend base::RefCountedThreadSafe<WeakContainer>; - ~WeakContainer(); - base::ThreadChecker checker_; - __unsafe_unretained id object_; -}; - -} // namespace base - -// Sentinel for observing the object contained in the weak pointer. The object -// will be deleted when the weak object is deleted and will notify its -// container. -@interface CRBWeakNSProtocolSentinel : NSObject -// Return the only associated container for this object. There can be only one. -// Will return null if object is nil . -+ (scoped_refptr<base::WeakContainer>)containerForObject:(id)object; -@end - -namespace base { - -// Base class for all WeakNSObject derivatives. -template <typename NST> -class WeakNSProtocol { - public: - explicit WeakNSProtocol(NST object = nil) { - container_ = [CRBWeakNSProtocolSentinel containerForObject:object]; - } - - WeakNSProtocol(const WeakNSProtocol<NST>& that) { - // A WeakNSProtocol object can be copied on one thread and used on - // another. - checker_.DetachFromThread(); - container_ = that.container_; - } - - ~WeakNSProtocol() { - // A WeakNSProtocol object can be used on one thread and released on - // another. This is not the case for the contained object. - checker_.DetachFromThread(); - } - - void reset(NST object = nil) { - DCHECK(checker_.CalledOnValidThread()); - container_ = [CRBWeakNSProtocolSentinel containerForObject:object]; - } - - NST get() const { - DCHECK(checker_.CalledOnValidThread()); - if (!container_.get()) - return nil; - return container_->object(); - } - - WeakNSProtocol& operator=(const WeakNSProtocol<NST>& that) { - // A WeakNSProtocol object can be copied on one thread and used on - // another. - checker_.DetachFromThread(); - container_ = that.container_; - return *this; - } - - bool operator==(NST that) const { - DCHECK(checker_.CalledOnValidThread()); - return get() == that; - } - - bool operator!=(NST that) const { - DCHECK(checker_.CalledOnValidThread()); - return get() != that; - } - - operator NST() const { - DCHECK(checker_.CalledOnValidThread()); - return get(); - } - - private: - // Refecounted reference to the container tracking the ObjectiveC object this - // class encapsulates. - scoped_refptr<base::WeakContainer> container_; - base::ThreadChecker checker_; -}; - -// Free functions -template <class NST> -bool operator==(NST p1, const WeakNSProtocol<NST>& p2) { - return p1 == p2.get(); -} - -template <class NST> -bool operator!=(NST p1, const WeakNSProtocol<NST>& p2) { - return p1 != p2.get(); -} - -template <typename NST> -class WeakNSObject : public WeakNSProtocol<NST*> { - public: - explicit WeakNSObject(NST* object = nil) : WeakNSProtocol<NST*>(object) {} - - WeakNSObject(const WeakNSObject<NST>& that) : WeakNSProtocol<NST*>(that) {} - - WeakNSObject& operator=(const WeakNSObject<NST>& that) { - WeakNSProtocol<NST*>::operator=(that); - return *this; - } -}; - -// Specialization to make WeakNSObject<id> work. -template <> -class WeakNSObject<id> : public WeakNSProtocol<id> { - public: - explicit WeakNSObject(id object = nil) : WeakNSProtocol<id>(object) {} - - WeakNSObject(const WeakNSObject<id>& that) : WeakNSProtocol<id>(that) {} - - WeakNSObject& operator=(const WeakNSObject<id>& that) { - WeakNSProtocol<id>::operator=(that); - return *this; - } -}; - -} // namespace base - -#endif // BASE_IOS_WEAK_NSOBJECT_H_
diff --git a/base/ios/weak_nsobject.mm b/base/ios/weak_nsobject.mm deleted file mode 100644 index c017b1d..0000000 --- a/base/ios/weak_nsobject.mm +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/ios/weak_nsobject.h" - -#include "base/mac/scoped_nsautorelease_pool.h" -#include "base/mac/scoped_nsobject.h" - -namespace { -// The key needed by objc_setAssociatedObject. -char sentinelObserverKey_; -} - -namespace base { - -WeakContainer::WeakContainer(id object) : object_(object) {} - -WeakContainer::~WeakContainer() {} - -} // namespace base - -@interface CRBWeakNSProtocolSentinel () -// Container to notify on dealloc. -@property(readonly, assign) scoped_refptr<base::WeakContainer> container; -// Designed initializer. -- (id)initWithContainer:(scoped_refptr<base::WeakContainer>)container; -@end - -@implementation CRBWeakNSProtocolSentinel - -@synthesize container = container_; - -+ (scoped_refptr<base::WeakContainer>)containerForObject:(id)object { - if (object == nil) - return nullptr; - // The autoreleasePool is needed here as the call to objc_getAssociatedObject - // returns an autoreleased object which is better released sooner than later. - base::mac::ScopedNSAutoreleasePool pool; - CRBWeakNSProtocolSentinel* sentinel = - objc_getAssociatedObject(object, &sentinelObserverKey_); - if (!sentinel) { - base::scoped_nsobject<CRBWeakNSProtocolSentinel> newSentinel( - [[CRBWeakNSProtocolSentinel alloc] - initWithContainer:new base::WeakContainer(object)]); - sentinel = newSentinel; - objc_setAssociatedObject(object, &sentinelObserverKey_, sentinel, - OBJC_ASSOCIATION_RETAIN); - // The retain count is 2. One retain is due to the alloc, the other to the - // association with the weak object. - DCHECK_EQ(2u, [sentinel retainCount]); - } - return [sentinel container]; -} - -- (id)initWithContainer:(scoped_refptr<base::WeakContainer>)container { - DCHECK(container.get()); - self = [super init]; - if (self) - container_ = container; - return self; -} - -- (void)dealloc { - self.container->nullify(); - [super dealloc]; -} - -@end
diff --git a/base/ios/weak_nsobject_unittest.mm b/base/ios/weak_nsobject_unittest.mm deleted file mode 100644 index ba85217..0000000 --- a/base/ios/weak_nsobject_unittest.mm +++ /dev/null
@@ -1,140 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/bind.h" -#include "base/ios/weak_nsobject.h" -#include "base/mac/scoped_nsobject.h" -#include "base/message_loop/message_loop.h" -#include "base/run_loop.h" -#include "base/single_thread_task_runner.h" -#include "base/threading/thread.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace base { -namespace { - -TEST(WeakNSObjectTest, WeakNSObject) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - WeakNSObject<NSObject> w1(p1); - EXPECT_TRUE(w1); - p1.reset(); - EXPECT_FALSE(w1); -} - -TEST(WeakNSObjectTest, MultipleWeakNSObject) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - WeakNSObject<NSObject> w1(p1); - WeakNSObject<NSObject> w2(w1); - EXPECT_TRUE(w1); - EXPECT_TRUE(w2); - EXPECT_TRUE(w1.get() == w2.get()); - p1.reset(); - EXPECT_FALSE(w1); - EXPECT_FALSE(w2); -} - -TEST(WeakNSObjectTest, WeakNSObjectDies) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - { - WeakNSObject<NSObject> w1(p1); - EXPECT_TRUE(w1); - } -} - -TEST(WeakNSObjectTest, WeakNSObjectReset) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - WeakNSObject<NSObject> w1(p1); - EXPECT_TRUE(w1); - w1.reset(); - EXPECT_FALSE(w1); - EXPECT_TRUE(p1); - EXPECT_TRUE([p1 description]); -} - -TEST(WeakNSObjectTest, WeakNSObjectResetWithObject) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - scoped_nsobject<NSObject> p2([[NSObject alloc] init]); - WeakNSObject<NSObject> w1(p1); - EXPECT_TRUE(w1); - w1.reset(p2); - EXPECT_TRUE(w1); - EXPECT_TRUE([p1 description]); - EXPECT_TRUE([p2 description]); -} - -TEST(WeakNSObjectTest, WeakNSObjectEmpty) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - WeakNSObject<NSObject> w1; - EXPECT_FALSE(w1); - w1.reset(p1); - EXPECT_TRUE(w1); - p1.reset(); - EXPECT_FALSE(w1); -} - -TEST(WeakNSObjectTest, WeakNSObjectCopy) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - WeakNSObject<NSObject> w1(p1); - WeakNSObject<NSObject> w2(w1); - EXPECT_TRUE(w1); - EXPECT_TRUE(w2); - p1.reset(); - EXPECT_FALSE(w1); - EXPECT_FALSE(w2); -} - -TEST(WeakNSObjectTest, WeakNSObjectAssignment) { - scoped_nsobject<NSObject> p1([[NSObject alloc] init]); - WeakNSObject<NSObject> w1(p1); - WeakNSObject<NSObject> w2; - EXPECT_FALSE(w2); - w2 = w1; - EXPECT_TRUE(w1); - EXPECT_TRUE(w2); - p1.reset(); - EXPECT_FALSE(w1); - EXPECT_FALSE(w2); -} - -// Touches |weak_data| by increasing its length by 1. Used to check that the -// weak object can be dereferenced. -void TouchWeakData(const WeakNSObject<NSMutableData>& weak_data) { - if (!weak_data) - return; - [weak_data increaseLengthBy:1]; -} - -// Makes a copy of |weak_object| on the current thread and posts a task to touch -// the weak object on its original thread. -void CopyWeakNSObjectAndPost(const WeakNSObject<NSMutableData>& weak_object, - scoped_refptr<SingleThreadTaskRunner> runner) { - // Copy using constructor. - WeakNSObject<NSMutableData> weak_copy1(weak_object); - runner->PostTask(FROM_HERE, Bind(&TouchWeakData, weak_copy1)); - // Copy using assignment operator. - WeakNSObject<NSMutableData> weak_copy2 = weak_object; - runner->PostTask(FROM_HERE, Bind(&TouchWeakData, weak_copy2)); -} - -// Tests that the weak object can be copied on a different thread. -TEST(WeakNSObjectTest, WeakNSObjectCopyOnOtherThread) { - MessageLoop loop; - Thread other_thread("WeakNSObjectCopyOnOtherThread"); - other_thread.Start(); - - scoped_nsobject<NSMutableData> data([[NSMutableData alloc] init]); - WeakNSObject<NSMutableData> weak(data); - - scoped_refptr<SingleThreadTaskRunner> runner = loop.task_runner(); - other_thread.task_runner()->PostTask( - FROM_HERE, Bind(&CopyWeakNSObjectAndPost, weak, runner)); - other_thread.Stop(); - RunLoop().RunUntilIdle(); - - // Check that TouchWeakData was called and the object touched twice. - EXPECT_EQ(2u, [data length]); -} - -} // namespace -} // namespace base
diff --git a/base/message_loop/message_pump_io_ios.cc b/base/message_loop/message_pump_io_ios.cc deleted file mode 100644 index 9b43e8e..0000000 --- a/base/message_loop/message_pump_io_ios.cc +++ /dev/null
@@ -1,182 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/message_loop/message_pump_io_ios.h" - -namespace base { - -MessagePumpIOSForIO::FdWatchController::FdWatchController( - const Location& from_here) - : FdWatchControllerInterface(from_here) {} - -MessagePumpIOSForIO::FdWatchController::~FdWatchController() { - StopWatchingFileDescriptor(); -} - -bool MessagePumpIOSForIO::FdWatchController::StopWatchingFileDescriptor() { - if (fdref_ == NULL) - return true; - - CFFileDescriptorDisableCallBacks(fdref_.get(), callback_types_); - if (pump_) - pump_->RemoveRunLoopSource(fd_source_); - fd_source_.reset(); - fdref_.reset(); - callback_types_ = 0; - pump_.reset(); - watcher_ = NULL; - return true; -} - -void MessagePumpIOSForIO::FdWatchController::Init(CFFileDescriptorRef fdref, - CFOptionFlags callback_types, - CFRunLoopSourceRef fd_source, - bool is_persistent) { - DCHECK(fdref); - DCHECK(!fdref_.is_valid()); - - is_persistent_ = is_persistent; - fdref_.reset(fdref); - callback_types_ = callback_types; - fd_source_.reset(fd_source); -} - -void MessagePumpIOSForIO::FdWatchController::OnFileCanReadWithoutBlocking( - int fd, - MessagePumpIOSForIO* pump) { - DCHECK(callback_types_ & kCFFileDescriptorReadCallBack); - watcher_->OnFileCanReadWithoutBlocking(fd); -} - -void MessagePumpIOSForIO::FdWatchController::OnFileCanWriteWithoutBlocking( - int fd, - MessagePumpIOSForIO* pump) { - DCHECK(callback_types_ & kCFFileDescriptorWriteCallBack); - watcher_->OnFileCanWriteWithoutBlocking(fd); -} - -MessagePumpIOSForIO::MessagePumpIOSForIO() : weak_factory_(this) { -} - -MessagePumpIOSForIO::~MessagePumpIOSForIO() { -} - -bool MessagePumpIOSForIO::WatchFileDescriptor(int fd, - bool persistent, - int mode, - FdWatchController* controller, - FdWatcher* delegate) { - DCHECK_GE(fd, 0); - DCHECK(controller); - DCHECK(delegate); - DCHECK(mode == WATCH_READ || mode == WATCH_WRITE || mode == WATCH_READ_WRITE); - - // WatchFileDescriptor should be called on the pump thread. It is not - // threadsafe, and your watcher may never be registered. - DCHECK(watch_file_descriptor_caller_checker_.CalledOnValidThread()); - - CFFileDescriptorContext source_context = {0}; - source_context.info = controller; - - CFOptionFlags callback_types = 0; - if (mode & WATCH_READ) { - callback_types |= kCFFileDescriptorReadCallBack; - } - if (mode & WATCH_WRITE) { - callback_types |= kCFFileDescriptorWriteCallBack; - } - - CFFileDescriptorRef fdref = controller->fdref_.get(); - if (fdref == NULL) { - base::ScopedCFTypeRef<CFFileDescriptorRef> scoped_fdref( - CFFileDescriptorCreate( - kCFAllocatorDefault, fd, false, HandleFdIOEvent, &source_context)); - if (scoped_fdref == NULL) { - NOTREACHED() << "CFFileDescriptorCreate failed"; - return false; - } - - CFFileDescriptorEnableCallBacks(scoped_fdref, callback_types); - - // TODO(wtc): what should the 'order' argument be? - base::ScopedCFTypeRef<CFRunLoopSourceRef> scoped_fd_source( - CFFileDescriptorCreateRunLoopSource( - kCFAllocatorDefault, scoped_fdref, 0)); - if (scoped_fd_source == NULL) { - NOTREACHED() << "CFFileDescriptorCreateRunLoopSource failed"; - return false; - } - CFRunLoopAddSource(run_loop(), scoped_fd_source, kCFRunLoopCommonModes); - - // Transfer ownership of scoped_fdref and fd_source to controller. - controller->Init(scoped_fdref.release(), callback_types, - scoped_fd_source.release(), persistent); - } else { - // It's illegal to use this function to listen on 2 separate fds with the - // same |controller|. - if (CFFileDescriptorGetNativeDescriptor(fdref) != fd) { - NOTREACHED() << "FDs don't match: " - << CFFileDescriptorGetNativeDescriptor(fdref) - << " != " << fd; - return false; - } - if (persistent != controller->is_persistent_) { - NOTREACHED() << "persistent doesn't match"; - return false; - } - - // Combine old/new event masks. - CFFileDescriptorDisableCallBacks(fdref, controller->callback_types_); - controller->callback_types_ |= callback_types; - CFFileDescriptorEnableCallBacks(fdref, controller->callback_types_); - } - - controller->set_watcher(delegate); - controller->set_pump(weak_factory_.GetWeakPtr()); - - return true; -} - -void MessagePumpIOSForIO::RemoveRunLoopSource(CFRunLoopSourceRef source) { - CFRunLoopRemoveSource(run_loop(), source, kCFRunLoopCommonModes); -} - -// static -void MessagePumpIOSForIO::HandleFdIOEvent(CFFileDescriptorRef fdref, - CFOptionFlags callback_types, - void* context) { - FdWatchController* controller = static_cast<FdWatchController*>(context); - DCHECK_EQ(fdref, controller->fdref_.get()); - - // Ensure that |fdref| will remain live for the duration of this function - // call even if |controller| is deleted or |StopWatchingFileDescriptor()| is - // called, either of which will cause |fdref| to be released. - ScopedCFTypeRef<CFFileDescriptorRef> scoped_fdref( - fdref, base::scoped_policy::RETAIN); - - int fd = CFFileDescriptorGetNativeDescriptor(fdref); - MessagePumpIOSForIO* pump = controller->pump().get(); - DCHECK(pump); - if (callback_types & kCFFileDescriptorWriteCallBack) - controller->OnFileCanWriteWithoutBlocking(fd, pump); - - // Perform the read callback only if the file descriptor has not been - // invalidated in the write callback. As |FdWatchController| invalidates - // its file descriptor on destruction, the file descriptor being valid also - // guarantees that |controller| has not been deleted. - if (callback_types & kCFFileDescriptorReadCallBack && - CFFileDescriptorIsValid(fdref)) { - DCHECK_EQ(fdref, controller->fdref_.get()); - controller->OnFileCanReadWithoutBlocking(fd, pump); - } - - // Re-enable callbacks after the read/write if the file descriptor is still - // valid and the controller is persistent. - if (CFFileDescriptorIsValid(fdref) && controller->is_persistent_) { - DCHECK_EQ(fdref, controller->fdref_.get()); - CFFileDescriptorEnableCallBacks(fdref, callback_types); - } -} - -} // namespace base
diff --git a/base/message_loop/message_pump_io_ios.h b/base/message_loop/message_pump_io_ios.h deleted file mode 100644 index b390544..0000000 --- a/base/message_loop/message_pump_io_ios.h +++ /dev/null
@@ -1,91 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_ -#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_ - -#include "base/base_export.h" -#include "base/mac/scoped_cffiledescriptorref.h" -#include "base/mac/scoped_cftyperef.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/message_loop/message_pump_mac.h" -#include "base/message_loop/watchable_io_message_pump_posix.h" -#include "base/threading/thread_checker.h" - -namespace base { - -// This file introduces a class to monitor sockets and issue callbacks when -// sockets are ready for I/O on iOS. -class BASE_EXPORT MessagePumpIOSForIO : public MessagePumpNSRunLoop, - public WatchableIOMessagePumpPosix { - public: - class FdWatchController : public FdWatchControllerInterface { - public: - explicit FdWatchController(const Location& from_here); - - // Implicitly calls StopWatchingFileDescriptor. - ~FdWatchController() override; - - // FdWatchControllerInterface: - bool StopWatchingFileDescriptor() override; - - private: - friend class MessagePumpIOSForIO; - friend class MessagePumpIOSForIOTest; - - // Called by MessagePumpIOSForIO, ownership of |fdref| and |fd_source| - // is transferred to this object. - void Init(CFFileDescriptorRef fdref, - CFOptionFlags callback_types, - CFRunLoopSourceRef fd_source, - bool is_persistent); - - void set_pump(base::WeakPtr<MessagePumpIOSForIO> pump) { pump_ = pump; } - const base::WeakPtr<MessagePumpIOSForIO>& pump() const { return pump_; } - - void set_watcher(FdWatcher* watcher) { watcher_ = watcher; } - - void OnFileCanReadWithoutBlocking(int fd, MessagePumpIOSForIO* pump); - void OnFileCanWriteWithoutBlocking(int fd, MessagePumpIOSForIO* pump); - - bool is_persistent_ = false; // false if this event is one-shot. - base::mac::ScopedCFFileDescriptorRef fdref_; - CFOptionFlags callback_types_ = 0; - base::ScopedCFTypeRef<CFRunLoopSourceRef> fd_source_; - base::WeakPtr<MessagePumpIOSForIO> pump_; - FdWatcher* watcher_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(FdWatchController); - }; - - MessagePumpIOSForIO(); - ~MessagePumpIOSForIO() override; - - bool WatchFileDescriptor(int fd, - bool persistent, - int mode, - FdWatchController* controller, - FdWatcher* delegate); - - void RemoveRunLoopSource(CFRunLoopSourceRef source); - - private: - friend class MessagePumpIOSForIOTest; - - static void HandleFdIOEvent(CFFileDescriptorRef fdref, - CFOptionFlags callback_types, - void* context); - - ThreadChecker watch_file_descriptor_caller_checker_; - - base::WeakPtrFactory<MessagePumpIOSForIO> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(MessagePumpIOSForIO); -}; - -} // namespace base - -#endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_IO_IOS_H_
diff --git a/base/native_library_ios.mm b/base/native_library_ios.mm deleted file mode 100644 index dbcafb4..0000000 --- a/base/native_library_ios.mm +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright (c) 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/native_library.h" - -#include "base/logging.h" - -#include "base/strings/string_util.h" - -namespace base { - -std::string NativeLibraryLoadError::ToString() const { - return message; -} - -NativeLibrary LoadNativeLibraryWithOptions(const base::FilePath& library_path, - const NativeLibraryOptions& options, - NativeLibraryLoadError* error) { - NOTIMPLEMENTED(); - if (error) - error->message = "Not implemented."; - return nullptr; -} - -void UnloadNativeLibrary(NativeLibrary library) { - NOTIMPLEMENTED(); - DCHECK(!library); -} - -void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, - StringPiece name) { - NOTIMPLEMENTED(); - return nullptr; -} - -std::string GetNativeLibraryName(StringPiece name) { - DCHECK(IsStringASCII(name)); - return name.as_string(); -} - -std::string GetLoadableModuleName(StringPiece name) { - return GetNativeLibraryName(name); -} - -} // namespace base
diff --git a/base/power_monitor/power_monitor_device_source_ios.mm b/base/power_monitor/power_monitor_device_source_ios.mm deleted file mode 100644 index 3e86b2e..0000000 --- a/base/power_monitor/power_monitor_device_source_ios.mm +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/power_monitor/power_monitor_device_source.h" - -#import <UIKit/UIKit.h> - -namespace base { - -bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() { - NOTIMPLEMENTED(); - return false; -} - -void PowerMonitorDeviceSource::PlatformInit() { - NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; - id foreground = - [nc addObserverForName:UIApplicationWillEnterForegroundNotification - object:nil - queue:nil - usingBlock:^(NSNotification* notification) { - ProcessPowerEvent(RESUME_EVENT); - }]; - id background = - [nc addObserverForName:UIApplicationDidEnterBackgroundNotification - object:nil - queue:nil - usingBlock:^(NSNotification* notification) { - ProcessPowerEvent(SUSPEND_EVENT); - }]; - notification_observers_.push_back(foreground); - notification_observers_.push_back(background); -} - -void PowerMonitorDeviceSource::PlatformDestroy() { - NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; - for (std::vector<id>::iterator it = notification_observers_.begin(); - it != notification_observers_.end(); ++it) { - [nc removeObserver:*it]; - } - notification_observers_.clear(); -} - -} // namespace base
diff --git a/base/process/launch_ios.cc b/base/process/launch_ios.cc deleted file mode 100644 index 3c700f8..0000000 --- a/base/process/launch_ios.cc +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/process/launch.h" - -namespace base { - -void RaiseProcessToHighPriority() { - // Impossible on iOS. Do nothing. -} - -} // namespace base
diff --git a/base/process/process_metrics_ios.cc b/base/process/process_metrics_ios.cc deleted file mode 100644 index 83fc3d6..0000000 --- a/base/process/process_metrics_ios.cc +++ /dev/null
@@ -1,100 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/process/process_metrics.h" - -#include <limits.h> -#include <mach/task.h> -#include <stddef.h> - -#include "base/logging.h" -#include "base/mac/scoped_mach_port.h" -#include "base/memory/ptr_util.h" -#include "base/numerics/safe_conversions.h" - -namespace base { - -ProcessMetrics::ProcessMetrics(ProcessHandle process) {} - -ProcessMetrics::~ProcessMetrics() {} - -// static -std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateProcessMetrics( - ProcessHandle process) { - return WrapUnique(new ProcessMetrics(process)); -} - -TimeDelta ProcessMetrics::GetCumulativeCPUUsage() { - NOTIMPLEMENTED(); - return TimeDelta(); -} - -size_t GetMaxFds() { - static const rlim_t kSystemDefaultMaxFds = 256; - rlim_t max_fds; - struct rlimit nofile; - if (getrlimit(RLIMIT_NOFILE, &nofile)) { - // Error case: Take a best guess. - max_fds = kSystemDefaultMaxFds; - } else { - max_fds = nofile.rlim_cur; - } - - if (max_fds > INT_MAX) - max_fds = INT_MAX; - - return static_cast<size_t>(max_fds); -} - -void IncreaseFdLimitTo(unsigned int max_descriptors) { - // Unimplemented. -} - -size_t GetPageSize() { - return getpagesize(); -} - -// Bytes committed by the system. -size_t GetSystemCommitCharge() { - NOTIMPLEMENTED(); - return 0; -} - -bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo) { - struct host_basic_info hostinfo; - mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT; - base::mac::ScopedMachSendRight host(mach_host_self()); - int result = host_info(host.get(), HOST_BASIC_INFO, - reinterpret_cast<host_info_t>(&hostinfo), &count); - if (result != KERN_SUCCESS) - return false; - - DCHECK_EQ(HOST_BASIC_INFO_COUNT, count); - meminfo->total = static_cast<int>(hostinfo.max_mem / 1024); - - vm_statistics64_data_t vm_info; - count = HOST_VM_INFO64_COUNT; - - if (host_statistics64(host.get(), HOST_VM_INFO64, - reinterpret_cast<host_info64_t>(&vm_info), - &count) != KERN_SUCCESS) { - return false; - } - DCHECK_EQ(HOST_VM_INFO64_COUNT, count); - - // Check that PAGE_SIZE is divisible by 1024 (2^10). - CHECK_EQ(PAGE_SIZE, (PAGE_SIZE >> 10) << 10); - meminfo->free = saturated_cast<int>( - PAGE_SIZE / 1024 * (vm_info.free_count - vm_info.speculative_count)); - meminfo->speculative = - saturated_cast<int>(PAGE_SIZE / 1024 * vm_info.speculative_count); - meminfo->file_backed = - saturated_cast<int>(PAGE_SIZE / 1024 * vm_info.external_page_count); - meminfo->purgeable = - saturated_cast<int>(PAGE_SIZE / 1024 * vm_info.purgeable_count); - - return true; -} - -} // namespace base
diff --git a/base/sys_info_ios.mm b/base/sys_info_ios.mm deleted file mode 100644 index 60a7531..0000000 --- a/base/sys_info_ios.mm +++ /dev/null
@@ -1,130 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/sys_info.h" - -#include <mach/mach.h> -#include <stddef.h> -#include <stdint.h> -#include <sys/sysctl.h> -#include <sys/types.h> -#import <UIKit/UIKit.h> - -#include "base/logging.h" -#include "base/mac/scoped_mach_port.h" -#include "base/mac/scoped_nsautorelease_pool.h" -#include "base/macros.h" -#include "base/process/process_metrics.h" -#include "base/strings/sys_string_conversions.h" - -namespace base { - -namespace { - -// Queries sysctlbyname() for the given key and returns the value from the -// system or the empty string on failure. -std::string GetSysctlValue(const char* key_name) { - char value[256]; - size_t len = arraysize(value); - if (sysctlbyname(key_name, &value, &len, nullptr, 0) == 0) { - DCHECK_GE(len, 1u); - DCHECK_EQ('\0', value[len - 1]); - return std::string(value, len - 1); - } - return std::string(); -} - -} // namespace - -// static -std::string SysInfo::OperatingSystemName() { - static dispatch_once_t get_system_name_once; - static std::string* system_name; - dispatch_once(&get_system_name_once, ^{ - base::mac::ScopedNSAutoreleasePool pool; - system_name = new std::string( - SysNSStringToUTF8([[UIDevice currentDevice] systemName])); - }); - // Examples of returned value: 'iPhone OS' on iPad 5.1.1 - // and iPhone 5.1.1. - return *system_name; -} - -// static -std::string SysInfo::OperatingSystemVersion() { - static dispatch_once_t get_system_version_once; - static std::string* system_version; - dispatch_once(&get_system_version_once, ^{ - base::mac::ScopedNSAutoreleasePool pool; - system_version = new std::string( - SysNSStringToUTF8([[UIDevice currentDevice] systemVersion])); - }); - return *system_version; -} - -// static -void SysInfo::OperatingSystemVersionNumbers(int32_t* major_version, - int32_t* minor_version, - int32_t* bugfix_version) { - base::mac::ScopedNSAutoreleasePool pool; - std::string system_version = OperatingSystemVersion(); - if (!system_version.empty()) { - // Try to parse out the version numbers from the string. - int num_read = sscanf(system_version.c_str(), "%d.%d.%d", major_version, - minor_version, bugfix_version); - if (num_read < 1) - *major_version = 0; - if (num_read < 2) - *minor_version = 0; - if (num_read < 3) - *bugfix_version = 0; - } -} - -// static -int64_t SysInfo::AmountOfPhysicalMemoryImpl() { - struct host_basic_info hostinfo; - mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT; - base::mac::ScopedMachSendRight host(mach_host_self()); - int result = host_info(host.get(), - HOST_BASIC_INFO, - reinterpret_cast<host_info_t>(&hostinfo), - &count); - if (result != KERN_SUCCESS) { - NOTREACHED(); - return 0; - } - DCHECK_EQ(HOST_BASIC_INFO_COUNT, count); - return static_cast<int64_t>(hostinfo.max_mem); -} - -// static -int64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { - SystemMemoryInfoKB info; - if (!GetSystemMemoryInfo(&info)) - return 0; - // We should add inactive file-backed memory also but there is no such - // information from iOS unfortunately. - return static_cast<int64_t>(info.free + info.speculative) * 1024; -} - -// static -std::string SysInfo::CPUModelName() { - return GetSysctlValue("machdep.cpu.brand_string"); -} - -// static -std::string SysInfo::HardwareModelName() { -#if TARGET_OS_SIMULATOR - // On the simulator, "hw.machine" returns "i386" or "x86_64" which doesn't - // match the expected format, so supply a fake string here. - return "Simulator1,1"; -#else - // Note: This uses "hw.machine" instead of "hw.model" like the Mac code, - // because "hw.model" doesn't always return the right string on some devices. - return GetSysctlValue("hw.machine"); -#endif -} - -} // namespace base
diff --git a/base/test/ios/OWNERS b/base/test/ios/OWNERS deleted file mode 100644 index 40a68c7..0000000 --- a/base/test/ios/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -rohitrao@chromium.org
diff --git a/base/test/ios/wait_util.h b/base/test/ios/wait_util.h deleted file mode 100644 index e0c4c27..0000000 --- a/base/test/ios/wait_util.h +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_IOS_WAIT_UTIL_H_ -#define BASE_TEST_IOS_WAIT_UTIL_H_ - -#include "base/ios/block_types.h" -#include "base/time/time.h" - -namespace base { -namespace test { -namespace ios { - -// Runs |action| if non-nil. Then, until either |condition| is true or |timeout| -// expires, repetitively runs the current NSRunLoop and the current MessageLoop -// (if |run_message_loop| is true). |condition| may be nil if there is no -// condition to wait for; the NSRunLoop and current MessageLoop will be run run -// until |timeout| expires. DCHECKs if |condition| is non-nil and |timeout| -// expires before |condition| becomes true. If |timeout| is zero, a reasonable -// default is used. Returns the time spent in the function. -// DEPRECATED - Do not use in new code. http://crbug.com/784735 -TimeDelta TimeUntilCondition(ProceduralBlock action, - ConditionBlock condition, - bool run_message_loop, - TimeDelta timeout); - -// Same as TimeUntilCondition, but doesn't run an action. -// DEPRECATED - Do not use in new code. http://crbug.com/784735 -void WaitUntilCondition(ConditionBlock condition, - bool run_message_loop, - TimeDelta timeout); -// DEPRECATED - Do not use in new code. http://crbug.com/784735 -void WaitUntilCondition(ConditionBlock condition); - -// Lets the run loop of the current thread process other messages -// within the given maximum delay. This method may return before max_delay -// elapsed. -void SpinRunLoopWithMaxDelay(TimeDelta max_delay); - -// Lets the run loop of the current thread process other messages -// within the given minimum delay. This method returns after |min_delay| -// elapsed. -void SpinRunLoopWithMinDelay(TimeDelta min_delay); - -} // namespace ios -} // namespace test -} // namespace base - -#endif // BASE_TEST_IOS_WAIT_UTIL_H_
diff --git a/base/test/ios/wait_util.mm b/base/test/ios/wait_util.mm deleted file mode 100644 index 39a4115..0000000 --- a/base/test/ios/wait_util.mm +++ /dev/null
@@ -1,70 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "base/test/ios/wait_util.h" - -#import <Foundation/Foundation.h> - -#include "base/logging.h" -#include "base/mac/scoped_nsobject.h" -#include "base/run_loop.h" -#include "base/test/test_timeouts.h" -#include "base/timer/elapsed_timer.h" - -namespace base { -namespace test { -namespace ios { - -TimeDelta TimeUntilCondition(ProceduralBlock action, - ConditionBlock condition, - bool run_message_loop, - TimeDelta timeout) { - ElapsedTimer timer; - if (action) - action(); - if (timeout.is_zero()) - timeout = TestTimeouts::action_timeout(); - const TimeDelta spin_delay(TimeDelta::FromMilliseconds(10)); - bool condition_evaluation_result = false; - while (timer.Elapsed() < timeout && - (!condition || !(condition_evaluation_result = condition()))) { - SpinRunLoopWithMaxDelay(spin_delay); - if (run_message_loop) - RunLoop().RunUntilIdle(); - } - const TimeDelta elapsed = timer.Elapsed(); - // If DCHECK is ever hit, check if |action| is doing something that is - // taking an unreasonably long time, or if |condition| does not come - // true quickly enough. Increase |timeout| only if necessary. - DCHECK(!condition || condition_evaluation_result); - return elapsed; -} - -void WaitUntilCondition(ConditionBlock condition, - bool run_message_loop, - TimeDelta timeout) { - TimeUntilCondition(nil, condition, run_message_loop, timeout); -} - -void WaitUntilCondition(ConditionBlock condition) { - WaitUntilCondition(condition, false, TimeDelta()); -} - -void SpinRunLoopWithMaxDelay(TimeDelta max_delay) { - scoped_nsobject<NSDate> beforeDate( - [[NSDate alloc] initWithTimeIntervalSinceNow:max_delay.InSecondsF()]); - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:beforeDate]; -} - -void SpinRunLoopWithMinDelay(TimeDelta min_delay) { - ElapsedTimer timer; - while (timer.Elapsed() < min_delay) { - SpinRunLoopWithMaxDelay(TimeDelta::FromMilliseconds(10)); - } -} - -} // namespace ios -} // namespace test -} // namespace base
diff --git a/base/test/launcher/unit_test_launcher_ios.cc b/base/test/launcher/unit_test_launcher_ios.cc deleted file mode 100644 index 0bb31f7..0000000 --- a/base/test/launcher/unit_test_launcher_ios.cc +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/launcher/unit_test_launcher.h" - -#include "base/command_line.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/mac/foundation_util.h" -#include "base/test/gtest_util.h" -#include "base/test/test_switches.h" - -namespace base { - -int LaunchUnitTests(int argc, - char** argv, - RunTestSuiteCallback run_test_suite) { - CHECK(CommandLine::InitializedForCurrentProcess() || - CommandLine::Init(argc, argv)); - const CommandLine* command_line = CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switches::kTestLauncherListTests)) { - FilePath list_path(command_line->GetSwitchValuePath( - switches::kTestLauncherListTests)); - if (WriteCompiledInTestsToFile(list_path)) { - return 0; - } else { - LOG(ERROR) << "Failed to write list of tests."; - return 1; - } - } else if (command_line->HasSwitch( - switches::kTestLauncherPrintWritablePath)) { - fprintf(stdout, "%s", mac::GetUserLibraryPath().value().c_str()); - fflush(stdout); - return 0; - } - - return std::move(run_test_suite).Run(); -} - -} // namespace base
diff --git a/base/test/test_listener_ios.h b/base/test/test_listener_ios.h deleted file mode 100644 index c312250..0000000 --- a/base/test/test_listener_ios.h +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_TEST_LISTENER_IOS_H_ -#define BASE_TEST_TEST_LISTENER_IOS_H_ - -namespace base { -namespace test_listener_ios { - -// Register an IOSRunLoopListener. -void RegisterTestEndListener(); - -} // namespace test_listener_ios -} // namespace base - -#endif // BASE_TEST_TEST_LISTENER_IOS_H_
diff --git a/base/test/test_listener_ios.mm b/base/test/test_listener_ios.mm deleted file mode 100644 index 12cf5bb..0000000 --- a/base/test/test_listener_ios.mm +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/test_listener_ios.h" - -#import <Foundation/Foundation.h> - -#include "base/mac/scoped_nsautorelease_pool.h" -#include "testing/gtest/include/gtest/gtest.h" - -// The iOS watchdog timer will kill an app that doesn't spin the main event -// loop often enough. This uses a Gtest TestEventListener to spin the current -// loop after each test finishes. However, if any individual test takes too -// long, it is still possible that the app will get killed. - -namespace { - -class IOSRunLoopListener : public testing::EmptyTestEventListener { - public: - virtual void OnTestEnd(const testing::TestInfo& test_info); -}; - -void IOSRunLoopListener::OnTestEnd(const testing::TestInfo& test_info) { - base::mac::ScopedNSAutoreleasePool scoped_pool; - - // At the end of the test, spin the default loop for a moment. - NSDate* stop_date = [NSDate dateWithTimeIntervalSinceNow:0.001]; - [[NSRunLoop currentRunLoop] runUntilDate:stop_date]; -} - -} // namespace - - -namespace base { -namespace test_listener_ios { - -void RegisterTestEndListener() { - testing::TestEventListeners& listeners = - testing::UnitTest::GetInstance()->listeners(); - listeners.Append(new IOSRunLoopListener); -} - -} // namespace test_listener_ios -} // namespace base
diff --git a/base/test/test_support_ios.h b/base/test/test_support_ios.h deleted file mode 100644 index c71cf0d..0000000 --- a/base/test/test_support_ios.h +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_TEST_SUPPORT_IOS_H_ -#define BASE_TEST_TEST_SUPPORT_IOS_H_ - -#include "base/test/test_suite.h" - -namespace base { - -// Inits the message loop for tests on iOS. -void InitIOSTestMessageLoop(); - -// Inits the run hook for tests on iOS. -void InitIOSRunHook(TestSuite* suite, int argc, char* argv[]); - -// Launches an iOS app that runs the tests in the suite passed to -// InitIOSRunHook. -void RunTestsFromIOSApp(); - -} // namespace base - -#endif // BASE_TEST_TEST_SUPPORT_IOS_H_
diff --git a/base/test/test_support_ios.mm b/base/test/test_support_ios.mm deleted file mode 100644 index 03c7631..0000000 --- a/base/test/test_support_ios.mm +++ /dev/null
@@ -1,219 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import <UIKit/UIKit.h> - -#include "base/debug/debugger.h" -#include "base/logging.h" -#include "base/mac/scoped_nsautorelease_pool.h" -#include "base/mac/scoped_nsobject.h" -#include "base/message_loop/message_loop.h" -#include "base/message_loop/message_pump_default.h" -#include "base/test/test_suite.h" -#include "testing/coverage_util_ios.h" - -// Springboard will kill any iOS app that fails to check in after launch within -// a given time. Starting a UIApplication before invoking TestSuite::Run -// prevents this from happening. - -// InitIOSRunHook saves the TestSuite and argc/argv, then invoking -// RunTestsFromIOSApp calls UIApplicationMain(), providing an application -// delegate class: ChromeUnitTestDelegate. The delegate implements -// application:didFinishLaunchingWithOptions: to invoke the TestSuite's Run -// method. - -// Since the executable isn't likely to be a real iOS UI, the delegate puts up a -// window displaying the app name. If a bunch of apps using MainHook are being -// run in a row, this provides an indication of which one is currently running. - -static base::TestSuite* g_test_suite = NULL; -static int g_argc; -static char** g_argv; - -@interface UIApplication (Testing) -- (void)_terminateWithStatus:(int)status; -@end - -#if TARGET_IPHONE_SIMULATOR -// Xcode 6 introduced behavior in the iOS Simulator where the software -// keyboard does not appear if a hardware keyboard is connected. The following -// declaration allows this behavior to be overriden when the app starts up. -@interface UIKeyboardImpl -+ (instancetype)sharedInstance; -- (void)setAutomaticMinimizationEnabled:(BOOL)enabled; -- (void)setSoftwareKeyboardShownByTouch:(BOOL)enabled; -@end -#endif // TARGET_IPHONE_SIMULATOR - -@interface ChromeUnitTestDelegate : NSObject { - base::scoped_nsobject<UIWindow> _window; -} -- (void)runTests; -@end - -@implementation ChromeUnitTestDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - -#if TARGET_IPHONE_SIMULATOR - // Xcode 6 introduced behavior in the iOS Simulator where the software - // keyboard does not appear if a hardware keyboard is connected. The following - // calls override this behavior by ensuring that the software keyboard is - // always shown. - [[UIKeyboardImpl sharedInstance] setAutomaticMinimizationEnabled:NO]; - [[UIKeyboardImpl sharedInstance] setSoftwareKeyboardShownByTouch:YES]; -#endif // TARGET_IPHONE_SIMULATOR - - CGRect bounds = [[UIScreen mainScreen] bounds]; - - // Yes, this is leaked, it's just to make what's running visible. - _window.reset([[UIWindow alloc] initWithFrame:bounds]); - [_window setBackgroundColor:[UIColor whiteColor]]; - [_window makeKeyAndVisible]; - - // Add a label with the app name. - UILabel* label = [[[UILabel alloc] initWithFrame:bounds] autorelease]; - label.text = [[NSProcessInfo processInfo] processName]; - label.textAlignment = NSTextAlignmentCenter; - [_window addSubview:label]; - - // An NSInternalInconsistencyException is thrown if the app doesn't have a - // root view controller. Set an empty one here. - [_window setRootViewController:[[[UIViewController alloc] init] autorelease]]; - - if ([self shouldRedirectOutputToFile]) - [self redirectOutput]; - - // Queue up the test run. - [self performSelector:@selector(runTests) - withObject:nil - afterDelay:0.1]; - return YES; -} - -// Returns true if the gtest output should be redirected to a file, then sent -// to NSLog when compleete. This redirection is used because gtest only writes -// output to stdout, but results must be written to NSLog in order to show up in -// the device log that is retrieved from the device by the host. -- (BOOL)shouldRedirectOutputToFile { -#if !TARGET_IPHONE_SIMULATOR - return !base::debug::BeingDebugged(); -#endif // TARGET_IPHONE_SIMULATOR - return NO; -} - -// Returns the path to the directory to store gtest output files. -- (NSString*)outputPath { - NSArray* searchPath = - NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, - NSUserDomainMask, - YES); - CHECK([searchPath count] > 0) << "Failed to get the Documents folder"; - return [searchPath objectAtIndex:0]; -} - -// Returns the path to file that stdout is redirected to. -- (NSString*)stdoutPath { - return [[self outputPath] stringByAppendingPathComponent:@"stdout.log"]; -} - -// Returns the path to file that stderr is redirected to. -- (NSString*)stderrPath { - return [[self outputPath] stringByAppendingPathComponent:@"stderr.log"]; -} - -// Redirects stdout and stderr to files in the Documents folder in the app's -// sandbox. -- (void)redirectOutput { - freopen([[self stdoutPath] UTF8String], "w+", stdout); - freopen([[self stderrPath] UTF8String], "w+", stderr); -} - -// Reads the redirected gtest output from a file and writes it to NSLog. -- (void)writeOutputToNSLog { - // Close the redirected stdout and stderr files so that the content written to - // NSLog doesn't end up in these files. - fclose(stdout); - fclose(stderr); - for (NSString* path in @[ [self stdoutPath], [self stderrPath]]) { - NSString* content = [NSString stringWithContentsOfFile:path - encoding:NSUTF8StringEncoding - error:NULL]; - NSArray* lines = [content componentsSeparatedByCharactersInSet: - [NSCharacterSet newlineCharacterSet]]; - - NSLog(@"Writing contents of %@ to NSLog", path); - for (NSString* line in lines) { - NSLog(@"%@", line); - } - } -} - -- (void)runTests { - coverage_util::ConfigureCoverageReportPath(); - - int exitStatus = g_test_suite->Run(); - - if ([self shouldRedirectOutputToFile]) - [self writeOutputToNSLog]; - - // If a test app is too fast, it will exit before Instruments has has a - // a chance to initialize and no test results will be seen. - // TODO(crbug.com/137010): Figure out how much time is actually needed, and - // sleep only to make sure that much time has elapsed since launch. - [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; - _window.reset(); - - // Use the hidden selector to try and cleanly take down the app (otherwise - // things can think the app crashed even on a zero exit status). - UIApplication* application = [UIApplication sharedApplication]; - [application _terminateWithStatus:exitStatus]; - - exit(exitStatus); -} - -@end - -namespace { - -std::unique_ptr<base::MessagePump> CreateMessagePumpForUIForTests() { - // A default MessagePump will do quite nicely in tests. - return std::unique_ptr<base::MessagePump>(new base::MessagePumpDefault()); -} - -} // namespace - -namespace base { - -void InitIOSTestMessageLoop() { - MessageLoop::InitMessagePumpForUIFactory(&CreateMessagePumpForUIForTests); -} - -void InitIOSRunHook(TestSuite* suite, int argc, char* argv[]) { - g_test_suite = suite; - g_argc = argc; - g_argv = argv; -} - -void RunTestsFromIOSApp() { - // When TestSuite::Run is invoked it calls RunTestsFromIOSApp(). On the first - // invocation, this method fires up an iOS app via UIApplicationMain. Since - // UIApplicationMain does not return until the app exits, control does not - // return to the initial TestSuite::Run invocation, so the app invokes - // TestSuite::Run a second time and since |ran_hook| is true at this point, - // this method is a no-op and control returns to TestSuite:Run so that test - // are executed. Once the app exits, RunTestsFromIOSApp calls exit() so that - // control is not returned to the initial invocation of TestSuite::Run. - static bool ran_hook = false; - if (!ran_hook) { - ran_hook = true; - mac::ScopedNSAutoreleasePool pool; - int exit_status = UIApplicationMain(g_argc, g_argv, nil, - @"ChromeUnitTestDelegate"); - exit(exit_status); - } -} - -} // namespace base