| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ios/net/request_tracker.h" | 5 #include "ios/net/request_tracker.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #import "ios/net/clients/crn_forwarding_network_client.h" | 8 #import "ios/net/clients/crn_forwarding_network_client.h" |
| 9 #import "ios/net/clients/crn_forwarding_network_client_factory.h" | 9 #import "ios/net/clients/crn_forwarding_network_client_factory.h" |
| 10 | 10 |
| 11 #if !defined(__has_feature) || !__has_feature(objc_arc) | 11 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 12 #error "This file requires ARC support." | 12 #error "This file requires ARC support." |
| 13 #endif | 13 #endif |
| 14 | 14 |
| 15 namespace net { | 15 namespace net { |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 // Reference to the single instance of the RequestTrackerFactory. | 19 // Reference to the single instance of the RequestTrackerFactory. |
| 20 RequestTracker::RequestTrackerFactory* g_request_tracker_factory = nullptr; | 20 RequestTracker::RequestTrackerFactory* g_request_tracker_factory = nullptr; |
| 21 | 21 |
| 22 // Array of network client factories that should be added to any new request | |
| 23 // tracker. | |
| 24 class GlobalNetworkClientFactories { | |
| 25 public: | |
| 26 static GlobalNetworkClientFactories* GetInstance() { | |
| 27 if (!g_global_network_client_factories) | |
| 28 g_global_network_client_factories = new GlobalNetworkClientFactories; | |
| 29 return g_global_network_client_factories; | |
| 30 } | |
| 31 | |
| 32 // Gets the factories. | |
| 33 NSArray* GetFactories() { | |
| 34 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 35 return factories_.get(); | |
| 36 } | |
| 37 | |
| 38 // Adds a factory. | |
| 39 void AddFactory(CRNForwardingNetworkClientFactory* factory) { | |
| 40 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 41 DCHECK_EQ(NSNotFound, | |
| 42 static_cast<NSInteger>([factories_ indexOfObject:factory])); | |
| 43 DCHECK(!IsSelectorOverriden(factory, @selector(clientHandlingRequest:))); | |
| 44 DCHECK(!IsSelectorOverriden(factory, | |
| 45 @selector(clientHandlingResponse:request:))); | |
| 46 DCHECK(!IsSelectorOverriden( | |
| 47 factory, @selector(clientHandlingRedirect:url:response:))); | |
| 48 [factories_ addObject:factory]; | |
| 49 } | |
| 50 | |
| 51 // Returns true if |factory| re-implements |selector|. | |
| 52 // Only used for debugging. | |
| 53 bool IsSelectorOverriden(CRNForwardingNetworkClientFactory* factory, | |
| 54 SEL selector) { | |
| 55 return | |
| 56 [factory methodForSelector:selector] != | |
| 57 [CRNForwardingNetworkClientFactory instanceMethodForSelector:selector]; | |
| 58 } | |
| 59 | |
| 60 private: | |
| 61 GlobalNetworkClientFactories() : factories_([[NSMutableArray alloc] init]) {} | |
| 62 | |
| 63 base::scoped_nsobject<NSMutableArray> factories_; | |
| 64 base::ThreadChecker thread_checker_; | |
| 65 | |
| 66 static GlobalNetworkClientFactories* g_global_network_client_factories; | |
| 67 }; | |
| 68 | |
| 69 GlobalNetworkClientFactories* | |
| 70 GlobalNetworkClientFactories::g_global_network_client_factories = nullptr; | |
| 71 | |
| 72 } // namespace | 22 } // namespace |
| 73 | 23 |
| 74 RequestTracker::RequestTrackerFactory::~RequestTrackerFactory() { | 24 RequestTracker::RequestTrackerFactory::~RequestTrackerFactory() { |
| 75 } | 25 } |
| 76 | 26 |
| 77 // static | 27 // static |
| 78 void RequestTracker::SetRequestTrackerFactory(RequestTrackerFactory* factory) { | 28 void RequestTracker::SetRequestTrackerFactory(RequestTrackerFactory* factory) { |
| 79 g_request_tracker_factory = factory; | 29 g_request_tracker_factory = factory; |
| 80 } | 30 } |
| 81 | 31 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 101 NSUInteger idx, | 51 NSUInteger idx, |
| 102 BOOL* stop) { | 52 BOOL* stop) { |
| 103 return [obj clientClass] == [factory clientClass]; | 53 return [obj clientClass] == [factory clientClass]; |
| 104 }] == NSNotFound); | 54 }] == NSNotFound); |
| 105 [client_factories_ addObject:factory]; | 55 [client_factories_ addObject:factory]; |
| 106 if ([factory requiresOrdering]) { | 56 if ([factory requiresOrdering]) { |
| 107 [client_factories_ sortUsingSelector:@selector(orderRelativeTo:)]; | 57 [client_factories_ sortUsingSelector:@selector(orderRelativeTo:)]; |
| 108 } | 58 } |
| 109 } | 59 } |
| 110 | 60 |
| 111 // static | |
| 112 void RequestTracker::AddGlobalNetworkClientFactory( | |
| 113 CRNForwardingNetworkClientFactory* factory) { | |
| 114 GlobalNetworkClientFactories::GetInstance()->AddFactory(factory); | |
| 115 } | |
| 116 | |
| 117 RequestTracker::RequestTracker() | 61 RequestTracker::RequestTracker() |
| 118 : client_factories_([[NSMutableArray alloc] init]), | 62 : client_factories_([[NSMutableArray alloc] init]), |
| 119 initialized_(false), | 63 initialized_(false), |
| 120 cache_mode_(CACHE_NORMAL), | 64 cache_mode_(CACHE_NORMAL), |
| 121 weak_ptr_factory_(this) { | 65 weak_ptr_factory_(this) { |
| 122 // RequestTracker can be created from the main thread and used from another | 66 // RequestTracker can be created from the main thread and used from another |
| 123 // thread. | 67 // thread. |
| 124 thread_checker_.DetachFromThread(); | 68 thread_checker_.DetachFromThread(); |
| 125 } | 69 } |
| 126 | 70 |
| 127 RequestTracker::~RequestTracker() { | 71 RequestTracker::~RequestTracker() { |
| 128 } | 72 } |
| 129 | 73 |
| 130 base::WeakPtr<RequestTracker> RequestTracker::GetWeakPtr() { | 74 base::WeakPtr<RequestTracker> RequestTracker::GetWeakPtr() { |
| 131 return weak_ptr_factory_.GetWeakPtr(); | 75 return weak_ptr_factory_.GetWeakPtr(); |
| 132 } | 76 } |
| 133 | 77 |
| 134 void RequestTracker::InvalidateWeakPtrs() { | 78 void RequestTracker::InvalidateWeakPtrs() { |
| 135 weak_ptr_factory_.InvalidateWeakPtrs(); | 79 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 136 } | 80 } |
| 137 | 81 |
| 138 void RequestTracker::Init() { | 82 void RequestTracker::Init() { |
| 139 DCHECK(thread_checker_.CalledOnValidThread()); | 83 DCHECK(thread_checker_.CalledOnValidThread()); |
| 140 DCHECK(!initialized_); | 84 DCHECK(!initialized_); |
| 141 initialized_ = true; | 85 initialized_ = true; |
| 142 for (CRNForwardingNetworkClientFactory* factory in | |
| 143 GlobalNetworkClientFactories::GetInstance()->GetFactories()) { | |
| 144 AddNetworkClientFactory(factory); | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 // static | |
| 149 NSArray* RequestTracker::GlobalClientsHandlingAnyRequest() { | |
| 150 NSMutableArray* applicable_clients = [NSMutableArray array]; | |
| 151 for (CRNForwardingNetworkClientFactory* factory in | |
| 152 GlobalNetworkClientFactories::GetInstance()->GetFactories()) { | |
| 153 CRNForwardingNetworkClient* client = [factory clientHandlingAnyRequest]; | |
| 154 if (client) | |
| 155 [applicable_clients addObject:client]; | |
| 156 } | |
| 157 return applicable_clients; | |
| 158 } | 86 } |
| 159 | 87 |
| 160 NSArray* RequestTracker::ClientsHandlingAnyRequest() { | 88 NSArray* RequestTracker::ClientsHandlingAnyRequest() { |
| 161 DCHECK(thread_checker_.CalledOnValidThread()); | 89 DCHECK(thread_checker_.CalledOnValidThread()); |
| 162 DCHECK(initialized_); | 90 DCHECK(initialized_); |
| 163 NSMutableArray* applicable_clients = [NSMutableArray array]; | 91 NSMutableArray* applicable_clients = [NSMutableArray array]; |
| 164 for (CRNForwardingNetworkClientFactory* factory in client_factories_.get()) { | 92 for (CRNForwardingNetworkClientFactory* factory in client_factories_.get()) { |
| 165 CRNForwardingNetworkClient* client = [factory clientHandlingAnyRequest]; | 93 CRNForwardingNetworkClient* client = [factory clientHandlingAnyRequest]; |
| 166 if (client) | 94 if (client) |
| 167 [applicable_clients addObject:client]; | 95 [applicable_clients addObject:client]; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 DCHECK(thread_checker_.CalledOnValidThread()); | 147 DCHECK(thread_checker_.CalledOnValidThread()); |
| 220 return cache_mode_; | 148 return cache_mode_; |
| 221 } | 149 } |
| 222 | 150 |
| 223 void RequestTracker::SetCacheMode(RequestTracker::CacheMode mode) { | 151 void RequestTracker::SetCacheMode(RequestTracker::CacheMode mode) { |
| 224 DCHECK(thread_checker_.CalledOnValidThread()); | 152 DCHECK(thread_checker_.CalledOnValidThread()); |
| 225 cache_mode_ = mode; | 153 cache_mode_ = mode; |
| 226 } | 154 } |
| 227 | 155 |
| 228 } // namespace net | 156 } // namespace net |
| OLD | NEW |