Commit 9e26337c authored by Justin Cohen's avatar Justin Cohen Committed by Commit Bot

[ios] Present the NTP directly from the BVC.

When kBrowserContainerPresentsNTP is enabled, bypass CRWNativeContent and instead
present the NTP directly and return nil to ios/web.

Bug: 826369
Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Change-Id: I373f43dfe02b3242c87fe997b97238c824bda116
Reviewed-on: https://chromium-review.googlesource.com/c/1280047
Commit-Queue: Justin Cohen <justincohen@chromium.org>
Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#599701}
parent 0fbe1e52
...@@ -99,6 +99,7 @@ source_set("tabs_internal") { ...@@ -99,6 +99,7 @@ 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,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#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"
...@@ -305,6 +306,12 @@ NSString* const kTabUrlKey = @"url"; ...@@ -305,6 +306,12 @@ 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()) {
......
...@@ -137,6 +137,7 @@ source_set("unit_tests") { ...@@ -137,6 +137,7 @@ source_set("unit_tests") {
"//ios/chrome/browser/snapshots", "//ios/chrome/browser/snapshots",
"//ios/chrome/browser/store_kit", "//ios/chrome/browser/store_kit",
"//ios/chrome/browser/tabs", "//ios/chrome/browser/tabs",
"//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/activity_services", "//ios/chrome/browser/ui/activity_services",
"//ios/chrome/browser/ui/alert_coordinator", "//ios/chrome/browser/ui/alert_coordinator",
"//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/commands",
...@@ -326,6 +327,7 @@ source_set("ui_internal") { ...@@ -326,6 +327,7 @@ source_set("ui_internal") {
"//ios/chrome/browser/language", "//ios/chrome/browser/language",
"//ios/chrome/browser/metrics:metrics_internal", "//ios/chrome/browser/metrics:metrics_internal",
"//ios/chrome/browser/net", "//ios/chrome/browser/net",
"//ios/chrome/browser/ntp",
"//ios/chrome/browser/passwords", "//ios/chrome/browser/passwords",
"//ios/chrome/browser/prefs", "//ios/chrome/browser/prefs",
"//ios/chrome/browser/prerender", "//ios/chrome/browser/prerender",
...@@ -376,7 +378,6 @@ source_set("ui_internal") { ...@@ -376,7 +378,6 @@ source_set("ui_internal") {
"//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:ntp_controller", "//ios/chrome/browser/ui/ntp:ntp_controller",
"//ios/chrome/browser/ui/ntp:ntp_internal",
"//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",
"//ios/chrome/browser/ui/overscroll_actions", "//ios/chrome/browser/ui/overscroll_actions",
...@@ -438,7 +439,6 @@ source_set("ui_internal") { ...@@ -438,7 +439,6 @@ source_set("ui_internal") {
"//ios/chrome/browser/ui/side_swipe", "//ios/chrome/browser/ui/side_swipe",
] ]
allow_circular_includes_from = [ allow_circular_includes_from = [
"//ios/chrome/browser/ui/ntp:ntp_internal",
"//ios/chrome/browser/ui/overscroll_actions", "//ios/chrome/browser/ui/overscroll_actions",
"//ios/chrome/browser/ui/settings", "//ios/chrome/browser/ui/settings",
"//ios/chrome/browser/ui/tabs:coordinator", "//ios/chrome/browser/ui/tabs:coordinator",
......
...@@ -75,6 +75,8 @@ ...@@ -75,6 +75,8 @@
#import "ios/chrome/browser/metrics/new_tab_page_uma.h" #import "ios/chrome/browser/metrics/new_tab_page_uma.h"
#import "ios/chrome/browser/metrics/size_class_recorder.h" #import "ios/chrome/browser/metrics/size_class_recorder.h"
#include "ios/chrome/browser/metrics/tab_usage_recorder.h" #include "ios/chrome/browser/metrics/tab_usage_recorder.h"
#import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h"
#import "ios/chrome/browser/ntp/new_tab_page_tab_helper_delegate.h"
#import "ios/chrome/browser/passwords/password_controller.h" #import "ios/chrome/browser/passwords/password_controller.h"
#include "ios/chrome/browser/passwords/password_tab_helper.h" #include "ios/chrome/browser/passwords/password_tab_helper.h"
#import "ios/chrome/browser/prerender/preload_controller_delegate.h" #import "ios/chrome/browser/prerender/preload_controller_delegate.h"
...@@ -163,6 +165,7 @@ ...@@ -163,6 +165,7 @@
#import "ios/chrome/browser/ui/main_content/main_content_ui_state.h" #import "ios/chrome/browser/ui/main_content/main_content_ui_state.h"
#import "ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.h" #import "ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
#import "ios/chrome/browser/ui/ntp/new_tab_page_owning.h"
#import "ios/chrome/browser/ui/ntp/ntp_util.h" #import "ios/chrome/browser/ui/ntp/ntp_util.h"
#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h" #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
#import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h" #import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h"
...@@ -432,6 +435,7 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -432,6 +435,7 @@ NSString* const kBrowserViewControllerSnackbarCategory =
SideSwipeControllerDelegate, SideSwipeControllerDelegate,
SnapshotGeneratorDelegate, SnapshotGeneratorDelegate,
TabDialogDelegate, TabDialogDelegate,
NewTabPageTabHelperDelegate,
TabModelObserver, TabModelObserver,
TabStripPresentation, TabStripPresentation,
ToolbarHeightProviderForFullscreen, ToolbarHeightProviderForFullscreen,
...@@ -935,6 +939,9 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -935,6 +939,9 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
conformsToProtocol:@protocol(BrowsingDataCommands)]); conformsToProtocol:@protocol(BrowsingDataCommands)]);
[_dispatcher startDispatchingToTarget:applicationCommandEndpoint [_dispatcher startDispatchingToTarget:applicationCommandEndpoint
forProtocol:@protocol(BrowsingDataCommands)]; forProtocol:@protocol(BrowsingDataCommands)];
_toolbarCoordinatorAdaptor =
[[ToolbarCoordinatorAdaptor alloc] initWithDispatcher:self.dispatcher];
self.toolbarInterface = _toolbarCoordinatorAdaptor;
_snackbarCoordinator = [[SnackbarCoordinator alloc] init]; _snackbarCoordinator = [[SnackbarCoordinator alloc] init];
_snackbarCoordinator.dispatcher = _dispatcher; _snackbarCoordinator.dispatcher = _dispatcher;
...@@ -1494,6 +1501,11 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -1494,6 +1501,11 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
[currentTab dismissModals]; [currentTab dismissModals];
if (currentTab) { if (currentTab) {
NewTabPageTabHelper* NTPHelper =
NewTabPageTabHelper::FromWebState(currentTab.webState);
if (NTPHelper && NTPHelper->IsActive()) {
NTPHelper->DismissModals();
}
auto* findHelper = FindTabHelper::FromWebState(currentTab.webState); auto* findHelper = FindTabHelper::FromWebState(currentTab.webState);
if (findHelper) { if (findHelper) {
findHelper->StopFinding(^{ findHelper->StopFinding(^{
...@@ -2102,9 +2114,6 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -2102,9 +2114,6 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
bottomToolbarCoordinator.longPressDelegate = self.popupMenuCoordinator; bottomToolbarCoordinator.longPressDelegate = self.popupMenuCoordinator;
[bottomToolbarCoordinator start]; [bottomToolbarCoordinator start];
_toolbarCoordinatorAdaptor =
[[ToolbarCoordinatorAdaptor alloc] initWithDispatcher:self.dispatcher];
self.toolbarInterface = _toolbarCoordinatorAdaptor;
[_toolbarCoordinatorAdaptor addToolbarCoordinator:topToolbarCoordinator]; [_toolbarCoordinatorAdaptor addToolbarCoordinator:topToolbarCoordinator];
[_toolbarCoordinatorAdaptor addToolbarCoordinator:bottomToolbarCoordinator]; [_toolbarCoordinatorAdaptor addToolbarCoordinator:bottomToolbarCoordinator];
...@@ -2505,7 +2514,15 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -2505,7 +2514,15 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
// Make new content visible, resizing it first as the orientation may // Make new content visible, resizing it first as the orientation may
// have changed from the last time it was displayed. // have changed from the last time it was displayed.
tab.view.frame = self.contentArea.bounds; tab.view.frame = self.contentArea.bounds;
_browserContainerCoordinator.viewController.contentView = tab.view; NewTabPageTabHelper* NTPHelper =
NewTabPageTabHelper::FromWebState(tab.webState);
if (NTPHelper && NTPHelper->IsActive()) {
UIViewController* viewController = NTPHelper->GetViewController();
_browserContainerCoordinator.viewController.contentViewController =
viewController;
} else {
_browserContainerCoordinator.viewController.contentView = tab.view;
}
} }
[self updateToolbar]; [self updateToolbar];
...@@ -2878,6 +2895,11 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -2878,6 +2895,11 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
DCHECK(_downloadManagerCoordinator); DCHECK(_downloadManagerCoordinator);
DownloadManagerTabHelper::CreateForWebState(tab.webState, DownloadManagerTabHelper::CreateForWebState(tab.webState,
_downloadManagerCoordinator); _downloadManagerCoordinator);
if (base::FeatureList::IsEnabled(kBrowserContainerContainsNTP)) {
NewTabPageTabHelper::CreateForWebState(
tab.webState, self.tabModel.webStateList, self, self,
self.toolbarInterface, self.dispatcher);
}
// The language detection helper accepts a callback from the translate // The language detection helper accepts a callback from the translate
// client, so must be created after it. // client, so must be created after it.
...@@ -2958,6 +2980,12 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -2958,6 +2980,12 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
- (id)nativeControllerForTab:(Tab*)tab { - (id)nativeControllerForTab:(Tab*)tab {
id nativeController = tab.webController.nativeController; id nativeController = tab.webController.nativeController;
if (tab) {
NewTabPageTabHelper* NTPHelper =
NewTabPageTabHelper::FromWebState(tab.webState);
if (NTPHelper && NTPHelper->IsActive())
nativeController = NTPHelper->GetController();
}
return nativeController ? nativeController : _temporaryNativeController; return nativeController ? nativeController : _temporaryNativeController;
} }
...@@ -3034,7 +3062,7 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -3034,7 +3062,7 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
// If there is a native controller, use the native controller's scroll offset. // If there is a native controller, use the native controller's scroll offset.
id nativeController = id nativeController =
[self nativeControllerForTab:[self.tabModel currentTab]]; [self nativeControllerForTab:[self.tabModel currentTab]];
if ([nativeController conformsToProtocol:@protocol(CRWNativeContent)] && if ([nativeController conformsToProtocol:@protocol(NewTabPageOwning)] &&
[nativeController respondsToSelector:@selector(scrollOffset)]) { [nativeController respondsToSelector:@selector(scrollOffset)]) {
scrollOffset = [nativeController scrollOffset]; scrollOffset = [nativeController scrollOffset];
} }
...@@ -3072,6 +3100,14 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -3072,6 +3100,14 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
return @[]; return @[];
NSMutableArray* overlays = [NSMutableArray array]; NSMutableArray* overlays = [NSMutableArray array];
NewTabPageTabHelper* NTPHelper =
NewTabPageTabHelper::FromWebState(tab.webState);
if (NTPHelper && NTPHelper->IsActive()) {
SnapshotOverlay* ntpOverlay =
[[SnapshotOverlay alloc] initWithView:[NTPHelper->GetController() view]
yOffset:0];
[overlays addObject:ntpOverlay];
}
UIView* infoBarView = [self infoBarOverlayViewForTab:tab]; UIView* infoBarView = [self infoBarOverlayViewForTab:tab];
if (infoBarView) { if (infoBarView) {
CGFloat infoBarYOffset = [self infoBarOverlayYOffsetForTab:tab]; CGFloat infoBarYOffset = [self infoBarOverlayYOffsetForTab:tab];
...@@ -3097,7 +3133,7 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -3097,7 +3133,7 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
DCHECK(webState); DCHECK(webState);
Tab* tab = LegacyTabHelper::GetTabForWebState(webState); Tab* tab = LegacyTabHelper::GetTabForWebState(webState);
DCHECK([self.tabModel indexOfTab:tab] != NSNotFound); DCHECK([self.tabModel indexOfTab:tab] != NSNotFound);
id<CRWNativeContent> nativeController = [self nativeControllerForTab:tab]; id nativeController = [self nativeControllerForTab:tab];
if ([nativeController respondsToSelector:@selector(willUpdateSnapshot)]) { if ([nativeController respondsToSelector:@selector(willUpdateSnapshot)]) {
[nativeController willUpdateSnapshot]; [nativeController willUpdateSnapshot];
} }
...@@ -3684,7 +3720,10 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -3684,7 +3720,10 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
return reading_list::IsOfflineURLValid( return reading_list::IsOfflineURLValid(
url, ReadingListModelFactory::GetForBrowserState(_browserState)); url, ReadingListModelFactory::GetForBrowserState(_browserState));
} }
return host == kChromeUINewTabHost; if (host == kChromeUINewTabHost)
return !base::FeatureList::IsEnabled(kBrowserContainerContainsNTP);
return NO;
} }
- (id<CRWNativeContent>)controllerForURL:(const GURL&)url - (id<CRWNativeContent>)controllerForURL:(const GURL&)url
...@@ -3694,6 +3733,9 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -3694,6 +3733,9 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
id<CRWNativeContent> nativeController = nil; id<CRWNativeContent> nativeController = nil;
base::StringPiece url_host = url.host_piece(); base::StringPiece url_host = url.host_piece();
if (url_host == kChromeUINewTabHost) { if (url_host == kChromeUINewTabHost) {
if (base::FeatureList::IsEnabled(kBrowserContainerContainsNTP))
return nil;
CGFloat fakeStatusBarHeight = _fakeStatusBarView.frame.size.height; CGFloat fakeStatusBarHeight = _fakeStatusBarView.frame.size.height;
UIEdgeInsets safeAreaInset = UIEdgeInsetsZero; UIEdgeInsets safeAreaInset = UIEdgeInsetsZero;
if (@available(iOS 11.0, *)) { if (@available(iOS 11.0, *)) {
...@@ -3920,9 +3962,8 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -3920,9 +3962,8 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
// Resize the NTP's contentInset.bottom to be above the secondary toolbar. // Resize the NTP's contentInset.bottom to be above the secondary toolbar.
id nativeController = [self nativeControllerForTab:[_model currentTab]]; id nativeController = [self nativeControllerForTab:[_model currentTab]];
if ([nativeController isKindOfClass:[NewTabPageController class]]) { if ([nativeController conformsToProtocol:@protocol(NewTabPageOwning)]) {
NewTabPageController* newTabPageController = id<NewTabPageOwning> newTabPageController = nativeController;
base::mac::ObjCCast<NewTabPageController>(nativeController);
UIEdgeInsets contentInset = newTabPageController.contentInset; UIEdgeInsets contentInset = newTabPageController.contentInset;
contentInset.bottom = self.secondaryToolbarHeightConstraint.constant; contentInset.bottom = self.secondaryToolbarHeightConstraint.constant;
newTabPageController.contentInset = contentInset; newTabPageController.contentInset = contentInset;
...@@ -4674,7 +4715,7 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint { ...@@ -4674,7 +4715,7 @@ applicationCommandEndpoint:(id<ApplicationCommands>)applicationCommandEndpoint {
- (void)focusFakebox { - (void)focusFakebox {
id nativeController = [self nativeControllerForTab:[_model currentTab]]; id nativeController = [self nativeControllerForTab:[_model currentTab]];
DCHECK([nativeController isKindOfClass:[NewTabPageController class]]); DCHECK([nativeController conformsToProtocol:@protocol(NewTabPageOwning)]);
[nativeController focusFakebox]; [nativeController focusFakebox];
} }
...@@ -5382,4 +5423,13 @@ nativeContentHeaderHeightForPreloadController:(PreloadController*)controller ...@@ -5382,4 +5423,13 @@ nativeContentHeaderHeightForPreloadController:(PreloadController*)controller
self.consentBumpCoordinator = nil; self.consentBumpCoordinator = nil;
} }
#pragma mark - NewTabPageTabHelperDelegate
- (void)newTabPageHelperDidChangeVisibility:(NewTabPageTabHelper*)NTPHelper {
Tab* currentTab = [_model currentTab];
if (NewTabPageTabHelper::FromWebState(currentTab.webState) == NTPHelper) {
[self displayTab:currentTab];
}
}
@end @end
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
#import "ios/chrome/browser/ui/page_not_available_controller.h" #import "ios/chrome/browser/ui/page_not_available_controller.h"
#import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h" #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
#include "ios/chrome/browser/ui/ui_feature_flags.h"
#include "ios/chrome/browser/ui/ui_util.h" #include "ios/chrome/browser/ui/ui_util.h"
#import "ios/chrome/browser/web/error_page_content.h" #import "ios/chrome/browser/web/error_page_content.h"
#include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
...@@ -327,8 +328,10 @@ TEST_F(BrowserViewControllerTest, TestNativeContentController) { ...@@ -327,8 +328,10 @@ TEST_F(BrowserViewControllerTest, TestNativeContentController) {
id<CRWNativeContent> controller = id<CRWNativeContent> controller =
[bvc_ controllerForURL:GURL(kChromeUINewTabURL) [bvc_ controllerForURL:GURL(kChromeUINewTabURL)
webState:webStateImpl_.get()]; webState:webStateImpl_.get()];
EXPECT_TRUE(controller != nil); if (!base::FeatureList::IsEnabled(kBrowserContainerContainsNTP)) {
EXPECT_TRUE([controller isMemberOfClass:[NewTabPageController class]]); EXPECT_TRUE(controller != nil);
EXPECT_TRUE([controller isMemberOfClass:[NewTabPageController class]]);
}
controller = [bvc_ controllerForURL:GURL(kChromeUISettingsURL) controller = [bvc_ controllerForURL:GURL(kChromeUISettingsURL)
webState:webStateImpl_.get()]; webState:webStateImpl_.get()];
......
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