Commit 83a5a25e authored by Justin Cohen's avatar Justin Cohen Committed by Commit Bot

[ios] BVC owns NTP coordinator.

Moves ownership of the NTP coordinator from the NTP tab helper to the BVC.

Bug: 826369
Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Change-Id: I470d344778f844145bbd4a615f3753b3980f1614
Reviewed-on: https://chromium-review.googlesource.com/c/1287321Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Reviewed-by: default avatarKurt Horimoto <kkhorimoto@chromium.org>
Commit-Queue: Justin Cohen <justincohen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#601602}
parent 0dce6ad3
...@@ -13,11 +13,7 @@ source_set("ntp") { ...@@ -13,11 +13,7 @@ source_set("ntp") {
"//base:base", "//base:base",
"//components/strings:components_strings_grit", "//components/strings:components_strings_grit",
"//ios/chrome/browser", "//ios/chrome/browser",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/ntp",
"//ios/chrome/browser/ui/ntp:coordinator",
"//ios/chrome/browser/web_state_list",
"//ios/web/public", "//ios/web/public",
"//ui/base:base", "//ui/base:base",
] ]
...@@ -37,9 +33,7 @@ source_set("unit_tests") { ...@@ -37,9 +33,7 @@ source_set("unit_tests") {
"//ios/chrome/browser/ntp", "//ios/chrome/browser/ntp",
"//ios/chrome/browser/ntp_snippets:ntp_snippets", "//ios/chrome/browser/ntp_snippets:ntp_snippets",
"//ios/chrome/browser/search_engines:search_engines", "//ios/chrome/browser/search_engines:search_engines",
"//ios/chrome/browser/ui",
"//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/ntp",
"//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:test_support", "//ios/chrome/browser/web_state_list:test_support",
"//ios/chrome/test:test_support", "//ios/chrome/test:test_support",
......
...@@ -8,20 +8,10 @@ ...@@ -8,20 +8,10 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#include "base/macros.h" #include "base/macros.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_owning.h"
#include "ios/web/public/web_state/web_state_observer.h" #include "ios/web/public/web_state/web_state_observer.h"
#import "ios/web/public/web_state/web_state_user_data.h" #import "ios/web/public/web_state/web_state_user_data.h"
class WebStateList;
@protocol NewTabPageTabHelperDelegate; @protocol NewTabPageTabHelperDelegate;
@protocol NewTabPageControllerDelegate;
@protocol ApplicationCommands;
@protocol BrowserCommands;
@protocol OmniboxFocuser;
@protocol FakeboxFocuser;
@protocol SnackbarCommands;
@protocol UrlLoader;
@class NewTabPageCoordinator;
// NewTabPageTabHelper which manages a single NTP per tab. // NewTabPageTabHelper which manages a single NTP per tab.
class NewTabPageTabHelper : public web::WebStateObserver, class NewTabPageTabHelper : public web::WebStateObserver,
...@@ -29,52 +19,21 @@ class NewTabPageTabHelper : public web::WebStateObserver, ...@@ -29,52 +19,21 @@ class NewTabPageTabHelper : public web::WebStateObserver,
public: public:
~NewTabPageTabHelper() override; ~NewTabPageTabHelper() override;
static void CreateForWebState( static void CreateForWebState(web::WebState* web_state,
web::WebState* web_state, id<NewTabPageTabHelperDelegate> delegate);
WebStateList* web_state_list,
id<NewTabPageTabHelperDelegate> delegate,
id<UrlLoader> loader,
id<NewTabPageControllerDelegate> toolbar_delegate,
id<ApplicationCommands,
BrowserCommands,
OmniboxFocuser,
FakeboxFocuser,
SnackbarCommands,
UrlLoader> dispatcher);
// Returns true when the current web_state is an NTP and the underlying // Returns true when the current web_state is an NTP and the underlying
// controllers have been created. // controllers have been created.
bool IsActive() const; bool IsActive() const;
// Returns the current NTP controller.
id<NewTabPageOwning> GetController() const;
// Disables this tab helper. This is useful when navigating away from an NTP, // Disables this tab helper. This is useful when navigating away from an NTP,
// so the tab helper can be disabled immediately, and before any potential // so the tab helper can be disabled immediately, and before any potential
// WebStateObserver callback. // WebStateObserver callback.
void Deactivate(); void Deactivate();
// Returns the UIViewController for the current NTP.
// TODO(crbug.com/826369): Currently there's a 1:1 relationship between the
// webState and the NTP, so we can't delegate this coordinator to the BVC.
// Consider sharing one NTP per BVC, and removing this ownership.
UIViewController* GetViewController() const;
// Instructs the current NTP to dismiss any context menus.
void DismissModals() const;
private: private:
NewTabPageTabHelper(web::WebState* web_state, NewTabPageTabHelper(web::WebState* web_state,
WebStateList* web_state_list, id<NewTabPageTabHelperDelegate> delegate);
id<NewTabPageTabHelperDelegate> delegate,
id<UrlLoader> loader,
id<NewTabPageControllerDelegate> toolbar_delegate,
id<ApplicationCommands,
BrowserCommands,
OmniboxFocuser,
FakeboxFocuser,
SnackbarCommands,
UrlLoader> dispatcher);
// web::WebStateObserver overrides: // web::WebStateObserver overrides:
void WebStateDestroyed(web::WebState* web_state) override; void WebStateDestroyed(web::WebState* web_state) override;
...@@ -84,18 +43,15 @@ class NewTabPageTabHelper : public web::WebStateObserver, ...@@ -84,18 +43,15 @@ class NewTabPageTabHelper : public web::WebStateObserver,
// Enable or disable the tab helper. // Enable or disable the tab helper.
void SetActive(bool active); void SetActive(bool active);
// The Objective-C NTP coordinator instance.
// TODO(crbug.com/826369): Currently there's a 1:1 relationship between the
// webState and the NTP, so we can't delegate this coordinator to the BVC.
// Consider sharing one NTP per BVC, and moving this to a delegate.
__strong NewTabPageCoordinator* ntp_coordinator_ = nil;
// Used to present and dismiss the NTP. // Used to present and dismiss the NTP.
__weak id<NewTabPageTabHelperDelegate> delegate_ = nil; __weak id<NewTabPageTabHelperDelegate> delegate_ = nil;
// The WebState with which this object is associated. // The WebState with which this object is associated.
web::WebState* web_state_ = nullptr; web::WebState* web_state_ = nullptr;
// |YES| if the current tab helper is active.
BOOL active_;
DISALLOW_COPY_AND_ASSIGN(NewTabPageTabHelper); DISALLOW_COPY_AND_ASSIGN(NewTabPageTabHelper);
}; };
......
...@@ -10,12 +10,9 @@ ...@@ -10,12 +10,9 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/ntp/new_tab_page_tab_helper_delegate.h" #include "ios/chrome/browser/ntp/new_tab_page_tab_helper_delegate.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h"
#include "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/browser/ui/ui_feature_flags.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_item.h"
#import "ios/web/public/navigation_manager.h" #import "ios/web/public/navigation_manager.h"
#import "ios/web/public/web_state/navigation_context.h" #import "ios/web/public/web_state/navigation_context.h"
...@@ -29,22 +26,12 @@ ...@@ -29,22 +26,12 @@
// static // static
void NewTabPageTabHelper::CreateForWebState( void NewTabPageTabHelper::CreateForWebState(
web::WebState* web_state, web::WebState* web_state,
WebStateList* web_state_list, id<NewTabPageTabHelperDelegate> delegate) {
id<NewTabPageTabHelperDelegate> delegate,
id<UrlLoader> url_loader,
id<NewTabPageControllerDelegate> toolbar_delegate,
id<ApplicationCommands,
BrowserCommands,
OmniboxFocuser,
FakeboxFocuser,
SnackbarCommands,
UrlLoader> dispatcher) {
DCHECK(web_state); DCHECK(web_state);
if (!FromWebState(web_state)) { if (!FromWebState(web_state)) {
web_state->SetUserData(UserDataKey(), web_state->SetUserData(
base::WrapUnique(new NewTabPageTabHelper( UserDataKey(),
web_state, web_state_list, delegate, url_loader, base::WrapUnique(new NewTabPageTabHelper(web_state, delegate)));
toolbar_delegate, dispatcher)));
} }
} }
...@@ -52,52 +39,20 @@ NewTabPageTabHelper::~NewTabPageTabHelper() = default; ...@@ -52,52 +39,20 @@ NewTabPageTabHelper::~NewTabPageTabHelper() = default;
NewTabPageTabHelper::NewTabPageTabHelper( NewTabPageTabHelper::NewTabPageTabHelper(
web::WebState* web_state, web::WebState* web_state,
WebStateList* web_state_list, id<NewTabPageTabHelperDelegate> delegate)
id<NewTabPageTabHelperDelegate> delegate,
id<UrlLoader> url_loader,
id<NewTabPageControllerDelegate> toolbar_delegate,
id<ApplicationCommands,
BrowserCommands,
OmniboxFocuser,
FakeboxFocuser,
SnackbarCommands,
UrlLoader> dispatcher)
: delegate_(delegate), web_state_(web_state) { : delegate_(delegate), web_state_(web_state) {
DCHECK(delegate); DCHECK(delegate);
DCHECK(base::FeatureList::IsEnabled(kBrowserContainerContainsNTP)); DCHECK(base::FeatureList::IsEnabled(kBrowserContainerContainsNTP));
ios::ChromeBrowserState* browser_state =
ios::ChromeBrowserState::FromBrowserState(web_state->GetBrowserState());
ntp_coordinator_ =
[[NewTabPageCoordinator alloc] initWithBrowserState:browser_state];
ntp_coordinator_.webStateList = web_state_list;
ntp_coordinator_.dispatcher = dispatcher;
ntp_coordinator_.URLLoader = url_loader;
ntp_coordinator_.toolbarDelegate = toolbar_delegate;
web_state->AddObserver(this); web_state->AddObserver(this);
if (web_state->GetVisibleURL().GetOrigin() == kChromeUINewTabURL) { active_ = web_state->GetVisibleURL().GetOrigin() == kChromeUINewTabURL;
[ntp_coordinator_ start]; if (active_)
} [delegate_ newTabPageHelperDidChangeVisibility:this forWebState:web_state_];
} }
bool NewTabPageTabHelper::IsActive() const { bool NewTabPageTabHelper::IsActive() const {
return ntp_coordinator_.started; return active_;
}
UIViewController* NewTabPageTabHelper::GetViewController() const {
DCHECK(IsActive());
return ntp_coordinator_.viewController;
}
id<NewTabPageOwning> NewTabPageTabHelper::GetController() const {
return ntp_coordinator_;
}
void NewTabPageTabHelper::DismissModals() const {
return [ntp_coordinator_ dismissModals];
} }
void NewTabPageTabHelper::Deactivate() { void NewTabPageTabHelper::Deactivate() {
...@@ -108,6 +63,7 @@ void NewTabPageTabHelper::Deactivate() { ...@@ -108,6 +63,7 @@ void NewTabPageTabHelper::Deactivate() {
void NewTabPageTabHelper::WebStateDestroyed(web::WebState* web_state) { void NewTabPageTabHelper::WebStateDestroyed(web::WebState* web_state) {
web_state->RemoveObserver(this); web_state->RemoveObserver(this);
SetActive(false);
} }
void NewTabPageTabHelper::DidStartNavigation( void NewTabPageTabHelper::DidStartNavigation(
...@@ -123,31 +79,18 @@ void NewTabPageTabHelper::DidStartNavigation( ...@@ -123,31 +79,18 @@ void NewTabPageTabHelper::DidStartNavigation(
#pragma mark - Private #pragma mark - Private
void NewTabPageTabHelper::SetActive(bool active) { void NewTabPageTabHelper::SetActive(bool active) {
// Save the NTP scroll offset before we navigate away. bool was_active = active_;
web::NavigationManager* manager = web_state_->GetNavigationManager(); active_ = active;
if (web_state_->GetLastCommittedURL().GetOrigin() == kChromeUINewTabURL) {
web::NavigationItem* item = manager->GetLastCommittedItem();
web::PageDisplayState displayState;
CGPoint scrollOffset = ntp_coordinator_.scrollOffset;
displayState.scroll_state().set_offset_x(scrollOffset.x);
displayState.scroll_state().set_offset_y(scrollOffset.y);
item->SetPageDisplayState(displayState);
}
bool was_active = IsActive();
if (active) { if (active) {
web::NavigationManager* manager = web_state_->GetNavigationManager(); web::NavigationManager* manager = web_state_->GetNavigationManager();
web::NavigationItem* item = manager->GetPendingItem(); web::NavigationItem* item = manager->GetPendingItem();
if (item) if (item)
item->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE)); item->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE));
[ntp_coordinator_ start];
} else {
[ntp_coordinator_ stop];
} }
// Tell |delegate_| to show or hide the NTP, if necessary. // Tell |delegate_| to show or hide the NTP, if necessary.
if (IsActive() != was_active) { if (active_ != was_active) {
[delegate_ newTabPageHelperDidChangeVisibility:this]; [delegate_ newTabPageHelperDidChangeVisibility:this forWebState:web_state_];
} }
} }
...@@ -10,7 +10,8 @@ class NewTabPageTabHelper; ...@@ -10,7 +10,8 @@ class NewTabPageTabHelper;
// Protocol defining a delegate for the NTP tab helper. // Protocol defining a delegate for the NTP tab helper.
@protocol NewTabPageTabHelperDelegate @protocol NewTabPageTabHelperDelegate
// Tells the delegate the NTP needs to be shown or hidden. // Tells the delegate the NTP needs to be shown or hidden.
- (void)newTabPageHelperDidChangeVisibility:(NewTabPageTabHelper*)NTPHelper; - (void)newTabPageHelperDidChangeVisibility:(NewTabPageTabHelper*)NTPHelper
forWebState:(web::WebState*)webState;
@end @end
#endif // IOS_CHROME_BROWSER_NTP_NEW_TAB_PAGE_TAB_HELPER_DELEGATE_H_ #endif // IOS_CHROME_BROWSER_NTP_NEW_TAB_PAGE_TAB_HELPER_DELEGATE_H_
...@@ -16,9 +16,7 @@ ...@@ -16,9 +16,7 @@
#include "ios/chrome/browser/ntp/new_tab_page_tab_helper_delegate.h" #include "ios/chrome/browser/ntp/new_tab_page_tab_helper_delegate.h"
#include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h" #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h"
#include "ios/chrome/browser/search_engines/template_url_service_factory.h" #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_controller_delegate.h"
#include "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/browser/ui/ui_feature_flags.h"
#import "ios/chrome/browser/ui/url_loader.h"
#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" #import "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/browser/web_state_list/web_state_list.h"
#include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager.h" #include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager.h"
...@@ -38,14 +36,6 @@ namespace { ...@@ -38,14 +36,6 @@ namespace {
const char kTestURL[] = "http://foo.bar"; const char kTestURL[] = "http://foo.bar";
} // namespace } // namespace
@protocol NewTabPageTabDispatcher<ApplicationCommands,
BrowserCommands,
OmniboxFocuser,
FakeboxFocuser,
SnackbarCommands,
UrlLoader>
@end
// Test fixture for testing NewTabPageTabHelper class. // Test fixture for testing NewTabPageTabHelper class.
class NewTabPageTabHelperTest : public PlatformTest { class NewTabPageTabHelperTest : public PlatformTest {
protected: protected:
...@@ -74,11 +64,6 @@ class NewTabPageTabHelperTest : public PlatformTest { ...@@ -74,11 +64,6 @@ class NewTabPageTabHelperTest : public PlatformTest {
test_web_state_.SetBrowserState(chrome_browser_state_.get()); test_web_state_.SetBrowserState(chrome_browser_state_.get());
delegate_ = OCMProtocolMock(@protocol(NewTabPageTabHelperDelegate)); delegate_ = OCMProtocolMock(@protocol(NewTabPageTabHelperDelegate));
loader_ = OCMProtocolMock(@protocol(UrlLoader));
toolbar_delegate_ =
OCMProtocolMock(@protocol(NewTabPageControllerDelegate));
dispatcher_ = OCMProtocolMock(@protocol(NewTabPageTabDispatcher));
web_state_list_ = std::make_unique<WebStateList>(&web_state_list_delegate_);
} }
NewTabPageTabHelper* tab_helper() { NewTabPageTabHelper* tab_helper() {
...@@ -86,14 +71,9 @@ class NewTabPageTabHelperTest : public PlatformTest { ...@@ -86,14 +71,9 @@ class NewTabPageTabHelperTest : public PlatformTest {
} }
void CreateTabHelper() { void CreateTabHelper() {
NewTabPageTabHelper::CreateForWebState( NewTabPageTabHelper::CreateForWebState(&test_web_state_, delegate_);
&test_web_state_, web_state_list_.get(), delegate_, loader_,
toolbar_delegate_, dispatcher_);
} }
id dispatcher_;
id toolbar_delegate_;
id loader_;
id delegate_; id delegate_;
web::TestWebThreadBundle thread_bundle_; web::TestWebThreadBundle thread_bundle_;
IOSChromeScopedTestingChromeBrowserStateManager scoped_browser_state_manager_; IOSChromeScopedTestingChromeBrowserStateManager scoped_browser_state_manager_;
......
...@@ -99,7 +99,6 @@ source_set("tabs_internal") { ...@@ -99,7 +99,6 @@ source_set("tabs_internal") {
"//ios/chrome/browser/language", "//ios/chrome/browser/language",
"//ios/chrome/browser/metrics", "//ios/chrome/browser/metrics",
"//ios/chrome/browser/metrics:metrics_internal", "//ios/chrome/browser/metrics:metrics_internal",
"//ios/chrome/browser/ntp",
"//ios/chrome/browser/passwords", "//ios/chrome/browser/passwords",
"//ios/chrome/browser/prerender", "//ios/chrome/browser/prerender",
"//ios/chrome/browser/reading_list", "//ios/chrome/browser/reading_list",
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#include "ios/chrome/browser/history/top_sites_factory.h" #include "ios/chrome/browser/history/top_sites_factory.h"
#include "ios/chrome/browser/infobars/infobar_manager_impl.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
#import "ios/chrome/browser/metrics/tab_usage_recorder.h" #import "ios/chrome/browser/metrics/tab_usage_recorder.h"
#import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h"
#include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/pref_names.h"
#include "ios/chrome/browser/reading_list/reading_list_model_factory.h" #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
#include "ios/chrome/browser/search_engines/template_url_service_factory.h" #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
...@@ -306,12 +305,6 @@ NSString* const kTabUrlKey = @"url"; ...@@ -306,12 +305,6 @@ NSString* const kTabUrlKey = @"url";
if (self.webState->IsEvicted() && [_parentTabModel tabUsageRecorder]) if (self.webState->IsEvicted() && [_parentTabModel tabUsageRecorder])
[_parentTabModel tabUsageRecorder]->RecordPageLoadStart(self.webState); [_parentTabModel tabUsageRecorder]->RecordPageLoadStart(self.webState);
// Any early returns (such as below) must happen after the above call to
// RecordPageLoadStart, which is used for metric logging.
NewTabPageTabHelper* NTP = NewTabPageTabHelper::FromWebState(self.webState);
if (NTP && NTP->IsActive())
return [NTP->GetController() view];
// Do not trigger the load if the tab has crashed. SadTabTabHelper is // Do not trigger the load if the tab has crashed. SadTabTabHelper is
// responsible for handing reload logic for crashed tabs. // responsible for handing reload logic for crashed tabs.
if (!self.webState->IsCrashed()) { if (!self.webState->IsCrashed()) {
......
...@@ -376,6 +376,7 @@ source_set("ui_internal") { ...@@ -376,6 +376,7 @@ source_set("ui_internal") {
"//ios/chrome/browser/ui/main_content:main_content_ui", "//ios/chrome/browser/ui/main_content:main_content_ui",
"//ios/chrome/browser/ui/main_content:main_content_ui_broadcasting_util", "//ios/chrome/browser/ui/main_content:main_content_ui_broadcasting_util",
"//ios/chrome/browser/ui/ntp", "//ios/chrome/browser/ui/ntp",
"//ios/chrome/browser/ui/ntp:coordinator",
"//ios/chrome/browser/ui/ntp:ntp_controller", "//ios/chrome/browser/ui/ntp:ntp_controller",
"//ios/chrome/browser/ui/ntp:util", "//ios/chrome/browser/ui/ntp:util",
"//ios/chrome/browser/ui/omnibox:omnibox_internal", "//ios/chrome/browser/ui/omnibox:omnibox_internal",
......
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
#pragma mark - Properties #pragma mark - Properties
- (UIViewController*)viewController { - (UIViewController*)viewController {
[self start];
if (self.browserState->IsOffTheRecord()) { if (self.browserState->IsOffTheRecord()) {
return self.incognitoViewController; return self.incognitoViewController;
} else { } else {
......
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