Revert of Replace TabModel with WebStateList in GoogleLandingController. (patchset #7 id:110001 of https://codereview.chromium.org/2833513002/ )

Reason for revert:
Broke downstream eg tests, needs some minor fixes.

Original issue's description:
> Replace TabModel with WebStateList in GoogleLandingController.
>
> BUG=694750
>
> Review-Url: https://codereview.chromium.org/2833513002
> Cr-Commit-Position: refs/heads/master@{#466542}
> Committed: https://chromium.googlesource.com/chromium/src/+/892edbbf57698e574b6b2b15481239af1c5c4ede

TBR=rohitrao@chromium.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=694750

Review-Url: https://codereview.chromium.org/2835033002
Cr-Commit-Position: refs/heads/master@{#466563}
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn
index 2bc28e6..8c223db 100644
--- a/ios/chrome/browser/ui/ntp/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -187,7 +187,6 @@
     "//ios/chrome/browser/ui/overscroll_actions",
     "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/toolbar:resource_macros",
-    "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
@@ -237,12 +236,8 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/sessions",
-    "//ios/chrome/browser/sessions:test_support",
-    "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/web_state_list:test_support",
-    "//ios/chrome/browser/web_state_list:web_state_list",
     "//ios/chrome/test:test_support",
     "//ios/public/provider/chrome/browser/images",
     "//ios/web:test_support",
diff --git a/ios/chrome/browser/ui/ntp/google_landing_consumer.h b/ios/chrome/browser/ui/ntp/google_landing_consumer.h
index a3ccc87..9c6b9ea 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_consumer.h
+++ b/ios/chrome/browser/ui/ntp/google_landing_consumer.h
@@ -41,9 +41,6 @@
 // |YES| if a what's new promo can be displayed.
 - (void)setPromoCanShow:(BOOL)promoCanShow;
 
-// The number of tabs to show in the google landing fake toolbar.
-- (void)setTabCount:(int)tabCount;
-
 // TODO(crbug.com/694750): This should be replaced with consumer suitable data
 // type property.
 // Tells the consumer to that most visited data updated.
diff --git a/ios/chrome/browser/ui/ntp/google_landing_controller.mm b/ios/chrome/browser/ui/ntp/google_landing_controller.mm
index 6775b12..7f1d3c7 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_controller.mm
+++ b/ios/chrome/browser/ui/ntp/google_landing_controller.mm
@@ -190,9 +190,6 @@
 // |YES| if a what's new promo can be displayed.
 @property(nonatomic, assign) BOOL promoCanShow;
 
-// The number of tabs to show in the google landing fake toolbar.
-@property(nonatomic, assign) int tabCount;
-
 // iPhone landscape uses a slightly different layout for the doodle and search
 // field frame. Returns the proper frame from |frames| based on orientation,
 // centered in the view.
@@ -262,7 +259,6 @@
 @synthesize promoIcon = _promoIcon;
 @synthesize promoCanShow = _promoCanShow;
 @synthesize maximumMostVisitedSitesShown = _maximumMostVisitedSitesShown;
-@synthesize tabCount = _tabCount;
 @synthesize voiceSearchIsEnabled = _voiceSearchIsEnabled;
 
 - (void)loadView {
@@ -999,7 +995,6 @@
         // iPhone header also contains a toolbar since the normal toolbar is
         // hidden.
         [_headerView addToolbarWithDataSource:self.dataSource];
-        [_headerView setToolbarTabCount:self.tabCount];
       }
       [_supplementaryViews addObject:_headerView];
     }
@@ -1489,9 +1484,4 @@
   [_mostVisitedView reloadItemsAtIndexPaths:@[ indexPath ]];
 }
 
-- (void)setTabCount:(int)tabCount {
-  _tabCount = tabCount;
-  [_headerView setToolbarTabCount:self.tabCount];
-}
-
 @end
diff --git a/ios/chrome/browser/ui/ntp/google_landing_controller_unittest.mm b/ios/chrome/browser/ui/ntp/google_landing_controller_unittest.mm
index b34dce3..3a711ff 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_controller_unittest.mm
+++ b/ios/chrome/browser/ui/ntp/google_landing_controller_unittest.mm
@@ -12,8 +12,6 @@
 #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
 #import "ios/chrome/browser/ui/ntp/google_landing_controller.h"
 #import "ios/chrome/browser/ui/ntp/google_landing_mediator.h"
-#include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
-#include "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/test/block_cleanup_test.h"
 #include "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
 #include "ios/web/public/test/test_web_thread.h"
@@ -57,14 +55,13 @@
     // Set up stub UrlLoader.
     mockUrlLoader_ = [OCMockObject mockForProtocol:@protocol(UrlLoader)];
     controller_ = [[GoogleLandingController alloc] init];
-    webStateList_ = base::MakeUnique<WebStateList>(&webStateListDelegate_);
     mediator_ = [[GoogleLandingMediator alloc]
           initWithConsumer:controller_
               browserState:chrome_browser_state_.get()
                     loader:(id<UrlLoader>)mockUrlLoader_
                    focuser:nil
         webToolbarDelegate:nil
-              webStateList:webStateList_.get()];
+                  tabModel:nil];
   };
 
   base::MessageLoopForUI message_loop_;
