| OLD | NEW |
| 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 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 std::unique_ptr<web::WebStateImpl> webState( | 507 std::unique_ptr<web::WebStateImpl> webState( |
| 508 new web::WebStateImpl(browserState)); | 508 new web::WebStateImpl(browserState)); |
| 509 webState->GetNavigationManagerImpl().InitializeSession( | 509 webState->GetNavigationManagerImpl().InitializeSession( |
| 510 windowName, opener.tabId, openedByDOM, openerIndex); | 510 windowName, opener.tabId, openedByDOM, openerIndex); |
| 511 | 511 |
| 512 return [self initWithWebState:std::move(webState) model:parentModel]; | 512 return [self initWithWebState:std::move(webState) model:parentModel]; |
| 513 } | 513 } |
| 514 | 514 |
| 515 - (instancetype)initWithWebState:(std::unique_ptr<web::WebState>)webState | 515 - (instancetype)initWithWebState:(std::unique_ptr<web::WebState>)webState |
| 516 model:(TabModel*)parentModel { | 516 model:(TabModel*)parentModel { |
| 517 return [self initWithWebState:std::move(webState) |
| 518 model:parentModel |
| 519 attachTabHelpers:YES]; |
| 520 } |
| 521 |
| 522 - (instancetype)initWithWebState:(std::unique_ptr<web::WebState>)webState |
| 523 model:(TabModel*)parentModel |
| 524 attachTabHelpers:(BOOL)attachTabHelpers { |
| 517 DCHECK(webState); | 525 DCHECK(webState); |
| 518 self = [super init]; | 526 self = [super init]; |
| 519 if (self) { | 527 if (self) { |
| 520 propertyReleaser_Tab_.Init(self, [Tab class]); | 528 propertyReleaser_Tab_.Init(self, [Tab class]); |
| 521 tabHistoryContext_.reset(new TabHistoryContext()); | 529 tabHistoryContext_.reset(new TabHistoryContext()); |
| 522 parentTabModel_ = parentModel; | 530 parentTabModel_ = parentModel; |
| 523 browserState_ = | 531 browserState_ = |
| 524 ios::ChromeBrowserState::FromBrowserState(webState->GetBrowserState()); | 532 ios::ChromeBrowserState::FromBrowserState(webState->GetBrowserState()); |
| 525 | 533 |
| 526 webStateImpl_.reset(static_cast<web::WebStateImpl*>(webState.release())); | 534 webStateImpl_.reset(static_cast<web::WebStateImpl*>(webState.release())); |
| 527 webStateObserver_.reset( | 535 webStateObserver_.reset( |
| 528 new web::WebStateObserverBridge(webStateImpl_.get(), self)); | 536 new web::WebStateObserverBridge(webStateImpl_.get(), self)); |
| 529 | 537 |
| 530 [self.webController setDelegate:self]; | 538 [self.webController setDelegate:self]; |
| 531 | 539 |
| 532 NSString* sessionID = self.tabId; | 540 NSString* sessionID = self.tabId; |
| 533 DCHECK(sessionID); | 541 DCHECK(sessionID); |
| 534 snapshotManager_.reset([[SnapshotManager alloc] init]); | 542 snapshotManager_.reset([[SnapshotManager alloc] init]); |
| 535 | 543 |
| 536 webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc] | 544 webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc] |
| 537 initWithSnapshotManager:snapshotManager_ | 545 initWithSnapshotManager:snapshotManager_ |
| 538 tab:self]); | 546 tab:self]); |
| 539 | 547 |
| 540 findInPageController_.reset([[FindInPageController alloc] | 548 findInPageController_.reset([[FindInPageController alloc] |
| 541 initWithWebState:self.webState | 549 initWithWebState:self.webState |
| 542 delegate:self]); | 550 delegate:self]); |
| 543 | 551 |
| 544 [self initNativeAppNavigationController]; | 552 [self initNativeAppNavigationController]; |
| 545 // IOSChromeSessionTabHelper comes first because it sets up the tab ID, and | |
| 546 // other helpers may rely on that. | |
| 547 IOSChromeSessionTabHelper::CreateForWebState(self.webState); | |
| 548 | 553 |
| 549 NetworkActivityIndicatorTabHelper::CreateForWebState(self.webState, | 554 if (attachTabHelpers) { |
| 550 self.tabId); | 555 // IOSChromeSessionTabHelper comes first because it sets up the tab ID, |
| 551 IOSChromeSyncedTabDelegate::CreateForWebState(self.webState); | 556 // and other helpers may rely on that. |
| 552 InfoBarManagerImpl::CreateForWebState(self.webState); | 557 IOSChromeSessionTabHelper::CreateForWebState(self.webState); |
| 553 IOSSecurityStateTabHelper::CreateForWebState(self.webState); | |
| 554 RepostFormTabHelper::CreateForWebState(self.webState); | |
| 555 BlockedPopupTabHelper::CreateForWebState(self.webState); | |
| 556 | 558 |
| 557 if (reading_list::switches::IsReadingListEnabled()) { | 559 NetworkActivityIndicatorTabHelper::CreateForWebState(self.webState, |
| 558 ReadingListModel* model = | 560 self.tabId); |
| 559 ReadingListModelFactory::GetForBrowserState(browserState_); | 561 IOSChromeSyncedTabDelegate::CreateForWebState(self.webState); |
| 560 ReadingListWebStateObserver::FromWebState(self.webState, model); | 562 InfoBarManagerImpl::CreateForWebState(self.webState); |
| 563 IOSSecurityStateTabHelper::CreateForWebState(self.webState); |
| 564 RepostFormTabHelper::CreateForWebState(self.webState); |
| 565 BlockedPopupTabHelper::CreateForWebState(self.webState); |
| 566 |
| 567 if (reading_list::switches::IsReadingListEnabled()) { |
| 568 ReadingListModel* model = |
| 569 ReadingListModelFactory::GetForBrowserState(browserState_); |
| 570 ReadingListWebStateObserver::FromWebState(self.webState, model); |
| 571 } |
| 572 |
| 573 tabInfoBarObserver_.reset(new TabInfoBarObserver(self)); |
| 574 tabInfoBarObserver_->SetShouldObserveInfoBarManager(true); |
| 575 |
| 576 if (AccountConsistencyService* account_consistency_service = |
| 577 ios::AccountConsistencyServiceFactory::GetForBrowserState( |
| 578 browserState_)) { |
| 579 account_consistency_service->SetWebStateHandler(self.webState, self); |
| 580 } |
| 581 ChromeIOSTranslateClient::CreateForWebState(self.webState); |
| 582 if (experimental_flags::IsAutoReloadEnabled()) { |
| 583 autoReloadBridge_.reset([[AutoReloadBridge alloc] initWithTab:self]); |
| 584 } |
| 585 printObserver_.reset(new PrintObserver(self.webState)); |
| 586 |
| 587 base::scoped_nsprotocol<id<PasswordsUiDelegate>> passwordsUiDelegate( |
| 588 [[PasswordsUiDelegateImpl alloc] init]); |
| 589 passwordController_.reset([[PasswordController alloc] |
| 590 initWithWebState:self.webState |
| 591 passwordsUiDelegate:passwordsUiDelegate]); |
| 592 password_manager::PasswordGenerationManager* passwordGenerationManager = |
| 593 [passwordController_ passwordGenerationManager]; |
| 594 autofillController_.reset([[AutofillController alloc] |
| 595 initWithBrowserState:browserState_ |
| 596 passwordGenerationManager:passwordGenerationManager |
| 597 webState:self.webState]); |
| 598 suggestionController_.reset([[FormSuggestionController alloc] |
| 599 initWithWebState:self.webState |
| 600 providers:[self suggestionProviders]]); |
| 601 inputAccessoryViewController_.reset( |
| 602 [[FormInputAccessoryViewController alloc] |
| 603 initWithWebState:self.webState |
| 604 providers:[self accessoryViewProviders]]); |
| 605 |
| 606 ios::ChromeBrowserState* original_browser_state = |
| 607 ios::ChromeBrowserState::FromBrowserState( |
| 608 self.webState->GetBrowserState()) |
| 609 ->GetOriginalChromeBrowserState(); |
| 610 favicon::WebFaviconDriver::CreateForWebState( |
| 611 self.webState, |
| 612 ios::FaviconServiceFactory::GetForBrowserState( |
| 613 original_browser_state, ServiceAccessType::IMPLICIT_ACCESS), |
| 614 ios::HistoryServiceFactory::GetForBrowserState( |
| 615 original_browser_state, ServiceAccessType::IMPLICIT_ACCESS), |
| 616 ios::BookmarkModelFactory::GetForBrowserState( |
| 617 original_browser_state)); |
| 618 history::WebStateTopSitesObserver::CreateForWebState( |
| 619 self.webState, |
| 620 ios::TopSitesFactory::GetForBrowserState(original_browser_state) |
| 621 .get()); |
| 622 [self setShouldObserveFaviconChanges:YES]; |
| 623 |
| 624 if (parentModel && parentModel.syncedWindowDelegate) { |
| 625 IOSChromeSessionTabHelper::FromWebState(self.webState) |
| 626 ->SetWindowID(parentModel.sessionID); |
| 627 } |
| 628 |
| 629 // Create the ReaderModeController immediately so it can register for |
| 630 // WebState changes. |
| 631 if (experimental_flags::IsReaderModeEnabled()) { |
| 632 readerModeController_.reset([[ReaderModeController alloc] |
| 633 initWithWebState:self.webState |
| 634 delegate:self]); |
| 635 } |
| 636 |
| 637 // Allow the embedder to attach tab helpers. |
| 638 ios::GetChromeBrowserProvider()->AttachTabHelpers(self.webState, self); |
| 561 } | 639 } |
| 562 | 640 |
| 563 tabInfoBarObserver_.reset(new TabInfoBarObserver(self)); | |
| 564 tabInfoBarObserver_->SetShouldObserveInfoBarManager(true); | |
| 565 | |
| 566 if (AccountConsistencyService* account_consistency_service = | |
| 567 ios::AccountConsistencyServiceFactory::GetForBrowserState( | |
| 568 browserState_)) { | |
| 569 account_consistency_service->SetWebStateHandler(self.webState, self); | |
| 570 } | |
| 571 ChromeIOSTranslateClient::CreateForWebState(self.webState); | |
| 572 if (experimental_flags::IsAutoReloadEnabled()) { | |
| 573 autoReloadBridge_.reset([[AutoReloadBridge alloc] initWithTab:self]); | |
| 574 } | |
| 575 printObserver_.reset(new PrintObserver(self.webState)); | |
| 576 | |
| 577 base::scoped_nsprotocol<id<PasswordsUiDelegate>> passwordsUiDelegate( | |
| 578 [[PasswordsUiDelegateImpl alloc] init]); | |
| 579 passwordController_.reset([[PasswordController alloc] | |
| 580 initWithWebState:self.webState | |
| 581 passwordsUiDelegate:passwordsUiDelegate]); | |
| 582 password_manager::PasswordGenerationManager* passwordGenerationManager = | |
| 583 [passwordController_ passwordGenerationManager]; | |
| 584 autofillController_.reset([[AutofillController alloc] | |
| 585 initWithBrowserState:browserState_ | |
| 586 passwordGenerationManager:passwordGenerationManager | |
| 587 webState:self.webState]); | |
| 588 suggestionController_.reset([[FormSuggestionController alloc] | |
| 589 initWithWebState:self.webState | |
| 590 providers:[self suggestionProviders]]); | |
| 591 inputAccessoryViewController_.reset( | |
| 592 [[FormInputAccessoryViewController alloc] | |
| 593 initWithWebState:self.webState | |
| 594 providers:[self accessoryViewProviders]]); | |
| 595 | |
| 596 ios::ChromeBrowserState* original_browser_state = | |
| 597 ios::ChromeBrowserState::FromBrowserState( | |
| 598 self.webState->GetBrowserState()) | |
| 599 ->GetOriginalChromeBrowserState(); | |
| 600 favicon::WebFaviconDriver::CreateForWebState( | |
| 601 self.webState, | |
| 602 ios::FaviconServiceFactory::GetForBrowserState( | |
| 603 original_browser_state, ServiceAccessType::IMPLICIT_ACCESS), | |
| 604 ios::HistoryServiceFactory::GetForBrowserState( | |
| 605 original_browser_state, ServiceAccessType::IMPLICIT_ACCESS), | |
| 606 ios::BookmarkModelFactory::GetForBrowserState(original_browser_state)); | |
| 607 history::WebStateTopSitesObserver::CreateForWebState( | |
| 608 self.webState, | |
| 609 ios::TopSitesFactory::GetForBrowserState(original_browser_state).get()); | |
| 610 [self setShouldObserveFaviconChanges:YES]; | |
| 611 | |
| 612 if (parentModel && parentModel.syncedWindowDelegate) { | |
| 613 IOSChromeSessionTabHelper::FromWebState(self.webState) | |
| 614 ->SetWindowID(parentModel.sessionID); | |
| 615 } | |
| 616 | |
| 617 // Create the ReaderModeController immediately so it can register for | |
| 618 // WebState changes. | |
| 619 if (experimental_flags::IsReaderModeEnabled()) { | |
| 620 readerModeController_.reset([[ReaderModeController alloc] | |
| 621 initWithWebState:self.webState | |
| 622 delegate:self]); | |
| 623 } | |
| 624 | |
| 625 // Allow the embedder to attach tab helpers. | |
| 626 ios::GetChromeBrowserProvider()->AttachTabHelpers(self.webState, self); | |
| 627 | |
| 628 [[NSNotificationCenter defaultCenter] | 641 [[NSNotificationCenter defaultCenter] |
| 629 addObserver:self | 642 addObserver:self |
| 630 selector:@selector(applicationDidBecomeActive) | 643 selector:@selector(applicationDidBecomeActive) |
| 631 name:UIApplicationDidBecomeActiveNotification | 644 name:UIApplicationDidBecomeActiveNotification |
| 632 object:nil]; | 645 object:nil]; |
| 633 } | 646 } |
| 634 return self; | 647 return self; |
| 635 } | 648 } |
| 636 | 649 |
| 637 - (instancetype)init { | 650 - (instancetype)init { |
| (...skipping 1584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2222 return (fromIndex != NSNotFound && toIndex != NSNotFound && | 2235 return (fromIndex != NSNotFound && toIndex != NSNotFound && |
| 2223 fromIndex > toIndex); | 2236 fromIndex > toIndex); |
| 2224 } | 2237 } |
| 2225 | 2238 |
| 2226 @end | 2239 @end |
| 2227 | 2240 |
| 2228 #pragma mark - TestingSupport | 2241 #pragma mark - TestingSupport |
| 2229 | 2242 |
| 2230 @implementation Tab (TestingSupport) | 2243 @implementation Tab (TestingSupport) |
| 2231 | 2244 |
| 2232 - (void)replaceWebState:(std::unique_ptr<web::WebStateImpl>)webState { | |
| 2233 // Stop observing the old InfoBarManager and FaviconDriver since they will | |
| 2234 // be deleted with the old web controller. | |
| 2235 [self setShouldObserveInfoBarManager:NO]; | |
| 2236 [self setShouldObserveFaviconChanges:NO]; | |
| 2237 [self.webController setDelegate:nil]; | |
| 2238 // Set the new web state. | |
| 2239 webStateImpl_ = std::move(webState); | |
| 2240 [self.webController setDelegate:self]; | |
| 2241 webStateObserver_.reset( | |
| 2242 new web::WebStateObserverBridge(webStateImpl_.get(), self)); | |
| 2243 // SessionTabHelper comes first because it sets up the tab ID, and other | |
| 2244 // helpers may rely on that. | |
| 2245 IOSChromeSessionTabHelper::CreateForWebState(webStateImpl_.get()); | |
| 2246 IOSChromeSyncedTabDelegate::CreateForWebState(webStateImpl_.get()); | |
| 2247 // Start observing the new web controller's InfoBarManager and FaviconDriver. | |
| 2248 [self setShouldObserveInfoBarManager:YES]; | |
| 2249 [self setShouldObserveFaviconChanges:YES]; | |
| 2250 findInPageController_.reset(); | |
| 2251 } | |
| 2252 | |
| 2253 - (void)replaceExternalAppLauncher:(id)externalAppLauncher { | 2245 - (void)replaceExternalAppLauncher:(id)externalAppLauncher { |
| 2254 externalAppLauncher_.reset([externalAppLauncher retain]); | 2246 externalAppLauncher_.reset([externalAppLauncher retain]); |
| 2255 } | 2247 } |
| 2256 | 2248 |
| 2257 - (TabModel*)parentTabModel { | 2249 - (TabModel*)parentTabModel { |
| 2258 return parentTabModel_; | 2250 return parentTabModel_; |
| 2259 } | 2251 } |
| 2260 | 2252 |
| 2261 - (FormInputAccessoryViewController*)inputAccessoryViewController { | 2253 - (FormInputAccessoryViewController*)inputAccessoryViewController { |
| 2262 return inputAccessoryViewController_.get(); | 2254 return inputAccessoryViewController_.get(); |
| 2263 } | 2255 } |
| 2264 | 2256 |
| 2265 @end | 2257 @end |
| OLD | NEW |