Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Unified Diff: ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.mm

Issue 2737563006: [ios] Adds support for Find in Page to the new architecture. (Closed)
Patch Set: Fix GN. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.mm
diff --git a/ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.mm b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.mm
new file mode 100644
index 0000000000000000000000000000000000000000..c3a269a10e561e1b0784eb0709b6dca6d9131c5f
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.mm
@@ -0,0 +1,126 @@
+// 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_mediator.h"
+
+#include "base/memory/ptr_util.h"
+#import "ios/chrome/browser/find_in_page/find_in_page_model.h"
+#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
+#include "ios/chrome/browser/web_state_list/web_state_list.h"
+#include "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
+#import "ios/clean/chrome/browser/ui/commands/find_in_page_search_commands.h"
+#import "ios/clean/chrome/browser/ui/commands/find_in_page_visibility_commands.h"
+#import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_consumer.h"
+#import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
+#include "ios/web/public/web_state/web_state.h"
+
+@interface FindInPageMediator ()<FindInPageSearchCommands,
+ WebStateListObserving>
+
+// The WebStateList that is being observed by this mediator.
+@property(nonatomic, assign) WebStateList* webStateList;
+
+// Provides the consumer that will be updated by this mediator.
+@property(nonatomic, weak) id<FindInPageConsumerProvider> provider;
+
+// Used to dispatch commands.
+@property(nonatomic, weak) id<FindInPageVisibilityCommands> dispatcher;
+
+// Called by the Find in Page backend when new results are available.
+- (void)findResultsAvailable:(FindInPageModel*)model;
+
+@end
+
+@implementation FindInPageMediator {
+ // Observes the WebStateList so that this mediator can update the UI when the
+ // active WebState changes.
+ std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
+}
+
+@synthesize dispatcher = _dispatcher;
+@synthesize provider = _provider;
+@synthesize webStateList = _webStateList;
+
+- (instancetype)initWithWebStateList:(WebStateList*)webStateList
+ provider:(id<FindInPageConsumerProvider>)provider
+ dispatcher:
+ (id<FindInPageVisibilityCommands>)dispatcher {
+ if ((self = [super init])) {
+ DCHECK(webStateList);
+ DCHECK(provider);
+
+ _webStateList = webStateList;
+ _provider = provider;
+ _dispatcher = dispatcher;
+
+ _webStateListObserver = base::MakeUnique<WebStateListObserverBridge>(self);
+ _webStateList->AddObserver(_webStateListObserver.get());
+ }
+ return self;
+}
+
+- (void)stopFinding {
+ web::WebState* webState = self.webStateList->GetActiveWebState();
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState);
+ DCHECK(helper);
+ helper->StopFinding(nil);
+}
+
+- (void)findResultsAvailable:(FindInPageModel*)model {
+ id<FindInPageConsumer> consumer = self.provider.consumer;
+ [consumer setCurrentMatch:model.currentIndex ofTotalMatches:model.matches];
+}
+
+- (void)webStateList:(WebStateList*)webStateList
+ didChangeActiveWebState:(web::WebState*)newWebState
+ oldWebState:(web::WebState*)oldWebState
+ atIndex:(int)atIndex
+ userAction:(BOOL)userAction {
+ // Update the visibility of the find bar based on the |newWebState|.
+ if (newWebState) {
+ FindTabHelper* helper = FindTabHelper::FromWebState(newWebState);
+ DCHECK(helper);
+
+ if (helper->IsFindUIActive()) {
+ [self.dispatcher showFindInPage];
+ } else {
+ [self.dispatcher hideFindInPage];
+ }
+ } else {
+ // If there is no new active WebState, hide the find bar.
+ [self.dispatcher hideFindInPage];
+ }
+}
+
+#pragma mark - Command handlers
+
+- (void)findStringInPage:(NSString*)searchTerm {
+ web::WebState* webState = self.webStateList->GetActiveWebState();
+
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState);
+ DCHECK(helper);
+ helper->StartFinding(searchTerm, ^(FindInPageModel* model) {
+ [self findResultsAvailable:model];
+ });
+}
+
+- (void)findNextInPage {
+ web::WebState* webState = self.webStateList->GetActiveWebState();
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState);
+ DCHECK(helper);
+ helper->ContinueFinding(FindTabHelper::FORWARD, ^(FindInPageModel* model) {
+ [self findResultsAvailable:model];
+ });
+}
+
+- (void)findPreviousInPage {
+ web::WebState* webState = self.webStateList->GetActiveWebState();
+ FindTabHelper* helper = FindTabHelper::FromWebState(webState);
+ DCHECK(helper);
+ helper->ContinueFinding(FindTabHelper::REVERSE, ^(FindInPageModel* model) {
+ [self findResultsAvailable:model];
+ });
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698