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

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

Issue 2857133002: [ios] ARCMigrate ios/chrome/browser/tabs/tab.mm to ARC. (Closed)
Patch Set: Rebase. Created 3 years, 7 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') | no next file » | 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>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/ios/block_types.h" 14 #include "base/ios/block_types.h"
15 #import "base/ios/weak_nsobject.h"
16 #include "base/json/string_escape.h" 15 #include "base/json/string_escape.h"
17 #include "base/logging.h" 16 #include "base/logging.h"
18 #include "base/mac/bind_objc_block.h" 17 #include "base/mac/bind_objc_block.h"
19 #include "base/mac/foundation_util.h" 18 #include "base/mac/foundation_util.h"
20 #include "base/mac/objc_property_releaser.h" 19 #include "base/memory/ptr_util.h"
21 #include "base/mac/scoped_nsobject.h"
22 #include "base/metrics/histogram_macros.h" 20 #include "base/metrics/histogram_macros.h"
23 #include "base/metrics/user_metrics.h" 21 #include "base/metrics/user_metrics.h"
24 #include "base/metrics/user_metrics_action.h" 22 #include "base/metrics/user_metrics_action.h"
25 #include "base/scoped_observer.h" 23 #include "base/scoped_observer.h"
26 #include "base/strings/string_split.h" 24 #include "base/strings/string_split.h"
27 #include "base/strings/sys_string_conversions.h" 25 #include "base/strings/sys_string_conversions.h"
28 #include "base/strings/utf_string_conversions.h" 26 #include "base/strings/utf_string_conversions.h"
29 #include "base/time/time.h" 27 #include "base/time/time.h"
30 #include "components/favicon/core/favicon_driver_observer.h" 28 #include "components/favicon/core/favicon_driver_observer.h"
31 #include "components/favicon/ios/web_favicon_driver.h" 29 #include "components/favicon/ios/web_favicon_driver.h"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 #import "net/base/mac/url_conversions.h" 135 #import "net/base/mac/url_conversions.h"
138 #include "net/base/net_errors.h" 136 #include "net/base/net_errors.h"
139 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 137 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
140 #include "net/cert/x509_certificate.h" 138 #include "net/cert/x509_certificate.h"
141 #include "net/http/http_response_headers.h" 139 #include "net/http/http_response_headers.h"
142 #include "net/url_request/url_fetcher.h" 140 #include "net/url_request/url_fetcher.h"
143 #include "ui/base/l10n/l10n_util.h" 141 #include "ui/base/l10n/l10n_util.h"
144 #include "ui/base/page_transition_types.h" 142 #include "ui/base/page_transition_types.h"
145 #include "url/origin.h" 143 #include "url/origin.h"
146 144
147 using base::UserMetricsAction; 145 #if !defined(__has_feature) || !__has_feature(objc_arc)
148 using web::NavigationManagerImpl; 146 #error "This file requires ARC support."
149 using net::RequestTracker; 147 #endif
150 148
151 NSString* const kTabUrlStartedLoadingNotificationForCrashReporting = 149 NSString* const kTabUrlStartedLoadingNotificationForCrashReporting =
152 @"kTabUrlStartedLoadingNotificationForCrashReporting"; 150 @"kTabUrlStartedLoadingNotificationForCrashReporting";
153 NSString* const kTabUrlMayStartLoadingNotificationForCrashReporting = 151 NSString* const kTabUrlMayStartLoadingNotificationForCrashReporting =
154 @"kTabUrlMayStartLoadingNotificationForCrashReporting"; 152 @"kTabUrlMayStartLoadingNotificationForCrashReporting";
155 NSString* const kTabIsShowingExportableNotificationForCrashReporting = 153 NSString* const kTabIsShowingExportableNotificationForCrashReporting =
156 @"kTabIsShowingExportableNotificationForCrashReporting"; 154 @"kTabIsShowingExportableNotificationForCrashReporting";
157 NSString* const kTabClosingCurrentDocumentNotificationForCrashReporting = 155 NSString* const kTabClosingCurrentDocumentNotificationForCrashReporting =
158 @"kTabClosingCurrentDocumentNotificationForCrashReporting"; 156 @"kTabClosingCurrentDocumentNotificationForCrashReporting";
159 157
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 195
198 // Returns true if |item| is the result of a HTTP redirect. 196 // Returns true if |item| is the result of a HTTP redirect.
199 // Returns false if |item| is nullptr; 197 // Returns false if |item| is nullptr;
200 bool IsItemRedirectItem(web::NavigationItem* item) { 198 bool IsItemRedirectItem(web::NavigationItem* item) {
201 if (!item) 199 if (!item)
202 return false; 200 return false;
203 201
204 return (ui::PageTransition::PAGE_TRANSITION_IS_REDIRECT_MASK & 202 return (ui::PageTransition::PAGE_TRANSITION_IS_REDIRECT_MASK &
205 item->GetTransitionType()) == 0; 203 item->GetTransitionType()) == 0;
206 } 204 }
205
206 // TabHistoryContext is used by history to scope the lifetime of navigation
207 // entry references to Tab.
208 class TabHistoryContext : public history::Context {
209 public:
210 TabHistoryContext() {}
211 ~TabHistoryContext() {}
212
213 private:
214 DISALLOW_COPY_AND_ASSIGN(TabHistoryContext);
215 };
207 } // namespace 216 } // namespace
208 217
209 @interface Tab ()<CRWWebStateObserver, 218 @interface Tab ()<CRWWebStateObserver,
210 CRWWebControllerObserver, 219 CRWWebControllerObserver,
211 FindInPageControllerDelegate, 220 FindInPageControllerDelegate,
212 ReaderModeControllerDelegate> { 221 ReaderModeControllerDelegate> {
213 TabModel* parentTabModel_; // weak 222 __weak TabModel* parentTabModel_;
214 ios::ChromeBrowserState* browserState_; // weak 223 ios::ChromeBrowserState* browserState_;
215 224
216 base::scoped_nsobject<OpenInController> openInController_; 225 OpenInController* openInController_;
217 base::WeakNSProtocol<id<PassKitDialogProvider>> passKitDialogProvider_;
218 226
219 // Whether or not this tab is currently being displayed. 227 // Whether or not this tab is currently being displayed.
220 BOOL visible_; 228 BOOL visible_;
221 229
222 // Holds entries that need to be added to the history DB. Prerender tabs do 230 // Holds entries that need to be added to the history DB. Prerender tabs do
223 // not write navigation data to the history DB. Instead, they cache history 231 // not write navigation data to the history DB. Instead, they cache history
224 // data in this vector and add it to the DB when the prerender status is 232 // data in this vector and add it to the DB when the prerender status is
225 // removed (when the Tab is swapped in as a real Tab). 233 // removed (when the Tab is swapped in as a real Tab).
226 std::vector<history::HistoryAddPageArgs> addPageVector_; 234 std::vector<history::HistoryAddPageArgs> addPageVector_;
227 235
228 // YES if this Tab is being prerendered. 236 // YES if this Tab is being prerendered.
229 BOOL isPrerenderTab_; 237 BOOL isPrerenderTab_;
230 238
231 // YES if this Tab was initiated from a voice search. 239 // YES if this Tab was initiated from a voice search.
232 BOOL isVoiceSearchResultsTab_; 240 BOOL isVoiceSearchResultsTab_;
233 241
234 // YES if the Tab needs to be reloaded after the app becomes active. 242 // YES if the Tab needs to be reloaded after the app becomes active.
235 BOOL requireReloadAfterBecomingActive_; 243 BOOL requireReloadAfterBecomingActive_;
236 244
237 // Last visited timestamp. 245 // Last visited timestamp.
238 double lastVisitedTimestamp_; 246 double lastVisitedTimestamp_;
239 247
240 base::mac::ObjCPropertyReleaser propertyReleaser_Tab_;
241
242 id<TabDelegate> delegate_; // weak
243 base::WeakNSProtocol<id<TabDialogDelegate>> dialogDelegate_;
244 base::WeakNSProtocol<id<SnapshotOverlayProvider>> snapshotOverlayProvider_;
245
246 // Delegate used for snapshotting geometry.
247 id<TabSnapshottingDelegate> tabSnapshottingDelegate_; // weak
248
249 // The Full Screen Controller responsible for hiding/showing the toolbar. 248 // The Full Screen Controller responsible for hiding/showing the toolbar.
250 base::scoped_nsobject<FullScreenController> fullScreenController_; 249 FullScreenController* fullScreenController_;
251
252 // The delegate responsible for headers over the tab.
253 id<TabHeadersDelegate> tabHeadersDelegate_; // weak
254
255 base::WeakNSProtocol<id<FullScreenControllerDelegate>>
256 fullScreenControllerDelegate_;
257 250
258 // The Overscroll controller responsible for displaying the 251 // The Overscroll controller responsible for displaying the
259 // overscrollActionsView above the toolbar. 252 // overscrollActionsView above the toolbar.
260 base::scoped_nsobject<OverscrollActionsController> 253 OverscrollActionsController* overscrollActionsController_;
261 overscrollActionsController_;
262 base::WeakNSProtocol<id<OverscrollActionsControllerDelegate>>
263 overscrollActionsControllerDelegate_;
264
265 base::scoped_nsobject<NSString> tabId_;
266 254
267 // Lightweight object dealing with various different UI behaviours when 255 // Lightweight object dealing with various different UI behaviours when
268 // opening a URL in an external application. 256 // opening a URL in an external application.
269 base::scoped_nsobject<ExternalAppLauncher> externalAppLauncher_; 257 ExternalAppLauncher* externalAppLauncher_;
270 258
271 // Handles suggestions for form entry. 259 // Handles suggestions for form entry.
272 base::scoped_nsobject<FormSuggestionController> suggestionController_; 260 FormSuggestionController* suggestionController_;
273 261
274 // Manages the input accessory view during form input. 262 // Manages the input accessory view during form input.
275 base::scoped_nsobject<FormInputAccessoryViewController> 263 FormInputAccessoryViewController* inputAccessoryViewController_;
276 inputAccessoryViewController_;
277
278 // TODO(crbug.com/661665): move the WebContentsObservers into their own
279 // container.
280 // Handles saving and autofill of passwords.
281 base::scoped_nsobject<PasswordController> passwordController_;
282 264
283 // Handles autofill. 265 // Handles autofill.
284 base::scoped_nsobject<AutofillController> autofillController_; 266 AutofillController* autofillController_;
285 267
286 // Handles GAL infobar on web pages. 268 // Handles GAL infobar on web pages.
287 base::scoped_nsobject<NativeAppNavigationController> 269 NativeAppNavigationController* nativeAppNavigationController_;
288 nativeAppNavigationController_;
289 270
290 // Handles caching and retrieving of snapshots. 271 // Handles caching and retrieving of snapshots.
291 base::scoped_nsobject<SnapshotManager> snapshotManager_; 272 SnapshotManager* snapshotManager_;
292 273
293 // Handles retrieving, generating and updating snapshots of CRWWebController's 274 // Handles retrieving, generating and updating snapshots of CRWWebController's
294 // web page. 275 // web page.
295 base::scoped_nsobject<WebControllerSnapshotHelper> 276 WebControllerSnapshotHelper* webControllerSnapshotHelper_;
296 webControllerSnapshotHelper_;
297 277
298 // Handles support for window.print JavaScript calls. 278 // Handles support for window.print JavaScript calls.
299 std::unique_ptr<PrintObserver> printObserver_; 279 std::unique_ptr<PrintObserver> printObserver_;
300 280
301 // AutoReloadBridge for this tab. 281 // AutoReloadBridge for this tab.
302 base::scoped_nsobject<AutoReloadBridge> autoReloadBridge_; 282 AutoReloadBridge* autoReloadBridge_;
303 283
304 // WebStateImpl for this tab. 284 // WebStateImpl for this tab.
305 web::WebStateImpl* webStateImpl_; 285 web::WebStateImpl* webStateImpl_;
306 286
307 // Allows Tab to conform CRWWebStateDelegate protocol. 287 // Allows Tab to conform CRWWebStateDelegate protocol.
308 std::unique_ptr<web::WebStateObserverBridge> webStateObserver_; 288 std::unique_ptr<web::WebStateObserverBridge> webStateObserver_;
309 289
310 // Context used by history to scope the lifetime of navigation entry 290 // Context used by history to scope the lifetime of navigation entry
311 // references to Tab. 291 // references to Tab.
312 std::unique_ptr<TabHistoryContext> tabHistoryContext_; 292 TabHistoryContext tabHistoryContext_;
313
314 // The controller for everything related to reader mode.
315 base::scoped_nsobject<ReaderModeController> readerModeController_;
316 293
317 // C++ bridge that receives notifications from the FaviconDriver. 294 // C++ bridge that receives notifications from the FaviconDriver.
318 std::unique_ptr<FaviconDriverObserverBridge> faviconDriverObserverBridge_; 295 std::unique_ptr<FaviconDriverObserverBridge> faviconDriverObserverBridge_;
319 296
320 // U2F call controller object. 297 // U2F call controller object.
321 base::scoped_nsobject<U2FController> U2FController_; 298 U2FController* U2FController_;
322 299
323 // C++ observer used to trigger snapshots after the removal of InfoBars. 300 // C++ observer used to trigger snapshots after the removal of InfoBars.
324 std::unique_ptr<TabInfoBarObserver> tabInfoBarObserver_; 301 std::unique_ptr<TabInfoBarObserver> tabInfoBarObserver_;
325 } 302 }
326 303
327 // Returns the tab's reader mode controller. May contain nil if the feature is 304 // Returns the tab's reader mode controller. May contain nil if the feature is
328 // disabled. 305 // disabled.
329 @property(nonatomic, readonly) ReaderModeController* readerModeController; 306 @property(nonatomic, readonly) ReaderModeController* readerModeController;
330 307
331 // Returns a list of FormSuggestionProviders to be queried for suggestions 308 // Returns a list of FormSuggestionProviders to be queried for suggestions
(...skipping 28 matching lines...) Expand all
360 // Called after the session history is replaced, useful for updating members 337 // Called after the session history is replaced, useful for updating members
361 // with new sessionID. 338 // with new sessionID.
362 - (void)didReplaceSessionHistory; 339 - (void)didReplaceSessionHistory;
363 340
364 // Called when the UIApplication's state becomes active. 341 // Called when the UIApplication's state becomes active.
365 - (void)applicationDidBecomeActive; 342 - (void)applicationDidBecomeActive;
366 343
367 @end 344 @end
368 345
369 namespace { 346 namespace {
370 // TabHistoryContext is used by history to scope the lifetime of navigation
371 // entry references to Tab.
372 class TabHistoryContext : public history::Context {
373 public:
374 TabHistoryContext() {}
375 ~TabHistoryContext() {}
376
377 private:
378 DISALLOW_COPY_AND_ASSIGN(TabHistoryContext);
379 };
380
381 class FaviconDriverObserverBridge : public favicon::FaviconDriverObserver { 347 class FaviconDriverObserverBridge : public favicon::FaviconDriverObserver {
382 public: 348 public:
383 FaviconDriverObserverBridge(Tab* owner, 349 FaviconDriverObserverBridge(Tab* owner,
384 favicon::FaviconDriver* favicon_driver); 350 favicon::FaviconDriver* favicon_driver);
385 ~FaviconDriverObserverBridge() override; 351 ~FaviconDriverObserverBridge() override;
386 352
387 // favicon::FaviconDriverObserver implementation. 353 // favicon::FaviconDriverObserver implementation.
388 void OnFaviconUpdated(favicon::FaviconDriver* favicon_driver, 354 void OnFaviconUpdated(favicon::FaviconDriver* favicon_driver,
389 NotificationIconType notification_icon_type, 355 NotificationIconType notification_icon_type,
390 const GURL& icon_url, 356 const GURL& icon_url,
391 bool icon_url_changed, 357 bool icon_url_changed,
392 const gfx::Image& image) override; 358 const gfx::Image& image) override;
393 359
394 private: 360 private:
395 Tab* owner_; // Owns this instance. 361 __weak Tab* owner_;
396 ScopedObserver<favicon::FaviconDriver, favicon::FaviconDriverObserver> 362 ScopedObserver<favicon::FaviconDriver, favicon::FaviconDriverObserver>
397 scoped_observer_; 363 scoped_observer_;
398 DISALLOW_COPY_AND_ASSIGN(FaviconDriverObserverBridge); 364 DISALLOW_COPY_AND_ASSIGN(FaviconDriverObserverBridge);
399 }; 365 };
400 366
401 FaviconDriverObserverBridge::FaviconDriverObserverBridge( 367 FaviconDriverObserverBridge::FaviconDriverObserverBridge(
402 Tab* owner, 368 Tab* owner,
403 favicon::FaviconDriver* favicon_driver) 369 favicon::FaviconDriver* favicon_driver)
404 : owner_(owner), scoped_observer_(this) { 370 : owner_(owner), scoped_observer_(this) {
405 scoped_observer_.Add(favicon_driver); 371 scoped_observer_.Add(favicon_driver);
(...skipping 15 matching lines...) Expand all
421 public: 387 public:
422 explicit TabInfoBarObserver(Tab* owner); 388 explicit TabInfoBarObserver(Tab* owner);
423 ~TabInfoBarObserver() override; 389 ~TabInfoBarObserver() override;
424 void SetShouldObserveInfoBarManager(bool should_observe); 390 void SetShouldObserveInfoBarManager(bool should_observe);
425 void OnInfoBarAdded(infobars::InfoBar* infobar) override; 391 void OnInfoBarAdded(infobars::InfoBar* infobar) override;
426 void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override; 392 void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override;
427 void OnInfoBarReplaced(infobars::InfoBar* old_infobar, 393 void OnInfoBarReplaced(infobars::InfoBar* old_infobar,
428 infobars::InfoBar* new_infobar) override; 394 infobars::InfoBar* new_infobar) override;
429 395
430 private: 396 private:
431 Tab* owner_; // Owns this instance; 397 __weak Tab* owner_;
432 ScopedObserver<infobars::InfoBarManager, TabInfoBarObserver> scoped_observer_; 398 ScopedObserver<infobars::InfoBarManager, TabInfoBarObserver> scoped_observer_;
433 DISALLOW_COPY_AND_ASSIGN(TabInfoBarObserver); 399 DISALLOW_COPY_AND_ASSIGN(TabInfoBarObserver);
434 }; 400 };
435 401
436 TabInfoBarObserver::TabInfoBarObserver(Tab* owner) 402 TabInfoBarObserver::TabInfoBarObserver(Tab* owner)
437 : owner_(owner), scoped_observer_(this) {} 403 : owner_(owner), scoped_observer_(this) {}
438 404
439 TabInfoBarObserver::~TabInfoBarObserver() {} 405 TabInfoBarObserver::~TabInfoBarObserver() {}
440 406
441 void TabInfoBarObserver::SetShouldObserveInfoBarManager(bool should_observe) { 407 void TabInfoBarObserver::SetShouldObserveInfoBarManager(bool should_observe) {
(...skipping 24 matching lines...) Expand all
466 infobars::InfoBar* new_infobar) { 432 infobars::InfoBar* new_infobar) {
467 // Update snapshots after the infobar has been replaced. 433 // Update snapshots after the infobar has been replaced.
468 [owner_ updateSnapshotWithOverlay:YES visibleFrameOnly:YES]; 434 [owner_ updateSnapshotWithOverlay:YES visibleFrameOnly:YES];
469 } 435 }
470 436
471 } // anonymous namespace 437 } // anonymous namespace
472 438
473 @implementation Tab 439 @implementation Tab
474 440
475 @synthesize browserState = browserState_; 441 @synthesize browserState = browserState_;
442 @synthesize tabId = tabId_;
476 @synthesize useGreyImageCache = useGreyImageCache_; 443 @synthesize useGreyImageCache = useGreyImageCache_;
477 @synthesize isPrerenderTab = isPrerenderTab_; 444 @synthesize isPrerenderTab = isPrerenderTab_;
478 @synthesize isLinkLoadingPrerenderTab = isLinkLoadingPrerenderTab_; 445 @synthesize isLinkLoadingPrerenderTab = isLinkLoadingPrerenderTab_;
479 @synthesize isVoiceSearchResultsTab = isVoiceSearchResultsTab_; 446 @synthesize isVoiceSearchResultsTab = isVoiceSearchResultsTab_;
447 @synthesize passwordController = passwordController_;
448 @synthesize overscrollActionsController = overscrollActionsController_;
449 @synthesize readerModeController = readerModeController_;
450 @synthesize overscrollActionsControllerDelegate =
451 overscrollActionsControllerDelegate_;
452 @synthesize passKitDialogProvider = passKitDialogProvider_;
480 @synthesize delegate = delegate_; 453 @synthesize delegate = delegate_;
454 @synthesize dialogDelegate = dialogDelegate_;
455 @synthesize snapshotOverlayProvider = snapshotOverlayProvider_;
481 @synthesize tabSnapshottingDelegate = tabSnapshottingDelegate_; 456 @synthesize tabSnapshottingDelegate = tabSnapshottingDelegate_;
482 @synthesize tabHeadersDelegate = tabHeadersDelegate_; 457 @synthesize tabHeadersDelegate = tabHeadersDelegate_;
458 @synthesize fullScreenControllerDelegate = fullScreenControllerDelegate_;
483 459
484 - (instancetype)initWithWebState:(web::WebState*)webState { 460 - (instancetype)initWithWebState:(web::WebState*)webState {
485 DCHECK(webState); 461 DCHECK(webState);
486 self = [super init]; 462 self = [super init];
487 if (self) { 463 if (self) {
488 propertyReleaser_Tab_.Init(self, [Tab class]);
489
490 // TODO(crbug.com/620465): Tab should only use public API of WebState. 464 // TODO(crbug.com/620465): Tab should only use public API of WebState.
491 // Remove this cast once this is the case. 465 // Remove this cast once this is the case.
492 webStateImpl_ = static_cast<web::WebStateImpl*>(webState); 466 webStateImpl_ = static_cast<web::WebStateImpl*>(webState);
493 browserState_ = 467 browserState_ =
494 ios::ChromeBrowserState::FromBrowserState(webState->GetBrowserState()); 468 ios::ChromeBrowserState::FromBrowserState(webState->GetBrowserState());
495
496 tabHistoryContext_ = base::MakeUnique<TabHistoryContext>();
497 webStateObserver_ = 469 webStateObserver_ =
498 base::MakeUnique<web::WebStateObserverBridge>(webState, self); 470 base::MakeUnique<web::WebStateObserverBridge>(webState, self);
499 471
500 [self updateLastVisitedTimestamp]; 472 [self updateLastVisitedTimestamp];
501 [[self webController] addObserver:self]; 473 [[self webController] addObserver:self];
502 [[self webController] setDelegate:self]; 474 [[self webController] setDelegate:self];
503 475
504 snapshotManager_.reset([[SnapshotManager alloc] init]); 476 snapshotManager_ = [[SnapshotManager alloc] init];
505 webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc] 477 webControllerSnapshotHelper_ = [[WebControllerSnapshotHelper alloc]
506 initWithSnapshotManager:snapshotManager_ 478 initWithSnapshotManager:snapshotManager_
507 tab:self]); 479 tab:self];
508 480
509 if (experimental_flags::IsNativeAppLauncherEnabled()) 481 if (experimental_flags::IsNativeAppLauncherEnabled())
510 [self initNativeAppNavigationController]; 482 [self initNativeAppNavigationController];
511 483
512 [[NSNotificationCenter defaultCenter] 484 [[NSNotificationCenter defaultCenter]
513 addObserver:self 485 addObserver:self
514 selector:@selector(applicationDidBecomeActive) 486 selector:@selector(applicationDidBecomeActive)
515 name:UIApplicationDidBecomeActiveNotification 487 name:UIApplicationDidBecomeActiveNotification
516 object:nil]; 488 object:nil];
517 } 489 }
518 return self; 490 return self;
519 } 491 }
520 492
521 - (void)attachTabHelpers { 493 - (void)attachTabHelpers {
522 tabInfoBarObserver_.reset(new TabInfoBarObserver(self)); 494 tabInfoBarObserver_ = base::MakeUnique<TabInfoBarObserver>(self);
523 tabInfoBarObserver_->SetShouldObserveInfoBarManager(true); 495 tabInfoBarObserver_->SetShouldObserveInfoBarManager(true);
524 496
525 if (experimental_flags::IsAutoReloadEnabled()) { 497 if (experimental_flags::IsAutoReloadEnabled())
526 autoReloadBridge_.reset([[AutoReloadBridge alloc] initWithTab:self]); 498 autoReloadBridge_ = [[AutoReloadBridge alloc] initWithTab:self];
527 }
528 printObserver_ = base::MakeUnique<PrintObserver>(self.webState); 499 printObserver_ = base::MakeUnique<PrintObserver>(self.webState);
529 500
530 base::scoped_nsprotocol<id<PasswordsUiDelegate>> passwordsUiDelegate( 501 id<PasswordsUiDelegate> passwordsUiDelegate =
531 [[PasswordsUiDelegateImpl alloc] init]); 502 [[PasswordsUiDelegateImpl alloc] init];
532 passwordController_.reset([[PasswordController alloc] 503 passwordController_ =
533 initWithWebState:self.webState 504 [[PasswordController alloc] initWithWebState:self.webState
534 passwordsUiDelegate:passwordsUiDelegate]); 505 passwordsUiDelegate:passwordsUiDelegate];
535 password_manager::PasswordGenerationManager* passwordGenerationManager = 506 password_manager::PasswordGenerationManager* passwordGenerationManager =
536 [passwordController_ passwordGenerationManager]; 507 [passwordController_ passwordGenerationManager];
537 autofillController_.reset([[AutofillController alloc] 508 autofillController_ =
538 initWithBrowserState:browserState_ 509 [[AutofillController alloc] initWithBrowserState:browserState_
539 passwordGenerationManager:passwordGenerationManager 510 passwordGenerationManager:passwordGenerationManager
540 webState:self.webState]); 511 webState:self.webState];
541 suggestionController_.reset([[FormSuggestionController alloc] 512 suggestionController_ = [[FormSuggestionController alloc]
542 initWithWebState:self.webState 513 initWithWebState:self.webState
543 providers:[self suggestionProviders]]); 514 providers:[self suggestionProviders]];
544 inputAccessoryViewController_.reset([[FormInputAccessoryViewController alloc] 515 inputAccessoryViewController_ = [[FormInputAccessoryViewController alloc]
545 initWithWebState:self.webState 516 initWithWebState:self.webState
546 providers:[self accessoryViewProviders]]); 517 providers:[self accessoryViewProviders]];
547 518
548 [self setShouldObserveFaviconChanges:YES]; 519 [self setShouldObserveFaviconChanges:YES];
549 520
550 // Create the ReaderModeController immediately so it can register for 521 // Create the ReaderModeController immediately so it can register for
551 // WebState changes. 522 // WebState changes.
552 if (experimental_flags::IsReaderModeEnabled()) { 523 if (experimental_flags::IsReaderModeEnabled()) {
553 readerModeController_.reset([[ReaderModeController alloc] 524 readerModeController_ =
554 initWithWebState:self.webState 525 [[ReaderModeController alloc] initWithWebState:self.webState
555 delegate:self]); 526 delegate:self];
556 } 527 }
557 } 528 }
558 529
559 - (NSArray*)accessoryViewProviders { 530 - (NSArray*)accessoryViewProviders {
560 NSMutableArray* providers = [NSMutableArray array]; 531 NSMutableArray* providers = [NSMutableArray array];
561 id<FormInputAccessoryViewProvider> provider = 532 id<FormInputAccessoryViewProvider> provider =
562 [passwordController_ accessoryViewProvider]; 533 [passwordController_ accessoryViewProvider];
563 if (provider) 534 if (provider)
564 [providers addObject:provider]; 535 [providers addObject:provider];
565 [providers addObject:[suggestionController_ accessoryViewProvider]]; 536 [providers addObject:[suggestionController_ accessoryViewProvider]];
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 } 568 }
598 569
599 - (id<TabDialogDelegate>)dialogDelegate { 570 - (id<TabDialogDelegate>)dialogDelegate {
600 return dialogDelegate_; 571 return dialogDelegate_;
601 } 572 }
602 573
603 - (BOOL)loadFinished { 574 - (BOOL)loadFinished {
604 return [self.webController loadPhase] == web::PAGE_LOADED; 575 return [self.webController loadPhase] == web::PAGE_LOADED;
605 } 576 }
606 577
607 - (void)setDialogDelegate:(id<TabDialogDelegate>)dialogDelegate {
608 dialogDelegate_.reset(dialogDelegate);
609 }
610
611 - (void)setIsVoiceSearchResultsTab:(BOOL)isVoiceSearchResultsTab { 578 - (void)setIsVoiceSearchResultsTab:(BOOL)isVoiceSearchResultsTab {
612 // There is intentionally no equality check in this setter, as we want the 579 // There is intentionally no equality check in this setter, as we want the
613 // notificaiton to be sent regardless of whether the value has changed. 580 // notificaiton to be sent regardless of whether the value has changed.
614 isVoiceSearchResultsTab_ = isVoiceSearchResultsTab; 581 isVoiceSearchResultsTab_ = isVoiceSearchResultsTab;
615 [parentTabModel_ notifyTabChanged:self]; 582 [parentTabModel_ notifyTabChanged:self];
616 } 583 }
617 584
618 - (PasswordController*)passwordController {
619 return passwordController_.get();
620 }
621
622 - (void)retrieveSnapshot:(void (^)(UIImage*))callback { 585 - (void)retrieveSnapshot:(void (^)(UIImage*))callback {
623 [webControllerSnapshotHelper_ 586 [webControllerSnapshotHelper_
624 retrieveSnapshotForWebController:self.webController 587 retrieveSnapshotForWebController:self.webController
625 sessionID:self.tabId 588 sessionID:self.tabId
626 withOverlays:[self snapshotOverlays] 589 withOverlays:[self snapshotOverlays]
627 callback:callback]; 590 callback:callback];
628 } 591 }
629 592
630 - (const GURL&)url { 593 - (const GURL&)url {
631 // See note in header; this method should be removed. 594 // See note in header; this method should be removed.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 627
665 - (NSString*)urlDisplayString { 628 - (NSString*)urlDisplayString {
666 base::string16 urlText = url_formatter::FormatUrl( 629 base::string16 urlText = url_formatter::FormatUrl(
667 self.url, url_formatter::kFormatUrlOmitNothing, net::UnescapeRule::SPACES, 630 self.url, url_formatter::kFormatUrlOmitNothing, net::UnescapeRule::SPACES,
668 nullptr, nullptr, nullptr); 631 nullptr, nullptr, nullptr);
669 return base::SysUTF16ToNSString(urlText); 632 return base::SysUTF16ToNSString(urlText);
670 } 633 }
671 634
672 - (NSString*)tabId { 635 - (NSString*)tabId {
673 if (tabId_) 636 if (tabId_)
674 return tabId_.get(); 637 return tabId_;
675 638
676 DCHECK(self.webState); 639 DCHECK(self.webState);
677 web::SerializableUserDataManager* userDataManager = 640 web::SerializableUserDataManager* userDataManager =
678 web::SerializableUserDataManager::FromWebState(self.webState); 641 web::SerializableUserDataManager::FromWebState(self.webState);
679 NSString* tabId = base::mac::ObjCCast<NSString>( 642 NSString* tabId = base::mac::ObjCCast<NSString>(
680 userDataManager->GetValueForSerializationKey(kTabIDKey)); 643 userDataManager->GetValueForSerializationKey(kTabIDKey));
681 644
682 if (!tabId || ![tabId length]) { 645 if (!tabId || ![tabId length]) {
683 tabId = [[NSUUID UUID] UUIDString]; 646 tabId = [[NSUUID UUID] UUIDString];
684 userDataManager->AddSerializableData(tabId, kTabIDKey); 647 userDataManager->AddSerializableData(tabId, kTabIDKey);
685 } 648 }
686 649
687 tabId_.reset([tabId copy]); 650 tabId_ = [tabId copy];
688 return tabId_.get(); 651 return tabId_;
689 } 652 }
690 653
691 - (web::WebState*)webState { 654 - (web::WebState*)webState {
692 return webStateImpl_; 655 return webStateImpl_;
693 } 656 }
694 657
695 - (void)fetchFavicon { 658 - (void)fetchFavicon {
696 const GURL& url = self.url; 659 const GURL& url = self.url;
697 if (!url.is_valid()) 660 if (!url.is_valid())
698 return; 661 return;
699 662
700 favicon::FaviconDriver* faviconDriver = 663 favicon::FaviconDriver* faviconDriver =
701 favicon::WebFaviconDriver::FromWebState(self.webState); 664 favicon::WebFaviconDriver::FromWebState(self.webState);
702 if (faviconDriver) { 665 if (faviconDriver)
703 faviconDriver->FetchFavicon(url); 666 faviconDriver->FetchFavicon(url);
704 }
705 } 667 }
706 668
707 - (void)setFavicon:(const gfx::Image*)image { 669 - (void)setFavicon:(const gfx::Image*)image {
708 web::NavigationItem* item = [self navigationManager]->GetVisibleItem(); 670 web::NavigationItem* item = [self navigationManager]->GetVisibleItem();
709 if (!item) 671 if (!item)
710 return; 672 return;
711 if (image) { 673 if (image) {
712 item->GetFavicon().image = *image; 674 item->GetFavicon().image = *image;
713 item->GetFavicon().valid = true; 675 item->GetFavicon().valid = true;
714 } 676 }
715 [parentTabModel_ notifyTabChanged:self]; 677 [parentTabModel_ notifyTabChanged:self];
716 } 678 }
717 679
718 - (UIImage*)favicon { 680 - (UIImage*)favicon {
719 DCHECK([self navigationManager]); 681 DCHECK([self navigationManager]);
720 web::NavigationItem* item = [self navigationManager]->GetVisibleItem(); 682 web::NavigationItem* item = [self navigationManager]->GetVisibleItem();
721 if (!item) 683 if (!item)
722 return nil; 684 return nil;
723 const gfx::Image& image = item->GetFavicon().image; 685 const gfx::Image& image = item->GetFavicon().image;
724 if (image.IsEmpty()) 686 if (image.IsEmpty())
725 return nil; 687 return nil;
726 return image.ToUIImage(); 688 return image.ToUIImage();
727 } 689 }
728 690
729 - (UIView*)view { 691 - (UIView*)view {
730 // Record reload of previously-evicted tab. 692 // Record reload of previously-evicted tab.
731 if (![self.webController isViewAlive] && [parentTabModel_ tabUsageRecorder]) { 693 if (![self.webController isViewAlive] && [parentTabModel_ tabUsageRecorder])
732 [parentTabModel_ tabUsageRecorder]->RecordPageLoadStart(self); 694 [parentTabModel_ tabUsageRecorder]->RecordPageLoadStart(self);
733 }
734 return self.webState ? self.webState->GetView() : nil; 695 return self.webState ? self.webState->GetView() : nil;
735 } 696 }
736 697
737 - (UIView*)viewForPrinting { 698 - (UIView*)viewForPrinting {
738 return self.webController.viewForPrinting; 699 return self.webController.viewForPrinting;
739 } 700 }
740 701
741 - (web::NavigationManager*)navigationManager { 702 - (web::NavigationManager*)navigationManager {
742 return self.webState ? self.webState->GetNavigationManager() : nullptr; 703 return self.webState ? self.webState->GetNavigationManager() : nullptr;
743 } 704 }
(...skipping 19 matching lines...) Expand all
763 } 724 }
764 725
765 - (void)didReplaceSessionHistory { 726 - (void)didReplaceSessionHistory {
766 // Replace fullScreenController_ with a new sessionID when the navigation 727 // Replace fullScreenController_ with a new sessionID when the navigation
767 // manager changes. 728 // manager changes.
768 // TODO(crbug.com/661666): Consider just updating sessionID and not replacing 729 // TODO(crbug.com/661666): Consider just updating sessionID and not replacing
769 // |fullScreenController_|. 730 // |fullScreenController_|.
770 if (fullScreenController_) { 731 if (fullScreenController_) {
771 [fullScreenController_ invalidate]; 732 [fullScreenController_ invalidate];
772 [self.webController removeObserver:fullScreenController_]; 733 [self.webController removeObserver:fullScreenController_];
773 fullScreenController_.reset([[FullScreenController alloc] 734 fullScreenController_ = [[FullScreenController alloc]
774 initWithDelegate:fullScreenControllerDelegate_ 735 initWithDelegate:fullScreenControllerDelegate_
775 navigationManager:self.navigationManager 736 navigationManager:self.navigationManager
776 sessionID:self.tabId]); 737 sessionID:self.tabId];
777 [self.webController addObserver:fullScreenController_]; 738 [self.webController addObserver:fullScreenController_];
778 // If the content of the page was loaded without knowledge of the 739 // If the content of the page was loaded without knowledge of the
779 // toolbar position it will be misplaced under the toolbar instead of 740 // toolbar position it will be misplaced under the toolbar instead of
780 // right below. This happens e.g. in the case of preloading. This is to make 741 // right below. This happens e.g. in the case of preloading. This is to make
781 // sure the content is moved to the right place. 742 // sure the content is moved to the right place.
782 [fullScreenController_ moveContentBelowHeader]; 743 [fullScreenController_ moveContentBelowHeader];
783 } 744 }
784 } 745 }
785 746
786 - (void)setIsLinkLoadingPrerenderTab:(BOOL)isLinkLoadingPrerenderTab { 747 - (void)setIsLinkLoadingPrerenderTab:(BOOL)isLinkLoadingPrerenderTab {
(...skipping 23 matching lines...) Expand all
810 BOOL loadingFinished = self.webController.loadPhase == web::PAGE_LOADED; 771 BOOL loadingFinished = self.webController.loadPhase == web::PAGE_LOADED;
811 if (loadingFinished) 772 if (loadingFinished)
812 [self updateSnapshotWithOverlay:YES visibleFrameOnly:YES]; 773 [self updateSnapshotWithOverlay:YES visibleFrameOnly:YES];
813 774
814 [[OmniboxGeolocationController sharedInstance] 775 [[OmniboxGeolocationController sharedInstance]
815 finishPageLoadForTab:self 776 finishPageLoadForTab:self
816 loadSuccess:loadingFinished]; 777 loadSuccess:loadingFinished];
817 [self countMainFrameLoad]; 778 [self countMainFrameLoad];
818 } 779 }
819 780
820 - (id<FullScreenControllerDelegate>)fullScreenControllerDelegate {
821 return fullScreenControllerDelegate_.get();
822 }
823
824 - (void)setFullScreenControllerDelegate: 781 - (void)setFullScreenControllerDelegate:
825 (id<FullScreenControllerDelegate>)fullScreenControllerDelegate { 782 (id<FullScreenControllerDelegate>)fullScreenControllerDelegate {
826 if (fullScreenControllerDelegate == fullScreenControllerDelegate_) { 783 if (fullScreenControllerDelegate == fullScreenControllerDelegate_)
827 return; 784 return;
828 }
829 // Lazily create a FullScreenController. 785 // Lazily create a FullScreenController.
830 // The check for fullScreenControllerDelegate is necessary to avoid recreating 786 // The check for fullScreenControllerDelegate is necessary to avoid recreating
831 // a FullScreenController during teardown. 787 // a FullScreenController during teardown.
832 if (!fullScreenController_ && fullScreenControllerDelegate) { 788 if (!fullScreenController_ && fullScreenControllerDelegate) {
833 fullScreenController_.reset([[FullScreenController alloc] 789 fullScreenController_ = [[FullScreenController alloc]
834 initWithDelegate:fullScreenControllerDelegate 790 initWithDelegate:fullScreenControllerDelegate
835 navigationManager:self.navigationManager 791 navigationManager:self.navigationManager
836 sessionID:self.tabId]); 792 sessionID:self.tabId];
837 [self.webController addObserver:fullScreenController_]; 793 [self.webController addObserver:fullScreenController_];
838 // If the content of the page was loaded without knowledge of the 794 // If the content of the page was loaded without knowledge of the
839 // toolbar position it will be misplaced under the toolbar instead of 795 // toolbar position it will be misplaced under the toolbar instead of
840 // right below. This happens e.g. in the case of preloading. This is to make 796 // right below. This happens e.g. in the case of preloading. This is to make
841 // sure the content is moved to the right place. 797 // sure the content is moved to the right place.
842 [fullScreenController_ moveContentBelowHeader]; 798 [fullScreenController_ moveContentBelowHeader];
843 } 799 }
844 fullScreenControllerDelegate_.reset(fullScreenControllerDelegate); 800 fullScreenControllerDelegate_ = fullScreenControllerDelegate;
845 }
846
847 - (OverscrollActionsController*)overscrollActionsController {
848 return overscrollActionsController_.get();
849 }
850
851 - (id<OverscrollActionsControllerDelegate>)overscrollActionsControllerDelegate {
852 return overscrollActionsControllerDelegate_.get();
853 } 801 }
854 802
855 - (void)setOverscrollActionsControllerDelegate: 803 - (void)setOverscrollActionsControllerDelegate:
856 (id<OverscrollActionsControllerDelegate>) 804 (id<OverscrollActionsControllerDelegate>)
857 overscrollActionsControllerDelegate { 805 overscrollActionsControllerDelegate {
858 if (overscrollActionsControllerDelegate_ == 806 if (overscrollActionsControllerDelegate_ ==
859 overscrollActionsControllerDelegate) 807 overscrollActionsControllerDelegate) {
860 return; 808 return;
809 }
861 810
862 // Lazily create a OverscrollActionsController. 811 // Lazily create a OverscrollActionsController.
863 // The check for overscrollActionsControllerDelegate is necessary to avoid 812 // The check for overscrollActionsControllerDelegate is necessary to avoid
864 // recreating a OverscrollActionsController during teardown. 813 // recreating a OverscrollActionsController during teardown.
865 if (!overscrollActionsController_) { 814 if (!overscrollActionsController_) {
866 overscrollActionsController_.reset( 815 overscrollActionsController_ = [[OverscrollActionsController alloc] init];
867 [[OverscrollActionsController alloc] init]);
868 [self.webController addObserver:overscrollActionsController_]; 816 [self.webController addObserver:overscrollActionsController_];
869 } 817 }
870 OverscrollStyle style = OverscrollStyle::REGULAR_PAGE_NON_INCOGNITO; 818 OverscrollStyle style = OverscrollStyle::REGULAR_PAGE_NON_INCOGNITO;
871 if (browserState_->IsOffTheRecord()) { 819 if (browserState_->IsOffTheRecord())
872 style = OverscrollStyle::REGULAR_PAGE_INCOGNITO; 820 style = OverscrollStyle::REGULAR_PAGE_INCOGNITO;
873 }
874 [overscrollActionsController_ setStyle:style]; 821 [overscrollActionsController_ setStyle:style];
875 [overscrollActionsController_ 822 [overscrollActionsController_
876 setDelegate:overscrollActionsControllerDelegate]; 823 setDelegate:overscrollActionsControllerDelegate];
877 overscrollActionsControllerDelegate_.reset( 824 overscrollActionsControllerDelegate_ = overscrollActionsControllerDelegate;
878 overscrollActionsControllerDelegate);
879 } 825 }
880 826
881 - (void)saveTitleToHistoryDB { 827 - (void)saveTitleToHistoryDB {
882 // If incognito, don't update history. 828 // If incognito, don't update history.
883 if (browserState_->IsOffTheRecord()) 829 if (browserState_->IsOffTheRecord())
884 return; 830 return;
885 // Don't update the history if current entry has no title. 831 // Don't update the history if current entry has no title.
886 NSString* title = [self title]; 832 NSString* title = [self title];
887 if (![title length] || 833 if (![title length] ||
888 [title isEqualToString:l10n_util::GetNSString(IDS_DEFAULT_TAB_TITLE)]) 834 [title isEqualToString:l10n_util::GetNSString(IDS_DEFAULT_TAB_TITLE)]) {
889 return; 835 return;
836 }
890 837
891 history::HistoryService* historyService = 838 history::HistoryService* historyService =
892 ios::HistoryServiceFactory::GetForBrowserState( 839 ios::HistoryServiceFactory::GetForBrowserState(
893 browserState_, ServiceAccessType::IMPLICIT_ACCESS); 840 browserState_, ServiceAccessType::IMPLICIT_ACCESS);
894 DCHECK(historyService); 841 DCHECK(historyService);
895 historyService->SetPageTitle(self.url, base::SysNSStringToUTF16(title)); 842 historyService->SetPageTitle(self.url, base::SysNSStringToUTF16(title));
896 } 843 }
897 844
898 - (void)addCurrentEntryToHistoryDB { 845 - (void)addCurrentEntryToHistoryDB {
899 DCHECK([self navigationManager]->GetVisibleItem()); 846 DCHECK([self navigationManager]->GetVisibleItem());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 } 892 }
946 893
947 DCHECK(item->GetTimestamp().ToInternalValue() > 0); 894 DCHECK(item->GetTimestamp().ToInternalValue() > 0);
948 if ([self isPrerenderTab]) { 895 if ([self isPrerenderTab]) {
949 // Clicks on content suggestions on the NTP should not contribute to the 896 // Clicks on content suggestions on the NTP should not contribute to the
950 // Most Visited tiles in the NTP. 897 // Most Visited tiles in the NTP.
951 const bool consider_for_ntp_most_visited = 898 const bool consider_for_ntp_most_visited =
952 referrer.url != GURL(kChromeContentSuggestionsReferrer); 899 referrer.url != GURL(kChromeContentSuggestionsReferrer);
953 900
954 history::HistoryAddPageArgs args( 901 history::HistoryAddPageArgs args(
955 url, item->GetTimestamp(), tabHistoryContext_.get(), 902 url, item->GetTimestamp(), &tabHistoryContext_, item->GetUniqueID(),
956 item->GetUniqueID(), referrer.url, redirects, item->GetTransitionType(), 903 referrer.url, redirects, item->GetTransitionType(),
957 history::SOURCE_BROWSED, false, consider_for_ntp_most_visited); 904 history::SOURCE_BROWSED, false, consider_for_ntp_most_visited);
958 addPageVector_.push_back(args); 905 addPageVector_.push_back(args);
959 } else { 906 } else {
960 historyService->AddPage(url, item->GetTimestamp(), tabHistoryContext_.get(), 907 historyService->AddPage(url, item->GetTimestamp(), &tabHistoryContext_,
961 item->GetUniqueID(), referrer.url, redirects, 908 item->GetUniqueID(), referrer.url, redirects,
962 item->GetTransitionType(), history::SOURCE_BROWSED, 909 item->GetTransitionType(), history::SOURCE_BROWSED,
963 false); 910 false);
964 [self saveTitleToHistoryDB]; 911 [self saveTitleToHistoryDB];
965 } 912 }
966 } 913 }
967 914
968 - (void)commitCachedEntriesToHistoryDB { 915 - (void)commitCachedEntriesToHistoryDB {
969 // If OTR, don't update history. 916 // If OTR, don't update history.
970 if (browserState_->IsOffTheRecord()) { 917 if (browserState_->IsOffTheRecord()) {
(...skipping 27 matching lines...) Expand all
998 } 945 }
999 } 946 }
1000 947
1001 ui::PageTransition transition = params.transition_type; 948 ui::PageTransition transition = params.transition_type;
1002 949
1003 // Record any explicit, non-redirect navigation as a clobber (as long as it's 950 // Record any explicit, non-redirect navigation as a clobber (as long as it's
1004 // in a real tab). 951 // in a real tab).
1005 if (!initialNavigation && !isPrerenderTab_ && 952 if (!initialNavigation && !isPrerenderTab_ &&
1006 !PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_RELOAD) && 953 !PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_RELOAD) &&
1007 (transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) == 0) { 954 (transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) == 0) {
1008 base::RecordAction(UserMetricsAction("MobileTabClobbered")); 955 base::RecordAction(base::UserMetricsAction("MobileTabClobbered"));
1009 } 956 }
1010 if ([parentTabModel_ tabUsageRecorder]) 957 if ([parentTabModel_ tabUsageRecorder])
1011 [parentTabModel_ tabUsageRecorder]->RecordPageLoadStart(self); 958 [parentTabModel_ tabUsageRecorder]->RecordPageLoadStart(self);
1012 959
1013 // Reset |isVoiceSearchResultsTab| since a new page is being navigated to. 960 // Reset |isVoiceSearchResultsTab| since a new page is being navigated to.
1014 self.isVoiceSearchResultsTab = NO; 961 self.isVoiceSearchResultsTab = NO;
1015 962
1016 web::NavigationItem* navigationItem = 963 web::NavigationItem* navigationItem =
1017 [self navigationManager]->GetPendingItem(); 964 [self navigationManager]->GetPendingItem();
1018 965
1019 // TODO(crbug.com/676129): the pending item is not correctly set when the 966 // TODO(crbug.com/676129): the pending item is not correctly set when the
1020 // page is reloading, use the last committed item if pending item is null. 967 // page is reloading, use the last committed item if pending item is null.
1021 // Remove this once tracking bug is fixed. 968 // Remove this once tracking bug is fixed.
1022 if (!navigationItem) 969 if (!navigationItem)
1023 navigationItem = [self navigationManager]->GetLastCommittedItem(); 970 navigationItem = [self navigationManager]->GetLastCommittedItem();
1024 971
1025 [[OmniboxGeolocationController sharedInstance] 972 [[OmniboxGeolocationController sharedInstance]
1026 addLocationToNavigationItem:navigationItem 973 addLocationToNavigationItem:navigationItem
1027 browserState:browserState_]; 974 browserState:browserState_];
1028 } 975 }
1029 976
1030 - (void)loadSessionTab:(const sessions::SessionTab*)sessionTab { 977 - (void)loadSessionTab:(const sessions::SessionTab*)sessionTab {
1031 DCHECK(sessionTab); 978 DCHECK(sessionTab);
1032 [self replaceHistoryWithNavigations:sessionTab->navigations 979 [self replaceHistoryWithNavigations:sessionTab->navigations
1033 currentIndex:sessionTab->current_navigation_index]; 980 currentIndex:sessionTab->current_navigation_index];
1034 } 981 }
1035 982
1036 - (void)webWillReload { 983 - (void)webWillReload {
1037 if ([parentTabModel_ tabUsageRecorder]) { 984 if ([parentTabModel_ tabUsageRecorder])
1038 [parentTabModel_ tabUsageRecorder]->RecordReload(self); 985 [parentTabModel_ tabUsageRecorder]->RecordReload(self);
1039 }
1040 } 986 }
1041 987
1042 // Halt the tab, which amounts to halting its webController. 988 // Halt the tab, which amounts to halting its webController.
1043 - (void)terminateNetworkActivity { 989 - (void)terminateNetworkActivity {
1044 [self.webController terminateNetworkActivity]; 990 [self.webController terminateNetworkActivity];
1045 } 991 }
1046 992
1047 - (void)webStateDestroyed:(web::WebState*)webState { 993 - (void)webStateDestroyed:(web::WebState*)webState {
1048 DCHECK_EQ(webStateImpl_, webState); 994 DCHECK_EQ(webStateImpl_, webState);
1049 self.fullScreenControllerDelegate = nil; 995 self.fullScreenControllerDelegate = nil;
1050 self.overscrollActionsControllerDelegate = nil; 996 self.overscrollActionsControllerDelegate = nil;
1051 self.passKitDialogProvider = nil; 997 self.passKitDialogProvider = nil;
1052 self.snapshotOverlayProvider = nil; 998 self.snapshotOverlayProvider = nil;
1053 999
1054 [[NSNotificationCenter defaultCenter] removeObserver:self]; 1000 [[NSNotificationCenter defaultCenter] removeObserver:self];
1055 1001
1056 [passwordController_ detach]; 1002 [passwordController_ detach];
1057 passwordController_.reset(); 1003 passwordController_ = nil;
1058 tabInfoBarObserver_.reset(); 1004 tabInfoBarObserver_.reset();
1059 1005
1060 faviconDriverObserverBridge_.reset(); 1006 faviconDriverObserverBridge_.reset();
1061 [openInController_ detachFromWebController]; 1007 [openInController_ detachFromWebController];
1062 openInController_.reset(); 1008 openInController_ = nil;
1063 [autofillController_ detachFromWebState]; 1009 [autofillController_ detachFromWebState];
1064 [suggestionController_ detachFromWebState]; 1010 [suggestionController_ detachFromWebState];
1065 if (fullScreenController_) 1011 if (fullScreenController_)
1066 [self.webController removeObserver:fullScreenController_]; 1012 [self.webController removeObserver:fullScreenController_];
1067 [fullScreenController_ invalidate]; 1013 [fullScreenController_ invalidate];
1068 fullScreenController_.reset(); 1014 fullScreenController_ = nil;
1069 if (overscrollActionsController_) 1015 if (overscrollActionsController_)
1070 [self.webController removeObserver:overscrollActionsController_]; 1016 [self.webController removeObserver:overscrollActionsController_];
1071 [overscrollActionsController_ invalidate]; 1017 [overscrollActionsController_ invalidate];
1072 overscrollActionsController_.reset(); 1018 overscrollActionsController_ = nil;
1073 [readerModeController_ detachFromWebState]; 1019 [readerModeController_ detachFromWebState];
1074 readerModeController_.reset(); 1020 readerModeController_ = nil;
1075 1021
1076 // Invalidate any snapshot stored for this session. 1022 // Invalidate any snapshot stored for this session.
1077 DCHECK(self.tabId); 1023 DCHECK(self.tabId);
1078 [snapshotManager_ removeImageWithSessionID:self.tabId]; 1024 [snapshotManager_ removeImageWithSessionID:self.tabId];
1079 1025
1080 // Cancel any queued dialogs. 1026 // Cancel any queued dialogs.
1081 [self.dialogDelegate cancelDialogForTab:self]; 1027 [self.dialogDelegate cancelDialogForTab:self];
1082 1028
1083 webStateObserver_.reset(); 1029 webStateObserver_.reset();
1084 webStateImpl_ = nullptr; 1030 webStateImpl_ = nullptr;
1085 } 1031 }
1086 1032
1087 - (void)dismissModals { 1033 - (void)dismissModals {
1088 [openInController_ disable]; 1034 [openInController_ disable];
1089 [self.webController dismissModals]; 1035 [self.webController dismissModals];
1090 } 1036 }
1091 1037
1092 - (void)setShouldObserveInfoBarManager:(BOOL)shouldObserveInfoBarManager { 1038 - (void)setShouldObserveInfoBarManager:(BOOL)shouldObserveInfoBarManager {
1093 tabInfoBarObserver_->SetShouldObserveInfoBarManager( 1039 tabInfoBarObserver_->SetShouldObserveInfoBarManager(
1094 shouldObserveInfoBarManager); 1040 shouldObserveInfoBarManager);
1095 } 1041 }
1096 1042
1097 - (void)setShouldObserveFaviconChanges:(BOOL)shouldObserveFaviconChanges { 1043 - (void)setShouldObserveFaviconChanges:(BOOL)shouldObserveFaviconChanges {
1098 if (shouldObserveFaviconChanges) { 1044 if (shouldObserveFaviconChanges) {
1099 favicon::FaviconDriver* faviconDriver = 1045 favicon::FaviconDriver* faviconDriver =
1100 favicon::WebFaviconDriver::FromWebState(self.webState); 1046 favicon::WebFaviconDriver::FromWebState(self.webState);
1101 // Some MockWebContents used in tests do not support the FaviconDriver. 1047 // Some MockWebContents used in tests do not support the FaviconDriver.
1102 if (faviconDriver) { 1048 if (faviconDriver) {
1103 faviconDriverObserverBridge_.reset( 1049 faviconDriverObserverBridge_ =
1104 new FaviconDriverObserverBridge(self, faviconDriver)); 1050 base::MakeUnique<FaviconDriverObserverBridge>(self, faviconDriver);
1105 } 1051 }
1106 } else { 1052 } else {
1107 faviconDriverObserverBridge_.reset(); 1053 faviconDriverObserverBridge_.reset();
1108 } 1054 }
1109 } 1055 }
1110 1056
1111 - (void)goBack { 1057 - (void)goBack {
1112 if (self.navigationManager) { 1058 if (self.navigationManager) {
1113 DCHECK(self.navigationManager->CanGoBack()); 1059 DCHECK(self.navigationManager->CanGoBack());
1114 base::RecordAction(UserMetricsAction("Back")); 1060 base::RecordAction(base::UserMetricsAction("Back"));
1115 self.navigationManager->GoBack(); 1061 self.navigationManager->GoBack();
1116 } 1062 }
1117 } 1063 }
1118 1064
1119 - (void)goForward { 1065 - (void)goForward {
1120 if (self.navigationManager) { 1066 if (self.navigationManager) {
1121 DCHECK(self.navigationManager->CanGoForward()); 1067 DCHECK(self.navigationManager->CanGoForward());
1122 base::RecordAction(UserMetricsAction("Forward")); 1068 base::RecordAction(base::UserMetricsAction("Forward"));
1123 self.navigationManager->GoForward(); 1069 self.navigationManager->GoForward();
1124 } 1070 }
1125 } 1071 }
1126 1072
1127 - (BOOL)canGoBack { 1073 - (BOOL)canGoBack {
1128 return self.navigationManager && self.navigationManager->CanGoBack(); 1074 return self.navigationManager && self.navigationManager->CanGoBack();
1129 } 1075 }
1130 1076
1131 - (BOOL)canGoForward { 1077 - (BOOL)canGoForward {
1132 return self.navigationManager && self.navigationManager->CanGoForward(); 1078 return self.navigationManager && self.navigationManager->CanGoForward();
1133 } 1079 }
1134 1080
1135 - (void)goToItem:(const web::NavigationItem*)item { 1081 - (void)goToItem:(const web::NavigationItem*)item {
1136 DCHECK(item); 1082 DCHECK(item);
1137 1083
1138 if (self.navigationManager) { 1084 if (self.navigationManager) {
1139 CRWSessionController* sessionController = 1085 CRWSessionController* sessionController =
1140 [self navigationManagerImpl]->GetSessionController(); 1086 [self navigationManagerImpl]->GetSessionController();
1141 NSInteger itemIndex = [sessionController indexOfItem:item]; 1087 NSInteger itemIndex = [sessionController indexOfItem:item];
1142 DCHECK_NE(itemIndex, NSNotFound); 1088 DCHECK_NE(itemIndex, NSNotFound);
1143 self.navigationManager->GoToIndex(itemIndex); 1089 self.navigationManager->GoToIndex(itemIndex);
1144 } 1090 }
1145 } 1091 }
1146 1092
1147 - (BOOL)openExternalURL:(const GURL&)url 1093 - (BOOL)openExternalURL:(const GURL&)url
1148 sourceURL:(const GURL&)sourceURL 1094 sourceURL:(const GURL&)sourceURL
1149 linkClicked:(BOOL)linkClicked { 1095 linkClicked:(BOOL)linkClicked {
1150 if (!externalAppLauncher_.get()) 1096 if (!externalAppLauncher_)
1151 externalAppLauncher_.reset([[ExternalAppLauncher alloc] init]); 1097 externalAppLauncher_ = [[ExternalAppLauncher alloc] init];
1152
1153 // This method may release CRWWebController which may cause a crash
1154 // (crbug.com/393949).
1155 [[self.webController retain] autorelease];
1156 1098
1157 // Make a local url copy for possible modification. 1099 // Make a local url copy for possible modification.
1158 GURL finalURL = url; 1100 GURL finalURL = url;
1159 1101
1160 // Check if it's a direct FIDO U2F x-callback call. If so, do not open it, to 1102 // Check if it's a direct FIDO U2F x-callback call. If so, do not open it, to
1161 // prevent pages from spoofing requests with different origins. 1103 // prevent pages from spoofing requests with different origins.
1162 if (finalURL.SchemeIs("u2f-x-callback")) { 1104 if (finalURL.SchemeIs("u2f-x-callback"))
1163 return NO; 1105 return NO;
1164 }
1165 1106
1166 // Block attempts to open this application's settings in the native system 1107 // Block attempts to open this application's settings in the native system
1167 // settings application. 1108 // settings application.
1168 if (finalURL.SchemeIs("app-settings")) 1109 if (finalURL.SchemeIs("app-settings"))
1169 return NO; 1110 return NO;
1170 1111
1171 // Check if it's a FIDO U2F call. 1112 // Check if it's a FIDO U2F call.
1172 if (finalURL.SchemeIs("u2f")) { 1113 if (finalURL.SchemeIs("u2f")) {
1173 // Create U2FController object lazily. 1114 // Create U2FController object lazily.
1174 if (!U2FController_) { 1115 if (!U2FController_)
1175 U2FController_.reset([[U2FController alloc] init]); 1116 U2FController_ = [[U2FController alloc] init];
1176 }
1177 1117
1178 DCHECK([self navigationManager]); 1118 DCHECK([self navigationManager]);
1179 GURL origin = 1119 GURL origin =
1180 [self navigationManager]->GetLastCommittedItem()->GetURL().GetOrigin(); 1120 [self navigationManager]->GetLastCommittedItem()->GetURL().GetOrigin();
1181 1121
1182 // Compose u2f-x-callback URL and update urlToOpen. 1122 // Compose u2f-x-callback URL and update urlToOpen.
1183 finalURL = [U2FController_ XCallbackFromRequestURL:finalURL 1123 finalURL = [U2FController_ XCallbackFromRequestURL:finalURL
1184 originURL:origin 1124 originURL:origin
1185 tabURL:self.url 1125 tabURL:self.url
1186 tabID:self.tabId]; 1126 tabID:self.tabId];
1187 1127
1188 if (!finalURL.is_valid()) { 1128 if (!finalURL.is_valid())
1189 return NO; 1129 return NO;
1190 }
1191 } 1130 }
1192 1131
1193 if ([externalAppLauncher_ openURL:finalURL linkClicked:linkClicked]) { 1132 if ([externalAppLauncher_ openURL:finalURL linkClicked:linkClicked]) {
1194 // Clears pending navigation history after successfully launching the 1133 // Clears pending navigation history after successfully launching the
1195 // external app. 1134 // external app.
1196 DCHECK([self navigationManager]); 1135 DCHECK([self navigationManager]);
1197 [self navigationManager]->DiscardNonCommittedItems(); 1136 [self navigationManager]->DiscardNonCommittedItems();
1198 // Ensure the UI reflects the current entry, not the just-discarded pending 1137 // Ensure the UI reflects the current entry, not the just-discarded pending
1199 // entry. 1138 // entry.
1200 [parentTabModel_ notifyTabChanged:self]; 1139 [parentTabModel_ notifyTabChanged:self];
1201 1140
1202 if (sourceURL.is_valid()) { 1141 if (sourceURL.is_valid()) {
1203 ReadingListModel* model = 1142 ReadingListModel* model =
1204 ReadingListModelFactory::GetForBrowserState(browserState_); 1143 ReadingListModelFactory::GetForBrowserState(browserState_);
1205 if (model && model->loaded()) { 1144 if (model && model->loaded())
1206 model->SetReadStatus(sourceURL, true); 1145 model->SetReadStatus(sourceURL, true);
1207 }
1208 } 1146 }
1209 1147
1210 return YES; 1148 return YES;
1211 } 1149 }
1212 return NO; 1150 return NO;
1213 } 1151 }
1214 1152
1215 - (void)webState:(web::WebState*)webState 1153 - (void)webState:(web::WebState*)webState
1216 didFinishNavigation:(web::NavigationContext*)navigation { 1154 didFinishNavigation:(web::NavigationContext*)navigation {
1217 if (navigation->IsSameDocument()) { 1155 if (navigation->IsSameDocument()) {
1156 // Fetch the favicon for the new URL.
1218 auto* faviconDriver = favicon::WebFaviconDriver::FromWebState(webState); 1157 auto* faviconDriver = favicon::WebFaviconDriver::FromWebState(webState);
1219 if (faviconDriver) { 1158 if (faviconDriver)
1220 // Fetch the favicon for the new URL.
1221 faviconDriver->FetchFavicon(navigation->GetUrl()); 1159 faviconDriver->FetchFavicon(navigation->GetUrl());
1222 }
1223 } 1160 }
1224 1161
1225 if (!navigation->IsErrorPage()) { 1162 if (!navigation->IsErrorPage()) {
1226 [self addCurrentEntryToHistoryDB]; 1163 [self addCurrentEntryToHistoryDB];
1227 [self countMainFrameLoad]; 1164 [self countMainFrameLoad];
1228 } 1165 }
1229 1166
1230 [parentTabModel_ notifyTabChanged:self]; 1167 [parentTabModel_ notifyTabChanged:self];
1231 } 1168 }
1232 1169
(...skipping 10 matching lines...) Expand all
1243 break; 1180 break;
1244 case UIInterfaceOrientationUnknown: 1181 case UIInterfaceOrientationUnknown:
1245 // TODO(crbug.com/228832): Convert from a boolean histogram to an 1182 // TODO(crbug.com/228832): Convert from a boolean histogram to an
1246 // enumerated histogram and log this case as well. 1183 // enumerated histogram and log this case as well.
1247 break; 1184 break;
1248 } 1185 }
1249 } 1186 }
1250 1187
1251 - (OpenInController*)openInController { 1188 - (OpenInController*)openInController {
1252 if (!openInController_) { 1189 if (!openInController_) {
1253 openInController_.reset([[OpenInController alloc] 1190 openInController_ = [[OpenInController alloc]
1254 initWithRequestContext:browserState_->GetRequestContext() 1191 initWithRequestContext:browserState_->GetRequestContext()
1255 webController:self.webController]); 1192 webController:self.webController];
1256 } 1193 }
1257 return openInController_.get(); 1194 return openInController_;
1258 } 1195 }
1259 1196
1260 - (id<CRWNativeContent>)controllerForUnhandledContentAtURL:(const GURL&)url { 1197 - (id<CRWNativeContent>)controllerForUnhandledContentAtURL:(const GURL&)url {
1261 // Shows download manager UI for unhandled content. 1198 // Shows download manager UI for unhandled content.
1262 DownloadManagerController* downloadController = 1199 DownloadManagerController* downloadController =
1263 [[[DownloadManagerController alloc] initWithWebState:self.webState 1200 [[DownloadManagerController alloc] initWithWebState:self.webState
1264 downloadURL:url] autorelease]; 1201 downloadURL:url];
1265 [downloadController start]; 1202 [downloadController start];
1266 return downloadController; 1203 return downloadController;
1267 } 1204 }
1268 1205
1269 - (void)handleExportableFile:(net::HttpResponseHeaders*)headers { 1206 - (void)handleExportableFile:(net::HttpResponseHeaders*)headers {
1270 // Only "application/pdf" is supported for now. 1207 // Only "application/pdf" is supported for now.
1271 if (self.webState->GetContentsMimeType() != "application/pdf") 1208 if (self.webState->GetContentsMimeType() != "application/pdf")
1272 return; 1209 return;
1273 1210
1274 [[NSNotificationCenter defaultCenter] 1211 [[NSNotificationCenter defaultCenter]
(...skipping 12 matching lines...) Expand all
1287 "", // referrer-charset 1224 "", // referrer-charset
1288 "", // suggested-name 1225 "", // suggested-name
1289 "application/pdf", // mime-type 1226 "application/pdf", // mime-type
1290 defaultFilename); 1227 defaultFilename);
1291 [[self openInController] 1228 [[self openInController]
1292 enableWithDocumentURL:self.url 1229 enableWithDocumentURL:self.url
1293 suggestedFilename:base::SysUTF16ToNSString(filename)]; 1230 suggestedFilename:base::SysUTF16ToNSString(filename)];
1294 } 1231 }
1295 1232
1296 - (void)countMainFrameLoad { 1233 - (void)countMainFrameLoad {
1297 if ([self isPrerenderTab] || [self url].SchemeIs(kChromeUIScheme)) { 1234 if ([self isPrerenderTab] || [self url].SchemeIs(kChromeUIScheme))
1298 return; 1235 return;
1299 } 1236 base::RecordAction(base::UserMetricsAction("MobilePageLoaded"));
1300 base::RecordAction(UserMetricsAction("MobilePageLoaded"));
1301 } 1237 }
1302 1238
1303 - (void)applicationDidBecomeActive { 1239 - (void)applicationDidBecomeActive {
1304 if (requireReloadAfterBecomingActive_) { 1240 if (!requireReloadAfterBecomingActive_)
1305 if (visible_) { 1241 return;
1306 self.navigationManager->Reload(web::ReloadType::NORMAL, 1242 if (visible_) {
1307 false /* check_for_repost */); 1243 self.navigationManager->Reload(web::ReloadType::NORMAL,
1308 } else { 1244 false /* check_for_repost */);
1309 [self.webController requirePageReload]; 1245 } else {
1310 } 1246 [self.webController requirePageReload];
1311 requireReloadAfterBecomingActive_ = NO;
1312 } 1247 }
1248 requireReloadAfterBecomingActive_ = NO;
1313 } 1249 }
1314 1250
1315 #pragma mark - 1251 #pragma mark -
1316 #pragma mark FindInPageControllerDelegate 1252 #pragma mark FindInPageControllerDelegate
1317 1253
1318 - (void)willAdjustScrollPosition { 1254 - (void)willAdjustScrollPosition {
1319 // Skip the next attempt to correct the scroll offset for the toolbar height. 1255 // Skip the next attempt to correct the scroll offset for the toolbar height.
1320 // Used when programatically scrolling down the y offset. 1256 // Used when programatically scrolling down the y offset.
1321 [fullScreenController_ shouldSkipNextScrollOffsetForHeader]; 1257 [fullScreenController_ shouldSkipNextScrollOffsetForHeader];
1322 } 1258 }
1323 1259
1324 #pragma mark - 1260 #pragma mark -
1325 #pragma mark FullScreen 1261 #pragma mark FullScreen
1326 1262
1327 - (void)updateFullscreenWithToolbarVisible:(BOOL)visible { 1263 - (void)updateFullscreenWithToolbarVisible:(BOOL)visible {
1328 [fullScreenController_ moveHeaderToRestingPosition:visible]; 1264 [fullScreenController_ moveHeaderToRestingPosition:visible];
1329 } 1265 }
1330 1266
1331 #pragma mark - 1267 #pragma mark -
1332 #pragma mark Reader mode 1268 #pragma mark Reader mode
1333 1269
1334 - (UIView*)superviewForReaderModePanel { 1270 - (UIView*)superviewForReaderModePanel {
1335 return self.view; 1271 return self.view;
1336 } 1272 }
1337 1273
1338 - (ReaderModeController*)readerModeController {
1339 return readerModeController_.get();
1340 }
1341
1342 - (BOOL)canSwitchToReaderMode { 1274 - (BOOL)canSwitchToReaderMode {
1343 // Only if the page is loaded and the page passes suitability checks. 1275 // Only if the page is loaded and the page passes suitability checks.
1344 ReaderModeController* controller = self.readerModeController; 1276 ReaderModeController* controller = self.readerModeController;
1345 return controller && controller.checker->CanSwitchToReaderMode(); 1277 return controller && controller.checker->CanSwitchToReaderMode();
1346 } 1278 }
1347 1279
1348 - (void)switchToReaderMode { 1280 - (void)switchToReaderMode {
1349 DCHECK(self.view); 1281 DCHECK(self.view);
1350 [self.readerModeController switchToReaderMode]; 1282 [self.readerModeController switchToReaderMode];
1351 } 1283 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 params.user_agent_override_option = 1341 params.user_agent_override_option =
1410 web::NavigationManager::UserAgentOverrideOption::MOBILE; 1342 web::NavigationManager::UserAgentOverrideOption::MOBILE;
1411 break; 1343 break;
1412 case web::UserAgentType::NONE: 1344 case web::UserAgentType::NONE:
1413 NOTREACHED(); 1345 NOTREACHED();
1414 } 1346 }
1415 1347
1416 navigationManager->LoadURLWithParams(params); 1348 navigationManager->LoadURLWithParams(params);
1417 } 1349 }
1418 1350
1419 - (id<SnapshotOverlayProvider>)snapshotOverlayProvider {
1420 return snapshotOverlayProvider_.get();
1421 }
1422
1423 - (void)setSnapshotOverlayProvider:
1424 (id<SnapshotOverlayProvider>)snapshotOverlayProvider {
1425 snapshotOverlayProvider_.reset(snapshotOverlayProvider);
1426 }
1427
1428 - (void)evaluateU2FResultFromURL:(const GURL&)URL { 1351 - (void)evaluateU2FResultFromURL:(const GURL&)URL {
1429 DCHECK(U2FController_); 1352 DCHECK(U2FController_);
1430 [U2FController_ evaluateU2FResultFromU2FURL:URL webState:self.webState]; 1353 [U2FController_ evaluateU2FResultFromU2FURL:URL webState:self.webState];
1431 } 1354 }
1432 1355
1433 #pragma mark - CRWWebControllerObserver protocol methods. 1356 #pragma mark - CRWWebControllerObserver protocol methods.
1434 1357
1435 - (void)webControllerWillClose:(CRWWebController*)webController { 1358 - (void)webControllerWillClose:(CRWWebController*)webController {
1436 DCHECK_EQ(webController, [self webController]); 1359 DCHECK_EQ(webController, [self webController]);
1437 [[self webController] removeObserver:self]; 1360 [[self webController] removeObserver:self];
(...skipping 20 matching lines...) Expand all
1458 BOOL isUserNavigationEvent = 1381 BOOL isUserNavigationEvent =
1459 (transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) == 0; 1382 (transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK) == 0;
1460 // Check for link-follow clobbers. These are changes where there is no 1383 // Check for link-follow clobbers. These are changes where there is no
1461 // pending entry (since that means the change wasn't caused by this class), 1384 // pending entry (since that means the change wasn't caused by this class),
1462 // and where the URL changes (to avoid counting page resurrection). 1385 // and where the URL changes (to avoid counting page resurrection).
1463 // TODO(crbug.com/546401): Consider moving this into NavigationManager, or 1386 // TODO(crbug.com/546401): Consider moving this into NavigationManager, or
1464 // into a NavigationManager observer callback, so it doesn't need to be 1387 // into a NavigationManager observer callback, so it doesn't need to be
1465 // checked in several places. 1388 // checked in several places.
1466 if (isUserNavigationEvent && !isPrerenderTab_ && 1389 if (isUserNavigationEvent && !isPrerenderTab_ &&
1467 ![self navigationManager]->GetPendingItem() && url != self.url) { 1390 ![self navigationManager]->GetPendingItem() && url != self.url) {
1468 base::RecordAction(UserMetricsAction("MobileTabClobbered")); 1391 base::RecordAction(base::UserMetricsAction("MobileTabClobbered"));
1469 if ([parentTabModel_ tabUsageRecorder]) 1392 if ([parentTabModel_ tabUsageRecorder])
1470 [parentTabModel_ tabUsageRecorder]->RecordPageLoadStart(self); 1393 [parentTabModel_ tabUsageRecorder]->RecordPageLoadStart(self);
1471 } 1394 }
1472 if (![self navigationManager]->GetPendingItem()) { 1395 if (![self navigationManager]->GetPendingItem()) {
1473 // Reset |isVoiceSearchResultsTab| since a new page is being navigated to. 1396 // Reset |isVoiceSearchResultsTab| since a new page is being navigated to.
1474 self.isVoiceSearchResultsTab = NO; 1397 self.isVoiceSearchResultsTab = NO;
1475 } 1398 }
1476 } 1399 }
1477 1400
1478 - (void)webState:(web::WebState*)webState 1401 - (void)webState:(web::WebState*)webState
(...skipping 18 matching lines...) Expand all
1497 [autoReloadBridge_ loadStartedForURL:lastCommittedURL]; 1420 [autoReloadBridge_ loadStartedForURL:lastCommittedURL];
1498 1421
1499 if (parentTabModel_) { 1422 if (parentTabModel_) {
1500 [[NSNotificationCenter defaultCenter] 1423 [[NSNotificationCenter defaultCenter]
1501 postNotificationName:kTabModelTabWillStartLoadingNotification 1424 postNotificationName:kTabModelTabWillStartLoadingNotification
1502 object:parentTabModel_ 1425 object:parentTabModel_
1503 userInfo:@{kTabModelTabKey : self}]; 1426 userInfo:@{kTabModelTabKey : self}];
1504 } 1427 }
1505 favicon::FaviconDriver* faviconDriver = 1428 favicon::FaviconDriver* faviconDriver =
1506 favicon::WebFaviconDriver::FromWebState(webState); 1429 favicon::WebFaviconDriver::FromWebState(webState);
1507 if (faviconDriver) { 1430 if (faviconDriver)
1508 faviconDriver->FetchFavicon(lastCommittedURL); 1431 faviconDriver->FetchFavicon(lastCommittedURL);
1509 }
1510 [parentTabModel_ notifyTabChanged:self]; 1432 [parentTabModel_ notifyTabChanged:self];
1511 if (parentTabModel_) { 1433 if (parentTabModel_) {
1512 [[NSNotificationCenter defaultCenter] 1434 [[NSNotificationCenter defaultCenter]
1513 postNotificationName:kTabModelTabDidStartLoadingNotification 1435 postNotificationName:kTabModelTabDidStartLoadingNotification
1514 object:parentTabModel_ 1436 object:parentTabModel_
1515 userInfo:@{kTabModelTabKey : self}]; 1437 userInfo:@{kTabModelTabKey : self}];
1516 } 1438 }
1517 1439
1518 web::NavigationItem* previousItem = nullptr; 1440 web::NavigationItem* previousItem = nullptr;
1519 if (details.previous_item_index >= 0) { 1441 if (details.previous_item_index >= 0) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1552 [self navigationManager]->GetLastCommittedItem(); 1474 [self navigationManager]->GetLastCommittedItem();
1553 if (lastCommittedItem) { 1475 if (lastCommittedItem) {
1554 wasPost = lastCommittedItem->HasPostData(); 1476 wasPost = lastCommittedItem->HasPostData();
1555 lastCommittedURL = lastCommittedItem->GetVirtualURL(); 1477 lastCommittedURL = lastCommittedItem->GetVirtualURL();
1556 } 1478 }
1557 if (loadSuccess) 1479 if (loadSuccess)
1558 [autoReloadBridge_ loadFinishedForURL:lastCommittedURL wasPost:wasPost]; 1480 [autoReloadBridge_ loadFinishedForURL:lastCommittedURL wasPost:wasPost];
1559 else 1481 else
1560 [autoReloadBridge_ loadFailedForURL:lastCommittedURL wasPost:wasPost]; 1482 [autoReloadBridge_ loadFailedForURL:lastCommittedURL wasPost:wasPost];
1561 [webControllerSnapshotHelper_ setSnapshotCoalescingEnabled:YES]; 1483 [webControllerSnapshotHelper_ setSnapshotCoalescingEnabled:YES];
1562 if (!loadSuccess) { 1484 if (!loadSuccess)
1563 [fullScreenController_ disableFullScreen]; 1485 [fullScreenController_ disableFullScreen];
1564 }
1565 [self recordInterfaceOrientation]; 1486 [self recordInterfaceOrientation];
1566 navigation_metrics::RecordMainFrameNavigation( 1487 navigation_metrics::RecordMainFrameNavigation(
1567 lastCommittedURL, true, self.browserState->IsOffTheRecord()); 1488 lastCommittedURL, true, self.browserState->IsOffTheRecord());
1568 1489
1569 if (loadSuccess) { 1490 if (loadSuccess) {
1570 scoped_refptr<net::HttpResponseHeaders> headers = 1491 scoped_refptr<net::HttpResponseHeaders> headers =
1571 webStateImpl_->GetHttpResponseHeaders(); 1492 webStateImpl_->GetHttpResponseHeaders();
1572 [self handleExportableFile:headers.get()]; 1493 [self handleExportableFile:headers.get()];
1573 } 1494 }
1574 1495
1575 [parentTabModel_ notifyTabChanged:self]; 1496 [parentTabModel_ notifyTabChanged:self];
1576 1497
1577 if (parentTabModel_) { 1498 if (parentTabModel_) {
1578 if ([parentTabModel_ tabUsageRecorder]) 1499 if ([parentTabModel_ tabUsageRecorder])
1579 [parentTabModel_ tabUsageRecorder]->RecordPageLoadDone(self, loadSuccess); 1500 [parentTabModel_ tabUsageRecorder]->RecordPageLoadDone(self, loadSuccess);
1580 [[NSNotificationCenter defaultCenter] 1501 [[NSNotificationCenter defaultCenter]
1581 postNotificationName:kTabModelTabDidFinishLoadingNotification 1502 postNotificationName:kTabModelTabDidFinishLoadingNotification
1582 object:parentTabModel_ 1503 object:parentTabModel_
1583 userInfo:[NSDictionary 1504 userInfo:[NSDictionary
1584 dictionaryWithObjectsAndKeys: 1505 dictionaryWithObjectsAndKeys:
1585 self, kTabModelTabKey, 1506 self, kTabModelTabKey,
1586 [NSNumber numberWithBool:loadSuccess], 1507 [NSNumber numberWithBool:loadSuccess],
1587 kTabModelPageLoadSuccess, nil]]; 1508 kTabModelPageLoadSuccess, nil]];
1588 } 1509 }
1589 [[OmniboxGeolocationController sharedInstance] 1510 [[OmniboxGeolocationController sharedInstance]
1590 finishPageLoadForTab:self 1511 finishPageLoadForTab:self
1591 loadSuccess:loadSuccess]; 1512 loadSuccess:loadSuccess];
1592 1513
1593 if (loadSuccess) { 1514 if (loadSuccess)
1594 [self updateSnapshotWithOverlay:YES visibleFrameOnly:YES]; 1515 [self updateSnapshotWithOverlay:YES visibleFrameOnly:YES];
1595 }
1596 [webControllerSnapshotHelper_ setSnapshotCoalescingEnabled:NO]; 1516 [webControllerSnapshotHelper_ setSnapshotCoalescingEnabled:NO];
1597 } 1517 }
1598 1518
1599 - (void)webState:(web::WebState*)webState 1519 - (void)webState:(web::WebState*)webState
1600 didChangeLoadingProgress:(double)progress { 1520 didChangeLoadingProgress:(double)progress {
1601 // TODO(crbug.com/546406): It is probably possible to do something smarter, 1521 // TODO(crbug.com/546406): It is probably possible to do something smarter,
1602 // but the fact that this is not always sent will have to be taken into 1522 // but the fact that this is not always sent will have to be taken into
1603 // account. 1523 // account.
1604 [parentTabModel_ notifyTabChanged:self]; 1524 [parentTabModel_ notifyTabChanged:self];
1605 } 1525 }
(...skipping 29 matching lines...) Expand all
1635 // TODO(crbug/711511): If Native App Launcher is not enabled, returning NO 1555 // TODO(crbug/711511): If Native App Launcher is not enabled, returning NO
1636 // bypasses all Link Navigation logic. This call should eventually be 1556 // bypasses all Link Navigation logic. This call should eventually be
1637 // eliminated. 1557 // eliminated.
1638 if (!experimental_flags::IsNativeAppLauncherEnabled()) 1558 if (!experimental_flags::IsNativeAppLauncherEnabled())
1639 return NO; 1559 return NO;
1640 1560
1641 // Don't open any native app directly when prerendering or from Incognito. 1561 // Don't open any native app directly when prerendering or from Incognito.
1642 if (isPrerenderTab_ || self.browserState->IsOffTheRecord()) 1562 if (isPrerenderTab_ || self.browserState->IsOffTheRecord())
1643 return NO; 1563 return NO;
1644 1564
1645 base::scoped_nsprotocol<id<NativeAppMetadata>> metadata( 1565 id<NativeAppMetadata> metadata =
1646 [[ios::GetChromeBrowserProvider()->GetNativeAppWhitelistManager() 1566 [ios::GetChromeBrowserProvider()->GetNativeAppWhitelistManager()
1647 nativeAppForURL:url] retain]); 1567 nativeAppForURL:url];
1648 if (![metadata shouldAutoOpenLinks]) 1568 if (![metadata shouldAutoOpenLinks])
1649 return NO; 1569 return NO;
1650 1570
1651 AuthenticationService* authenticationService = 1571 AuthenticationService* authenticationService =
1652 AuthenticationServiceFactory::GetForBrowserState(self.browserState); 1572 AuthenticationServiceFactory::GetForBrowserState(self.browserState);
1653 ChromeIdentity* identity = authenticationService->GetAuthenticatedIdentity(); 1573 ChromeIdentity* identity = authenticationService->GetAuthenticatedIdentity();
1654 1574
1655 // Attempts to open external app without x-callback. 1575 // Attempts to open external app without x-callback.
1656 if ([self openExternalURL:[metadata launchURLWithURL:url identity:identity] 1576 if ([self openExternalURL:[metadata launchURLWithURL:url identity:identity]
1657 sourceURL:sourceURL 1577 sourceURL:sourceURL
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1691 linkClicked:(BOOL)linkClicked { 1611 linkClicked:(BOOL)linkClicked {
1692 // chrome:// URLs are only allowed if the mainDocumentURL is also a chrome:// 1612 // chrome:// URLs are only allowed if the mainDocumentURL is also a chrome://
1693 // URL. 1613 // URL.
1694 if (url.SchemeIs(kChromeUIScheme) && 1614 if (url.SchemeIs(kChromeUIScheme) &&
1695 !mainDocumentURL.SchemeIs(kChromeUIScheme)) { 1615 !mainDocumentURL.SchemeIs(kChromeUIScheme)) {
1696 return NO; 1616 return NO;
1697 } 1617 }
1698 1618
1699 // Always allow frame loads. 1619 // Always allow frame loads.
1700 BOOL isFrameLoad = (url != mainDocumentURL); 1620 BOOL isFrameLoad = (url != mainDocumentURL);
1701 if (isFrameLoad) { 1621 if (isFrameLoad)
1702 return YES; 1622 return YES;
1703 }
1704 1623
1705 // TODO(crbug.com/546402): If this turns out to be useful, find a less hacky 1624 // TODO(crbug.com/546402): If this turns out to be useful, find a less hacky
1706 // hook point to send this from. 1625 // hook point to send this from.
1707 NSString* urlString = base::SysUTF8ToNSString(url.spec()); 1626 NSString* urlString = base::SysUTF8ToNSString(url.spec());
1708 if ([urlString length]) { 1627 if ([urlString length]) {
1709 [[NSNotificationCenter defaultCenter] 1628 [[NSNotificationCenter defaultCenter]
1710 postNotificationName:kTabUrlMayStartLoadingNotificationForCrashReporting 1629 postNotificationName:kTabUrlMayStartLoadingNotificationForCrashReporting
1711 object:self 1630 object:self
1712 userInfo:[NSDictionary dictionaryWithObject:urlString 1631 userInfo:[NSDictionary dictionaryWithObject:urlString
1713 forKey:kTabUrlKey]]; 1632 forKey:kTabUrlKey]];
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1822 } 1741 }
1823 UMA_HISTOGRAM_ENUMERATION( 1742 UMA_HISTOGRAM_ENUMERATION(
1824 kRendererTerminationStateHistogram, static_cast<int>(tab_state), 1743 kRendererTerminationStateHistogram, static_cast<int>(tab_state),
1825 static_cast<int>( 1744 static_cast<int>(
1826 RendererTerminationTabState::TERMINATION_TAB_STATE_COUNT)); 1745 RendererTerminationTabState::TERMINATION_TAB_STATE_COUNT));
1827 if ([parentTabModel_ tabUsageRecorder]) 1746 if ([parentTabModel_ tabUsageRecorder])
1828 [parentTabModel_ tabUsageRecorder]->RendererTerminated(self, visible_); 1747 [parentTabModel_ tabUsageRecorder]->RendererTerminated(self, visible_);
1829 } 1748 }
1830 1749
1831 if (visible_) { 1750 if (visible_) {
1832 if (!applicationIsNotActive) { 1751 if (!applicationIsNotActive)
1833 [fullScreenController_ disableFullScreen]; 1752 [fullScreenController_ disableFullScreen];
1834 }
1835 } else { 1753 } else {
1836 [self.webController requirePageReload]; 1754 [self.webController requirePageReload];
1837 } 1755 }
1838 // Returning to the app (after the renderer crashed in the background) and 1756 // Returning to the app (after the renderer crashed in the background) and
1839 // having the page reload is much less confusing for the user. 1757 // having the page reload is much less confusing for the user.
1840 // Note: Given that the tab is visible, calling |requirePageReload| will not 1758 // Note: Given that the tab is visible, calling |requirePageReload| will not
1841 // work when the app becomes active because there is nothing to trigger 1759 // work when the app becomes active because there is nothing to trigger
1842 // a view redisplay in that scenario. 1760 // a view redisplay in that scenario.
1843 requireReloadAfterBecomingActive_ = visible_ && applicationIsNotActive; 1761 requireReloadAfterBecomingActive_ = visible_ && applicationIsNotActive;
1844 [self.dialogDelegate cancelDialogForTab:self]; 1762 [self.dialogDelegate cancelDialogForTab:self];
(...skipping 21 matching lines...) Expand all
1866 if (isPrerenderTab_) { 1784 if (isPrerenderTab_) {
1867 [delegate_ discardPrerender]; 1785 [delegate_ discardPrerender];
1868 return; 1786 return;
1869 } 1787 }
1870 if (self != [parentTabModel_ currentTab]) 1788 if (self != [parentTabModel_ currentTab])
1871 return; 1789 return;
1872 1790
1873 signin_metrics::LogAccountReconcilorStateOnGaiaResponse( 1791 signin_metrics::LogAccountReconcilorStateOnGaiaResponse(
1874 ios::AccountReconcilorFactory::GetForBrowserState(browserState_) 1792 ios::AccountReconcilorFactory::GetForBrowserState(browserState_)
1875 ->GetState()); 1793 ->GetState());
1876 base::scoped_nsobject<GenericChromeCommand> command( 1794 GenericChromeCommand* command =
1877 [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_ACCOUNTS_SETTINGS]); 1795 [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_ACCOUNTS_SETTINGS];
1878 [self.view chromeExecuteCommand:command]; 1796 [self.view chromeExecuteCommand:command];
1879 } 1797 }
1880 1798
1881 - (void)onAddAccount { 1799 - (void)onAddAccount {
1882 if (isPrerenderTab_) { 1800 if (isPrerenderTab_) {
1883 [delegate_ discardPrerender]; 1801 [delegate_ discardPrerender];
1884 return; 1802 return;
1885 } 1803 }
1886 if (self != [parentTabModel_ currentTab]) 1804 if (self != [parentTabModel_ currentTab])
1887 return; 1805 return;
1888 1806
1889 signin_metrics::LogAccountReconcilorStateOnGaiaResponse( 1807 signin_metrics::LogAccountReconcilorStateOnGaiaResponse(
1890 ios::AccountReconcilorFactory::GetForBrowserState(browserState_) 1808 ios::AccountReconcilorFactory::GetForBrowserState(browserState_)
1891 ->GetState()); 1809 ->GetState());
1892 base::scoped_nsobject<GenericChromeCommand> command( 1810 GenericChromeCommand* command =
1893 [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_ADD_ACCOUNT]); 1811 [[GenericChromeCommand alloc] initWithTag:IDC_SHOW_ADD_ACCOUNT];
1894 [self.view chromeExecuteCommand:command]; 1812 [self.view chromeExecuteCommand:command];
1895 } 1813 }
1896 1814
1897 - (void)onGoIncognito:(const GURL&)url { 1815 - (void)onGoIncognito:(const GURL&)url {
1898 if (isPrerenderTab_) { 1816 if (isPrerenderTab_) {
1899 [delegate_ discardPrerender]; 1817 [delegate_ discardPrerender];
1900 return; 1818 return;
1901 } 1819 }
1902 if (self != [parentTabModel_ currentTab]) 1820 if (self != [parentTabModel_ currentTab])
1903 return; 1821 return;
1904 1822
1905 // The user taps on go incognito from the mobile U-turn webpage (the web page 1823 // The user taps on go incognito from the mobile U-turn webpage (the web page
1906 // that displays all users accounts available in the content area). As the 1824 // that displays all users accounts available in the content area). As the
1907 // user chooses to go to incognito, the mobile U-turn page is no longer 1825 // user chooses to go to incognito, the mobile U-turn page is no longer
1908 // neeeded. The current solution is to go back in history. This has the 1826 // neeeded. The current solution is to go back in history. This has the
1909 // advantage of keeping the current browsing session and give a good user 1827 // advantage of keeping the current browsing session and give a good user
1910 // experience when the user comes back from incognito. 1828 // experience when the user comes back from incognito.
1911 [self goBack]; 1829 [self goBack];
1912 1830
1913 if (url.is_valid()) { 1831 if (url.is_valid()) {
1914 base::scoped_nsobject<OpenUrlCommand> command([[OpenUrlCommand alloc] 1832 OpenUrlCommand* command = [[OpenUrlCommand alloc]
1915 initWithURL:url 1833 initWithURL:url
1916 referrer:web::Referrer() // Strip referrer when switching modes. 1834 referrer:web::Referrer() // Strip referrer when switching modes.
1917 inIncognito:YES 1835 inIncognito:YES
1918 inBackground:NO 1836 inBackground:NO
1919 appendTo:kLastTab]); 1837 appendTo:kLastTab];
1920 [self.view chromeExecuteCommand:command]; 1838 [self.view chromeExecuteCommand:command];
1921 } else { 1839 } else {
1922 base::scoped_nsobject<GenericChromeCommand> chromeCommand( 1840 GenericChromeCommand* command =
1923 [[GenericChromeCommand alloc] initWithTag:IDC_NEW_INCOGNITO_TAB]); 1841 [[GenericChromeCommand alloc] initWithTag:IDC_NEW_INCOGNITO_TAB];
1924 [self.view chromeExecuteCommand:chromeCommand]; 1842 [self.view chromeExecuteCommand:command];
1925 } 1843 }
1926 } 1844 }
1927 1845
1928 - (NativeAppNavigationController*)nativeAppNavigationController { 1846 - (NativeAppNavigationController*)nativeAppNavigationController {
1929 // TODO(crbug.com/711511): If Native App Launcher is not enabled, simply 1847 // TODO(crbug.com/711511): If Native App Launcher is not enabled, simply
1930 // return nil here. This method should eventually be eliminated. 1848 // return nil here. This method should eventually be eliminated.
1931 if (!experimental_flags::IsNativeAppLauncherEnabled()) 1849 if (!experimental_flags::IsNativeAppLauncherEnabled())
1932 return nil; 1850 return nil;
1933 return nativeAppNavigationController_; 1851 return nativeAppNavigationController_;
1934 } 1852 }
1935 1853
1936 - (void)initNativeAppNavigationController { 1854 - (void)initNativeAppNavigationController {
1937 if (browserState_->IsOffTheRecord()) 1855 if (browserState_->IsOffTheRecord())
1938 return; 1856 return;
1939 DCHECK(!nativeAppNavigationController_); 1857 DCHECK(!nativeAppNavigationController_);
1940 nativeAppNavigationController_.reset( 1858 nativeAppNavigationController_ =
1941 [[NativeAppNavigationController alloc] initWithWebState:self.webState]); 1859 [[NativeAppNavigationController alloc] initWithWebState:self.webState];
1942 DCHECK(nativeAppNavigationController_); 1860 DCHECK(nativeAppNavigationController_);
1943 } 1861 }
1944 1862
1945 - (id<PassKitDialogProvider>)passKitDialogProvider {
1946 return passKitDialogProvider_.get();
1947 }
1948
1949 - (void)setPassKitDialogProvider:(id<PassKitDialogProvider>)provider {
1950 passKitDialogProvider_.reset(provider);
1951 }
1952
1953 - (void)wasShown { 1863 - (void)wasShown {
1954 visible_ = YES; 1864 visible_ = YES;
1955 [self updateFullscreenWithToolbarVisible:YES]; 1865 [self updateFullscreenWithToolbarVisible:YES];
1956 [self.webController wasShown]; 1866 [self.webController wasShown];
1957 [inputAccessoryViewController_ wasShown]; 1867 [inputAccessoryViewController_ wasShown];
1958 } 1868 }
1959 1869
1960 - (void)wasHidden { 1870 - (void)wasHidden {
1961 visible_ = NO; 1871 visible_ = NO;
1962 [self updateFullscreenWithToolbarVisible:YES]; 1872 [self updateFullscreenWithToolbarVisible:YES];
1963 [self.webController wasHidden]; 1873 [self.webController wasHidden];
1964 [inputAccessoryViewController_ wasHidden]; 1874 [inputAccessoryViewController_ wasHidden];
1965 } 1875 }
1966 1876
1967 #pragma mark - SadTabTabHelperDelegate 1877 #pragma mark - SadTabTabHelperDelegate
1968 1878
1969 - (BOOL)isTabVisibleForTabHelper:(SadTabTabHelper*)tabHelper { 1879 - (BOOL)isTabVisibleForTabHelper:(SadTabTabHelper*)tabHelper {
1970 UIApplicationState state = UIApplication.sharedApplication.applicationState; 1880 UIApplicationState state = UIApplication.sharedApplication.applicationState;
1971 return visible_ && !IsApplicationStateNotActive(state); 1881 return visible_ && !IsApplicationStateNotActive(state);
1972 } 1882 }
1973 1883
1974 @end 1884 @end
1975 1885
1976 #pragma mark - TestingSupport 1886 #pragma mark - TestingSupport
1977 1887
1978 @implementation Tab (TestingSupport) 1888 @implementation Tab (TestingSupport)
1979 1889
1980 - (void)replaceExternalAppLauncher:(id)externalAppLauncher { 1890 - (void)replaceExternalAppLauncher:(id)externalAppLauncher {
1981 externalAppLauncher_.reset([externalAppLauncher retain]); 1891 externalAppLauncher_ = externalAppLauncher;
1982 } 1892 }
1983 1893
1984 - (TabModel*)parentTabModel { 1894 - (TabModel*)parentTabModel {
1985 return parentTabModel_; 1895 return parentTabModel_;
1986 } 1896 }
1987 1897
1988 - (FormInputAccessoryViewController*)inputAccessoryViewController { 1898 - (FormInputAccessoryViewController*)inputAccessoryViewController {
1989 return inputAccessoryViewController_.get(); 1899 return inputAccessoryViewController_;
1990 } 1900 }
1991 1901
1992 @end 1902 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/tabs/tab.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698