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

Side by Side Diff: ios/chrome/browser/tabs/tab.mm

Issue 2775623002: [ios] WebStateList owns all WebState it manages. (Closed)
Patch Set: Fix gn check 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 unified diff | Download patch
« no previous file with comments | « ios/chrome/browser/tabs/tab.h ('k') | ios/chrome/browser/tabs/tab_helper_util.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "ios/chrome/browser/tabs/tab.h" 5 #import "ios/chrome/browser/tabs/tab.h"
6 6
7 #import <CoreLocation/CoreLocation.h> 7 #import <CoreLocation/CoreLocation.h>
8 #import <UIKit/UIKit.h> 8 #import <UIKit/UIKit.h>
9 9
10 #include <utility> 10 #include <utility>
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 164
165 namespace { 165 namespace {
166 class TabHistoryContext; 166 class TabHistoryContext;
167 class FaviconDriverObserverBridge; 167 class FaviconDriverObserverBridge;
168 class TabInfoBarObserver; 168 class TabInfoBarObserver;
169 169
170 // The key under which the Tab ID is stored in the WebState's serializable user 170 // The key under which the Tab ID is stored in the WebState's serializable user
171 // data. 171 // data.
172 NSString* const kTabIDKey = @"TabID"; 172 NSString* const kTabIDKey = @"TabID";
173 173
174 // The key under which the opener Tab ID is stored in the WebState's
175 // serializable user data.
176 NSString* const kOpenerIDKey = @"OpenerID";
177
178 // The key under which the opener navigation index is stored in the WebState's
179 // serializable user data.
180 NSString* const kOpenerNavigationIndexKey = @"OpenerNavigationIndex";
181
182 // Name of histogram for recording the state of the tab when the renderer is 174 // Name of histogram for recording the state of the tab when the renderer is
183 // terminated. 175 // terminated.
184 const char kRendererTerminationStateHistogram[] = 176 const char kRendererTerminationStateHistogram[] =
185 "Tab.StateAtRendererTermination"; 177 "Tab.StateAtRendererTermination";
186 178
187 // Referrer used for clicks on article suggestions on the NTP. 179 // Referrer used for clicks on article suggestions on the NTP.
188 const char kChromeContentSuggestionsReferrer[] = 180 const char kChromeContentSuggestionsReferrer[] =
189 "https://www.googleapis.com/auth/chrome-content-suggestions"; 181 "https://www.googleapis.com/auth/chrome-content-suggestions";
190 182
191 // Enum corresponding to UMA's TabForegroundState, for 183 // Enum corresponding to UMA's TabForegroundState, for
(...skipping 10 matching lines...) Expand all
202 194
203 // Returns true if the application is in the background or inactive state. 195 // Returns true if the application is in the background or inactive state.
204 bool IsApplicationStateNotActive(UIApplicationState state) { 196 bool IsApplicationStateNotActive(UIApplicationState state) {
205 return (state == UIApplicationStateBackground || 197 return (state == UIApplicationStateBackground ||
206 state == UIApplicationStateInactive); 198 state == UIApplicationStateInactive);
207 } 199 }
208 200
209 } // namespace 201 } // namespace
210 202
211 @interface Tab ()<CRWWebStateObserver, 203 @interface Tab ()<CRWWebStateObserver,
204 CRWWebControllerObserver,
212 FindInPageControllerDelegate, 205 FindInPageControllerDelegate,
213 ReaderModeControllerDelegate> { 206 ReaderModeControllerDelegate> {
214 TabModel* parentTabModel_; // weak 207 TabModel* parentTabModel_; // weak
215 ios::ChromeBrowserState* browserState_; // weak 208 ios::ChromeBrowserState* browserState_; // weak
216 209
217 base::scoped_nsobject<OpenInController> openInController_; 210 base::scoped_nsobject<OpenInController> openInController_;
218 base::WeakNSProtocol<id<PassKitDialogProvider>> passKitDialogProvider_; 211 base::WeakNSProtocol<id<PassKitDialogProvider>> passKitDialogProvider_;
219 212
220 // Whether or not this tab is currently being displayed. 213 // Whether or not this tab is currently being displayed.
221 BOOL visible_; 214 BOOL visible_;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 base::scoped_nsobject<WebControllerSnapshotHelper> 289 base::scoped_nsobject<WebControllerSnapshotHelper>
297 webControllerSnapshotHelper_; 290 webControllerSnapshotHelper_;
298 291
299 // Handles support for window.print JavaScript calls. 292 // Handles support for window.print JavaScript calls.
300 std::unique_ptr<PrintObserver> printObserver_; 293 std::unique_ptr<PrintObserver> printObserver_;
301 294
302 // AutoReloadBridge for this tab. 295 // AutoReloadBridge for this tab.
303 base::scoped_nsobject<AutoReloadBridge> autoReloadBridge_; 296 base::scoped_nsobject<AutoReloadBridge> autoReloadBridge_;
304 297
305 // WebStateImpl for this tab. 298 // WebStateImpl for this tab.
306 std::unique_ptr<web::WebStateImpl> webStateImpl_; 299 web::WebStateImpl* webStateImpl_;
307 300
308 // Allows Tab to conform CRWWebStateDelegate protocol. 301 // Allows Tab to conform CRWWebStateDelegate protocol.
309 std::unique_ptr<web::WebStateObserverBridge> webStateObserver_; 302 std::unique_ptr<web::WebStateObserverBridge> webStateObserver_;
310 303
311 // Context used by history to scope the lifetime of navigation entry 304 // Context used by history to scope the lifetime of navigation entry
312 // references to Tab. 305 // references to Tab.
313 std::unique_ptr<TabHistoryContext> tabHistoryContext_; 306 std::unique_ptr<TabHistoryContext> tabHistoryContext_;
314 307
315 // The controller for everything related to reader mode. 308 // The controller for everything related to reader mode.
316 base::scoped_nsobject<ReaderModeController> readerModeController_; 309 base::scoped_nsobject<ReaderModeController> readerModeController_;
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 468
476 @synthesize browserState = browserState_; 469 @synthesize browserState = browserState_;
477 @synthesize useGreyImageCache = useGreyImageCache_; 470 @synthesize useGreyImageCache = useGreyImageCache_;
478 @synthesize isPrerenderTab = isPrerenderTab_; 471 @synthesize isPrerenderTab = isPrerenderTab_;
479 @synthesize isLinkLoadingPrerenderTab = isLinkLoadingPrerenderTab_; 472 @synthesize isLinkLoadingPrerenderTab = isLinkLoadingPrerenderTab_;
480 @synthesize isVoiceSearchResultsTab = isVoiceSearchResultsTab_; 473 @synthesize isVoiceSearchResultsTab = isVoiceSearchResultsTab_;
481 @synthesize delegate = delegate_; 474 @synthesize delegate = delegate_;
482 @synthesize tabSnapshottingDelegate = tabSnapshottingDelegate_; 475 @synthesize tabSnapshottingDelegate = tabSnapshottingDelegate_;
483 @synthesize tabHeadersDelegate = tabHeadersDelegate_; 476 @synthesize tabHeadersDelegate = tabHeadersDelegate_;
484 477
485 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState 478 - (instancetype)initWithWebState:(web::WebState*)webState {
486 opener:(Tab*)opener
487 openedByDOM:(BOOL)openedByDOM
488 model:(TabModel*)parentModel {
489 web::WebState::CreateParams params(browserState);
490 params.created_with_opener = openedByDOM;
491 std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
492 if ([opener navigationManager]) {
493 web::SerializableUserDataManager* userDataManager =
494 web::SerializableUserDataManager::FromWebState(webState.get());
495 userDataManager->AddSerializableData(opener.tabId, kOpenerIDKey);
496 userDataManager->AddSerializableData(
497 @([opener navigationManager]->GetLastCommittedItemIndex()),
498 kOpenerNavigationIndexKey);
499 }
500
501 return [self initWithWebState:std::move(webState) model:parentModel];
502 }
503
504 - (instancetype)initWithWebState:(std::unique_ptr<web::WebState>)webState
505 model:(TabModel*)parentModel {
506 return [self initWithWebState:std::move(webState)
507 model:parentModel
508 attachTabHelpers:YES];
509 }
510
511 - (instancetype)initWithWebState:(std::unique_ptr<web::WebState>)webState
512 model:(TabModel*)parentModel
513 attachTabHelpers:(BOOL)attachTabHelpers {
514 DCHECK(webState); 479 DCHECK(webState);
515 self = [super init]; 480 self = [super init];
516 if (self) { 481 if (self) {
517 propertyReleaser_Tab_.Init(self, [Tab class]); 482 propertyReleaser_Tab_.Init(self, [Tab class]);
518 tabHistoryContext_.reset(new TabHistoryContext()); 483
519 parentTabModel_ = parentModel; 484 // TODO(crbug.com/620465): Tab should only use public API of WebState.
485 // Remove this cast once this is the case.
486 webStateImpl_ = static_cast<web::WebStateImpl*>(webState);
520 browserState_ = 487 browserState_ =
521 ios::ChromeBrowserState::FromBrowserState(webState->GetBrowserState()); 488 ios::ChromeBrowserState::FromBrowserState(webState->GetBrowserState());
522 489
523 webStateImpl_.reset(static_cast<web::WebStateImpl*>(webState.release())); 490 tabHistoryContext_ = base::MakeUnique<TabHistoryContext>();
524 webStateObserver_.reset( 491 webStateObserver_ =
525 new web::WebStateObserverBridge(self.webState, self)); 492 base::MakeUnique<web::WebStateObserverBridge>(webState, self);
493
526 [self updateLastVisitedTimestamp]; 494 [self updateLastVisitedTimestamp];
527 495 [[self webController] addObserver:self];
528 // Do not respect |attachTabHelpers| as this tab helper is required for 496 [[self webController] setDelegate:self];
529 // proper conversion from WebState to Tab.
530 LegacyTabHelper::CreateForWebState(self.webState, self);
531
532 [self.webController setDelegate:self];
533 497
534 snapshotManager_.reset([[SnapshotManager alloc] init]); 498 snapshotManager_.reset([[SnapshotManager alloc] init]);
535 webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc] 499 webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc]
536 initWithSnapshotManager:snapshotManager_ 500 initWithSnapshotManager:snapshotManager_
537 tab:self]); 501 tab:self]);
538 502
539 [self initNativeAppNavigationController]; 503 [self initNativeAppNavigationController];
540 504
541 if (attachTabHelpers) {
542 AttachTabHelpers(self.webState);
543
544 tabInfoBarObserver_.reset(new TabInfoBarObserver(self));
545 tabInfoBarObserver_->SetShouldObserveInfoBarManager(true);
546
547 if (experimental_flags::IsAutoReloadEnabled()) {
548 autoReloadBridge_.reset([[AutoReloadBridge alloc] initWithTab:self]);
549 }
550 printObserver_.reset(new PrintObserver(self.webState));
551
552 base::scoped_nsprotocol<id<PasswordsUiDelegate>> passwordsUiDelegate(
553 [[PasswordsUiDelegateImpl alloc] init]);
554 passwordController_.reset([[PasswordController alloc]
555 initWithWebState:self.webState
556 passwordsUiDelegate:passwordsUiDelegate]);
557 password_manager::PasswordGenerationManager* passwordGenerationManager =
558 [passwordController_ passwordGenerationManager];
559 autofillController_.reset([[AutofillController alloc]
560 initWithBrowserState:browserState_
561 passwordGenerationManager:passwordGenerationManager
562 webState:self.webState]);
563 suggestionController_.reset([[FormSuggestionController alloc]
564 initWithWebState:self.webState
565 providers:[self suggestionProviders]]);
566 inputAccessoryViewController_.reset(
567 [[FormInputAccessoryViewController alloc]
568 initWithWebState:self.webState
569 providers:[self accessoryViewProviders]]);
570
571 [self setShouldObserveFaviconChanges:YES];
572
573 if (parentModel && parentModel.syncedWindowDelegate) {
574 IOSChromeSessionTabHelper::FromWebState(self.webState)
575 ->SetWindowID(parentModel.sessionID);
576 }
577
578 // Create the ReaderModeController immediately so it can register for
579 // WebState changes.
580 if (experimental_flags::IsReaderModeEnabled()) {
581 readerModeController_.reset([[ReaderModeController alloc]
582 initWithWebState:self.webState
583 delegate:self]);
584 }
585 }
586
587 [[NSNotificationCenter defaultCenter] 505 [[NSNotificationCenter defaultCenter]
588 addObserver:self 506 addObserver:self
589 selector:@selector(applicationDidBecomeActive) 507 selector:@selector(applicationDidBecomeActive)
590 name:UIApplicationDidBecomeActiveNotification 508 name:UIApplicationDidBecomeActiveNotification
591 object:nil]; 509 object:nil];
592 } 510 }
593 return self; 511 return self;
594 } 512 }
595 513
514 - (void)attachTabHelpers {
515 tabInfoBarObserver_.reset(new TabInfoBarObserver(self));
516 tabInfoBarObserver_->SetShouldObserveInfoBarManager(true);
517
518 if (experimental_flags::IsAutoReloadEnabled()) {
519 autoReloadBridge_.reset([[AutoReloadBridge alloc] initWithTab:self]);
520 }
521 printObserver_ = base::MakeUnique<PrintObserver>(self.webState);
522
523 base::scoped_nsprotocol<id<PasswordsUiDelegate>> passwordsUiDelegate(
524 [[PasswordsUiDelegateImpl alloc] init]);
525 passwordController_.reset([[PasswordController alloc]
526 initWithWebState:self.webState
527 passwordsUiDelegate:passwordsUiDelegate]);
528 password_manager::PasswordGenerationManager* passwordGenerationManager =
529 [passwordController_ passwordGenerationManager];
530 autofillController_.reset([[AutofillController alloc]
531 initWithBrowserState:browserState_
532 passwordGenerationManager:passwordGenerationManager
533 webState:self.webState]);
534 suggestionController_.reset([[FormSuggestionController alloc]
535 initWithWebState:self.webState
536 providers:[self suggestionProviders]]);
537 inputAccessoryViewController_.reset([[FormInputAccessoryViewController alloc]
538 initWithWebState:self.webState
539 providers:[self accessoryViewProviders]]);
540
541 [self setShouldObserveFaviconChanges:YES];
542
543 // Create the ReaderModeController immediately so it can register for
544 // WebState changes.
545 if (experimental_flags::IsReaderModeEnabled()) {
546 readerModeController_.reset([[ReaderModeController alloc]
547 initWithWebState:self.webState
548 delegate:self]);
549 }
550 }
551
596 - (NSArray*)accessoryViewProviders { 552 - (NSArray*)accessoryViewProviders {
597 NSMutableArray* providers = [NSMutableArray array]; 553 NSMutableArray* providers = [NSMutableArray array];
598 id<FormInputAccessoryViewProvider> provider = 554 id<FormInputAccessoryViewProvider> provider =
599 [passwordController_ accessoryViewProvider]; 555 [passwordController_ accessoryViewProvider];
600 if (provider) 556 if (provider)
601 [providers addObject:provider]; 557 [providers addObject:provider];
602 [providers addObject:[suggestionController_ accessoryViewProvider]]; 558 [providers addObject:[suggestionController_ accessoryViewProvider]];
603 return providers; 559 return providers;
604 } 560 }
605 561
606 - (NSArray*)suggestionProviders { 562 - (NSArray*)suggestionProviders {
607 NSMutableArray* providers = [NSMutableArray array]; 563 NSMutableArray* providers = [NSMutableArray array];
608 [providers addObject:[passwordController_ suggestionProvider]]; 564 [providers addObject:[passwordController_ suggestionProvider]];
609 [providers addObject:[autofillController_ suggestionProvider]]; 565 [providers addObject:[autofillController_ suggestionProvider]];
610 return providers; 566 return providers;
611 } 567 }
612 568
613 - (id<FindInPageControllerDelegate>)findInPageControllerDelegate { 569 - (id<FindInPageControllerDelegate>)findInPageControllerDelegate {
614 return self; 570 return self;
615 } 571 }
616 572
617 + (Tab*)preloadingTabWithBrowserState:(ios::ChromeBrowserState*)browserState
618 url:(const GURL&)URL
619 referrer:(const web::Referrer&)referrer
620 transition:(ui::PageTransition)transition
621 provider:(id<CRWNativeContentProvider>)provider
622 opener:(Tab*)opener
623 desktopUserAgent:(BOOL)desktopUserAgent
624 configuration:(void (^)(Tab*))configuration {
625 Tab* tab = [[[Tab alloc] initWithBrowserState:browserState
626 opener:opener
627 openedByDOM:NO
628 model:nil] autorelease];
629 [[tab webController] setNativeProvider:provider];
630 [[tab webController] setWebUsageEnabled:YES];
631
632 if (configuration)
633 configuration(tab);
634
635 web::NavigationManager::WebLoadParams params(URL);
636 params.transition_type = transition;
637 params.referrer = referrer;
638 if (desktopUserAgent) {
639 params.user_agent_override_option =
640 web::NavigationManager::UserAgentOverrideOption::DESKTOP;
641 }
642
643 [[tab webController] loadWithParams:params];
644
645 return tab;
646 }
647
648 - (void)dealloc {
649 DCHECK([NSThread isMainThread]);
650 // Note that -[CRWWebController close] has already been called, so nothing
651 // significant should be done with it in this method.
652 DCHECK_NE(self.webController.delegate, self);
653 [super dealloc];
654 }
655
656 - (void)setParentTabModel:(TabModel*)model { 573 - (void)setParentTabModel:(TabModel*)model {
657 DCHECK(!model || !parentTabModel_); 574 DCHECK(!model || !parentTabModel_);
658 parentTabModel_ = model; 575 parentTabModel_ = model;
659 576
660 if (parentTabModel_.syncedWindowDelegate) { 577 if (parentTabModel_.syncedWindowDelegate) {
661 IOSChromeSessionTabHelper::FromWebState(self.webState) 578 IOSChromeSessionTabHelper::FromWebState(self.webState)
662 ->SetWindowID(model.sessionID); 579 ->SetWindowID(model.sessionID);
663 } 580 }
664 } 581 }
665 582
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 664
748 if (!tabId || ![tabId length]) { 665 if (!tabId || ![tabId length]) {
749 tabId = [[NSUUID UUID] UUIDString]; 666 tabId = [[NSUUID UUID] UUIDString];
750 userDataManager->AddSerializableData(tabId, kTabIDKey); 667 userDataManager->AddSerializableData(tabId, kTabIDKey);
751 } 668 }
752 669
753 tabId_.reset([tabId copy]); 670 tabId_.reset([tabId copy]);
754 return tabId_.get(); 671 return tabId_.get();
755 } 672 }
756 673
757 - (NSString*)openerID {
758 DCHECK(self.webState);
759 web::SerializableUserDataManager* userDataManager =
760 web::SerializableUserDataManager::FromWebState(self.webState);
761 id<NSCoding> openerID =
762 userDataManager->GetValueForSerializationKey(kOpenerIDKey);
763 return base::mac::ObjCCastStrict<NSString>(openerID);
764 }
765
766 - (NSInteger)openerNavigationIndex {
767 DCHECK(self.webState);
768 web::SerializableUserDataManager* userDataManager =
769 web::SerializableUserDataManager::FromWebState(self.webState);
770 id<NSCoding> openerNavigationIndex =
771 userDataManager->GetValueForSerializationKey(kOpenerNavigationIndexKey);
772 if (!openerNavigationIndex)
773 return -1;
774 return base::mac::ObjCCastStrict<NSNumber>(openerNavigationIndex)
775 .integerValue;
776 }
777
778 - (web::WebState*)webState { 674 - (web::WebState*)webState {
779 return webStateImpl_.get(); 675 return webStateImpl_;
780 } 676 }
781 677
782 - (void)fetchFavicon { 678 - (void)fetchFavicon {
783 const GURL& url = self.url; 679 const GURL& url = self.url;
784 if (!url.is_valid()) 680 if (!url.is_valid())
785 return; 681 return;
786 682
787 favicon::FaviconDriver* faviconDriver = 683 favicon::FaviconDriver* faviconDriver =
788 favicon::WebFaviconDriver::FromWebState(self.webState); 684 favicon::WebFaviconDriver::FromWebState(self.webState);
789 if (faviconDriver) { 685 if (faviconDriver) {
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 // Equivalent to the user pressing 'stop', or a window.stop() command. 1032 // Equivalent to the user pressing 'stop', or a window.stop() command.
1137 - (void)stopLoading { 1033 - (void)stopLoading {
1138 [self.webController stopLoading]; 1034 [self.webController stopLoading];
1139 } 1035 }
1140 1036
1141 // Halt the tab, which amounts to halting its webController. 1037 // Halt the tab, which amounts to halting its webController.
1142 - (void)terminateNetworkActivity { 1038 - (void)terminateNetworkActivity {
1143 [self.webController terminateNetworkActivity]; 1039 [self.webController terminateNetworkActivity];
1144 } 1040 }
1145 1041
1146 // This can't be done in dealloc in case someone holds an extra strong 1042 - (void)webStateDestroyed:(web::WebState*)webState {
1147 // reference to the Tab, which would cause the close sequence to fire at a 1043 DCHECK_EQ(webStateImpl_, webState);
1148 // random time.
1149 - (void)close {
1150 self.fullScreenControllerDelegate = nil; 1044 self.fullScreenControllerDelegate = nil;
1151 self.overscrollActionsControllerDelegate = nil; 1045 self.overscrollActionsControllerDelegate = nil;
1152 self.passKitDialogProvider = nil; 1046 self.passKitDialogProvider = nil;
1153 self.snapshotOverlayProvider = nil; 1047 self.snapshotOverlayProvider = nil;
1154 1048
1155 [[NSNotificationCenter defaultCenter] removeObserver:self]; 1049 [[NSNotificationCenter defaultCenter] removeObserver:self];
1156 1050
1157 [passwordController_ detach]; 1051 [passwordController_ detach];
1158 passwordController_.reset(); 1052 passwordController_.reset();
1159 tabInfoBarObserver_.reset(); 1053 tabInfoBarObserver_.reset();
(...skipping 10 matching lines...) Expand all
1170 if (overscrollActionsController_) 1064 if (overscrollActionsController_)
1171 [self.webController removeObserver:overscrollActionsController_]; 1065 [self.webController removeObserver:overscrollActionsController_];
1172 [overscrollActionsController_ invalidate]; 1066 [overscrollActionsController_ invalidate];
1173 overscrollActionsController_.reset(); 1067 overscrollActionsController_.reset();
1174 [readerModeController_ detachFromWebState]; 1068 [readerModeController_ detachFromWebState];
1175 readerModeController_.reset(); 1069 readerModeController_.reset();
1176 1070
1177 // Invalidate any snapshot stored for this session. 1071 // Invalidate any snapshot stored for this session.
1178 DCHECK(self.tabId); 1072 DCHECK(self.tabId);
1179 [snapshotManager_ removeImageWithSessionID:self.tabId]; 1073 [snapshotManager_ removeImageWithSessionID:self.tabId];
1180 // Reset association with the webController.
1181 [self.webController setDelegate:nil];
1182 1074
1183 // Cancel any queued dialogs. 1075 // Cancel any queued dialogs.
1184 [self.dialogDelegate cancelDialogForTab:self]; 1076 [self.dialogDelegate cancelDialogForTab:self];
1185 1077
1186 // These steps must be done last, and must be done in this order; nothing
1187 // involving the tab should be done after didCloseTab:, and the
1188 // CRWWebController backing the tab should outlive anything done during tab
1189 // closure (since -[CRWWebController close] is what begins tearing down the
1190 // web/ layer, and tab closure may trigger operations that need to query the
1191 // web/ layer). The scoped strong ref is because didCloseTab: is often the
1192 // trigger for deallocating the tab, but that can in turn cause
1193 // CRWWebController to be deallocated before its close is called. The facade
1194 // delegate should be torn down after |-didCloseTab:| so components triggered
1195 // by tab closure can use the content facade, and it should be deleted before
1196 // the web controller since the web controller owns the facade's backing
1197 // objects. |parentTabModel_| is reset after calling |-didCloseTab:| to
1198 // prevent propagating WebState notifications that happen during WebState
1199 // destruction.
1200 // TODO(crbug.com/546222): Fix the need for this; TabModel should be
1201 // responsible for making the lifetime of Tab sane, rather than allowing Tab
1202 // to drive its own destruction.
1203 base::scoped_nsobject<Tab> kungFuDeathGrip([self retain]);
1204 [parentTabModel_ didCloseTab:self]; // Inform parent of tab closure.
1205 parentTabModel_ = nil;
1206
1207 // Destroy the WebState but first stop listening to WebState events (as |self|
1208 // is in no state to respond to the notifications if |webStateImpl_| is null).
1209 LegacyTabHelper::RemoveFromWebState(self.webState);
1210 webStateObserver_.reset(); 1078 webStateObserver_.reset();
1211 webStateImpl_.reset(); 1079 webStateImpl_ = nullptr;
1212 } 1080 }
1213 1081
1214 - (void)dismissModals { 1082 - (void)dismissModals {
1215 [openInController_ disable]; 1083 [openInController_ disable];
1216 [self.webController dismissModals]; 1084 [self.webController dismissModals];
1217 } 1085 }
1218 1086
1219 - (void)setShouldObserveInfoBarManager:(BOOL)shouldObserveInfoBarManager { 1087 - (void)setShouldObserveInfoBarManager:(BOOL)shouldObserveInfoBarManager {
1220 tabInfoBarObserver_->SetShouldObserveInfoBarManager( 1088 tabInfoBarObserver_->SetShouldObserveInfoBarManager(
1221 shouldObserveInfoBarManager); 1089 shouldObserveInfoBarManager);
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 - (void)setSnapshotOverlayProvider: 1408 - (void)setSnapshotOverlayProvider:
1541 (id<SnapshotOverlayProvider>)snapshotOverlayProvider { 1409 (id<SnapshotOverlayProvider>)snapshotOverlayProvider {
1542 snapshotOverlayProvider_.reset(snapshotOverlayProvider); 1410 snapshotOverlayProvider_.reset(snapshotOverlayProvider);
1543 } 1411 }
1544 1412
1545 - (void)evaluateU2FResultFromURL:(const GURL&)URL { 1413 - (void)evaluateU2FResultFromURL:(const GURL&)URL {
1546 DCHECK(U2FController_); 1414 DCHECK(U2FController_);
1547 [U2FController_ evaluateU2FResultFromU2FURL:URL webState:self.webState]; 1415 [U2FController_ evaluateU2FResultFromU2FURL:URL webState:self.webState];
1548 } 1416 }
1549 1417
1418 #pragma mark - CRWWebControllerObserver protocol methods.
1419
1420 - (void)webControllerWillClose:(CRWWebController*)webController {
1421 DCHECK_EQ(webController, [self webController]);
1422 [[self webController] removeObserver:self];
1423 [[self webController] setDelegate:nil];
1424 }
1425
1550 #pragma mark - CRWWebDelegate and CRWWebStateObserver protocol methods. 1426 #pragma mark - CRWWebDelegate and CRWWebStateObserver protocol methods.
1551 1427
1552 // This method is invoked whenever the system believes the URL is about to 1428 // This method is invoked whenever the system believes the URL is about to
1553 // change, or immediately after any unexpected change of the URL. The apparent 1429 // change, or immediately after any unexpected change of the URL. The apparent
1554 // destination URL is included in the |url| parameter. 1430 // destination URL is included in the |url| parameter.
1555 // Warning: because of the present design it is possible for malicious websites 1431 // Warning: because of the present design it is possible for malicious websites
1556 // to invoke superflous instances of this delegate with artibrary URLs. 1432 // to invoke superflous instances of this delegate with artibrary URLs.
1557 // Ensure there is nothing here that could be a risk to the user beyond mild 1433 // Ensure there is nothing here that could be a risk to the user beyond mild
1558 // confusion in that event (e.g. progress bar starting unexpectedly). 1434 // confusion in that event (e.g. progress bar starting unexpectedly).
1559 - (void)webWillAddPendingURL:(const GURL&)url 1435 - (void)webWillAddPendingURL:(const GURL&)url
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
2100 1976
2101 - (TabModel*)parentTabModel { 1977 - (TabModel*)parentTabModel {
2102 return parentTabModel_; 1978 return parentTabModel_;
2103 } 1979 }
2104 1980
2105 - (FormInputAccessoryViewController*)inputAccessoryViewController { 1981 - (FormInputAccessoryViewController*)inputAccessoryViewController {
2106 return inputAccessoryViewController_.get(); 1982 return inputAccessoryViewController_.get();
2107 } 1983 }
2108 1984
2109 @end 1985 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/tabs/tab.h ('k') | ios/chrome/browser/tabs/tab_helper_util.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698