@@ -72,8 +69,6 @@
   web::TestWebThread io_thread_;
   IOSChromeScopedTestingLocalState local_state_;
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
-  FakeWebStateListDelegate webStateListDelegate_;
-  std::unique_ptr<WebStateList> webStateList_;
   OCMockObject* mockUrlLoader_;
   GoogleLandingMediator* mediator_;
   GoogleLandingController* controller_;
diff --git a/ios/chrome/browser/ui/ntp/google_landing_data_source.h b/ios/chrome/browser/ui/ntp/google_landing_data_source.h
index b8621d1..48e78e7e7 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_data_source.h
+++ b/ios/chrome/browser/ui/ntp/google_landing_data_source.h
@@ -65,6 +65,8 @@
 // Gets the toolbar delegate.
 - (id<WebToolbarDelegate>)toolbarDelegate;
 
+// Gets the tab model.
+- (TabModel*)tabModel;
 
 @end
 
diff --git a/ios/chrome/browser/ui/ntp/google_landing_mediator.h b/ios/chrome/browser/ui/ntp/google_landing_mediator.h
index 6bfcfae..95112f9 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_mediator.h
+++ b/ios/chrome/browser/ui/ntp/google_landing_mediator.h
@@ -12,7 +12,6 @@
 @protocol GoogleLandingConsumer;
 @protocol OmniboxFocuser;
 @protocol UrlLoader;
-class WebStateList;
 
 namespace ios {
 class ChromeBrowserState;
@@ -26,8 +25,7 @@
                           loader:(id<UrlLoader>)loader
                          focuser:(id<OmniboxFocuser>)focuser
               webToolbarDelegate:(id<WebToolbarDelegate>)webToolbarDelegate
-                    webStateList:(WebStateList*)webStateList
-    NS_DESIGNATED_INITIALIZER;
+                        tabModel:(TabModel*)tabModel NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
 // Get the maximum number of sites shown.
diff --git a/ios/chrome/browser/ui/ntp/google_landing_mediator.mm b/ios/chrome/browser/ui/ntp/google_landing_mediator.mm
index 0d5ce31..aa41b9e 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_mediator.mm
+++ b/ios/chrome/browser/ui/ntp/google_landing_mediator.mm
@@ -31,8 +31,6 @@
 #import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h"
 #import "ios/chrome/browser/ui/toolbar/web_toolbar_controller.h"
 #import "ios/chrome/browser/ui/url_loader.h"
-#import "ios/chrome/browser/web_state_list/web_state_list.h"
-#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #include "ios/public/provider/chrome/browser/voice/voice_search_provider.h"
 
@@ -81,8 +79,7 @@
 
 }  // namespace google_landing
 
