Index: ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm |
diff --git a/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..651d348647d60584b21e60cf9d51ba9ef50b01b6 |
--- /dev/null |
+++ b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm |
@@ -0,0 +1,127 @@ |
+// Copyright 2017 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/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.h" |
+ |
+#include <memory> |
+ |
+#include "base/memory/ptr_util.h" |
+#import "ios/chrome/browser/find_in_page/find_tab_helper.h" |
+#import "ios/clean/chrome/browser/browser_coordinator+internal.h" |
+#import "ios/clean/chrome/browser/model/browser.h" |
+#import "ios/clean/chrome/browser/ui/commands/command_dispatcher.h" |
+#import "ios/clean/chrome/browser/ui/commands/find_in_page_commands.h" |
+#import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.h" |
+#import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_view_controller.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+@interface FindInPageCoordinator ()<FindInPageCommands, |
+ FindInPageMediatorDelegate> |
+ |
+@property(nonatomic, readwrite, assign) BOOL started; |
lpromero
2017/03/14 17:17:56
Should this be a property of all coordinators? In
marq (ping after 24h)
2017/03/16 13:37:05
I don't think it should be in the context (which s
rohitrao (ping after 24h)
2017/03/16 14:00:17
I was picturing this as a property on BrowserCoord
lpromero
2017/03/16 14:57:04
Sidenote: One can change "animated" in the context
lpromero
2017/03/16 17:12:30
https://codereview.chromium.org/2750003004
|
+ |
+@property(nonatomic, readwrite, strong) |
+ FindInPageViewController* viewController; |
+ |
+@end |
+ |
+@implementation FindInPageCoordinator { |
+ std::unique_ptr<FindInPageMediator> mediator_; |
lpromero
2017/03/14 17:17:56
_mediator
|
+} |
+ |
+@synthesize started = _started; |
+@synthesize viewController = _viewController; |
+ |
+#pragma mark - Coordinator lifecycle management |
+ |
+- (void)coordinatorDidMoveToParent:(BrowserCoordinator*)parent { |
+ DCHECK(self.browser); |
+ mediator_ = base::MakeUnique<FindInPageMediator>( |
+ &self.browser->web_state_list(), self); |
+ |
+ // Register command handlers with the dispatcher. |
+ CommandDispatcher* dispatcher = self.browser->dispatcher(); |
rohitrao (ping after 24h)
2017/03/14 01:10:37
3) Here's an example of command registration using
|
+ [dispatcher registerTarget:self forSelector:@selector(showFindInPage)]; |
+ [dispatcher registerTarget:self forSelector:@selector(findStringInPage:)]; |
+ [dispatcher registerTarget:self forSelector:@selector(findNextInPage)]; |
+ [dispatcher registerTarget:self forSelector:@selector(findPreviousInPage)]; |
+ [dispatcher registerTarget:self forSelector:@selector(hideFindInPage)]; |
+} |
+ |
+- (void)start { |
+ self.started = YES; |
+ self.viewController = [[FindInPageViewController alloc] init]; |
+ self.viewController.dispatcher = static_cast<id>(self.browser->dispatcher()); |
rohitrao (ping after 24h)
2017/03/14 01:10:36
4) Here's an example of casting the dispatcher to
lpromero
2017/03/14 17:17:56
And it's not possible to cast to id<FooCommands>,
rohitrao (ping after 24h)
2017/03/16 14:00:17
I'm not sure. I'll try it and see.
marq (ping after 24h)
2017/03/17 14:45:33
Protocols aren't really part of the type system in
rohitrao (ping after 24h)
2017/03/20 23:37:55
This is still an open question. Conforming to the
|
+ mediator_->set_consumer(self.viewController); |
+ [super start]; |
+} |
+ |
+- (void)stop { |
+ [super stop]; |
+ mediator_->set_consumer(nil); |
rohitrao (ping after 24h)
2017/03/14 01:10:37
5) The consumer (UIVC) is destroyed when this coor
|
+ self.started = NO; |
+ self.viewController = nil; |
+} |
+ |
+#pragma mark - Mediator delegate |
+ |
+- (void)createConsumer { |
+ DCHECK(!self.started); |
+ [self start]; |
+} |
+ |
+#pragma mark - Command handlers |
+ |
+- (void)showFindInPage { |
+ NSLog(@"showFindInPage command handler"); |
lpromero
2017/03/14 17:17:56
Remove
|
+ web::WebState* webState = self.browser->web_state_list().GetActiveWebState(); |
+ FindTabHelper::CreateForWebState(webState, nil); |
+ if (!self.started) |
+ [self start]; |
+} |
+ |
+- (void)findStringInPage:(NSString*)searchTerm { |
+ NSLog(@"findStringInPage command handler: %@", searchTerm); |
stkhapugin
2017/03/14 14:51:06
Can you add metrics logging: UserActions.Counts.Fi
|
+ web::WebState* webState = self.browser->web_state_list().GetActiveWebState(); |
+ |
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState); |
+ helper->StartFinding(searchTerm, ^(FindInPageModel* model) { |
+ mediator_->OnFindInPageResultsAvailable(model); |
rohitrao (ping after 24h)
2017/03/14 01:10:36
6) This is an unfortunate side effect of the FIP A
|
+ }); |
+} |
+ |
+- (void)findNextInPage { |
+ NSLog(@"findNextInPage command handler"); |
lpromero
2017/03/14 17:17:56
Remove
|
+ if (!self.started) |
+ [self start]; |
rohitrao (ping after 24h)
2017/03/14 01:10:37
7) This is an example of a command that can be cal
lpromero
2017/03/14 17:17:56
* When you say controller layer, it's the coordina
rohitrao (ping after 24h)
2017/03/16 14:00:17
I use the phrase "controller layer" to collectivel
|
+ |
+ web::WebState* webState = self.browser->web_state_list().GetActiveWebState(); |
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState); |
+ helper->ContinueFinding(FindTabHelper::FORWARD, ^(FindInPageModel* model) { |
+ mediator_->OnFindInPageResultsAvailable(model); |
+ }); |
+} |
+ |
+- (void)findPreviousInPage { |
+ NSLog(@"findPreviousInPage command handler"); |
lpromero
2017/03/14 17:17:56
Remove.
|
+ if (!self.started) |
+ [self start]; |
+ |
+ web::WebState* webState = self.browser->web_state_list().GetActiveWebState(); |
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState); |
+ helper->ContinueFinding(FindTabHelper::REVERSE, ^(FindInPageModel* model) { |
+ mediator_->OnFindInPageResultsAvailable(model); |
+ }); |
+} |
+ |
+- (void)hideFindInPage { |
+ NSLog(@"hideFindInPage command handler"); |
+ if (self.started) |
+ [self stop]; |
+} |
+ |
+@end |