Commit 7356cb88 authored by Stepan Khapugin's avatar Stepan Khapugin Committed by Commit Bot

[iOS][multiball] Move TabOpening from MainController to SceneController.

Moves TabOpening protocol implementation and updates tests.

Bug: None
Change-Id: Iee5608fc34d288f3196dd77438825264add0f15c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1984307
Commit-Queue: Stepan Khapugin <stkhapugin@chromium.org>
Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#732376}
parent 4243798f
......@@ -59,6 +59,7 @@ source_set("unit_tests") {
"//ios/chrome/browser",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/tabs",
"//ios/chrome/browser/ui/main:scene",
"//ios/chrome/common/app_group",
"//ios/chrome/test:test_support",
"//ios/public/provider/chrome/browser:browser",
......
......@@ -71,7 +71,6 @@
[_mainController setMetricsMediator:_metricsMediator];
_browserLauncher = _mainController;
_startupInformation = _mainController;
_tabOpener = _mainController;
_appState = [[AppState alloc] initWithBrowserLauncher:_browserLauncher
startupInformation:_startupInformation
applicationDelegate:self];
......@@ -91,6 +90,7 @@
_sceneController.mainController = (id<MainControllerGuts>)_mainController;
_mainController.sceneController = _sceneController;
_tabSwitcherProtocol = _sceneController;
_tabOpener = _sceneController;
}
}
return self;
......
......@@ -10,7 +10,6 @@
#import "ios/chrome/app/application_delegate/app_navigation.h"
#import "ios/chrome/app/application_delegate/browser_launcher.h"
#import "ios/chrome/app/application_delegate/startup_information.h"
#import "ios/chrome/app/application_delegate/tab_opening.h"
#import "ios/chrome/app/main_controller_guts.h"
#import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/commands/browsing_data_commands.h"
......@@ -20,6 +19,7 @@
@protocol AppURLLoadingServiceDelegate;
@protocol BrowsingDataCommands;
@protocol SceneControllerGuts;
@protocol TabOpening;
@protocol TabSwitcherDelegate;
// The main controller of the application, owned by the MainWindow nib. Also
......@@ -32,7 +32,6 @@
BrowserLauncher,
MainControllerGuts,
StartupInformation,
TabOpening,
BrowsingDataCommands>
// The application window.
......@@ -50,7 +49,8 @@
@property(nonatomic, weak) id<ApplicationCommands,
TabSwitcherDelegate,
AppURLLoadingServiceDelegate,
SceneControllerGuts>
SceneControllerGuts,
TabOpening>
sceneController;
@end
......
......@@ -675,9 +675,9 @@ void MainControllerAuthenticationServiceDelegate::ClearBrowsingData(
[_browserViewWrangler updateDeviceSharingManager];
[self openTabFromLaunchOptions:_launchOptions
startupInformation:self
appState:self.appState];
[self.sceneController openTabFromLaunchOptions:_launchOptions
startupInformation:self
appState:self.appState];
_launchOptions = nil;
if (!self.startupParameters) {
......@@ -718,13 +718,14 @@ void MainControllerAuthenticationServiceDelegate::ClearBrowsingData(
if (self.startupParameters) {
UrlLoadParams params =
UrlLoadParams::InNewTab(self.startupParameters.externalURL);
[self dismissModalsAndOpenSelectedTabInMode:ApplicationModeForTabOpening::
NORMAL
withUrlLoadParams:params
dismissOmnibox:YES
completion:^{
[self setStartupParameters:nil];
}];
[self.sceneController
dismissModalsAndOpenSelectedTabInMode:ApplicationModeForTabOpening::
NORMAL
withUrlLoadParams:params
dismissOmnibox:YES
completion:^{
[self setStartupParameters:nil];
}];
}
}
......@@ -1285,7 +1286,8 @@ void MainControllerAuthenticationServiceDelegate::ClearBrowsingData(
focusOmnibox:NO];
[self finishDismissingTabSwitcher];
}
if (firstRun || [self shouldOpenNTPTabOnActivationOfTabModel:tabModel]) {
if (firstRun ||
[self.sceneController shouldOpenNTPTabOnActivationOfTabModel:tabModel]) {
OpenNewTabCommand* command = [OpenNewTabCommand
commandWithIncognito:(self.currentBVC == self.otrBVC)];
command.userInitiated = NO;
......@@ -1544,33 +1546,6 @@ void MainControllerAuthenticationServiceDelegate::ClearBrowsingData(
[self.mainCoordinator showTabSwitcher:_tabSwitcher];
}
- (BOOL)shouldOpenNTPTabOnActivationOfTabModel:(TabModel*)tabModel {
if (self.tabSwitcherIsActive) {
// Only attempt to dismiss the tab switcher and open a new tab if:
// - there are no tabs open in either tab model, and
// - the tab switcher controller is not directly or indirectly presenting
// another view controller.
if (![self.mainTabModel isEmpty] || ![self.otrTabModel isEmpty])
return NO;
// If the tabSwitcher is contained, check if the parent container is
// presenting another view controller.
if ([[_tabSwitcher viewController]
.parentViewController presentedViewController]) {
return NO;
}
// Check if the tabSwitcher is directly presenting another view controller.
if ([_tabSwitcher viewController].presentedViewController) {
return NO;
}
return YES;
}
return ![tabModel count] && [tabModel browserState] &&
![tabModel browserState]->IsOffTheRecord();
}
#pragma mark - TabSwitcherDelegate helper methods
- (void)beginDismissingTabSwitcherWithCurrentModel:(TabModel*)tabModel
......@@ -1732,51 +1707,6 @@ void MainControllerAuthenticationServiceDelegate::ClearBrowsingData(
prefs->CommitPendingWrite();
}
#pragma mark - TabOpening implementation.
- (void)dismissModalsAndOpenSelectedTabInMode:
(ApplicationModeForTabOpening)targetMode
withUrlLoadParams:
(const UrlLoadParams&)urlLoadParams
dismissOmnibox:(BOOL)dismissOmnibox
completion:(ProceduralBlock)completion {
UrlLoadParams copyOfUrlLoadParams = urlLoadParams;
[self.sceneController
dismissModalDialogsWithCompletion:^{
[self.sceneController openSelectedTabInMode:targetMode
withUrlLoadParams:copyOfUrlLoadParams
completion:completion];
}
dismissOmnibox:dismissOmnibox];
}
- (void)openTabFromLaunchOptions:(NSDictionary*)launchOptions
startupInformation:(id<StartupInformation>)startupInformation
appState:(AppState*)appState {
if (launchOptions) {
BOOL applicationIsActive =
[[UIApplication sharedApplication] applicationState] ==
UIApplicationStateActive;
[URLOpener handleLaunchOptions:launchOptions
applicationActive:applicationIsActive
tabOpener:self
startupInformation:startupInformation
appState:appState];
}
}
// TODO(crbug.com/1021752): Remove this stub.
- (BOOL)shouldCompletePaymentRequestOnCurrentTab:
(id<StartupInformation>)startupInformation {
return NO;
}
- (BOOL)URLIsOpenedInRegularMode:(const GURL&)URL {
WebStateList* webStateList = self.mainTabModel.webStateList;
return webStateList && webStateList->GetIndexOfWebStateWithURL(URL) !=
WebStateList::kInvalidIndex;
}
#pragma mark - ApplicationCommands helpers
......
......@@ -7,6 +7,7 @@
#import <UIKit/UIKit.h>
#include "ios/chrome/app/startup/chrome_app_startup_parameters.h"
#import "ios/chrome/browser/crash_report/crash_restore_helper.h"
#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
#import "ios/public/provider/chrome/browser/user_feedback/user_feedback_provider.h"
......@@ -64,8 +65,7 @@ enum class TabSwitcherDismissalMode { NONE, NORMAL, INCOGNITO };
BOOL tabSwitcherIsActive;
// YES while animating the dismissal of tab switcher.
@property(nonatomic, assign, getter=dismissingTabSwitcher)
BOOL dismissingTabSwitcher;
@property(nonatomic, assign) BOOL dismissingTabSwitcher;
// Returns YES if the settings are presented, either from
// self.settingsNavigationController or from SigninInteractionCoordinator.
......@@ -104,13 +104,6 @@ enum class TabSwitcherDismissalMode { NONE, NORMAL, INCOGNITO };
- (TabGridCoordinator*)mainCoordinator;
- (id<BrowserInterfaceProvider>)interfaceProvider;
- (void)startVoiceSearchInCurrentBVC;
- (void)dismissModalsAndOpenSelectedTabInMode:
(ApplicationModeForTabOpening)targetMode
withUrlLoadParams:
(const UrlLoadParams&)urlLoadParams
dismissOmnibox:(BOOL)dismissOmnibox
completion:(ProceduralBlock)completion;
- (void)showTabSwitcher;
// TabSwitcherDelegate helpers
......
......@@ -6,9 +6,12 @@
#include "base/threading/thread.h"
#import "ios/chrome/app/application_delegate/app_state.h"
#import "ios/chrome/app/application_delegate/tab_opening.h"
#import "ios/chrome/app/application_delegate/url_opener.h"
#include "ios/chrome/app/main_controller_private.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/ui/main/scene_controller.h"
#import "ios/chrome/browser/ui/main/scene_state.h"
#import "ios/testing/scoped_block_swizzler.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
......@@ -50,7 +53,7 @@ class TabOpenerTest : public PlatformTest {
swizzle_block_executed_ = YES;
EXPECT_EQ(expectedLaunchOptions, options);
EXPECT_EQ(expectedStartupInformation, startupInformation);
EXPECT_EQ(main_controller_, tabOpener);
EXPECT_EQ(main_controller_.sceneController, tabOpener);
EXPECT_EQ(expectedAppState, appState);
} copy];
URL_opening_handle_launch_swizzler_.reset(new ScopedBlockSwizzler(
......@@ -62,13 +65,21 @@ class TabOpenerTest : public PlatformTest {
MainController* GetMainController() {
if (!main_controller_) {
scene_state_ = [[SceneState alloc] init];
main_controller_ = [[MainController alloc] init];
scene_controller_ =
[[SceneController alloc] initWithSceneState:scene_state_];
main_controller_.sceneController = scene_controller_;
scene_controller_.mainController = main_controller_;
}
return main_controller_;
}
private:
MainController* main_controller_;
SceneController* scene_controller_;
SceneState* scene_state_;
__block BOOL swizzle_block_executed_;
HandleLaunchOptions swizzle_block_;
std::unique_ptr<ScopedBlockSwizzler> URL_opening_handle_launch_swizzler_;
......@@ -91,7 +102,7 @@ TEST_F(TabOpenerTest, openTabFromLaunchOptionsWithOptions) {
swizzleHandleLaunchOptions(launchOptions, startupInformationMock,
appStateMock);
id<TabOpening> tabOpener = GetMainController();
id<TabOpening> tabOpener = GetMainController().sceneController;
// Action.
[tabOpener openTabFromLaunchOptions:launchOptions
......@@ -111,7 +122,7 @@ TEST_F(TabOpenerTest, openTabFromLaunchOptionsWithNil) {
swizzleHandleLaunchOptions(nil, startupInformationMock, appStateMock);
id<TabOpening> tabOpener = GetMainController();
id<TabOpening> tabOpener = GetMainController().sceneController;
// Action.
[tabOpener openTabFromLaunchOptions:nil
......
......@@ -54,6 +54,7 @@ source_set("payments") {
"//ui/base",
"//url",
]
public_deps = [ "//components/autofill/core/browser" ]
libs = [ "UIKit.framework" ]
}
......
......@@ -30,6 +30,7 @@ source_set("scene") {
":main",
":scene_guts",
"//base",
"//components/payments/core",
"//components/signin/public/identity_manager",
"//components/url_formatter",
"//ios/chrome/app:app",
......@@ -40,6 +41,8 @@ source_set("scene") {
"//ios/chrome/browser/browsing_data",
"//ios/chrome/browser/main",
"//ios/chrome/browser/ntp:features",
"//ios/chrome/browser/payments",
"//ios/chrome/browser/payments:constants",
"//ios/chrome/browser/signin",
"//ios/chrome/browser/snapshots",
"//ios/chrome/browser/tabs:tabs",
......
......@@ -7,6 +7,7 @@
#import <UIKit/UIKit.h>
#import "ios/chrome/app/application_delegate/tab_opening.h"
#import "ios/chrome/app/application_delegate/tab_switching.h"
#import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/main/scene_controller_guts.h"
......@@ -22,7 +23,8 @@
ApplicationCommands,
TabSwitcherDelegate,
TabSwitching,
SceneControllerGuts>
SceneControllerGuts,
TabOpening>
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithSceneState:(SceneState*)sceneState
......
......@@ -8,9 +8,12 @@
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/sys_string_conversions.h"
#include "components/payments/core/features.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/url_formatter/url_formatter.h"
#import "ios/chrome/app/application_delegate/app_state.h"
#include "ios/chrome/app/application_delegate/tab_opening.h"
#import "ios/chrome/app/application_delegate/url_opener.h"
#import "ios/chrome/app/chrome_overlay_window.h"
#import "ios/chrome/app/deferred_initialization_runner.h"
#import "ios/chrome/app/main_controller_guts.h"
......@@ -22,6 +25,9 @@
#import "ios/chrome/browser/chrome_url_util.h"
#include "ios/chrome/browser/main/browser.h"
#include "ios/chrome/browser/ntp/features.h"
#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h"
#include "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h"
#include "ios/chrome/browser/payments/payment_request_constants.h"
#include "ios/chrome/browser/signin/identity_manager_factory.h"
#import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
#import "ios/chrome/browser/tabs/tab_model.h"
......@@ -517,11 +523,11 @@ enum class EnterTabSwitcherSnapshotResult {
UrlLoadParams params = UrlLoadParams::InNewTab([command URL]);
params.web_params.transition_type = ui::PAGE_TRANSITION_TYPED;
ProceduralBlock completion = ^{
[self.mainController dismissModalsAndOpenSelectedTabInMode:
ApplicationModeForTabOpening::NORMAL
withUrlLoadParams:params
dismissOmnibox:YES
completion:nil];
[self dismissModalsAndOpenSelectedTabInMode:ApplicationModeForTabOpening::
NORMAL
withUrlLoadParams:params
dismissOmnibox:YES
completion:nil];
};
[self closeSettingsAnimated:YES completion:completion];
}
......@@ -616,6 +622,118 @@ enum class EnterTabSwitcherSnapshotResult {
return YES;
}
#pragma mark - TabOpening implementation.
- (void)dismissModalsAndOpenSelectedTabInMode:
(ApplicationModeForTabOpening)targetMode
withUrlLoadParams:
(const UrlLoadParams&)urlLoadParams
dismissOmnibox:(BOOL)dismissOmnibox
completion:(ProceduralBlock)completion {
UrlLoadParams copyOfUrlLoadParams = urlLoadParams;
[self
dismissModalDialogsWithCompletion:^{
[self openSelectedTabInMode:targetMode
withUrlLoadParams:copyOfUrlLoadParams
completion:completion];
}
dismissOmnibox:dismissOmnibox];
}
- (void)openTabFromLaunchOptions:(NSDictionary*)launchOptions
startupInformation:(id<StartupInformation>)startupInformation
appState:(AppState*)appState {
if (launchOptions) {
BOOL applicationIsActive =
[[UIApplication sharedApplication] applicationState] ==
UIApplicationStateActive;
[URLOpener handleLaunchOptions:launchOptions
applicationActive:applicationIsActive
tabOpener:self
startupInformation:startupInformation
appState:appState];
}
}
- (BOOL)shouldCompletePaymentRequestOnCurrentTab:
(id<StartupInformation>)startupInformation {
if (!startupInformation.startupParameters)
return NO;
if (!startupInformation.startupParameters.completePaymentRequest)
return NO;
if (!base::FeatureList::IsEnabled(payments::features::kWebPaymentsNativeApps))
return NO;
payments::IOSPaymentInstrumentLauncher* paymentAppLauncher =
payments::IOSPaymentInstrumentLauncherFactory::GetInstance()
->GetForBrowserState(self.mainController.mainBrowserState);
if (!paymentAppLauncher->delegate())
return NO;
std::string payment_id =
startupInformation.startupParameters.externalURLParams
.find(payments::kPaymentRequestIDExternal)
->second;
if (paymentAppLauncher->payment_request_id() != payment_id)
return NO;
std::string payment_response =
startupInformation.startupParameters.externalURLParams
.find(payments::kPaymentRequestDataExternal)
->second;
paymentAppLauncher->ReceiveResponseFromIOSPaymentInstrument(payment_response);
[startupInformation setStartupParameters:nil];
return YES;
}
- (BOOL)URLIsOpenedInRegularMode:(const GURL&)URL {
WebStateList* webStateList =
self.mainController.interfaceProvider.mainInterface.tabModel.webStateList;
return webStateList && webStateList->GetIndexOfWebStateWithURL(URL) !=
WebStateList::kInvalidIndex;
}
- (ProceduralBlock)completionBlockForTriggeringAction:
(NTPTabOpeningPostOpeningAction)action {
return [self.mainController completionBlockForTriggeringAction:action];
}
- (BOOL)shouldOpenNTPTabOnActivationOfTabModel:(TabModel*)tabModel {
if (self.mainController.tabSwitcherIsActive) {
TabModel* mainTabModel =
self.mainController.interfaceProvider.mainInterface.tabModel;
TabModel* otrTabModel =
self.mainController.interfaceProvider.incognitoInterface.tabModel;
// Only attempt to dismiss the tab switcher and open a new tab if:
// - there are no tabs open in either tab model, and
// - the tab switcher controller is not directly or indirectly presenting
// another view controller.
if (![mainTabModel isEmpty] || ![otrTabModel isEmpty])
return NO;
// If the tabSwitcher is contained, check if the parent container is
// presenting another view controller.
if ([[self.mainController.tabSwitcher viewController]
.parentViewController presentedViewController]) {
return NO;
}
// Check if the tabSwitcher is directly presenting another view controller.
if ([self.mainController.tabSwitcher viewController]
.presentedViewController) {
return NO;
}
return YES;
}
return ![tabModel count] && [tabModel browserState] &&
![tabModel browserState] -> IsOffTheRecord();
}
#pragma mark - AppURLLoadingServiceDelegate
// Note that the current tab of |browserCoordinator|'s BVC will normally be
......
......@@ -7,10 +7,13 @@
#import <UIKit/UIKit.h>
#include "ios/chrome/app/application_delegate/startup_information.h"
#import "ios/chrome/app/application_delegate/tab_opening.h"
#import "ios/chrome/browser/procedural_block_types.h"
#import "ios/chrome/browser/url_loading/url_loading_params.h"
@class TabModel;
@protocol SceneControllerGuts
- (void)closeSettingsAnimated:(BOOL)animated
......@@ -23,6 +26,18 @@
withUrlLoadParams:(const UrlLoadParams&)urlLoadParams
completion:(ProceduralBlock)completion;
- (void)openTabFromLaunchOptions:(NSDictionary*)launchOptions
startupInformation:(id<StartupInformation>)startupInformation
appState:(AppState*)appState;
- (void)dismissModalsAndOpenSelectedTabInMode:
(ApplicationModeForTabOpening)targetMode
withUrlLoadParams:
(const UrlLoadParams&)urlLoadParams
dismissOmnibox:(BOOL)dismissOmnibox
completion:(ProceduralBlock)completion;
- (BOOL)shouldOpenNTPTabOnActivationOfTabModel:(TabModel*)tabModel;
@end
#endif // IOS_CHROME_BROWSER_UI_MAIN_SCENE_CONTROLLER_GUTS_H_
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