Commit 03b06d27 authored by David Jean's avatar David Jean Committed by Chromium LUCI CQ

[ios] Remove deprecated network activity indicator

Network Activity indicator is deprecated starting with
iOS 13.

Bug: 1125908, 1115004
Change-Id: I52488502cc79b780e4c707c1f2f27eb82d0b52d6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2600129Reviewed-by: default avatarEric Noyau <noyau@chromium.org>
Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Commit-Queue: David Jean <djean@chromium.org>
Cr-Commit-Position: refs/heads/master@{#839069}
parent 2f5033e7
...@@ -37,7 +37,6 @@ source_set("download") { ...@@ -37,7 +37,6 @@ source_set("download") {
"//components/strings:components_strings_grit", "//components/strings:components_strings_grit",
"//ios/chrome/app/strings:ios_strings", "//ios/chrome/app/strings:ios_strings",
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/network_activity",
"//ios/chrome/browser/overlays", "//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/common/confirmation", "//ios/chrome/browser/overlays/public/common/confirmation",
"//ios/chrome/browser/overlays/public/common/confirmation:util", "//ios/chrome/browser/overlays/public/common/confirmation:util",
...@@ -87,7 +86,6 @@ source_set("unit_tests") { ...@@ -87,7 +86,6 @@ source_set("unit_tests") {
"//base/test:test_support", "//base/test:test_support",
"//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/download", "//ios/chrome/browser/download",
"//ios/chrome/browser/network_activity",
"//ios/chrome/test/fakes", "//ios/chrome/test/fakes",
"//ios/web/public", "//ios/web/public",
"//ios/web/public/download", "//ios/web/public/download",
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/notreached.h" #include "base/notreached.h"
#import "ios/chrome/browser/download/download_manager_tab_helper_delegate.h" #import "ios/chrome/browser/download/download_manager_tab_helper_delegate.h"
#import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
#import "ios/web/public/download/download_task.h" #import "ios/web/public/download/download_task.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -72,8 +71,6 @@ void DownloadManagerTabHelper::WasHidden(web::WebState* web_state) { ...@@ -72,8 +71,6 @@ void DownloadManagerTabHelper::WasHidden(web::WebState* web_state) {
void DownloadManagerTabHelper::WebStateDestroyed(web::WebState* web_state) { void DownloadManagerTabHelper::WebStateDestroyed(web::WebState* web_state) {
web_state->RemoveObserver(this); web_state->RemoveObserver(this);
if (task_) { if (task_) {
[[NetworkActivityIndicatorManager sharedInstance]
clearNetworkTasksForGroup:GetNetworkActivityKey()];
task_->RemoveObserver(this); task_->RemoveObserver(this);
task_ = nullptr; task_ = nullptr;
} }
...@@ -83,18 +80,12 @@ void DownloadManagerTabHelper::OnDownloadUpdated(web::DownloadTask* task) { ...@@ -83,18 +80,12 @@ void DownloadManagerTabHelper::OnDownloadUpdated(web::DownloadTask* task) {
DCHECK_EQ(task, task_.get()); DCHECK_EQ(task, task_.get());
switch (task->GetState()) { switch (task->GetState()) {
case web::DownloadTask::State::kCancelled: case web::DownloadTask::State::kCancelled:
[[NetworkActivityIndicatorManager sharedInstance]
clearNetworkTasksForGroup:GetNetworkActivityKey()];
task_->RemoveObserver(this); task_->RemoveObserver(this);
task_ = nullptr; task_ = nullptr;
break; break;
case web::DownloadTask::State::kInProgress: case web::DownloadTask::State::kInProgress:
[[NetworkActivityIndicatorManager sharedInstance]
startNetworkTaskForGroup:GetNetworkActivityKey()];
break; break;
case web::DownloadTask::State::kComplete: case web::DownloadTask::State::kComplete:
[[NetworkActivityIndicatorManager sharedInstance]
clearNetworkTasksForGroup:GetNetworkActivityKey()];
break; break;
case web::DownloadTask::State::kNotStarted: case web::DownloadTask::State::kNotStarted:
// OnDownloadUpdated cannot be called with this state. // OnDownloadUpdated cannot be called with this state.
...@@ -102,16 +93,9 @@ void DownloadManagerTabHelper::OnDownloadUpdated(web::DownloadTask* task) { ...@@ -102,16 +93,9 @@ void DownloadManagerTabHelper::OnDownloadUpdated(web::DownloadTask* task) {
} }
} }
NSString* DownloadManagerTabHelper::GetNetworkActivityKey() const {
return [@"DownloadManagerTabHelper."
stringByAppendingString:task_->GetIndentifier()];
}
void DownloadManagerTabHelper::DidCreateDownload( void DownloadManagerTabHelper::DidCreateDownload(
std::unique_ptr<web::DownloadTask> task) { std::unique_ptr<web::DownloadTask> task) {
if (task_) { if (task_) {
[[NetworkActivityIndicatorManager sharedInstance]
clearNetworkTasksForGroup:GetNetworkActivityKey()];
task_->RemoveObserver(this); task_->RemoveObserver(this);
} }
task_ = std::move(task); task_ = std::move(task);
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <memory> #include <memory>
#import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
#import "ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h" #import "ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h"
#import "ios/web/public/test/fakes/fake_download_task.h" #import "ios/web/public/test/fakes/fake_download_task.h"
#import "ios/web/public/test/fakes/fake_web_state.h" #import "ios/web/public/test/fakes/fake_web_state.h"
...@@ -140,92 +139,6 @@ TEST_F(DownloadManagerTabHelperTest, HideAndShowWebState) { ...@@ -140,92 +139,6 @@ TEST_F(DownloadManagerTabHelperTest, HideAndShowWebState) {
EXPECT_EQ(web::DownloadTask::State::kNotStarted, *delegate_.state); EXPECT_EQ(web::DownloadTask::State::kNotStarted, *delegate_.state);
} }
// Tests showing network activity indicator when download is started and hiding
// when download is cancelled.
TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnCancel) {
ASSERT_FALSE(delegate_.state);
auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
web::FakeDownloadTask* task_ptr = task.get();
tab_helper()->Download(std::move(task));
ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
task_ptr->Cancel();
EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
}
// Tests showing network activity indicator when download is started and hiding
// when download is complete.
TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnDone) {
ASSERT_FALSE(delegate_.state);
auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
web::FakeDownloadTask* task_ptr = task.get();
tab_helper()->Download(std::move(task));
ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
task_ptr->SetDone(true);
EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
}
// Tests showing network activity indicator when download is started and hiding
// when the download task is replaced.
TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnReplacement) {
ASSERT_FALSE(delegate_.state);
auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
web::FakeDownloadTask* task_ptr = task.get();
tab_helper()->Download(std::move(task));
ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
// Replace the download task.
auto task2 = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
const web::FakeDownloadTask* task2_ptr = task2.get();
tab_helper()->Download(std::move(task2));
EXPECT_EQ(task2_ptr, delegate_.decidingPolicyForDownload);
// Ask the delegate to replace the new download.
BOOL replaced = [delegate_ decidePolicy:kNewDownloadPolicyReplace];
ASSERT_TRUE(replaced);
// Now network activity indicator is hidden.
EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
}
// Tests showing network activity indicator when download is started and hiding
// when tab helper is destroyed.
TEST_F(DownloadManagerTabHelperTest, NetworkActivityIndicatorOnDestruction) {
ASSERT_FALSE(delegate_.state);
auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
web::FakeDownloadTask* task_ptr = task.get();
tab_helper()->Download(std::move(task));
ASSERT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
task_ptr->Start(std::make_unique<net::URLFetcherStringWriter>());
EXPECT_EQ(1U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
web_state_ = nullptr;
EXPECT_EQ(0U, [[NetworkActivityIndicatorManager sharedInstance]
numTotalNetworkTasks]);
}
// Tests that has_download_task() returns correct result. // Tests that has_download_task() returns correct result.
TEST_F(DownloadManagerTabHelperTest, HasDownloadTask) { TEST_F(DownloadManagerTabHelperTest, HasDownloadTask) {
ASSERT_FALSE(delegate_.state); ASSERT_FALSE(delegate_.state);
......
# Copyright 2019 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.
source_set("network_activity") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"network_activity_indicator_manager.h",
"network_activity_indicator_manager.mm",
]
deps = [ "//base" ]
}
source_set("tab_helper") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"network_activity_indicator_tab_helper.h",
"network_activity_indicator_tab_helper.mm",
]
deps = [
":network_activity",
"//base",
"//ios/web/public",
]
}
source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ]
testonly = true
sources = [
"network_activity_indicator_manager_unittest.mm",
"network_activity_indicator_tab_helper_unittest.mm",
]
deps = [
":network_activity",
":tab_helper",
"//ios/web/public",
"//ios/web/public/test",
"//ios/web/public/test/fakes",
"//testing/gtest",
]
}
// Copyright 2016 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 IOS_CHROME_BROWSER_NETWORK_ACTIVITY_NETWORK_ACTIVITY_INDICATOR_MANAGER_H_
#define IOS_CHROME_BROWSER_NETWORK_ACTIVITY_NETWORK_ACTIVITY_INDICATOR_MANAGER_H_
#import <Foundation/Foundation.h>
// This class controls access to the network activity indicator across the
// app. It provides a simple interface for clients to indicate they are
// starting a network task and they would like the indicator shown, and to
// indicate they have finished a network task.
//
// Clients are required to pass an NSString* to each method to identify
// themselves. Separating clients into groups prevents a client from "stopping"
// requests from other clients on accident, and makes those bugs easier to
// track down. Specifically, the manager will immediately fail if the number
// of tasks stopped for a group ever exceeds the number of tasks started for
// that group. Clients are responsible for namespacing their group strings
// properly. All methods must be called on the UI thread.
@interface NetworkActivityIndicatorManager : NSObject
// Returns the singleton NetworkActivityIndicatorManager.
+ (NetworkActivityIndicatorManager*)sharedInstance;
// Begins a single network task. The network activity indicator is guaranteed
// to be shown after this finishes (if it isn't already). |group| must be
// non-nil.
- (void)startNetworkTaskForGroup:(NSString*)group;
// Stops a single network task. The network activity indicator may or may not
// stop being shown once this finishes, depending on whether there are other
// unstopped tasks or not. |group| must be non-nil, and have at least one
// unstopped task.
- (void)stopNetworkTaskForGroup:(NSString*)group;
// A convenience method for starting multiple network tasks at once. |group|
// must be non-nil. |numTasks| must be greater than 0.
- (void)startNetworkTasks:(NSUInteger)numTasks forGroup:(NSString*)group;
// A convenience method for stopping multiple network tasks at once. |group|
// must be non-nil. |numTasks| must be greater than 0, and |numTasks| must be
// less than or equal to the number of unstopped tasks in |group|.
- (void)stopNetworkTasks:(NSUInteger)numTasks forGroup:(NSString*)group;
// A convenience method for stopping all network tasks for a group. |group|
// must be non-nil. Can be called on any group at any time, regardless of
// whether the group has any unstopped network tasks or not. Returns the number
// of tasks stopped by this call.
- (NSUInteger)clearNetworkTasksForGroup:(NSString*)group;
// Returns the number of unstopped network tasks for |group|. |group| must be
// non-nil. Can be called on any group at any time, regardless of whether the
// group has any unstopped network tasks or not.
- (NSUInteger)numNetworkTasksForGroup:(NSString*)group;
// Returns the total number of unstopped network tasks, across all groups. This
// method was added for testing only. Clients should never depend on this, and
// should instead only be concerned with the number of unstopped network tasks
// for the groups they control, which can be queried using
// |-numNetworkTasksForGroup:|.
- (NSUInteger)numTotalNetworkTasks;
@end
#endif // IOS_CHROME_BROWSER_NETWORK_ACTIVITY_NETWORK_ACTIVITY_INDICATOR_MANAGER_H_
// Copyright 2016 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 "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
#import <UIKit/UIKit.h>
#include "base/check_op.h"
#include "base/threading/thread_checker.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface NetworkActivityIndicatorManager () {
NSMutableDictionary* _groupCounts;
NSUInteger _totalCount;
base::ThreadChecker _threadChecker;
}
@end
@implementation NetworkActivityIndicatorManager
+ (NetworkActivityIndicatorManager*)sharedInstance {
static NetworkActivityIndicatorManager* instance =
[[NetworkActivityIndicatorManager alloc] init];
return instance;
}
- (instancetype)init {
self = [super init];
if (self) {
_groupCounts = [[NSMutableDictionary alloc] init];
_totalCount = 0;
}
return self;
}
- (void)startNetworkTaskForGroup:(NSString*)group {
[self startNetworkTasks:1 forGroup:group];
}
- (void)stopNetworkTaskForGroup:(NSString*)group {
[self stopNetworkTasks:1 forGroup:group];
}
- (void)startNetworkTasks:(NSUInteger)numTasks forGroup:(NSString*)group {
DCHECK(_threadChecker.CalledOnValidThread());
DCHECK(group);
DCHECK_GT(numTasks, 0U);
NSUInteger count = 0;
NSNumber* number = [_groupCounts objectForKey:group];
if (number) {
count = [number unsignedIntegerValue];
DCHECK_GT(count, 0U);
}
count += numTasks;
[_groupCounts setObject:@(count) forKey:group];
_totalCount += numTasks;
#if !defined(__IPHONE_13_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_13_0
// TODO(crbug.com/1115004) remove this code (or file?) or upgrade to custom
// indicator.
if (_totalCount == numTasks) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
}
#endif
}
- (void)stopNetworkTasks:(NSUInteger)numTasks forGroup:(NSString*)group {
DCHECK(_threadChecker.CalledOnValidThread());
DCHECK(group);
DCHECK_GT(numTasks, 0U);
NSNumber* number = [_groupCounts objectForKey:group];
DCHECK(number);
NSUInteger count = [number unsignedIntegerValue];
DCHECK(count >= numTasks);
count -= numTasks;
if (count == 0) {
[_groupCounts removeObjectForKey:group];
} else {
[_groupCounts setObject:@(count) forKey:group];
}
_totalCount -= numTasks;
#if !defined(__IPHONE_13_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_13_0
if (_totalCount == 0) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
#endif
}
- (NSUInteger)clearNetworkTasksForGroup:(NSString*)group {
DCHECK(_threadChecker.CalledOnValidThread());
DCHECK(group);
NSNumber* number = [_groupCounts objectForKey:group];
if (!number) {
return 0;
}
NSUInteger count = [number unsignedIntegerValue];
DCHECK_GT(count, 0U);
[self stopNetworkTasks:count forGroup:group];
return count;
}
- (NSUInteger)numNetworkTasksForGroup:(NSString*)group {
DCHECK(_threadChecker.CalledOnValidThread());
DCHECK(group);
NSNumber* number = [_groupCounts objectForKey:group];
if (!number) {
return 0;
}
return [number unsignedIntegerValue];
}
- (NSUInteger)numTotalNetworkTasks {
DCHECK(_threadChecker.CalledOnValidThread());
return _totalCount;
}
@end
// Copyright 2016 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 "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
#import <UIKit/UIKit.h>
#include "testing/gtest_mac.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
NSString* const kNetworkActivityKeyOne =
@"NetworkActivityIndicatorManagerTest.NetworkActivityIndicatorKeyOne";
NSString* const kNetworkActivityKeyTwo =
@"NetworkActivityIndicatorManagerTest.NetworkActivityIndicatorKeyTwo";
class NetworkActivityIndicatorManagerTest : public PlatformTest {
public:
NetworkActivityIndicatorManagerTest()
: manager_([[NetworkActivityIndicatorManager alloc] init]) {}
protected:
void ExpectNetworkActivity(NSUInteger groupOneCount,
NSUInteger groupTwoCount) {
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyOne],
groupOneCount);
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyTwo],
groupTwoCount);
EXPECT_EQ([manager_ numTotalNetworkTasks], groupOneCount + groupTwoCount);
if (groupOneCount + groupTwoCount > 0U) {
EXPECT_TRUE([[UIApplication sharedApplication]
isNetworkActivityIndicatorVisible]);
} else {
EXPECT_FALSE([[UIApplication sharedApplication]
isNetworkActivityIndicatorVisible]);
}
}
NetworkActivityIndicatorManager* manager_;
};
TEST_F(NetworkActivityIndicatorManagerTest, TestNumNetworkTasksForGroup) {
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyOne], 0U);
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyTwo], 0U);
[manager_ startNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyOne], 2U);
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyTwo], 0U);
[manager_ startNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyOne], 2U);
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyTwo], 3U);
[manager_ stopNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyOne], 0U);
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyTwo], 3U);
[manager_ stopNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyOne], 0U);
EXPECT_EQ([manager_ numNetworkTasksForGroup:kNetworkActivityKeyTwo], 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, TestNumTotalNetworkTasks) {
EXPECT_EQ([manager_ numTotalNetworkTasks], 0U);
[manager_ startNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
EXPECT_EQ([manager_ numTotalNetworkTasks], 2U);
[manager_ startNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
EXPECT_EQ([manager_ numTotalNetworkTasks], 5U);
[manager_ stopNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
EXPECT_EQ([manager_ numTotalNetworkTasks], 3U);
[manager_ stopNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
EXPECT_EQ([manager_ numTotalNetworkTasks], 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, StartStopNetworkTaskForOneGroup) {
ExpectNetworkActivity(0U, 0U);
[manager_ startNetworkTaskForGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(1U, 0U);
[manager_ stopNetworkTaskForGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, StartStopNetworkTaskForTwoGroups) {
ExpectNetworkActivity(0U, 0U);
[manager_ startNetworkTaskForGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(1U, 0U);
[manager_ startNetworkTaskForGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(1U, 1U);
[manager_ stopNetworkTaskForGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 1U);
[manager_ stopNetworkTaskForGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(0U, 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, StartStopNetworkTasksForOneGroup) {
ExpectNetworkActivity(0U, 0U);
[manager_ startNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(2U, 0U);
[manager_ stopNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, StartStopNetworkTasksForTwoGroups) {
ExpectNetworkActivity(0U, 0U);
[manager_ startNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(2U, 0U);
[manager_ startNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(2U, 3U);
[manager_ stopNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 3U);
[manager_ stopNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(0U, 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, ClearNetworkTasksForGroup) {
ExpectNetworkActivity(0U, 0U);
[manager_ startNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(2U, 0U);
[manager_ clearNetworkTasksForGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, ClearNetworkTasksForUnusedGroup) {
ExpectNetworkActivity(0U, 0U);
[manager_ clearNetworkTasksForGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 0U);
}
TEST_F(NetworkActivityIndicatorManagerTest, StartStopNetworkTasksInChunks) {
ExpectNetworkActivity(0U, 0U);
[manager_ startNetworkTasks:2U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(2U, 0U);
[manager_ startNetworkTasks:3U forGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(2U, 3U);
[manager_ startNetworkTasks:7U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(9U, 3U);
[manager_ startNetworkTaskForGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(9U, 4U);
[manager_ stopNetworkTasks:4U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(5U, 4U);
[manager_ stopNetworkTasks:2U forGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(5U, 2U);
[manager_ stopNetworkTasks:5U forGroup:kNetworkActivityKeyOne];
ExpectNetworkActivity(0U, 2U);
[manager_ clearNetworkTasksForGroup:kNetworkActivityKeyTwo];
ExpectNetworkActivity(0U, 0U);
}
} // namespace
// Copyright 2016 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 IOS_CHROME_BROWSER_NETWORK_ACTIVITY_NETWORK_ACTIVITY_INDICATOR_TAB_HELPER_H_
#define IOS_CHROME_BROWSER_NETWORK_ACTIVITY_NETWORK_ACTIVITY_INDICATOR_TAB_HELPER_H_
#import <Foundation/Foundation.h>
#include "base/macros.h"
#include "ios/web/public/web_state_observer.h"
#import "ios/web/public/web_state_user_data.h"
// Handles listening to WebState network activity to control network activity
// indicator.
class NetworkActivityIndicatorTabHelper
: public web::WebStateObserver,
public web::WebStateUserData<NetworkActivityIndicatorTabHelper> {
public:
~NetworkActivityIndicatorTabHelper() override;
static void CreateForWebState(web::WebState* web_state, NSString* tab_id);
private:
friend class web::WebStateUserData<NetworkActivityIndicatorTabHelper>;
NetworkActivityIndicatorTabHelper(web::WebState* web_state, NSString* tab_id);
// web::WebStateObserver overrides:
void DidStartLoading(web::WebState* web_state) override;
void DidStopLoading(web::WebState* web_state) override;
void WebStateDestroyed(web::WebState* web_state) override;
// Clears any network activity state associated with this activity.
void Stop();
// Key used to uniquely identify this activity.
NSString* network_activity_key_;
WEB_STATE_USER_DATA_KEY_DECL();
DISALLOW_COPY_AND_ASSIGN(NetworkActivityIndicatorTabHelper);
};
#endif // IOS_CHROME_BROWSER_NETWORK_ACTIVITY_NETWORK_ACTIVITY_INDICATOR_TAB_HELPER_H_
// Copyright 2016 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 "ios/chrome/browser/network_activity/network_activity_indicator_tab_helper.h"
#include "base/memory/ptr_util.h"
#import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
#import "ios/web/public/web_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// static
void NetworkActivityIndicatorTabHelper::CreateForWebState(
web::WebState* web_state,
NSString* tab_id) {
DCHECK(web_state);
if (!FromWebState(web_state)) {
web_state->SetUserData(
UserDataKey(), base::WrapUnique(new NetworkActivityIndicatorTabHelper(
web_state, tab_id)));
}
}
NetworkActivityIndicatorTabHelper::NetworkActivityIndicatorTabHelper(
web::WebState* web_state,
NSString* tab_id)
: network_activity_key_([tab_id copy]) {
web_state->AddObserver(this);
}
NetworkActivityIndicatorTabHelper::~NetworkActivityIndicatorTabHelper() {
Stop();
}
void NetworkActivityIndicatorTabHelper::DidStartLoading(
web::WebState* web_state) {
NetworkActivityIndicatorManager* shared_manager =
[NetworkActivityIndicatorManager sharedInstance];
// Verifies that there are not any network tasks associated with this instance
// before starting another task, so that this method is idempotent.
if (![shared_manager numNetworkTasksForGroup:network_activity_key_])
[shared_manager startNetworkTaskForGroup:network_activity_key_];
}
void NetworkActivityIndicatorTabHelper::DidStopLoading(
web::WebState* web_state) {
Stop();
}
void NetworkActivityIndicatorTabHelper::WebStateDestroyed(
web::WebState* web_state) {
web_state->RemoveObserver(this);
}
void NetworkActivityIndicatorTabHelper::Stop() {
NetworkActivityIndicatorManager* shared_manager =
[NetworkActivityIndicatorManager sharedInstance];
// Verifies that there is a network task associated with this instance
// before stopping a task, so that this method is idempotent.
if ([shared_manager numNetworkTasksForGroup:network_activity_key_])
[shared_manager stopNetworkTaskForGroup:network_activity_key_];
}
WEB_STATE_USER_DATA_KEY_IMPL(NetworkActivityIndicatorTabHelper)
// Copyright 2016 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 "ios/chrome/browser/network_activity/network_activity_indicator_tab_helper.h"
#import <UIKit/UIKit.h>
#import "ios/web/public/test/fakes/fake_web_state.h"
#import "ios/web/public/test/web_test.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using web::FakeWebState;
using NetworkActivityIndicatorTabHelperTest = PlatformTest;
// Tests that the network activity for a single WebState correctly manages
// the state of the network activity indicator.
TEST_F(NetworkActivityIndicatorTabHelperTest, SingleWebStateActivity) {
auto web_state = std::make_unique<FakeWebState>();
NetworkActivityIndicatorTabHelper::CreateForWebState(web_state.get(),
@"web_state1");
EXPECT_FALSE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state->SetLoading(true);
EXPECT_TRUE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state->SetLoading(false);
EXPECT_FALSE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
}
// Tests that the network activity for multiple WebStates correctly manage
// the state of the network activity indicator.
TEST_F(NetworkActivityIndicatorTabHelperTest, MultipleWebStateActivity) {
auto web_state1 = std::make_unique<FakeWebState>();
NetworkActivityIndicatorTabHelper::CreateForWebState(web_state1.get(),
@"web_state1");
auto web_state2 = std::make_unique<FakeWebState>();
NetworkActivityIndicatorTabHelper::CreateForWebState(web_state2.get(),
@"web_state2");
EXPECT_FALSE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state1->SetLoading(true);
web_state2->SetLoading(true);
EXPECT_TRUE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state1->SetLoading(false);
EXPECT_TRUE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state2->SetLoading(false);
EXPECT_FALSE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
}
// Tests that the network activity for a single WebState correctly stops when
// the WebState is deallocated.
TEST_F(NetworkActivityIndicatorTabHelperTest, WebStateDeallocated) {
auto web_state = std::make_unique<FakeWebState>();
NetworkActivityIndicatorTabHelper::CreateForWebState(web_state.get(),
@"web_state1");
EXPECT_FALSE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state->SetLoading(true);
EXPECT_TRUE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
web_state.reset(nil);
EXPECT_FALSE(
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]);
}
...@@ -74,7 +74,6 @@ source_set("tabs_internal") { ...@@ -74,7 +74,6 @@ source_set("tabs_internal") {
"//ios/chrome/browser/link_to_text", "//ios/chrome/browser/link_to_text",
"//ios/chrome/browser/main", "//ios/chrome/browser/main",
"//ios/chrome/browser/metrics", "//ios/chrome/browser/metrics",
"//ios/chrome/browser/network_activity:tab_helper",
"//ios/chrome/browser/ntp", "//ios/chrome/browser/ntp",
"//ios/chrome/browser/open_in", "//ios/chrome/browser/open_in",
"//ios/chrome/browser/overscroll_actions", "//ios/chrome/browser/overscroll_actions",
......
...@@ -43,7 +43,6 @@ ...@@ -43,7 +43,6 @@
#import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h" #import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h"
#import "ios/chrome/browser/link_to_text/link_to_text_tab_helper.h" #import "ios/chrome/browser/link_to_text/link_to_text_tab_helper.h"
#import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h" #import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h"
#import "ios/chrome/browser/network_activity/network_activity_indicator_tab_helper.h"
#import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h" #import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h"
#import "ios/chrome/browser/open_in/open_in_tab_helper.h" #import "ios/chrome/browser/open_in/open_in_tab_helper.h"
#import "ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper.h" #import "ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper.h"
...@@ -102,7 +101,6 @@ void AttachTabHelpers(web::WebState* web_state, bool for_prerender) { ...@@ -102,7 +101,6 @@ void AttachTabHelpers(web::WebState* web_state, bool for_prerender) {
WebStateDelegateTabHelper::CreateForWebState(web_state); WebStateDelegateTabHelper::CreateForWebState(web_state);
NSString* tab_id = TabIdTabHelper::FromWebState(web_state)->tab_id(); NSString* tab_id = TabIdTabHelper::FromWebState(web_state)->tab_id();
NetworkActivityIndicatorTabHelper::CreateForWebState(web_state, tab_id);
VoiceSearchNavigationTabHelper::CreateForWebState(web_state); VoiceSearchNavigationTabHelper::CreateForWebState(web_state);
IOSChromeSyncedTabDelegate::CreateForWebState(web_state); IOSChromeSyncedTabDelegate::CreateForWebState(web_state);
InfoBarManagerImpl::CreateForWebState(web_state); InfoBarManagerImpl::CreateForWebState(web_state);
......
...@@ -201,7 +201,6 @@ test("ios_chrome_unittests") { ...@@ -201,7 +201,6 @@ test("ios_chrome_unittests") {
"//ios/chrome/browser/metrics:unit_tests", "//ios/chrome/browser/metrics:unit_tests",
"//ios/chrome/browser/metrics:unit_tests_internal", "//ios/chrome/browser/metrics:unit_tests_internal",
"//ios/chrome/browser/net:unit_tests", "//ios/chrome/browser/net:unit_tests",
"//ios/chrome/browser/network_activity:unit_tests",
"//ios/chrome/browser/ntp:unit_tests", "//ios/chrome/browser/ntp:unit_tests",
"//ios/chrome/browser/omaha:unit_tests", "//ios/chrome/browser/omaha:unit_tests",
"//ios/chrome/browser/open_in:unit_tests", "//ios/chrome/browser/open_in:unit_tests",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment