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

Unified Diff: ios/chrome/browser/ui/contextual_search/contextual_search_results_view.mm

Issue 2775623002: [ios] WebStateList owns all WebState it manages. (Closed)
Patch Set: Fix ios_chrome_unittests. Created 3 years, 9 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/chrome/browser/ui/contextual_search/contextual_search_results_view.mm
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_results_view.mm b/ios/chrome/browser/ui/contextual_search/contextual_search_results_view.mm
index f669e27b1860d3b1c15fba2391339bc937ee9c96..27b84bdfa1fa474e41da3a2e688a0750d81ebeb5 100644
--- a/ios/chrome/browser/ui/contextual_search/contextual_search_results_view.mm
+++ b/ios/chrome/browser/ui/contextual_search/contextual_search_results_view.mm
@@ -8,15 +8,22 @@
#import "base/ios/weak_nsobject.h"
#include "base/mac/scoped_nsobject.h"
+#include "base/memory/ptr_util.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/tabs/legacy_tab_helper.h"
#import "ios/chrome/browser/tabs/tab.h"
+#import "ios/chrome/browser/tabs/tab_helper_util.h"
#import "ios/chrome/browser/ui/contextual_search/contextual_search_metrics.h"
#import "ios/chrome/browser/ui/contextual_search/contextual_search_panel_view.h"
#import "ios/chrome/browser/ui/contextual_search/contextual_search_web_state_observer.h"
#import "ios/chrome/common/material_timing.h"
+#import "ios/shared/chrome/browser/tabs/web_state_opener.h"
#include "ios/web/public/load_committed_details.h"
+#import "ios/web/public/serializable_user_data_manager.h"
#import "ios/web/public/web_state/ui/crw_native_content_provider.h"
#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/web_state/web_state.h"
#import "ios/web/web_state/ui/crw_web_controller.h"
namespace {
@@ -35,8 +42,9 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
base::WeakNSProtocol<id<ContextualSearchPreloadChecker>> _preloadChecker;
std::unique_ptr<ContextualSearchWebStateObserver> _webStateObserver;
- // Tab that loads the search results.
- base::scoped_nsobject<Tab> _tab;
+ // WebState that loads the search results.
+ std::unique_ptr<web::WebState> _webState;
+ std::unique_ptr<WebStateOpener> _webStateOpener;
// Access to the search tab's web view proxy.
base::scoped_nsprotocol<id<CRWWebViewProxy>> _webViewProxy;
@@ -106,11 +114,14 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
- (void)setActive:(BOOL)active {
if (active) {
- // Start watching the embedded Tab's web activity.
- _webStateObserver->ObserveWebState([_tab webState]);
- [[_tab webController] setShouldSuppressDialogs:NO];
- _webViewProxy.reset([[[_tab webController] webViewProxy] retain]);
- [[_webViewProxy scrollViewProxy] setBounces:NO];
+ if (_webState) {
+ Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get());
+ // Start watching the embedded Tab's web activity.
+ _webStateObserver->ObserveWebState(_webState.get());
+ [[tab webController] setShouldSuppressDialogs:NO];
+ _webViewProxy.reset([[[tab webController] webViewProxy] retain]);
+ [[_webViewProxy scrollViewProxy] setBounces:NO];
+ }
} else {
// Stop watching the embedded Tab's web activity.
_webStateObserver->ObserveWebState(nullptr);
@@ -131,35 +142,45 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
- (void)createTabForSearch:(GURL)url preloadEnabled:(BOOL)preloadEnabled {
DCHECK(self.opener);
- if (_tab)
+ if (_webState)
[self cancelLoad];
- void (^searchTabConfiguration)(Tab*) = ^(Tab* tab) {
- [tab setIsLinkLoadingPrerenderTab:YES];
- [[tab webController] setDelegate:tab];
- };
+ _webStateOpener = base::MakeUnique<WebStateOpener>(self.opener.webState);
+ web::WebState::CreateParams createParams(self.opener.browserState);
+ _webState = web::WebState::Create(createParams);
+
+ AttachTabHelpers(_webState.get());
+ Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get());
+ DCHECK(tab);
+
+ [[tab webController] setNativeProvider:self];
+ [[tab webController] setWebUsageEnabled:YES];
+ [tab setIsLinkLoadingPrerenderTab:YES];
+ [[tab webController] setDelegate:tab];
+
+ web::NavigationManager::WebLoadParams loadParams(url);
+ loadParams.transition_type = ui::PAGE_TRANSITION_FROM_ADDRESS_BAR;
+ [[tab webController] loadWithParams:loadParams];
- ui::PageTransition transition = ui::PAGE_TRANSITION_FROM_ADDRESS_BAR;
- Tab* tab = [Tab preloadingTabWithBrowserState:self.opener.browserState
- url:url
- referrer:web::Referrer()
- transition:transition
- provider:self
- opener:self.opener
- desktopUserAgent:false
- configuration:searchTabConfiguration];
- _tab.reset([tab retain]);
// Don't actually start the page load yet -- that happens in -loadTab
_preloadEnabled = preloadEnabled;
[self loadPendingSearchIfPossible];
}
-- (Tab*)releaseTab {
+- (std::unique_ptr<web::WebState>)releaseWebState {
[self disconnectTab];
// Allow the search tab to be sized by autoresizing mask again.
- [[_tab view] setTranslatesAutoresizingMaskIntoConstraints:YES];
- return [_tab.release() autorelease];
+ if (_webState) {
+ Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get());
+ [[tab view] setTranslatesAutoresizingMaskIntoConstraints:YES];
+ }
+ return std::move(_webState);
+}
+
+- (WebStateOpener)webStateOpener {
+ DCHECK(_webStateOpener);
+ return *_webStateOpener;
}
- (void)recordFinishedSearchChained:(BOOL)chained {
@@ -170,8 +191,11 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
#pragma mark - private methods
- (void)disconnectTab {
- [[_tab view] removeFromSuperview];
- [[_tab webController] setNativeProvider:nil];
+ if (_webState) {
+ Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get());
+ [[tab view] removeFromSuperview];
+ [[tab webController] setNativeProvider:nil];
+ }
self.active = NO;
_webViewProxy.reset();
}
@@ -180,13 +204,12 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
[self disconnectTab];
_loadInProgress = NO;
_loaded = NO;
- [_tab close];
- _tab.reset();
+ _webState.reset();
}
- (void)loadPendingSearchIfPossible {
// If the search tab hasn't been created, or if it's already loaded, no-op.
- if (!_tab.get() || _loadInProgress || self.active || _visibility == OFFSCREEN)
+ if (!_webState || _loadInProgress || self.active || _visibility == OFFSCREEN)
return;
// If this view is in a position where loading would be "preloading", check
@@ -199,7 +222,7 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
}
- (void)loadTab {
- DCHECK(_tab.get());
+ DCHECK(_webState);
// Start observing the search tab.
self.active = YES;
// TODO(crbug.com/546223): See if |_waitingForInitialSearchTabLoad| and
@@ -208,17 +231,20 @@ enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE };
// Mark the start of the time for the search.
_loadStartTime = base::Time::Now();
// Start the load by asking for the tab's view, but making it hidden.
- [_tab view].hidden = YES;
- [self addSubview:[_tab view]];
+ Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get());
+ [tab view].hidden = YES;
+ [self addSubview:[tab view]];
_loadInProgress = YES;
}
- (void)displayTab {
- [_tab view].frame = self.bounds;
+ DCHECK(_webState);
+ Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get());
+ [tab view].frame = self.bounds;
_loadInProgress = NO;
void (^insertTab)(void) = ^{
- [_tab view].hidden = NO;
+ [tab view].hidden = NO;
self.scrollEnabled = _shouldScroll;
};

Powered by Google App Engine
This is Rietveld 408576698