| Index: ios/net/request_tracker.mm
|
| diff --git a/ios/net/request_tracker.mm b/ios/net/request_tracker.mm
|
| index 85dce7ffdf4d4dcc33eabfe457e70581d2b7e733..f72921a3398e92988483bf9f9db81e6f9474b4ca 100644
|
| --- a/ios/net/request_tracker.mm
|
| +++ b/ios/net/request_tracker.mm
|
| @@ -18,6 +18,56 @@
|
|
|
| // Reference to the single instance of the RequestTrackerFactory.
|
| RequestTracker::RequestTrackerFactory* g_request_tracker_factory = nullptr;
|
| +
|
| +// Array of network client factories that should be added to any new request
|
| +// tracker.
|
| +class GlobalNetworkClientFactories {
|
| + public:
|
| + static GlobalNetworkClientFactories* GetInstance() {
|
| + if (!g_global_network_client_factories)
|
| + g_global_network_client_factories = new GlobalNetworkClientFactories;
|
| + return g_global_network_client_factories;
|
| + }
|
| +
|
| + // Gets the factories.
|
| + NSArray* GetFactories() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + return factories_.get();
|
| + }
|
| +
|
| + // Adds a factory.
|
| + void AddFactory(CRNForwardingNetworkClientFactory* factory) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK_EQ(NSNotFound,
|
| + static_cast<NSInteger>([factories_ indexOfObject:factory]));
|
| + DCHECK(!IsSelectorOverriden(factory, @selector(clientHandlingRequest:)));
|
| + DCHECK(!IsSelectorOverriden(factory,
|
| + @selector(clientHandlingResponse:request:)));
|
| + DCHECK(!IsSelectorOverriden(
|
| + factory, @selector(clientHandlingRedirect:url:response:)));
|
| + [factories_ addObject:factory];
|
| + }
|
| +
|
| + // Returns true if |factory| re-implements |selector|.
|
| + // Only used for debugging.
|
| + bool IsSelectorOverriden(CRNForwardingNetworkClientFactory* factory,
|
| + SEL selector) {
|
| + return
|
| + [factory methodForSelector:selector] !=
|
| + [CRNForwardingNetworkClientFactory instanceMethodForSelector:selector];
|
| + }
|
| +
|
| + private:
|
| + GlobalNetworkClientFactories() : factories_([[NSMutableArray alloc] init]) {}
|
| +
|
| + base::scoped_nsobject<NSMutableArray> factories_;
|
| + base::ThreadChecker thread_checker_;
|
| +
|
| + static GlobalNetworkClientFactories* g_global_network_client_factories;
|
| +};
|
| +
|
| +GlobalNetworkClientFactories*
|
| + GlobalNetworkClientFactories::g_global_network_client_factories = nullptr;
|
|
|
| } // namespace
|
|
|
| @@ -58,6 +108,12 @@
|
| }
|
| }
|
|
|
| +// static
|
| +void RequestTracker::AddGlobalNetworkClientFactory(
|
| + CRNForwardingNetworkClientFactory* factory) {
|
| + GlobalNetworkClientFactories::GetInstance()->AddFactory(factory);
|
| +}
|
| +
|
| RequestTracker::RequestTracker()
|
| : client_factories_([[NSMutableArray alloc] init]),
|
| initialized_(false),
|
| @@ -83,6 +139,22 @@
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(!initialized_);
|
| initialized_ = true;
|
| + for (CRNForwardingNetworkClientFactory* factory in
|
| + GlobalNetworkClientFactories::GetInstance()->GetFactories()) {
|
| + AddNetworkClientFactory(factory);
|
| + }
|
| +}
|
| +
|
| +// static
|
| +NSArray* RequestTracker::GlobalClientsHandlingAnyRequest() {
|
| + NSMutableArray* applicable_clients = [NSMutableArray array];
|
| + for (CRNForwardingNetworkClientFactory* factory in
|
| + GlobalNetworkClientFactories::GetInstance()->GetFactories()) {
|
| + CRNForwardingNetworkClient* client = [factory clientHandlingAnyRequest];
|
| + if (client)
|
| + [applicable_clients addObject:client];
|
| + }
|
| + return applicable_clients;
|
| }
|
|
|
| NSArray* RequestTracker::ClientsHandlingAnyRequest() {
|
|
|