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