-@interface GoogleLandingMediator ()<MostVisitedSitesObserving,
-                                    WebStateListObserving> {
+@interface GoogleLandingMediator ()<MostVisitedSitesObserving> {
   // The ChromeBrowserState associated with this mediator.
   ios::ChromeBrowserState* _browserState;  // Weak.
 
@@ -115,9 +112,7 @@
 
   base::WeakNSProtocol<id<WebToolbarDelegate>> _webToolbarDelegate;
 
-  // Observes the WebStateList so that this mediator can update the UI when the
-  // active WebState changes.
-  std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
+  base::scoped_nsobject<TabModel> _tabModel;
 
   // What's new promo.
   std::unique_ptr<NotificationPromoWhatsNew> _notification_promo;
@@ -126,9 +121,6 @@
 // Consumer to handle google landing update notifications.
 @property(nonatomic) id<GoogleLandingConsumer> consumer;
 
-// The WebStateList that is being observed by this mediator.
-@property(nonatomic, assign) WebStateList* webStateList;
-
 // Perform initial setup.
 - (void)setUp;
 
@@ -137,14 +129,13 @@
 @implementation GoogleLandingMediator
 
 @synthesize consumer = _consumer;
-@synthesize webStateList = _webStateList;
 
 - (instancetype)initWithConsumer:(id<GoogleLandingConsumer>)consumer
                     browserState:(ios::ChromeBrowserState*)browserState
                           loader:(id<UrlLoader>)loader
                          focuser:(id<OmniboxFocuser>)focuser
               webToolbarDelegate:(id<WebToolbarDelegate>)webToolbarDelegate
-                    webStateList:(WebStateList*)webStateList {
+                        tabModel:(TabModel*)tabModel {
   self = [super init];
   if (self) {
     _consumer = consumer;
@@ -152,18 +143,13 @@
     _loader = loader;
     _focuser.reset(focuser);
     _webToolbarDelegate.reset(webToolbarDelegate);
-    _webStateList = webStateList;
-
-    _webStateListObserver = base::MakeUnique<WebStateListObserverBridge>(self);
-    _webStateList->AddObserver(_webStateListObserver.get());
-
+    _tabModel.reset([tabModel retain]);
     [self setUp];
   }
   return self;
 }
 
 - (void)dealloc {
-  _webStateList->RemoveObserver(_webStateListObserver.get());
   [[NSNotificationCenter defaultCenter] removeObserver:self.consumer];
   [super dealloc];
 }
@@ -175,7 +161,6 @@
                                          ->IsVoiceSearchEnabled()];
   [_consumer
       setMaximumMostVisitedSitesShown:[GoogleLandingMediator maxSitesShown]];
-  [_consumer setTabCount:self.webStateList->count()];
 
   // Set up template URL service to listen for default search engine changes.
   _templateURLService =
@@ -265,20 +250,6 @@
   }
 }
 
-#pragma mark - WebStateListObserving
-
-- (void)webStateList:(WebStateList*)webStateList
-    didInsertWebState:(web::WebState*)webState
-              atIndex:(int)index {
-  [self.consumer setTabCount:self.webStateList->count()];
-}
-
-- (void)webStateList:(WebStateList*)webStateList
-    didDetachWebState:(web::WebState*)webState
-              atIndex:(int)atIndex {
-  [self.consumer setTabCount:self.webStateList->count()];
-}
-
 #pragma mark - GoogleLandingDataSource
 
 - (void)addBlacklistedURL:(const GURL&)url {
@@ -322,6 +293,10 @@
   return _webToolbarDelegate;
 }
 
+- (TabModel*)tabModel {
+  return _tabModel;
+}
+
 - (void)promoViewed {
   DCHECK(_notification_promo);
   _notification_promo->HandleViewed();
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
index 691cb7d..e7a91792 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
@@ -543,7 +543,7 @@
                       loader:loader_
                      focuser:focuser_
           webToolbarDelegate:webToolbarDelegate_
-                webStateList:[tabModel_ webStateList]]);
+                    tabModel:tabModel_]);
       [googleLandingController_ setDataSource:googleLandingMediator_];
     }
     panelController = googleLandingController_;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_controller_unittest.mm b/ios/chrome/browser/ui/ntp/new_tab_page_controller_unittest.mm
index 0c54bfe5..1bae95d 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller_unittest.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller_unittest.mm
@@ -17,8 +17,6 @@
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
-#import "ios/chrome/browser/sessions/test_session_service.h"
-#import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_view.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/test/block_cleanup_test.h"
@@ -89,10 +87,6 @@
             chrome_browser_state_.get()));
     GURL url(kChromeUINewTabURL);
     parentViewController_ = [[UIViewController alloc] init];
