Commit d6bf16ce authored by Sebastien Lalancette's avatar Sebastien Lalancette Committed by Commit Bot

[iOS] Create SharingCoordinator

This new class will be aggregating all the dependencies (e.g.
QRGeneratorCoordinator) around sharing scenarios and hide them away
under a simple interface. The current interface is only about sharing
the current page. In the near future, we'll be adding another method to
allow sharing a URL that doesn't have any associated WebView (e.g.
coming from Bookmarks).

Ideally, these dependencies would already be part of
ActivityServiceCoordinator. However, since QRGeneratorCoordinator itself
owns an ActivityServiceCoordinator instance, we had to add this extra
layer of aggregation.

Bug: 1102890
Change-Id: I6c2fc63239d6fd9567b244616e7b080e4ebd9a45
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2297601
Commit-Queue: Sebastien Lalancette <seblalancette@chromium.org>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#791829}
parent db94e0eb
...@@ -132,6 +132,7 @@ source_set("browser_view") { ...@@ -132,6 +132,7 @@ source_set("browser_view") {
"//ios/chrome/browser/ui/send_tab_to_self", "//ios/chrome/browser/ui/send_tab_to_self",
"//ios/chrome/browser/ui/settings/autofill", "//ios/chrome/browser/ui/settings/autofill",
"//ios/chrome/browser/ui/settings/sync/utils", "//ios/chrome/browser/ui/settings/sync/utils",
"//ios/chrome/browser/ui/sharing",
"//ios/chrome/browser/ui/side_swipe", "//ios/chrome/browser/ui/side_swipe",
"//ios/chrome/browser/ui/snackbar", "//ios/chrome/browser/ui/snackbar",
"//ios/chrome/browser/ui/tabs", "//ios/chrome/browser/ui/tabs",
......
...@@ -21,9 +21,7 @@ ...@@ -21,9 +21,7 @@
#import "ios/chrome/browser/store_kit/store_kit_coordinator.h" #import "ios/chrome/browser/store_kit/store_kit_coordinator.h"
#import "ios/chrome/browser/store_kit/store_kit_tab_helper.h" #import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
#import "ios/chrome/browser/tabs/tab_title_util.h" #import "ios/chrome/browser/tabs/tab_title_util.h"
#import "ios/chrome/browser/ui/activity_services/activity_scenario.h" #import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
#import "ios/chrome/browser/ui/activity_services/activity_service_coordinator.h"
#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_presentation.h"
#import "ios/chrome/browser/ui/alert_coordinator/repost_form_coordinator.h" #import "ios/chrome/browser/ui/alert_coordinator/repost_form_coordinator.h"
#import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_coordinator.h" #import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_coordinator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.h"
...@@ -61,6 +59,7 @@ ...@@ -61,6 +59,7 @@
#import "ios/chrome/browser/ui/reading_list/reading_list_coordinator.h" #import "ios/chrome/browser/ui/reading_list/reading_list_coordinator.h"
#import "ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.h" #import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.h"
#import "ios/chrome/browser/ui/sharing/sharing_coordinator.h"
#import "ios/chrome/browser/ui/snackbar/snackbar_coordinator.h" #import "ios/chrome/browser/ui/snackbar/snackbar_coordinator.h"
#import "ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.h" #import "ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.h"
#import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h" #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h"
...@@ -84,12 +83,10 @@ ...@@ -84,12 +83,10 @@
#endif #endif
@interface BrowserCoordinator () <ActivityServiceCommands, @interface BrowserCoordinator () <ActivityServiceCommands,
ActivityServicePresentation,
AutofillSecurityAlertPresenter, AutofillSecurityAlertPresenter,
BrowserCoordinatorCommands, BrowserCoordinatorCommands,
FormInputAccessoryCoordinatorNavigator, FormInputAccessoryCoordinatorNavigator,
PageInfoCommands, PageInfoCommands,
QRGenerationCommands,
RepostFormTabHelperDelegate, RepostFormTabHelperDelegate,
ToolbarAccessoryCoordinatorDelegate, ToolbarAccessoryCoordinatorDelegate,
URLLoadingDelegate, URLLoadingDelegate,
...@@ -115,10 +112,6 @@ ...@@ -115,10 +112,6 @@
// Presents a QLPreviewController in order to display USDZ format 3D models. // Presents a QLPreviewController in order to display USDZ format 3D models.
@property(nonatomic, strong) ARQuickLookCoordinator* ARQuickLookCoordinator; @property(nonatomic, strong) ARQuickLookCoordinator* ARQuickLookCoordinator;
// Coordinator for the activity view.
@property(nonatomic, strong)
ActivityServiceCoordinator* activityServiceCoordinator;
// Coordinator to add new credit card. // Coordinator to add new credit card.
@property(nonatomic, strong) @property(nonatomic, strong)
AutofillAddCreditCardCoordinator* addCreditCardCoordinator; AutofillAddCreditCardCoordinator* addCreditCardCoordinator;
...@@ -160,9 +153,6 @@ ...@@ -160,9 +153,6 @@
// TODO(crbug.com/910017): Convert to coordinator. // TODO(crbug.com/910017): Convert to coordinator.
@property(nonatomic, strong) PrintController* printController; @property(nonatomic, strong) PrintController* printController;
// Coordinator for the QR generator UI.
@property(nonatomic, strong) QRGeneratorCoordinator* qrGeneratorCoordinator;
// Coordinator for the QR scanner. // Coordinator for the QR scanner.
@property(nonatomic, strong) QRScannerLegacyCoordinator* qrScannerCoordinator; @property(nonatomic, strong) QRScannerLegacyCoordinator* qrScannerCoordinator;
...@@ -175,6 +165,9 @@ ...@@ -175,6 +165,9 @@
// Coordinator for displaying Repost Form dialog. // Coordinator for displaying Repost Form dialog.
@property(nonatomic, strong) RepostFormCoordinator* repostFormCoordinator; @property(nonatomic, strong) RepostFormCoordinator* repostFormCoordinator;
// Coordinator for sharing scenarios.
@property(nonatomic, strong) SharingCoordinator* sharingCoordinator;
// Coordinator for displaying snackbars. // Coordinator for displaying snackbars.
@property(nonatomic, strong) SnackbarCoordinator* snackbarCoordinator; @property(nonatomic, strong) SnackbarCoordinator* snackbarCoordinator;
...@@ -269,9 +262,6 @@ ...@@ -269,9 +262,6 @@
- (void)clearPresentedStateWithCompletion:(ProceduralBlock)completion - (void)clearPresentedStateWithCompletion:(ProceduralBlock)completion
dismissOmnibox:(BOOL)dismissOmnibox { dismissOmnibox:(BOOL)dismissOmnibox {
[self.activityServiceCoordinator stop];
self.activityServiceCoordinator = nil;
[self.passKitCoordinator stop]; [self.passKitCoordinator stop];
[self.openInMediator disableAll]; [self.openInMediator disableAll];
...@@ -281,8 +271,8 @@ ...@@ -281,8 +271,8 @@
[self.readingListCoordinator stop]; [self.readingListCoordinator stop];
self.readingListCoordinator = nil; self.readingListCoordinator = nil;
[self.qrGeneratorCoordinator stop]; [self.sharingCoordinator stop];
self.qrGeneratorCoordinator = nil; self.sharingCoordinator = nil;
[self.passwordBreachCoordinator stop]; [self.passwordBreachCoordinator stop];
...@@ -341,8 +331,6 @@ ...@@ -341,8 +331,6 @@
// coordinators. // coordinators.
DCHECK(self.dispatcher); DCHECK(self.dispatcher);
/* ActivityServiceCoordinator is created and started by a command. */
self.ARQuickLookCoordinator = [[ARQuickLookCoordinator alloc] self.ARQuickLookCoordinator = [[ARQuickLookCoordinator alloc]
initWithBaseViewController:self.viewController initWithBaseViewController:self.viewController
browser:self.browser]; browser:self.browser];
...@@ -387,14 +375,14 @@ ...@@ -387,14 +375,14 @@
browser:self.browser]; browser:self.browser];
[self.qrScannerCoordinator start]; [self.qrScannerCoordinator start];
/* QRGeneratorCoordinator is created and started by a command. */
/* ReadingListCoordinator is created and started by a BrowserCommand */ /* ReadingListCoordinator is created and started by a BrowserCommand */
/* RecentTabsCoordinator is created and started by a BrowserCommand */ /* RecentTabsCoordinator is created and started by a BrowserCommand */
/* RepostFormCoordinator is created and started by a delegate method */ /* RepostFormCoordinator is created and started by a delegate method */
/* SharingCoordinator is created and started by an ActivityServiceCommand */
self.storeKitCoordinator = [[StoreKitCoordinator alloc] self.storeKitCoordinator = [[StoreKitCoordinator alloc]
initWithBaseViewController:self.viewController initWithBaseViewController:self.viewController
browser:self.browser]; browser:self.browser];
...@@ -426,9 +414,6 @@ ...@@ -426,9 +414,6 @@
// Stops child coordinators. // Stops child coordinators.
- (void)stopChildCoordinators { - (void)stopChildCoordinators {
[self.activityServiceCoordinator stop];
self.activityServiceCoordinator = nil;
[self.allPasswordCoordinator stop]; [self.allPasswordCoordinator stop];
self.allPasswordCoordinator = nil; self.allPasswordCoordinator = nil;
...@@ -455,9 +440,6 @@ ...@@ -455,9 +440,6 @@
self.printController = nil; self.printController = nil;
[self.qrGeneratorCoordinator stop];
self.qrGeneratorCoordinator = nil;
[self.qrScannerCoordinator stop]; [self.qrScannerCoordinator stop];
self.qrScannerCoordinator = nil; self.qrScannerCoordinator = nil;
...@@ -470,6 +452,9 @@ ...@@ -470,6 +452,9 @@
[self.repostFormCoordinator stop]; [self.repostFormCoordinator stop];
self.repostFormCoordinator = nil; self.repostFormCoordinator = nil;
[self.sharingCoordinator stop];
self.sharingCoordinator = nil;
[self.snackbarCoordinator stop]; [self.snackbarCoordinator stop];
self.snackbarCoordinator = nil; self.snackbarCoordinator = nil;
...@@ -520,24 +505,14 @@ ...@@ -520,24 +505,14 @@
#pragma mark - ActivityServiceCommands #pragma mark - ActivityServiceCommands
- (void)sharePage { - (void)sharePage {
self.activityServiceCoordinator = [[ActivityServiceCoordinator alloc] UIView* shareButton =
initWithBaseViewController:self.viewController [self.viewController.activityServicePositioner shareButtonView];
browser:self.browser
scenario:ActivityScenario::TabShareButton];
self.activityServiceCoordinator.positionProvider =
[self.viewController activityServicePositioner];
self.activityServiceCoordinator.presentationProvider = self;
self.activityServiceCoordinator.scopedHandler = self;
[self.activityServiceCoordinator start];
}
#pragma mark - ActivityServicePresentation
- (void)activityServiceDidEndPresenting { self.sharingCoordinator =
[self.activityServiceCoordinator stop]; [[SharingCoordinator alloc] initWithBaseViewController:self.viewController
self.activityServiceCoordinator = nil; browser:self.browser
originView:shareButton];
[self.sharingCoordinator start];
} }
#pragma mark - BrowserCoordinatorCommands #pragma mark - BrowserCoordinatorCommands
...@@ -743,24 +718,6 @@ ...@@ -743,24 +718,6 @@
[self hidePageInfo]; [self hidePageInfo];
} }
#pragma mark - QRGenerationCommands
- (void)generateQRCode:(GenerateQRCodeCommand*)command {
DCHECK(base::FeatureList::IsEnabled(kQRCodeGeneration));
self.qrGeneratorCoordinator = [[QRGeneratorCoordinator alloc]
initWithBaseViewController:self.viewController
browser:self.browser
title:command.title
URL:command.URL
handler:self];
[self.qrGeneratorCoordinator start];
}
- (void)hideQRCode {
[self.qrGeneratorCoordinator stop];
self.qrGeneratorCoordinator = nil;
}
#pragma mark - FormInputAccessoryCoordinatorNavigator #pragma mark - FormInputAccessoryCoordinatorNavigator
- (void)openPasswordSettings { - (void)openPasswordSettings {
......
# Copyright 2020 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("sharing") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"sharing_coordinator.h",
"sharing_coordinator.mm",
]
deps = [
"//base",
"//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/activity_services",
"//ios/chrome/browser/ui/activity_services/requirements",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/qr_generator",
"//url",
]
}
source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ]
testonly = true
sources = [ "sharing_coordinator_unittest.mm" ]
deps = [
":sharing",
"//base",
"//base/test:test_support",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/main:test_support",
"//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/activity_services",
"//ios/chrome/browser/ui/activity_services/requirements",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/test:test_support",
"//ios/web/public",
"//ios/web/public/test",
"//ios/web/public/test/fakes",
"//testing/gmock",
"//testing/gtest",
"//third_party/ocmock",
"//url",
]
}
// Copyright 2020 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_UI_SHARING_SHARING_COORDINATOR_H_
#define IOS_CHROME_BROWSER_UI_SHARING_SHARING_COORDINATOR_H_
#include <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
class Browser;
// Coordinator of sharing scenarios. Its default scenario is to share the
// current tab's URL.
@interface SharingCoordinator : ChromeCoordinator
// Creates a coordinator using the base |viewController|, a |browser| and an
// |originView| from which the sharing scenario was triggered.
- (instancetype)initWithBaseViewController:(UIViewController*)viewController
browser:(Browser*)browser
originView:(UIView*)originView
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithBaseViewController:(UIViewController*)viewController
browser:(Browser*)browser NS_UNAVAILABLE;
@end
#endif // IOS_CHROME_BROWSER_UI_SHARING_SHARING_COORDINATOR_H_
// Copyright 2020 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/ui/sharing/sharing_coordinator.h"
#include "base/feature_list.h"
#import "ios/chrome/browser/ui/activity_services/activity_scenario.h"
#import "ios/chrome/browser/ui/activity_services/activity_service_coordinator.h"
#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_presentation.h"
#import "ios/chrome/browser/ui/commands/qr_generation_commands.h"
#import "ios/chrome/browser/ui/qr_generator/qr_generator_coordinator.h"
#include "ios/chrome/browser/ui/ui_feature_flags.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface SharingCoordinator () <ActivityServicePositioner,
ActivityServicePresentation,
QRGenerationCommands>
@property(nonatomic, strong)
ActivityServiceCoordinator* activityServiceCoordinator;
@property(nonatomic, strong) QRGeneratorCoordinator* qrGeneratorCoordinator;
@property(nonatomic, weak) UIView* originView;
@end
@implementation SharingCoordinator
- (instancetype)initWithBaseViewController:(UIViewController*)viewController
browser:(Browser*)browser
originView:(UIView*)originView {
if (self = [super initWithBaseViewController:viewController
browser:browser]) {
_originView = originView;
}
return self;
}
#pragma mark - ChromeCoordinator
- (void)start {
self.activityServiceCoordinator = [[ActivityServiceCoordinator alloc]
initWithBaseViewController:self.baseViewController
browser:self.browser
scenario:ActivityScenario::TabShareButton];
self.activityServiceCoordinator.positionProvider = self;
self.activityServiceCoordinator.presentationProvider = self;
self.activityServiceCoordinator.scopedHandler = self;
[self.activityServiceCoordinator start];
}
- (void)stop {
[self activityServiceDidEndPresenting];
[self hideQRCode];
self.originView = nil;
}
#pragma mark - ActivityServicePositioner
- (UIView*)shareButtonView {
return self.originView;
}
#pragma mark - ActivityServicePresentation
- (void)activityServiceDidEndPresenting {
[self.activityServiceCoordinator stop];
self.activityServiceCoordinator = nil;
}
#pragma mark - QRGenerationCommands
- (void)generateQRCode:(GenerateQRCodeCommand*)command {
DCHECK(base::FeatureList::IsEnabled(kQRCodeGeneration));
self.qrGeneratorCoordinator = [[QRGeneratorCoordinator alloc]
initWithBaseViewController:self.baseViewController
browser:self.browser
title:command.title
URL:command.URL
handler:self];
[self.qrGeneratorCoordinator start];
}
- (void)hideQRCode {
[self.qrGeneratorCoordinator stop];
self.qrGeneratorCoordinator = nil;
}
@end
// Copyright 2020 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/ui/sharing/sharing_coordinator.h"
#import <UIKit/UIKit.h>
#include "base/test/scoped_feature_list.h"
#include "base/values.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/main/test_browser.h"
#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_presentation.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/commands/generate_qr_code_command.h"
#import "ios/chrome/browser/ui/commands/qr_generation_commands.h"
#include "ios/chrome/browser/ui/ui_feature_flags.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_opener.h"
#import "ios/chrome/test/scoped_key_window.h"
#import "ios/web/public/test/fakes/test_navigation_manager.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "ios/web/public/test/web_task_environment.h"
#import "ios/web/public/web_state.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#include "third_party/ocmock/gtest_support.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
class MockTestWebState : public web::TestWebState {
public:
MockTestWebState() : web::TestWebState() {
SetNavigationManager(std::make_unique<web::TestNavigationManager>());
}
MOCK_METHOD2(ExecuteJavaScript,
void(const base::string16&, JavaScriptResultCallback));
};
// Test fixture for testing SharingCoordinator.
class SharingCoordinatorTest : public PlatformTest {
protected:
SharingCoordinatorTest()
: base_view_controller_([[UIViewController alloc] init]),
browser_(std::make_unique<TestBrowser>()),
fake_origin_view_([[UIView alloc] init]) {
[scoped_key_window_.Get() setRootViewController:base_view_controller_];
}
SharingCoordinator* GetCoordinator() {
return [[SharingCoordinator alloc]
initWithBaseViewController:base_view_controller_
browser:browser_.get()
originView:fake_origin_view_];
}
void AppendNewWebState(std::unique_ptr<web::TestWebState> web_state) {
browser_->GetWebStateList()->InsertWebState(
WebStateList::kInvalidIndex, std::move(web_state),
WebStateList::INSERT_ACTIVATE, WebStateOpener());
}
web::WebTaskEnvironment task_environment_;
base::test::ScopedFeatureList scoped_features_;
ScopedKeyWindow scoped_key_window_;
UIViewController* base_view_controller_;
std::unique_ptr<TestBrowser> browser_;
UIView* fake_origin_view_;
};
// Tests that the start method shares the current page and ends up presenting
// a UIActivityViewController.
TEST_F(SharingCoordinatorTest, Start_ShareCurrentPage) {
// Create a test web state.
GURL test_url = GURL("https://example.com");
base::Value url_value = base::Value(test_url.spec());
auto test_web_state = std::make_unique<MockTestWebState>();
test_web_state->SetCurrentURL(test_url);
test_web_state->SetBrowserState(browser_->GetBrowserState());
EXPECT_CALL(*test_web_state, ExecuteJavaScript(testing::_, testing::_))
.WillOnce(testing::Invoke(
[&](const base::string16& javascript,
base::OnceCallback<void(const base::Value*)> callback) {
std::move(callback).Run(&url_value);
}));
AppendNewWebState(std::move(test_web_state));
SharingCoordinator* coordinator = GetCoordinator();
// Pointer to allow us to grab the VC instance in our validation callback.
__block UIActivityViewController* activityViewController;
id vc_partial_mock = OCMPartialMock(base_view_controller_);
[[vc_partial_mock expect]
presentViewController:[OCMArg checkWithBlock:^BOOL(
UIViewController* viewController) {
if ([viewController isKindOfClass:[UIActivityViewController class]]) {
activityViewController = (UIActivityViewController*)viewController;
return YES;
}
return NO;
}]
animated:YES
completion:nil];
[coordinator start];
[vc_partial_mock verify];
// Verify that the positioning is correct.
auto activityHandler =
static_cast<id<ActivityServicePositioner, ActivityServicePresentation>>(
coordinator);
EXPECT_EQ(fake_origin_view_, activityHandler.shareButtonView);
// Verify that the presentation protocol works too.
id activity_vc_partial_mock = OCMPartialMock(activityViewController);
[[activity_vc_partial_mock expect] dismissViewControllerAnimated:YES
completion:nil];
[activityHandler activityServiceDidEndPresenting];
[activity_vc_partial_mock verify];
}
// Tests that the coordinator handles the QRGenerationCommands protocol.
TEST_F(SharingCoordinatorTest, GenerateQRCode) {
scoped_features_.InitAndEnableFeature(kQRCodeGeneration);
SharingCoordinator* coordinator = GetCoordinator();
id vc_partial_mock = OCMPartialMock(base_view_controller_);
[[vc_partial_mock expect] presentViewController:[OCMArg any]
animated:YES
completion:nil];
auto handler = static_cast<id<QRGenerationCommands>>(coordinator);
[handler generateQRCode:[[GenerateQRCodeCommand alloc]
initWithURL:GURL("https://example.com")
title:@"Some Title"]];
[vc_partial_mock verify];
[[vc_partial_mock expect] dismissViewControllerAnimated:YES completion:nil];
[handler hideQRCode];
[vc_partial_mock verify];
}
...@@ -304,6 +304,7 @@ test("ios_chrome_unittests") { ...@@ -304,6 +304,7 @@ test("ios_chrome_unittests") {
"//ios/chrome/browser/ui/settings/password/password_details:unit_tests", "//ios/chrome/browser/ui/settings/password/password_details:unit_tests",
"//ios/chrome/browser/ui/settings/privacy:unit_tests", "//ios/chrome/browser/ui/settings/privacy:unit_tests",
"//ios/chrome/browser/ui/settings/sync:unit_tests", "//ios/chrome/browser/ui/settings/sync:unit_tests",
"//ios/chrome/browser/ui/sharing:unit_tests",
"//ios/chrome/browser/ui/side_swipe:unit_tests", "//ios/chrome/browser/ui/side_swipe:unit_tests",
"//ios/chrome/browser/ui/tab_grid:unit_tests", "//ios/chrome/browser/ui/tab_grid:unit_tests",
"//ios/chrome/browser/ui/tab_grid/grid:unit_tests", "//ios/chrome/browser/ui/tab_grid/grid: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