blob: 32d669fb7cbb35df9c28b48a24307bdc1ab895af [file] [log] [blame]
// 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/test/app/chrome_test_util.h"
#include "base/mac/foundation_util.h"
#import "breakpad/src/client/ios/BreakpadController.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/metrics/metrics_service.h"
#import "ios/chrome/app/application_delegate/metrics_mediator.h"
#import "ios/chrome/app/application_delegate/metrics_mediator_testing.h"
#import "ios/chrome/app/chrome_overlay_window.h"
#import "ios/chrome/app/main_application_delegate_testing.h"
#import "ios/chrome/app/main_controller.h"
#import "ios/chrome/app/main_controller_private.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h"
#import "ios/chrome/browser/metrics/previous_session_info.h"
#import "ios/chrome/browser/metrics/previous_session_info_private.h"
#import "ios/chrome/browser/tabs/tab.h"
#import "ios/chrome/browser/ui/browser_view_controller.h"
#import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h"
#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
#import "ios/chrome/browser/ui/main/main_view_controller.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
#import "ios/web/public/test/native_controller_test_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// Methods to access private members for testing.
@interface BreakpadController (Testing)
- (BOOL)isEnabled;
- (BOOL)isUploadingEnabled;
- (dispatch_queue_t)queue;
@end
@implementation BreakpadController (Testing)
- (BOOL)isEnabled {
return started_;
}
- (BOOL)isUploadingEnabled {
return enableUploads_;
}
- (dispatch_queue_t)queue {
return queue_;
}
@end
namespace {
// Returns the current tab model.
TabModel* GetCurrentTabModel() {
MainController* main_controller = chrome_test_util::GetMainController();
DCHECK(main_controller);
BrowserViewController* main_bvc =
[[main_controller browserViewInformation] mainBVC];
BrowserViewController* current_bvc =
[[main_controller browserViewInformation] currentBVC];
return current_bvc == main_bvc
? [[main_controller browserViewInformation] mainTabModel]
: [[main_controller browserViewInformation] otrTabModel];
}
// Returns the current tab.
Tab* GetCurrentTab() {
TabModel* tab_model = GetCurrentTabModel();
return [tab_model currentTab];
}
// Returns the original ChromeBrowserState if |incognito| is false. If
// |ingonito| is true, returns an off-the-record ChromeBrowserState.
ios::ChromeBrowserState* GetBrowserState(bool incognito) {
std::vector<ios::ChromeBrowserState*> browser_states =
GetApplicationContext()
->GetChromeBrowserStateManager()
->GetLoadedBrowserStates();
DCHECK(!browser_states.empty());
ios::ChromeBrowserState* browser_state = browser_states.front();
DCHECK(!browser_state->IsOffTheRecord());
return incognito ? browser_state->GetOffTheRecordChromeBrowserState()
: browser_state;
}
// Gets the root UIViewController.
UIViewController* GetActiveViewController() {
UIWindow* main_window = [[UIApplication sharedApplication] keyWindow];
DCHECK([main_window isKindOfClass:[ChromeOverlayWindow class]]);
MainViewController* main_view_controller =
base::mac::ObjCCast<MainViewController>([main_window rootViewController]);
return main_view_controller.activeViewController;
}
} // namespace
namespace chrome_test_util {
MainController* GetMainController() {
return [MainApplicationDelegate sharedMainController];
}
DeviceSharingManager* GetDeviceSharingManager() {
return [GetMainController() deviceSharingManager];
}
NewTabPageController* GetCurrentNewTabPageController() {
web::WebState* web_state = GetCurrentWebState();
id nativeController = web::test::GetCurrentNativeController(web_state);
if (![nativeController isKindOfClass:[NewTabPageController class]])
return nil;
return base::mac::ObjCCast<NewTabPageController>(nativeController);
}
web::WebState* GetCurrentWebState() {
return GetCurrentTab().webState;
}
ios::ChromeBrowserState* GetOriginalBrowserState() {
return GetBrowserState(false);
}
ios::ChromeBrowserState* GetCurrentIncognitoBrowserState() {
return GetBrowserState(true);
}
NSUInteger GetRegisteredKeyCommandsCount() {
BrowserViewController* mainBVC =
GetMainController().browserViewInformation.mainBVC;
return mainBVC.keyCommands.count;
}
void RunCommandWithActiveViewController(GenericChromeCommand* command) {
[GetActiveViewController() chromeExecuteCommand:command];
}
void RemoveAllInfoBars() {
infobars::InfoBarManager* info_bar_manager = [GetCurrentTab() infoBarManager];
if (info_bar_manager) {
info_bar_manager->RemoveAllInfoBars(false /* animate */);
}
}
void ClearPresentedState() {
[GetMainController() dismissModalDialogsWithCompletion:nil];
}
void ResetAllWebViews() {
id<BrowserViewInformation> browser_view_info =
[GetMainController() browserViewInformation];
[[browser_view_info mainTabModel] resetAllWebViews];
[[browser_view_info otrTabModel] resetAllWebViews];
}
void SetBooleanLocalStatePref(const char* pref_name, bool value) {
DCHECK(GetApplicationContext());
DCHECK(GetApplicationContext()->GetLocalState());
BooleanPrefMember pref;
pref.Init(pref_name, GetApplicationContext()->GetLocalState());
pref.SetValue(value);
}
void SetBooleanUserPref(ios::ChromeBrowserState* browser_state,
const char* pref_name,
bool value) {
DCHECK(browser_state);
DCHECK(browser_state->GetPrefs());
BooleanPrefMember pref;
pref.Init(pref_name, browser_state->GetPrefs());
pref.SetValue(value);
}
void SetWWANStateTo(bool value) {
MainController* mainController = chrome_test_util::GetMainController();
net::NetworkChangeNotifier::ConnectionType connectionType =
value ? net::NetworkChangeNotifier::CONNECTION_4G
: net::NetworkChangeNotifier::CONNECTION_WIFI;
[mainController.metricsMediator connectionTypeChanged:connectionType];
}
void SetFirstLaunchStateTo(bool value) {
[[PreviousSessionInfo sharedInstance] setIsFirstSessionAfterUpgrade:value];
}
bool IsMetricsRecordingEnabled() {
DCHECK(GetApplicationContext());
DCHECK(GetApplicationContext()->GetMetricsService());
return GetApplicationContext()->GetMetricsService()->recording_active();
}
bool IsMetricsReportingEnabled() {
DCHECK(GetApplicationContext());
DCHECK(GetApplicationContext()->GetMetricsService());
return GetApplicationContext()->GetMetricsService()->reporting_active();
}
bool IsBreakpadEnabled() {
return [[BreakpadController sharedInstance] isEnabled];
}
bool IsBreakpadReportingEnabled() {
return [[BreakpadController sharedInstance] isUploadingEnabled];
}
bool IsFirstLaunchAfterUpgrade() {
return [chrome_test_util::GetMainController() isFirstLaunchAfterUpgrade];
}
void WaitForBreakpadQueue() {
dispatch_queue_t queue = [[BreakpadController sharedInstance] queue];
dispatch_barrier_sync(queue, ^{
});
}
void OpenChromeFromExternalApp(const GURL& url) {
[[[UIApplication sharedApplication] delegate]
applicationWillResignActive:[UIApplication sharedApplication]];
[GetMainController() setStartupParametersWithURL:url];
[[[UIApplication sharedApplication] delegate]
applicationDidBecomeActive:[UIApplication sharedApplication]];
}
} // namespace chrome_test_util