-    tabModel_ = [[TabModel alloc]
-        initWithSessionWindow:nil
-               sessionService:[[TestSessionService alloc] init]
-                 browserState:chrome_browser_state_.get()];
     controller_ =
         [[NewTabPageController alloc] initWithUrl:url
                                            loader:nil
@@ -101,7 +95,7 @@
                                      browserState:chrome_browser_state_.get()
                                        colorCache:nil
                                webToolbarDelegate:nil
-                                         tabModel:tabModel_
+                                         tabModel:nil
                              parentViewController:parentViewController_];
 
     incognitoController_ = [[NewTabPageController alloc]
@@ -121,8 +115,6 @@
     incognitoController_ = nil;
     controller_ = nil;
     parentViewController_ = nil;
-    [tabModel_ browserStateDestroyed];
-    tabModel_ = nil;
 
     // There may be blocks released below that have weak references to |profile|
     // owned by chrome_browser_state_.  Ensure BlockCleanupTest::TearDown() is
@@ -134,7 +126,6 @@
   web::TestWebThreadBundle thread_bundle_;
   IOSChromeScopedTestingLocalState local_state_;
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
-  TabModel* tabModel_;
   UIViewController* parentViewController_;
   NewTabPageController* controller_;
   NewTabPageController* incognitoController_;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.h b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.h
index e4c9354..b7a2fd7 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.h
@@ -40,8 +40,6 @@
 // Hide toolbar subviews that should not be displayed on the new tab page.
 - (void)hideToolbarViewsForNewTabPage;
 
-// Updates the toolbar tab count;
-- (void)setToolbarTabCount:(int)tabCount;
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_HEADER_VIEW_H_
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
index a9a5194..4659015 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
@@ -25,8 +25,9 @@
 
 }  // namespace
 
-@interface NewTabPageHeaderView () {
+@interface NewTabPageHeaderView ()<TabModelObserver> {
   base::scoped_nsobject<NewTabPageToolbarController> _toolbarController;
+  base::scoped_nsobject<TabModel> _tabModel;
   base::scoped_nsobject<UIImageView> _searchBoxBorder;
   base::scoped_nsobject<UIImageView> _shadow;
 }
@@ -44,6 +45,7 @@
 }
 
 - (void)dealloc {
+  [_tabModel removeObserver:self];
   [super dealloc];
 }
 
@@ -72,6 +74,9 @@
       initWithToolbarDelegate:[dataSource toolbarDelegate]
                       focuser:dataSource]);
   _toolbarController.get().readingListModel = [dataSource readingListModel];
+  [_tabModel removeObserver:self];
+  _tabModel.reset([[dataSource tabModel] retain]);
+  [self addTabModelObserver];
 
   UIView* toolbarView = [_toolbarController view];
   CGRect toolbarFrame = self.bounds;
@@ -88,8 +93,9 @@
   [_toolbarController hideViewsForNewTabPage:YES];
 };
 
-- (void)setToolbarTabCount:(int)tabCount {
-  [_toolbarController setTabCount:tabCount];
+- (void)addTabModelObserver {
+  [_tabModel addObserver:self];
+  [_toolbarController setTabCount:[_tabModel count]];
 }
 
 - (void)addViewsToSearchField:(UIView*)searchField {
@@ -116,6 +122,11 @@
   [_shadow setAlpha:0];
 }
 
+- (void)tabModelDidChangeTabCount:(TabModel*)model {
+  DCHECK(model == _tabModel);
+  [_toolbarController setTabCount:[_tabModel count]];
+}
+
 - (void)updateSearchField:(UIView*)searchField
          withInitialFrame:(CGRect)initialFrame
        subviewConstraints:(NSArray*)constraints
diff --git a/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm b/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
index 278b6378..352000bf 100644
--- a/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
@@ -36,7 +36,7 @@
                   loader:self.mediator
                  focuser:self.mediator
       webToolbarDelegate:nil
-            webStateList:&self.browser->web_state_list()];
+                tabModel:nil];
   self.viewController.dataSource = self.googleLandingMediator;
   [super start];
 }