Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / ios / web / crw_network_activity_indicator_manager.mm
blob683e293e4757345b5ad5ac6c1ec4a97381fdae07
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "ios/web/crw_network_activity_indicator_manager.h"
7 #import <UIKit/UIKit.h>
9 #include "base/logging.h"
10 #include "base/mac/scoped_nsobject.h"
11 #include "base/threading/thread_checker.h"
13 @interface CRWNetworkActivityIndicatorManager () {
14   base::scoped_nsobject<NSMutableDictionary> _groupCounts;
15   NSUInteger _totalCount;
16   base::ThreadChecker _threadChecker;
19 @end
21 @implementation CRWNetworkActivityIndicatorManager
23 + (CRWNetworkActivityIndicatorManager*)sharedInstance {
24   static CRWNetworkActivityIndicatorManager* instance =
25       [[CRWNetworkActivityIndicatorManager alloc] init];
26   return instance;
29 - (instancetype)init {
30   self = [super init];
31   if (self) {
32     _groupCounts.reset([[NSMutableDictionary alloc] init]);
33     _totalCount = 0;
34   }
35   return self;
38 - (void)startNetworkTaskForGroup:(NSString*)group {
39   [self startNetworkTasks:1 forGroup:group];
42 - (void)stopNetworkTaskForGroup:(NSString*)group {
43   [self stopNetworkTasks:1 forGroup:group];
46 - (void)startNetworkTasks:(NSUInteger)numTasks forGroup:(NSString*)group {
47   DCHECK(_threadChecker.CalledOnValidThread());
48   DCHECK(group);
49   DCHECK_GT(numTasks, 0U);
50   NSUInteger count = 0;
51   NSNumber* number = [_groupCounts objectForKey:group];
52   if (number) {
53     count = [number unsignedIntegerValue];
54     DCHECK_GT(count, 0U);
55   }
56   count += numTasks;
57   [_groupCounts setObject:@(count) forKey:group];
58   _totalCount += numTasks;
59   if (_totalCount == numTasks) {
60     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
61   }
64 - (void)stopNetworkTasks:(NSUInteger)numTasks forGroup:(NSString*)group {
65   DCHECK(_threadChecker.CalledOnValidThread());
66   DCHECK(group);
67   DCHECK_GT(numTasks, 0U);
68   NSNumber* number = [_groupCounts objectForKey:group];
69   DCHECK(number);
70   NSUInteger count = [number unsignedIntegerValue];
71   DCHECK(count >= numTasks);
72   count -= numTasks;
73   if (count == 0) {
74     [_groupCounts removeObjectForKey:group];
75   } else {
76     [_groupCounts setObject:@(count) forKey:group];
77   }
78   _totalCount -= numTasks;
79   if (_totalCount == 0) {
80     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
81   }
84 - (NSUInteger)clearNetworkTasksForGroup:(NSString*)group {
85   DCHECK(_threadChecker.CalledOnValidThread());
86   DCHECK(group);
87   NSNumber* number = [_groupCounts objectForKey:group];
88   if (!number) {
89     return 0;
90   }
91   NSUInteger count = [number unsignedIntegerValue];
92   DCHECK_GT(count, 0U);
93   [self stopNetworkTasks:count forGroup:group];
94   return count;
97 - (NSUInteger)numNetworkTasksForGroup:(NSString*)group {
98   DCHECK(_threadChecker.CalledOnValidThread());
99   DCHECK(group);
100   NSNumber* number = [_groupCounts objectForKey:group];
101   if (!number) {
102     return 0;
103   }
104   return [number unsignedIntegerValue];
107 - (NSUInteger)numTotalNetworkTasks {
108   DCHECK(_threadChecker.CalledOnValidThread());
109   return _totalCount;
112 @end