OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 /* | 5 /* |
6 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 6 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
9 * (http://www.torchmobile.com/) | 9 * (http://www.torchmobile.com/) |
10 * | 10 * |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
108 // | 108 // |
109 // An empty state is treated as a new navigation by WebKit, which would mean | 109 // An empty state is treated as a new navigation by WebKit, which would mean |
110 // losing the navigation entries and generating a new navigation entry after | 110 // losing the navigation entries and generating a new navigation entry after |
111 // this one. We don't want that. To avoid this we create a valid state which | 111 // this one. We don't want that. To avoid this we create a valid state which |
112 // WebKit will not treat as a new navigation. | 112 // WebKit will not treat as a new navigation. |
113 void SetPageStateIfEmpty(NavigationEntryImpl* entry) { | 113 void SetPageStateIfEmpty(NavigationEntryImpl* entry) { |
114 if (!entry->GetPageState().IsValid()) | 114 if (!entry->GetPageState().IsValid()) |
115 entry->SetPageState(PageState::CreateFromURL(entry->GetURL())); | 115 entry->SetPageState(PageState::CreateFromURL(entry->GetURL())); |
116 } | 116 } |
117 | 117 |
118 NavigationEntryImpl::RestoreType ControllerRestoreTypeToEntryType( | |
Charlie Reis
2016/08/11 23:58:43
I admit this does seem a bit unnecessary. I think
| |
119 NavigationController::RestoreType type) { | |
120 switch (type) { | |
121 case NavigationController::RESTORE_CURRENT_SESSION: | |
122 return NavigationEntryImpl::RESTORE_CURRENT_SESSION; | |
123 case NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY: | |
124 return NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY; | |
125 case NavigationController::RESTORE_LAST_SESSION_CRASHED: | |
126 return NavigationEntryImpl::RESTORE_LAST_SESSION_CRASHED; | |
127 } | |
128 NOTREACHED(); | |
129 return NavigationEntryImpl::RESTORE_CURRENT_SESSION; | |
130 } | |
131 | |
132 // Configure all the NavigationEntries in entries for restore. This resets | 118 // Configure all the NavigationEntries in entries for restore. This resets |
133 // the transition type to reload and makes sure the content state isn't empty. | 119 // the transition type to reload and makes sure the content state isn't empty. |
134 void ConfigureEntriesForRestore( | 120 void ConfigureEntriesForRestore( |
135 std::vector<std::unique_ptr<NavigationEntryImpl>>* entries, | 121 std::vector<std::unique_ptr<NavigationEntryImpl>>* entries, |
136 NavigationController::RestoreType type) { | 122 RestoreType type) { |
137 for (size_t i = 0; i < entries->size(); ++i) { | 123 for (size_t i = 0; i < entries->size(); ++i) { |
138 // Use a transition type of reload so that we don't incorrectly increase | 124 // Use a transition type of reload so that we don't incorrectly increase |
139 // the typed count. | 125 // the typed count. |
140 (*entries)[i]->SetTransitionType(ui::PAGE_TRANSITION_RELOAD); | 126 (*entries)[i]->SetTransitionType(ui::PAGE_TRANSITION_RELOAD); |
141 (*entries)[i]->set_restore_type(ControllerRestoreTypeToEntryType(type)); | 127 (*entries)[i]->set_restore_type(type); |
142 // NOTE(darin): This code is only needed for backwards compat. | 128 // NOTE(darin): This code is only needed for backwards compat. |
143 SetPageStateIfEmpty((*entries)[i].get()); | 129 SetPageStateIfEmpty((*entries)[i].get()); |
144 } | 130 } |
145 } | 131 } |
146 | 132 |
147 // Determines whether or not we should be carrying over a user agent override | 133 // Determines whether or not we should be carrying over a user agent override |
148 // between two NavigationEntries. | 134 // between two NavigationEntries. |
149 bool ShouldKeepOverride(const NavigationEntry* last_entry) { | 135 bool ShouldKeepOverride(const NavigationEntry* last_entry) { |
150 return last_entry && last_entry->GetIsOverridingUserAgent(); | 136 return last_entry && last_entry->GetIsOverridingUserAgent(); |
151 } | 137 } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 failed_pending_entry_id_(0), | 218 failed_pending_entry_id_(0), |
233 last_committed_entry_index_(-1), | 219 last_committed_entry_index_(-1), |
234 pending_entry_index_(-1), | 220 pending_entry_index_(-1), |
235 transient_entry_index_(-1), | 221 transient_entry_index_(-1), |
236 delegate_(delegate), | 222 delegate_(delegate), |
237 max_restored_page_id_(-1), | 223 max_restored_page_id_(-1), |
238 ssl_manager_(this), | 224 ssl_manager_(this), |
239 needs_reload_(false), | 225 needs_reload_(false), |
240 is_initial_navigation_(true), | 226 is_initial_navigation_(true), |
241 in_navigate_to_pending_entry_(false), | 227 in_navigate_to_pending_entry_(false), |
242 pending_reload_(NO_RELOAD), | 228 pending_reload_(ReloadType::NONE), |
243 get_timestamp_callback_(base::Bind(&base::Time::Now)), | 229 get_timestamp_callback_(base::Bind(&base::Time::Now)), |
244 screenshot_manager_(new NavigationEntryScreenshotManager(this)) { | 230 screenshot_manager_(new NavigationEntryScreenshotManager(this)) { |
245 DCHECK(browser_context_); | 231 DCHECK(browser_context_); |
246 } | 232 } |
247 | 233 |
248 NavigationControllerImpl::~NavigationControllerImpl() { | 234 NavigationControllerImpl::~NavigationControllerImpl() { |
249 DiscardNonCommittedEntriesInternal(); | 235 DiscardNonCommittedEntriesInternal(); |
250 } | 236 } |
251 | 237 |
252 WebContents* NavigationControllerImpl::GetWebContents() const { | 238 WebContents* NavigationControllerImpl::GetWebContents() const { |
(...skipping 21 matching lines...) Expand all Loading... | |
274 | 260 |
275 // At this point, the |entries| is full of empty scoped_ptrs, so it can be | 261 // At this point, the |entries| is full of empty scoped_ptrs, so it can be |
276 // cleared out safely. | 262 // cleared out safely. |
277 entries->clear(); | 263 entries->clear(); |
278 | 264 |
279 // And finish the restore. | 265 // And finish the restore. |
280 FinishRestore(selected_navigation, type); | 266 FinishRestore(selected_navigation, type); |
281 } | 267 } |
282 | 268 |
283 void NavigationControllerImpl::Reload(bool check_for_repost) { | 269 void NavigationControllerImpl::Reload(bool check_for_repost) { |
284 ReloadType type = RELOAD; | 270 ReloadType type = ReloadType::NORMAL; |
285 if (base::FeatureList::IsEnabled( | 271 if (base::FeatureList::IsEnabled( |
286 features::kNonValidatingReloadOnNormalReload)) { | 272 features::kNonValidatingReloadOnNormalReload)) { |
287 type = RELOAD_MAIN_RESOURCE; | 273 type = ReloadType::MAIN_RESOURCE; |
288 } | 274 } |
289 ReloadInternal(check_for_repost, type); | 275 ReloadInternal(check_for_repost, type); |
290 } | 276 } |
291 void NavigationControllerImpl::ReloadToRefreshContent(bool check_for_repost) { | 277 void NavigationControllerImpl::ReloadToRefreshContent(bool check_for_repost) { |
292 ReloadType type = RELOAD; | 278 ReloadType type = ReloadType::NORMAL; |
293 if (base::FeatureList::IsEnabled( | 279 if (base::FeatureList::IsEnabled( |
294 features::kNonValidatingReloadOnRefreshContent)) { | 280 features::kNonValidatingReloadOnRefreshContent)) { |
295 type = RELOAD_MAIN_RESOURCE; | 281 type = ReloadType::MAIN_RESOURCE; |
296 } | 282 } |
297 ReloadInternal(check_for_repost, type); | 283 ReloadInternal(check_for_repost, type); |
298 } | 284 } |
299 void NavigationControllerImpl::ReloadBypassingCache(bool check_for_repost) { | 285 void NavigationControllerImpl::ReloadBypassingCache(bool check_for_repost) { |
300 ReloadInternal(check_for_repost, RELOAD_BYPASSING_CACHE); | 286 ReloadInternal(check_for_repost, ReloadType::BYPASSING_CACHE); |
301 } | 287 } |
302 void NavigationControllerImpl::ReloadOriginalRequestURL(bool check_for_repost) { | 288 void NavigationControllerImpl::ReloadOriginalRequestURL(bool check_for_repost) { |
303 ReloadInternal(check_for_repost, RELOAD_ORIGINAL_REQUEST_URL); | 289 ReloadInternal(check_for_repost, ReloadType::ORIGINAL_REQUEST_URL); |
304 } | 290 } |
305 void NavigationControllerImpl::ReloadDisableLoFi(bool check_for_repost) { | 291 void NavigationControllerImpl::ReloadDisableLoFi(bool check_for_repost) { |
306 ReloadInternal(check_for_repost, RELOAD_DISABLE_LOFI_MODE); | 292 ReloadInternal(check_for_repost, ReloadType::DISABLE_LOFI_MODE); |
307 } | 293 } |
308 | 294 |
309 void NavigationControllerImpl::ReloadInternal(bool check_for_repost, | 295 void NavigationControllerImpl::ReloadInternal(bool check_for_repost, |
310 ReloadType reload_type) { | 296 ReloadType reload_type) { |
311 if (transient_entry_index_ != -1) { | 297 if (transient_entry_index_ != -1) { |
312 // If an interstitial is showing, treat a reload as a navigation to the | 298 // If an interstitial is showing, treat a reload as a navigation to the |
313 // transient entry's URL. | 299 // transient entry's URL. |
314 NavigationEntryImpl* transient_entry = GetTransientEntry(); | 300 NavigationEntryImpl* transient_entry = GetTransientEntry(); |
315 if (!transient_entry) | 301 if (!transient_entry) |
316 return; | 302 return; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
372 site_instance->HasWrongProcessForURL(entry->GetURL())) { | 358 site_instance->HasWrongProcessForURL(entry->GetURL())) { |
373 // Create a navigation entry that resembles the current one, but do not | 359 // Create a navigation entry that resembles the current one, but do not |
374 // copy page id, site instance, content state, or timestamp. | 360 // copy page id, site instance, content state, or timestamp. |
375 NavigationEntryImpl* nav_entry = NavigationEntryImpl::FromNavigationEntry( | 361 NavigationEntryImpl* nav_entry = NavigationEntryImpl::FromNavigationEntry( |
376 CreateNavigationEntry( | 362 CreateNavigationEntry( |
377 entry->GetURL(), entry->GetReferrer(), entry->GetTransitionType(), | 363 entry->GetURL(), entry->GetReferrer(), entry->GetTransitionType(), |
378 false, entry->extra_headers(), browser_context_).release()); | 364 false, entry->extra_headers(), browser_context_).release()); |
379 | 365 |
380 // Mark the reload type as NO_RELOAD, so navigation will not be considered | 366 // Mark the reload type as NO_RELOAD, so navigation will not be considered |
381 // a reload in the renderer. | 367 // a reload in the renderer. |
382 reload_type = NavigationController::NO_RELOAD; | 368 reload_type = ReloadType::NONE; |
383 | 369 |
384 nav_entry->set_should_replace_entry(true); | 370 nav_entry->set_should_replace_entry(true); |
385 pending_entry_ = nav_entry; | 371 pending_entry_ = nav_entry; |
386 DCHECK_EQ(-1, pending_entry_index_); | 372 DCHECK_EQ(-1, pending_entry_index_); |
387 } else { | 373 } else { |
388 pending_entry_ = entry; | 374 pending_entry_ = entry; |
389 pending_entry_index_ = current_index; | 375 pending_entry_index_ = current_index; |
390 | 376 |
391 // The title of the page being reloaded might have been removed in the | 377 // The title of the page being reloaded might have been removed in the |
392 // meanwhile, so we need to revert to the default title upon reload and | 378 // meanwhile, so we need to revert to the default title upon reload and |
393 // invalidate the previously cached title (SetTitle will do both). | 379 // invalidate the previously cached title (SetTitle will do both). |
394 // See Chromium issue 96041. | 380 // See Chromium issue 96041. |
395 pending_entry_->SetTitle(base::string16()); | 381 pending_entry_->SetTitle(base::string16()); |
396 | 382 |
397 pending_entry_->SetTransitionType(ui::PAGE_TRANSITION_RELOAD); | 383 pending_entry_->SetTransitionType(ui::PAGE_TRANSITION_RELOAD); |
398 } | 384 } |
399 | 385 |
400 NavigateToPendingEntry(reload_type); | 386 NavigateToPendingEntry(reload_type); |
401 } | 387 } |
402 } | 388 } |
403 | 389 |
404 void NavigationControllerImpl::CancelPendingReload() { | 390 void NavigationControllerImpl::CancelPendingReload() { |
405 DCHECK(pending_reload_ != NO_RELOAD); | 391 DCHECK(pending_reload_ != ReloadType::NONE); |
406 pending_reload_ = NO_RELOAD; | 392 pending_reload_ = ReloadType::NONE; |
407 } | 393 } |
408 | 394 |
409 void NavigationControllerImpl::ContinuePendingReload() { | 395 void NavigationControllerImpl::ContinuePendingReload() { |
410 if (pending_reload_ == NO_RELOAD) { | 396 if (pending_reload_ == ReloadType::NONE) { |
411 NOTREACHED(); | 397 NOTREACHED(); |
412 } else { | 398 } else { |
413 ReloadInternal(false, pending_reload_); | 399 ReloadInternal(false, pending_reload_); |
414 pending_reload_ = NO_RELOAD; | 400 pending_reload_ = ReloadType::NONE; |
415 } | 401 } |
416 } | 402 } |
417 | 403 |
418 bool NavigationControllerImpl::IsInitialNavigation() const { | 404 bool NavigationControllerImpl::IsInitialNavigation() const { |
419 return is_initial_navigation_; | 405 return is_initial_navigation_; |
420 } | 406 } |
421 | 407 |
422 bool NavigationControllerImpl::IsInitialBlankNavigation() const { | 408 bool NavigationControllerImpl::IsInitialBlankNavigation() const { |
423 // TODO(creis): Once we create a NavigationEntry for the initial blank page, | 409 // TODO(creis): Once we create a NavigationEntry for the initial blank page, |
424 // we'll need to check for entry count 1 and restore_type RESTORE_NONE (to | 410 // we'll need to check for entry count 1 and restore_type NONE (to exclude |
425 // exclude the cloned tab case). | 411 // the cloned tab case). |
426 return IsInitialNavigation() && GetEntryCount() == 0; | 412 return IsInitialNavigation() && GetEntryCount() == 0; |
427 } | 413 } |
428 | 414 |
429 NavigationEntryImpl* NavigationControllerImpl::GetEntryWithPageID( | 415 NavigationEntryImpl* NavigationControllerImpl::GetEntryWithPageID( |
430 SiteInstance* instance, | 416 SiteInstance* instance, |
431 int32_t page_id) const { | 417 int32_t page_id) const { |
432 int index = GetEntryIndexWithPageID(instance, page_id); | 418 int index = GetEntryIndexWithPageID(instance, page_id); |
433 return (index != -1) ? entries_[index].get() : nullptr; | 419 return (index != -1) ? entries_[index].get() : nullptr; |
434 } | 420 } |
435 | 421 |
436 NavigationEntryImpl* | 422 NavigationEntryImpl* |
437 NavigationControllerImpl::GetEntryWithUniqueID(int nav_entry_id) const { | 423 NavigationControllerImpl::GetEntryWithUniqueID(int nav_entry_id) const { |
438 int index = GetEntryIndexWithUniqueID(nav_entry_id); | 424 int index = GetEntryIndexWithUniqueID(nav_entry_id); |
439 return (index != -1) ? entries_[index].get() : nullptr; | 425 return (index != -1) ? entries_[index].get() : nullptr; |
440 } | 426 } |
441 | 427 |
442 void NavigationControllerImpl::LoadEntry( | 428 void NavigationControllerImpl::LoadEntry( |
443 std::unique_ptr<NavigationEntryImpl> entry) { | 429 std::unique_ptr<NavigationEntryImpl> entry) { |
444 // When navigating to a new page, we don't know for sure if we will actually | 430 // When navigating to a new page, we don't know for sure if we will actually |
445 // end up leaving the current page. The new page load could for example | 431 // end up leaving the current page. The new page load could for example |
446 // result in a download or a 'no content' response (e.g., a mailto: URL). | 432 // result in a download or a 'no content' response (e.g., a mailto: URL). |
447 SetPendingEntry(std::move(entry)); | 433 SetPendingEntry(std::move(entry)); |
448 NavigateToPendingEntry(NO_RELOAD); | 434 NavigateToPendingEntry(ReloadType::NONE); |
449 } | 435 } |
450 | 436 |
451 void NavigationControllerImpl::SetPendingEntry( | 437 void NavigationControllerImpl::SetPendingEntry( |
452 std::unique_ptr<NavigationEntryImpl> entry) { | 438 std::unique_ptr<NavigationEntryImpl> entry) { |
453 DiscardNonCommittedEntriesInternal(); | 439 DiscardNonCommittedEntriesInternal(); |
454 pending_entry_ = entry.release(); | 440 pending_entry_ = entry.release(); |
455 NotificationService::current()->Notify( | 441 NotificationService::current()->Notify( |
456 NOTIFICATION_NAV_ENTRY_PENDING, | 442 NOTIFICATION_NAV_ENTRY_PENDING, |
457 Source<NavigationController>(this), | 443 Source<NavigationController>(this), |
458 Details<NavigationEntry>(pending_entry_)); | 444 Details<NavigationEntry>(pending_entry_)); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
601 } | 587 } |
602 } | 588 } |
603 | 589 |
604 DiscardNonCommittedEntries(); | 590 DiscardNonCommittedEntries(); |
605 | 591 |
606 pending_entry_index_ = index; | 592 pending_entry_index_ = index; |
607 entries_[pending_entry_index_]->SetTransitionType( | 593 entries_[pending_entry_index_]->SetTransitionType( |
608 ui::PageTransitionFromInt( | 594 ui::PageTransitionFromInt( |
609 entries_[pending_entry_index_]->GetTransitionType() | | 595 entries_[pending_entry_index_]->GetTransitionType() | |
610 ui::PAGE_TRANSITION_FORWARD_BACK)); | 596 ui::PAGE_TRANSITION_FORWARD_BACK)); |
611 NavigateToPendingEntry(NO_RELOAD); | 597 NavigateToPendingEntry(ReloadType::NONE); |
612 } | 598 } |
613 | 599 |
614 void NavigationControllerImpl::GoToOffset(int offset) { | 600 void NavigationControllerImpl::GoToOffset(int offset) { |
615 // Note: This is actually reached in unit tests. | 601 // Note: This is actually reached in unit tests. |
616 if (!CanGoToOffset(offset)) | 602 if (!CanGoToOffset(offset)) |
617 return; | 603 return; |
618 | 604 |
619 GoToIndex(GetIndexForOffset(offset)); | 605 GoToIndex(GetIndexForOffset(offset)); |
620 } | 606 } |
621 | 607 |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
794 if (GetLastCommittedEntry()) { | 780 if (GetLastCommittedEntry()) { |
795 details->previous_url = GetLastCommittedEntry()->GetURL(); | 781 details->previous_url = GetLastCommittedEntry()->GetURL(); |
796 details->previous_entry_index = GetLastCommittedEntryIndex(); | 782 details->previous_entry_index = GetLastCommittedEntryIndex(); |
797 } else { | 783 } else { |
798 details->previous_url = GURL(); | 784 details->previous_url = GURL(); |
799 details->previous_entry_index = -1; | 785 details->previous_entry_index = -1; |
800 } | 786 } |
801 | 787 |
802 // If there is a pending entry at this point, it should have a SiteInstance, | 788 // If there is a pending entry at this point, it should have a SiteInstance, |
803 // except for restored entries. | 789 // except for restored entries. |
804 DCHECK(pending_entry_index_ == -1 || | 790 DCHECK(pending_entry_index_ == -1 || pending_entry_->site_instance() || |
805 pending_entry_->site_instance() || | 791 pending_entry_->restore_type() != RestoreType::NONE); |
806 pending_entry_->restore_type() != NavigationEntryImpl::RESTORE_NONE); | 792 if (pending_entry_ && pending_entry_->restore_type() != RestoreType::NONE) { |
807 if (pending_entry_ && | 793 pending_entry_->set_restore_type(RestoreType::NONE); |
808 pending_entry_->restore_type() != NavigationEntryImpl::RESTORE_NONE) | 794 } |
809 pending_entry_->set_restore_type(NavigationEntryImpl::RESTORE_NONE); | |
810 | 795 |
811 // The renderer tells us whether the navigation replaces the current entry. | 796 // The renderer tells us whether the navigation replaces the current entry. |
812 details->did_replace_entry = params.should_replace_current_entry; | 797 details->did_replace_entry = params.should_replace_current_entry; |
813 | 798 |
814 // Do navigation-type specific actions. These will make and commit an entry. | 799 // Do navigation-type specific actions. These will make and commit an entry. |
815 details->type = ClassifyNavigation(rfh, params); | 800 details->type = ClassifyNavigation(rfh, params); |
816 | 801 |
817 // is_in_page must be computed before the entry gets committed. | 802 // is_in_page must be computed before the entry gets committed. |
818 details->is_in_page = IsURLInPageNavigation(params.url, params.origin, | 803 details->is_in_page = IsURLInPageNavigation(params.url, params.origin, |
819 params.was_within_same_page, rfh); | 804 params.was_within_same_page, rfh); |
820 | 805 |
821 switch (details->type) { | 806 switch (details->type) { |
822 case NAVIGATION_TYPE_NEW_PAGE: | 807 case NavigationType::NEW_PAGE: |
Charlie Reis
2016/08/11 23:58:43
What's the motivation for changing this one? I'm
Takashi Toyoshima
2016/09/07 12:07:44
My understanding is "enum class" is encouraged to
| |
823 RendererDidNavigateToNewPage(rfh, params, details->is_in_page, | 808 RendererDidNavigateToNewPage(rfh, params, details->is_in_page, |
824 details->did_replace_entry); | 809 details->did_replace_entry); |
825 break; | 810 break; |
826 case NAVIGATION_TYPE_EXISTING_PAGE: | 811 case NavigationType::EXISTING_PAGE: |
827 details->did_replace_entry = details->is_in_page; | 812 details->did_replace_entry = details->is_in_page; |
828 RendererDidNavigateToExistingPage(rfh, params); | 813 RendererDidNavigateToExistingPage(rfh, params); |
829 break; | 814 break; |
830 case NAVIGATION_TYPE_SAME_PAGE: | 815 case NavigationType::SAME_PAGE: |
831 RendererDidNavigateToSamePage(rfh, params); | 816 RendererDidNavigateToSamePage(rfh, params); |
832 break; | 817 break; |
833 case NAVIGATION_TYPE_NEW_SUBFRAME: | 818 case NavigationType::NEW_SUBFRAME: |
834 RendererDidNavigateNewSubframe(rfh, params, details->is_in_page, | 819 RendererDidNavigateNewSubframe(rfh, params, details->is_in_page, |
835 details->did_replace_entry); | 820 details->did_replace_entry); |
836 break; | 821 break; |
837 case NAVIGATION_TYPE_AUTO_SUBFRAME: | 822 case NavigationType::AUTO_SUBFRAME: |
838 if (!RendererDidNavigateAutoSubframe(rfh, params)) | 823 if (!RendererDidNavigateAutoSubframe(rfh, params)) |
839 return false; | 824 return false; |
840 break; | 825 break; |
841 case NAVIGATION_TYPE_NAV_IGNORE: | 826 case NavigationType::NAV_IGNORE: |
842 // If a pending navigation was in progress, this canceled it. We should | 827 // If a pending navigation was in progress, this canceled it. We should |
843 // discard it and make sure it is removed from the URL bar. After that, | 828 // discard it and make sure it is removed from the URL bar. After that, |
844 // there is nothing we can do with this navigation, so we just return to | 829 // there is nothing we can do with this navigation, so we just return to |
845 // the caller that nothing has happened. | 830 // the caller that nothing has happened. |
846 if (pending_entry_) { | 831 if (pending_entry_) { |
847 DiscardNonCommittedEntries(); | 832 DiscardNonCommittedEntries(); |
848 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); | 833 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); |
849 } | 834 } |
850 return false; | 835 return false; |
851 default: | 836 default: |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
939 return true; | 924 return true; |
940 } | 925 } |
941 | 926 |
942 NavigationType NavigationControllerImpl::ClassifyNavigation( | 927 NavigationType NavigationControllerImpl::ClassifyNavigation( |
943 RenderFrameHostImpl* rfh, | 928 RenderFrameHostImpl* rfh, |
944 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) const { | 929 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) const { |
945 if (params.did_create_new_entry) { | 930 if (params.did_create_new_entry) { |
946 // A new entry. We may or may not have a pending entry for the page, and | 931 // A new entry. We may or may not have a pending entry for the page, and |
947 // this may or may not be the main frame. | 932 // this may or may not be the main frame. |
948 if (!rfh->GetParent()) { | 933 if (!rfh->GetParent()) { |
949 return NAVIGATION_TYPE_NEW_PAGE; | 934 return NavigationType::NEW_PAGE; |
950 } | 935 } |
951 | 936 |
952 // When this is a new subframe navigation, we should have a committed page | 937 // When this is a new subframe navigation, we should have a committed page |
953 // in which it's a subframe. This may not be the case when an iframe is | 938 // in which it's a subframe. This may not be the case when an iframe is |
954 // navigated on a popup navigated to about:blank (the iframe would be | 939 // navigated on a popup navigated to about:blank (the iframe would be |
955 // written into the popup by script on the main page). For these cases, | 940 // written into the popup by script on the main page). For these cases, |
956 // there isn't any navigation stuff we can do, so just ignore it. | 941 // there isn't any navigation stuff we can do, so just ignore it. |
957 if (!GetLastCommittedEntry()) | 942 if (!GetLastCommittedEntry()) |
958 return NAVIGATION_TYPE_NAV_IGNORE; | 943 return NavigationType::NAV_IGNORE; |
959 | 944 |
960 // Valid subframe navigation. | 945 // Valid subframe navigation. |
961 return NAVIGATION_TYPE_NEW_SUBFRAME; | 946 return NavigationType::NEW_SUBFRAME; |
962 } | 947 } |
963 | 948 |
964 // Cross-process location.replace navigations should be classified as New with | 949 // Cross-process location.replace navigations should be classified as New with |
965 // replacement rather than ExistingPage, since it is not safe to reuse the | 950 // replacement rather than ExistingPage, since it is not safe to reuse the |
966 // NavigationEntry. | 951 // NavigationEntry. |
967 // TODO(creis): Have the renderer classify location.replace as | 952 // TODO(creis): Have the renderer classify location.replace as |
968 // did_create_new_entry for all cases and eliminate this special case. This | 953 // did_create_new_entry for all cases and eliminate this special case. This |
969 // requires updating several test expectations. See https://crbug.com/596707. | 954 // requires updating several test expectations. See https://crbug.com/596707. |
970 if (!rfh->GetParent() && GetLastCommittedEntry() && | 955 if (!rfh->GetParent() && GetLastCommittedEntry() && |
971 GetLastCommittedEntry()->site_instance() != rfh->GetSiteInstance() && | 956 GetLastCommittedEntry()->site_instance() != rfh->GetSiteInstance() && |
972 params.should_replace_current_entry) { | 957 params.should_replace_current_entry) { |
973 return NAVIGATION_TYPE_NEW_PAGE; | 958 return NavigationType::NEW_PAGE; |
974 } | 959 } |
975 | 960 |
976 // We only clear the session history when navigating to a new page. | 961 // We only clear the session history when navigating to a new page. |
977 DCHECK(!params.history_list_was_cleared); | 962 DCHECK(!params.history_list_was_cleared); |
978 | 963 |
979 if (rfh->GetParent()) { | 964 if (rfh->GetParent()) { |
980 // All manual subframes would be did_create_new_entry and handled above, so | 965 // All manual subframes would be did_create_new_entry and handled above, so |
981 // we know this is auto. | 966 // we know this is auto. |
982 if (GetLastCommittedEntry()) { | 967 if (GetLastCommittedEntry()) { |
983 return NAVIGATION_TYPE_AUTO_SUBFRAME; | 968 return NavigationType::AUTO_SUBFRAME; |
984 } else { | 969 } else { |
985 // We ignore subframes created in non-committed pages; we'd appreciate if | 970 // We ignore subframes created in non-committed pages; we'd appreciate if |
986 // people stopped doing that. | 971 // people stopped doing that. |
987 return NAVIGATION_TYPE_NAV_IGNORE; | 972 return NavigationType::NAV_IGNORE; |
988 } | 973 } |
989 } | 974 } |
990 | 975 |
991 if (params.nav_entry_id == 0) { | 976 if (params.nav_entry_id == 0) { |
992 // This is a renderer-initiated navigation (nav_entry_id == 0), but didn't | 977 // This is a renderer-initiated navigation (nav_entry_id == 0), but didn't |
993 // create a new page. | 978 // create a new page. |
994 | 979 |
995 // Just like above in the did_create_new_entry case, it's possible to | 980 // Just like above in the did_create_new_entry case, it's possible to |
996 // scribble onto an uncommitted page. Again, there isn't any navigation | 981 // scribble onto an uncommitted page. Again, there isn't any navigation |
997 // stuff that we can do, so ignore it here as well. | 982 // stuff that we can do, so ignore it here as well. |
998 NavigationEntry* last_committed = GetLastCommittedEntry(); | 983 NavigationEntry* last_committed = GetLastCommittedEntry(); |
999 if (!last_committed) | 984 if (!last_committed) |
1000 return NAVIGATION_TYPE_NAV_IGNORE; | 985 return NavigationType::NAV_IGNORE; |
1001 | 986 |
1002 // This is history.replaceState(), history.reload(), or a client-side | 987 // This is history.replaceState(), history.reload(), or a client-side |
1003 // redirect. | 988 // redirect. |
1004 return NAVIGATION_TYPE_EXISTING_PAGE; | 989 return NavigationType::EXISTING_PAGE; |
1005 } | 990 } |
1006 | 991 |
1007 if (pending_entry_ && pending_entry_index_ == -1 && | 992 if (pending_entry_ && pending_entry_index_ == -1 && |
1008 pending_entry_->GetUniqueID() == params.nav_entry_id) { | 993 pending_entry_->GetUniqueID() == params.nav_entry_id) { |
1009 // In this case, we have a pending entry for a load of a new URL but Blink | 994 // In this case, we have a pending entry for a load of a new URL but Blink |
1010 // didn't do a new navigation (params.did_create_new_entry). First check to | 995 // didn't do a new navigation (params.did_create_new_entry). First check to |
1011 // make sure Blink didn't treat a new cross-process navigation as inert, and | 996 // make sure Blink didn't treat a new cross-process navigation as inert, and |
1012 // thus set params.did_create_new_entry to false. In that case, we must | 997 // thus set params.did_create_new_entry to false. In that case, we must |
1013 // treat it as NEW since the SiteInstance doesn't match the entry. | 998 // treat it as NEW since the SiteInstance doesn't match the entry. |
1014 if (GetLastCommittedEntry()->site_instance() != rfh->GetSiteInstance()) | 999 if (GetLastCommittedEntry()->site_instance() != rfh->GetSiteInstance()) |
1015 return NAVIGATION_TYPE_NEW_PAGE; | 1000 return NavigationType::NEW_PAGE; |
1016 | 1001 |
1017 // Otherwise, this happens when you press enter in the URL bar to reload. We | 1002 // Otherwise, this happens when you press enter in the URL bar to reload. We |
1018 // will create a pending entry, but Blink will convert it to a reload since | 1003 // will create a pending entry, but Blink will convert it to a reload since |
1019 // it's the same page and not create a new entry for it (the user doesn't | 1004 // it's the same page and not create a new entry for it (the user doesn't |
1020 // want to have a new back/forward entry when they do this). Therefore we | 1005 // want to have a new back/forward entry when they do this). Therefore we |
1021 // want to just ignore the pending entry and go back to where we were (the | 1006 // want to just ignore the pending entry and go back to where we were (the |
1022 // "existing entry"). | 1007 // "existing entry"). |
1023 // TODO(creis,avi): Eliminate SAME_PAGE in https://crbug.com/536102. | 1008 // TODO(creis,avi): Eliminate SAME_PAGE in https://crbug.com/536102. |
1024 return NAVIGATION_TYPE_SAME_PAGE; | 1009 return NavigationType::SAME_PAGE; |
1025 } | 1010 } |
1026 | 1011 |
1027 if (params.intended_as_new_entry) { | 1012 if (params.intended_as_new_entry) { |
1028 // This was intended to be a navigation to a new entry but the pending entry | 1013 // This was intended to be a navigation to a new entry but the pending entry |
1029 // got cleared in the meanwhile. Classify as EXISTING_PAGE because we may or | 1014 // got cleared in the meanwhile. Classify as EXISTING_PAGE because we may or |
1030 // may not have a pending entry. | 1015 // may not have a pending entry. |
1031 return NAVIGATION_TYPE_EXISTING_PAGE; | 1016 return NavigationType::EXISTING_PAGE; |
1032 } | 1017 } |
1033 | 1018 |
1034 if (params.url_is_unreachable && failed_pending_entry_id_ != 0 && | 1019 if (params.url_is_unreachable && failed_pending_entry_id_ != 0 && |
1035 params.nav_entry_id == failed_pending_entry_id_) { | 1020 params.nav_entry_id == failed_pending_entry_id_) { |
1036 // If the renderer was going to a new pending entry that got cleared because | 1021 // If the renderer was going to a new pending entry that got cleared because |
1037 // of an error, this is the case of the user trying to retry a failed load | 1022 // of an error, this is the case of the user trying to retry a failed load |
1038 // by pressing return. Classify as EXISTING_PAGE because we probably don't | 1023 // by pressing return. Classify as EXISTING_PAGE because we probably don't |
1039 // have a pending entry. | 1024 // have a pending entry. |
1040 return NAVIGATION_TYPE_EXISTING_PAGE; | 1025 return NavigationType::EXISTING_PAGE; |
1041 } | 1026 } |
1042 | 1027 |
1043 // Now we know that the notification is for an existing page. Find that entry. | 1028 // Now we know that the notification is for an existing page. Find that entry. |
1044 int existing_entry_index = GetEntryIndexWithUniqueID(params.nav_entry_id); | 1029 int existing_entry_index = GetEntryIndexWithUniqueID(params.nav_entry_id); |
1045 if (existing_entry_index == -1) { | 1030 if (existing_entry_index == -1) { |
1046 // The renderer has committed a navigation to an entry that no longer | 1031 // The renderer has committed a navigation to an entry that no longer |
1047 // exists. Because the renderer is showing that page, resurrect that entry. | 1032 // exists. Because the renderer is showing that page, resurrect that entry. |
1048 return NAVIGATION_TYPE_NEW_PAGE; | 1033 return NavigationType::NEW_PAGE; |
1049 } | 1034 } |
1050 | 1035 |
1051 // Since we weeded out "new" navigations above, we know this is an existing | 1036 // Since we weeded out "new" navigations above, we know this is an existing |
1052 // (back/forward) navigation. | 1037 // (back/forward) navigation. |
1053 return NAVIGATION_TYPE_EXISTING_PAGE; | 1038 return NavigationType::EXISTING_PAGE; |
1054 } | 1039 } |
1055 | 1040 |
1056 void NavigationControllerImpl::RendererDidNavigateToNewPage( | 1041 void NavigationControllerImpl::RendererDidNavigateToNewPage( |
1057 RenderFrameHostImpl* rfh, | 1042 RenderFrameHostImpl* rfh, |
1058 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, | 1043 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, |
1059 bool is_in_page, | 1044 bool is_in_page, |
1060 bool replace_entry) { | 1045 bool replace_entry) { |
1061 std::unique_ptr<NavigationEntryImpl> new_entry; | 1046 std::unique_ptr<NavigationEntryImpl> new_entry; |
1062 bool update_virtual_url = false; | 1047 bool update_virtual_url = false; |
1063 | 1048 |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1468 | 1453 |
1469 for (SessionStorageNamespaceMap::const_iterator it = | 1454 for (SessionStorageNamespaceMap::const_iterator it = |
1470 source.session_storage_namespace_map_.begin(); | 1455 source.session_storage_namespace_map_.begin(); |
1471 it != source.session_storage_namespace_map_.end(); | 1456 it != source.session_storage_namespace_map_.end(); |
1472 ++it) { | 1457 ++it) { |
1473 SessionStorageNamespaceImpl* source_namespace = | 1458 SessionStorageNamespaceImpl* source_namespace = |
1474 static_cast<SessionStorageNamespaceImpl*>(it->second.get()); | 1459 static_cast<SessionStorageNamespaceImpl*>(it->second.get()); |
1475 session_storage_namespace_map_[it->first] = source_namespace->Clone(); | 1460 session_storage_namespace_map_[it->first] = source_namespace->Clone(); |
1476 } | 1461 } |
1477 | 1462 |
1478 FinishRestore(source.last_committed_entry_index_, RESTORE_CURRENT_SESSION); | 1463 FinishRestore(source.last_committed_entry_index_, |
1464 RestoreType::CURRENT_SESSION); | |
1479 | 1465 |
1480 // Copy the max page id map from the old tab to the new tab. This ensures | 1466 // Copy the max page id map from the old tab to the new tab. This ensures |
1481 // that new and existing navigations in the tab's current SiteInstances | 1467 // that new and existing navigations in the tab's current SiteInstances |
1482 // are identified properly. | 1468 // are identified properly. |
1483 delegate_->CopyMaxPageIDsFrom(source.delegate()->GetWebContents()); | 1469 delegate_->CopyMaxPageIDsFrom(source.delegate()->GetWebContents()); |
1484 } | 1470 } |
1485 | 1471 |
1486 void NavigationControllerImpl::CopyStateFromAndPrune( | 1472 void NavigationControllerImpl::CopyStateFromAndPrune( |
1487 NavigationController* temp, | 1473 NavigationController* temp, |
1488 bool replace_entry) { | 1474 bool replace_entry) { |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1773 needs_reload_ = false; | 1759 needs_reload_ = false; |
1774 | 1760 |
1775 // If we were navigating to a slow-to-commit page, and the user performs | 1761 // If we were navigating to a slow-to-commit page, and the user performs |
1776 // a session history navigation to the last committed page, RenderViewHost | 1762 // a session history navigation to the last committed page, RenderViewHost |
1777 // will force the throbber to start, but WebKit will essentially ignore the | 1763 // will force the throbber to start, but WebKit will essentially ignore the |
1778 // navigation, and won't send a message to stop the throbber. To prevent this | 1764 // navigation, and won't send a message to stop the throbber. To prevent this |
1779 // from happening, we drop the navigation here and stop the slow-to-commit | 1765 // from happening, we drop the navigation here and stop the slow-to-commit |
1780 // page from loading (which would normally happen during the navigation). | 1766 // page from loading (which would normally happen during the navigation). |
1781 if (pending_entry_index_ != -1 && | 1767 if (pending_entry_index_ != -1 && |
1782 pending_entry_index_ == last_committed_entry_index_ && | 1768 pending_entry_index_ == last_committed_entry_index_ && |
1783 (entries_[pending_entry_index_]->restore_type() == | 1769 (entries_[pending_entry_index_]->restore_type() == RestoreType::NONE) && |
1784 NavigationEntryImpl::RESTORE_NONE) && | |
1785 (entries_[pending_entry_index_]->GetTransitionType() & | 1770 (entries_[pending_entry_index_]->GetTransitionType() & |
1786 ui::PAGE_TRANSITION_FORWARD_BACK)) { | 1771 ui::PAGE_TRANSITION_FORWARD_BACK)) { |
1787 delegate_->Stop(); | 1772 delegate_->Stop(); |
1788 | 1773 |
1789 // If an interstitial page is showing, we want to close it to get back | 1774 // If an interstitial page is showing, we want to close it to get back |
1790 // to what was showing before. | 1775 // to what was showing before. |
1791 if (delegate_->GetInterstitialPage()) | 1776 if (delegate_->GetInterstitialPage()) |
1792 delegate_->GetInterstitialPage()->DontProceed(); | 1777 delegate_->GetInterstitialPage()->DontProceed(); |
1793 | 1778 |
1794 DiscardNonCommittedEntries(); | 1779 DiscardNonCommittedEntries(); |
1795 return; | 1780 return; |
1796 } | 1781 } |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1977 } | 1962 } |
1978 | 1963 |
1979 void NavigationControllerImpl::LoadIfNecessary() { | 1964 void NavigationControllerImpl::LoadIfNecessary() { |
1980 if (!needs_reload_) | 1965 if (!needs_reload_) |
1981 return; | 1966 return; |
1982 | 1967 |
1983 // Calling Reload() results in ignoring state, and not loading. | 1968 // Calling Reload() results in ignoring state, and not loading. |
1984 // Explicitly use NavigateToPendingEntry so that the renderer uses the | 1969 // Explicitly use NavigateToPendingEntry so that the renderer uses the |
1985 // cached state. | 1970 // cached state. |
1986 if (pending_entry_) { | 1971 if (pending_entry_) { |
1987 NavigateToPendingEntry(NO_RELOAD); | 1972 NavigateToPendingEntry(ReloadType::NONE); |
1988 } else if (last_committed_entry_index_ != -1) { | 1973 } else if (last_committed_entry_index_ != -1) { |
1989 pending_entry_index_ = last_committed_entry_index_; | 1974 pending_entry_index_ = last_committed_entry_index_; |
1990 NavigateToPendingEntry(NO_RELOAD); | 1975 NavigateToPendingEntry(ReloadType::NONE); |
1991 } else { | 1976 } else { |
1992 // If there is something to reload, the successful reload will clear the | 1977 // If there is something to reload, the successful reload will clear the |
1993 // |needs_reload_| flag. Otherwise, just do it here. | 1978 // |needs_reload_| flag. Otherwise, just do it here. |
1994 needs_reload_ = false; | 1979 needs_reload_ = false; |
1995 } | 1980 } |
1996 } | 1981 } |
1997 | 1982 |
1998 void NavigationControllerImpl::NotifyEntryChanged( | 1983 void NavigationControllerImpl::NotifyEntryChanged( |
1999 const NavigationEntry* entry) { | 1984 const NavigationEntry* entry) { |
2000 EntryChangedDetails det; | 1985 EntryChangedDetails det; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2104 } | 2089 } |
2105 } | 2090 } |
2106 } | 2091 } |
2107 | 2092 |
2108 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 2093 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
2109 const base::Callback<base::Time()>& get_timestamp_callback) { | 2094 const base::Callback<base::Time()>& get_timestamp_callback) { |
2110 get_timestamp_callback_ = get_timestamp_callback; | 2095 get_timestamp_callback_ = get_timestamp_callback; |
2111 } | 2096 } |
2112 | 2097 |
2113 } // namespace content | 2098 } // namespace content |
OLD | NEW |