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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 } | 272 } |
273 | 273 |
274 void NavigationControllerImpl::Restore( | 274 void NavigationControllerImpl::Restore( |
275 int selected_navigation, | 275 int selected_navigation, |
276 RestoreType type, | 276 RestoreType type, |
277 std::vector<std::unique_ptr<NavigationEntry>>* entries) { | 277 std::vector<std::unique_ptr<NavigationEntry>>* entries) { |
278 // Verify that this controller is unused and that the input is valid. | 278 // Verify that this controller is unused and that the input is valid. |
279 DCHECK(GetEntryCount() == 0 && !GetPendingEntry()); | 279 DCHECK(GetEntryCount() == 0 && !GetPendingEntry()); |
280 DCHECK(selected_navigation >= 0 && | 280 DCHECK(selected_navigation >= 0 && |
281 selected_navigation < static_cast<int>(entries->size())); | 281 selected_navigation < static_cast<int>(entries->size())); |
| 282 DCHECK_EQ(-1, pending_entry_index_); |
282 | 283 |
283 needs_reload_ = true; | 284 needs_reload_ = true; |
284 entries_.reserve(entries->size()); | 285 entries_.reserve(entries->size()); |
285 for (auto& entry : *entries) | 286 for (auto& entry : *entries) |
286 entries_.push_back( | 287 entries_.push_back( |
287 NavigationEntryImpl::FromNavigationEntry(std::move(entry))); | 288 NavigationEntryImpl::FromNavigationEntry(std::move(entry))); |
288 | 289 |
289 // At this point, the |entries| is full of empty scoped_ptrs, so it can be | 290 // At this point, the |entries| is full of empty scoped_ptrs, so it can be |
290 // cleared out safely. | 291 // cleared out safely. |
291 entries->clear(); | 292 entries->clear(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 NavigationEntryImpl* | 441 NavigationEntryImpl* |
441 NavigationControllerImpl::GetEntryWithUniqueID(int nav_entry_id) const { | 442 NavigationControllerImpl::GetEntryWithUniqueID(int nav_entry_id) const { |
442 int index = GetEntryIndexWithUniqueID(nav_entry_id); | 443 int index = GetEntryIndexWithUniqueID(nav_entry_id); |
443 return (index != -1) ? entries_[index].get() : nullptr; | 444 return (index != -1) ? entries_[index].get() : nullptr; |
444 } | 445 } |
445 | 446 |
446 void NavigationControllerImpl::LoadEntry( | 447 void NavigationControllerImpl::LoadEntry( |
447 std::unique_ptr<NavigationEntryImpl> entry) { | 448 std::unique_ptr<NavigationEntryImpl> entry) { |
448 // Remember the last pending entry for which we haven't received a response | 449 // Remember the last pending entry for which we haven't received a response |
449 // yet. This will be deleted in the NavigateToPendingEntry() function. | 450 // yet. This will be deleted in the NavigateToPendingEntry() function. |
| 451 DCHECK_EQ(nullptr, last_pending_entry_); |
| 452 DCHECK_EQ(-1, last_pending_entry_index_); |
450 last_pending_entry_ = pending_entry_; | 453 last_pending_entry_ = pending_entry_; |
451 last_pending_entry_index_ = pending_entry_index_; | 454 last_pending_entry_index_ = pending_entry_index_; |
452 last_transient_entry_index_ = transient_entry_index_; | 455 last_transient_entry_index_ = transient_entry_index_; |
| 456 |
453 pending_entry_ = nullptr; | 457 pending_entry_ = nullptr; |
| 458 pending_entry_index_ = -1; |
454 // When navigating to a new page, we don't know for sure if we will actually | 459 // When navigating to a new page, we don't know for sure if we will actually |
455 // end up leaving the current page. The new page load could for example | 460 // end up leaving the current page. The new page load could for example |
456 // result in a download or a 'no content' response (e.g., a mailto: URL). | 461 // result in a download or a 'no content' response (e.g., a mailto: URL). |
457 SetPendingEntry(std::move(entry)); | 462 SetPendingEntry(std::move(entry)); |
458 NavigateToPendingEntry(ReloadType::NONE); | 463 NavigateToPendingEntry(ReloadType::NONE); |
459 } | 464 } |
460 | 465 |
461 void NavigationControllerImpl::SetPendingEntry( | 466 void NavigationControllerImpl::SetPendingEntry( |
462 std::unique_ptr<NavigationEntryImpl> entry) { | 467 std::unique_ptr<NavigationEntryImpl> entry) { |
463 DiscardNonCommittedEntriesInternal(); | 468 DiscardNonCommittedEntriesInternal(); |
464 pending_entry_ = entry.release(); | 469 pending_entry_ = entry.release(); |
| 470 DCHECK_EQ(-1, pending_entry_index_); |
465 NotificationService::current()->Notify( | 471 NotificationService::current()->Notify( |
466 NOTIFICATION_NAV_ENTRY_PENDING, | 472 NOTIFICATION_NAV_ENTRY_PENDING, |
467 Source<NavigationController>(this), | 473 Source<NavigationController>(this), |
468 Details<NavigationEntry>(pending_entry_)); | 474 Details<NavigationEntry>(pending_entry_)); |
469 } | 475 } |
470 | 476 |
471 NavigationEntryImpl* NavigationControllerImpl::GetActiveEntry() const { | 477 NavigationEntryImpl* NavigationControllerImpl::GetActiveEntry() const { |
472 if (transient_entry_index_ != -1) | 478 if (transient_entry_index_ != -1) |
473 return entries_[transient_entry_index_].get(); | 479 return entries_[transient_entry_index_].get(); |
474 if (pending_entry_) | 480 if (pending_entry_) |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 const std::string& mime_type = delegate_->GetContentsMimeType(); | 533 const std::string& mime_type = delegate_->GetContentsMimeType(); |
528 bool is_viewable_mime_type = | 534 bool is_viewable_mime_type = |
529 mime_util::IsSupportedNonImageMimeType(mime_type) && | 535 mime_util::IsSupportedNonImageMimeType(mime_type) && |
530 !media::IsSupportedMediaMimeType(mime_type); | 536 !media::IsSupportedMediaMimeType(mime_type); |
531 NavigationEntry* visible_entry = GetVisibleEntry(); | 537 NavigationEntry* visible_entry = GetVisibleEntry(); |
532 return visible_entry && !visible_entry->IsViewSourceMode() && | 538 return visible_entry && !visible_entry->IsViewSourceMode() && |
533 is_viewable_mime_type && !delegate_->GetInterstitialPage(); | 539 is_viewable_mime_type && !delegate_->GetInterstitialPage(); |
534 } | 540 } |
535 | 541 |
536 int NavigationControllerImpl::GetLastCommittedEntryIndex() const { | 542 int NavigationControllerImpl::GetLastCommittedEntryIndex() const { |
| 543 // The last committed entry index must always be less than the number of |
| 544 // entries. If there are no entries, it must be -1. However, there may be a |
| 545 // transient entry while the last committed entry index is still -1. |
| 546 DCHECK_LT(last_committed_entry_index_, GetEntryCount()); |
| 547 DCHECK(GetEntryCount() || last_committed_entry_index_ == -1); |
537 return last_committed_entry_index_; | 548 return last_committed_entry_index_; |
538 } | 549 } |
539 | 550 |
540 int NavigationControllerImpl::GetEntryCount() const { | 551 int NavigationControllerImpl::GetEntryCount() const { |
541 DCHECK(entries_.size() <= max_entry_count()); | 552 DCHECK_LE(entries_.size(), max_entry_count()); |
542 return static_cast<int>(entries_.size()); | 553 return static_cast<int>(entries_.size()); |
543 } | 554 } |
544 | 555 |
545 NavigationEntryImpl* NavigationControllerImpl::GetEntryAtIndex( | 556 NavigationEntryImpl* NavigationControllerImpl::GetEntryAtIndex( |
546 int index) const { | 557 int index) const { |
547 if (index < 0 || index >= GetEntryCount()) | 558 if (index < 0 || index >= GetEntryCount()) |
548 return nullptr; | 559 return nullptr; |
549 | 560 |
550 return entries_[index].get(); | 561 return entries_[index].get(); |
551 } | 562 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 return; | 619 return; |
609 } | 620 } |
610 if (index > transient_entry_index_) { | 621 if (index > transient_entry_index_) { |
611 // Removing the transient is goint to shift all entries by 1. | 622 // Removing the transient is goint to shift all entries by 1. |
612 index--; | 623 index--; |
613 } | 624 } |
614 } | 625 } |
615 | 626 |
616 DiscardNonCommittedEntries(); | 627 DiscardNonCommittedEntries(); |
617 | 628 |
| 629 DCHECK_EQ(nullptr, pending_entry_); |
| 630 DCHECK_EQ(-1, pending_entry_index_); |
| 631 pending_entry_ = entries_[index].get(); |
618 pending_entry_index_ = index; | 632 pending_entry_index_ = index; |
619 entries_[pending_entry_index_]->SetTransitionType( | 633 pending_entry_->SetTransitionType(ui::PageTransitionFromInt( |
620 ui::PageTransitionFromInt( | 634 pending_entry_->GetTransitionType() | ui::PAGE_TRANSITION_FORWARD_BACK)); |
621 entries_[pending_entry_index_]->GetTransitionType() | | |
622 ui::PAGE_TRANSITION_FORWARD_BACK)); | |
623 NavigateToPendingEntry(ReloadType::NONE); | 635 NavigateToPendingEntry(ReloadType::NONE); |
624 } | 636 } |
625 | 637 |
626 void NavigationControllerImpl::GoToOffset(int offset) { | 638 void NavigationControllerImpl::GoToOffset(int offset) { |
627 // Note: This is actually reached in unit tests. | 639 // Note: This is actually reached in unit tests. |
628 if (!CanGoToOffset(offset)) | 640 if (!CanGoToOffset(offset)) |
629 return; | 641 return; |
630 | 642 |
631 GoToIndex(GetIndexForOffset(offset)); | 643 GoToIndex(GetIndexForOffset(offset)); |
632 } | 644 } |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 DiscardNonCommittedEntriesInternal(); | 1731 DiscardNonCommittedEntriesInternal(); |
1720 | 1732 |
1721 // If there was a transient entry, invalidate everything so the new active | 1733 // If there was a transient entry, invalidate everything so the new active |
1722 // entry state is shown. | 1734 // entry state is shown. |
1723 if (transient) { | 1735 if (transient) { |
1724 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); | 1736 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); |
1725 } | 1737 } |
1726 } | 1738 } |
1727 | 1739 |
1728 NavigationEntryImpl* NavigationControllerImpl::GetPendingEntry() const { | 1740 NavigationEntryImpl* NavigationControllerImpl::GetPendingEntry() const { |
| 1741 // If there is no pending_entry_, there should be no pending_entry_index_. |
| 1742 DCHECK(pending_entry_ || pending_entry_index_ == -1); |
| 1743 |
| 1744 // If there is a pending_entry_index_, then pending_entry_ must be the entry |
| 1745 // at that index. |
| 1746 DCHECK(pending_entry_index_ == -1 || |
| 1747 pending_entry_ == GetEntryAtIndex(pending_entry_index_)); |
| 1748 |
1729 return pending_entry_; | 1749 return pending_entry_; |
1730 } | 1750 } |
1731 | 1751 |
1732 int NavigationControllerImpl::GetPendingEntryIndex() const { | 1752 int NavigationControllerImpl::GetPendingEntryIndex() const { |
| 1753 // The pending entry index must always be less than the number of entries. |
| 1754 // If there are no entries, it must be exactly -1. |
| 1755 DCHECK_LT(pending_entry_index_, GetEntryCount()); |
| 1756 DCHECK(GetEntryCount() != 0 || pending_entry_index_ == -1); |
1733 return pending_entry_index_; | 1757 return pending_entry_index_; |
1734 } | 1758 } |
1735 | 1759 |
1736 void NavigationControllerImpl::InsertOrReplaceEntry( | 1760 void NavigationControllerImpl::InsertOrReplaceEntry( |
1737 std::unique_ptr<NavigationEntryImpl> entry, | 1761 std::unique_ptr<NavigationEntryImpl> entry, |
1738 bool replace) { | 1762 bool replace) { |
1739 DCHECK(!ui::PageTransitionCoreTypeIs(entry->GetTransitionType(), | 1763 DCHECK(!ui::PageTransitionCoreTypeIs(entry->GetTransitionType(), |
1740 ui::PAGE_TRANSITION_AUTO_SUBFRAME)); | 1764 ui::PAGE_TRANSITION_AUTO_SUBFRAME)); |
1741 | 1765 |
1742 // If the pending_entry_index_ is -1, the navigation was to a new page, and we | 1766 // If the pending_entry_index_ is -1, the navigation was to a new page, and we |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1784 void NavigationControllerImpl::PruneOldestEntryIfFull() { | 1808 void NavigationControllerImpl::PruneOldestEntryIfFull() { |
1785 if (entries_.size() >= max_entry_count()) { | 1809 if (entries_.size() >= max_entry_count()) { |
1786 DCHECK_EQ(max_entry_count(), entries_.size()); | 1810 DCHECK_EQ(max_entry_count(), entries_.size()); |
1787 DCHECK_GT(last_committed_entry_index_, 0); | 1811 DCHECK_GT(last_committed_entry_index_, 0); |
1788 RemoveEntryAtIndex(0); | 1812 RemoveEntryAtIndex(0); |
1789 NotifyPrunedEntries(this, true, 1); | 1813 NotifyPrunedEntries(this, true, 1); |
1790 } | 1814 } |
1791 } | 1815 } |
1792 | 1816 |
1793 void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { | 1817 void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { |
| 1818 DCHECK(pending_entry_); |
1794 needs_reload_ = false; | 1819 needs_reload_ = false; |
1795 | 1820 |
1796 // If we were navigating to a slow-to-commit page, and the user performs | 1821 // If we were navigating to a slow-to-commit page, and the user performs |
1797 // a session history navigation to the last committed page, RenderViewHost | 1822 // a session history navigation to the last committed page, RenderViewHost |
1798 // will force the throbber to start, but WebKit will essentially ignore the | 1823 // will force the throbber to start, but WebKit will essentially ignore the |
1799 // navigation, and won't send a message to stop the throbber. To prevent this | 1824 // navigation, and won't send a message to stop the throbber. To prevent this |
1800 // from happening, we drop the navigation here and stop the slow-to-commit | 1825 // from happening, we drop the navigation here and stop the slow-to-commit |
1801 // page from loading (which would normally happen during the navigation). | 1826 // page from loading (which would normally happen during the navigation). |
1802 if (pending_entry_index_ != -1 && | 1827 if (pending_entry_index_ != -1 && |
1803 pending_entry_index_ == last_committed_entry_index_ && | 1828 pending_entry_index_ == last_committed_entry_index_ && |
1804 (entries_[pending_entry_index_]->restore_type() == RestoreType::NONE) && | 1829 pending_entry_->restore_type() == RestoreType::NONE && |
1805 (entries_[pending_entry_index_]->GetTransitionType() & | 1830 pending_entry_->GetTransitionType() & ui::PAGE_TRANSITION_FORWARD_BACK) { |
1806 ui::PAGE_TRANSITION_FORWARD_BACK)) { | |
1807 delegate_->Stop(); | 1831 delegate_->Stop(); |
1808 | 1832 |
1809 // If an interstitial page is showing, we want to close it to get back | 1833 // If an interstitial page is showing, we want to close it to get back |
1810 // to what was showing before. | 1834 // to what was showing before. |
1811 if (delegate_->GetInterstitialPage()) | 1835 if (delegate_->GetInterstitialPage()) |
1812 delegate_->GetInterstitialPage()->DontProceed(); | 1836 delegate_->GetInterstitialPage()->DontProceed(); |
1813 | 1837 |
1814 DiscardNonCommittedEntries(); | 1838 DiscardNonCommittedEntries(); |
1815 return; | 1839 return; |
1816 } | 1840 } |
1817 | 1841 |
1818 // If an interstitial page is showing, the previous renderer is blocked and | 1842 // If an interstitial page is showing, the previous renderer is blocked and |
1819 // cannot make new requests. Unblock (and disable) it to allow this | 1843 // cannot make new requests. Unblock (and disable) it to allow this |
1820 // navigation to succeed. The interstitial will stay visible until the | 1844 // navigation to succeed. The interstitial will stay visible until the |
1821 // resulting DidNavigate. | 1845 // resulting DidNavigate. |
1822 if (delegate_->GetInterstitialPage()) { | 1846 if (delegate_->GetInterstitialPage()) { |
1823 static_cast<InterstitialPageImpl*>(delegate_->GetInterstitialPage()) | 1847 static_cast<InterstitialPageImpl*>(delegate_->GetInterstitialPage()) |
1824 ->CancelForNavigation(); | 1848 ->CancelForNavigation(); |
1825 } | 1849 } |
1826 | 1850 |
1827 // The last navigation is the last pending navigation which hasn't been | 1851 // The last navigation is the last pending navigation which hasn't been |
1828 // committed yet, or the last committed navigation. | 1852 // committed yet, or the last committed navigation. |
1829 NavigationEntryImpl* last_navigation = | 1853 NavigationEntryImpl* last_navigation = |
1830 last_pending_entry_ ? last_pending_entry_ : GetLastCommittedEntry(); | 1854 last_pending_entry_ ? last_pending_entry_ : GetLastCommittedEntry(); |
1831 | 1855 |
1832 // Convert Enter-in-omnibox to a reload. This is what Blink does in | 1856 // Convert Enter-in-omnibox to a reload. This is what Blink does in |
1833 // FrameLoader, but we want to handle it here so that if the navigation is | 1857 // FrameLoader, but we want to handle it here so that if the navigation is |
1834 // redirected or handled purely on the browser side in PlzNavigate we have the | 1858 // redirected or handled purely on the browser side in PlzNavigate we have the |
1835 // same behaviour as Blink would. Note that we don't want to convert to a | 1859 // same behaviour as Blink would. |
1836 // reload for history navigations, so this must be above the retrieval of the | 1860 if (reload_type == ReloadType::NONE && last_navigation && |
1837 // pending_entry_ below when pending_entry_index_ is used. | 1861 // When |pending_entry_index_| is different from -1, it means this is an |
1838 if (reload_type == ReloadType::NONE && last_navigation && pending_entry_ && | 1862 // history navigation. History navigation mustn't be converted to a |
| 1863 // reload. |
| 1864 pending_entry_index_ == -1 && |
1839 // Please refer to the ShouldTreatNavigationAsReload() function for info | 1865 // Please refer to the ShouldTreatNavigationAsReload() function for info |
1840 // on which navigations are treated as reloads. In general navigating to | 1866 // on which navigations are treated as reloads. In general navigating to |
1841 // the last committed or pending entry via the address bar, clicking on | 1867 // the last committed or pending entry via the address bar, clicking on |
1842 // a link, etc would be treated as reloads. | 1868 // a link, etc would be treated as reloads. |
1843 ShouldTreatNavigationAsReload(pending_entry_) && | 1869 ShouldTreatNavigationAsReload(pending_entry_) && |
1844 // Skip entries with SSL errors. | 1870 // Skip entries with SSL errors. |
1845 !last_navigation->ssl_error() && | 1871 !last_navigation->ssl_error() && |
1846 // Ignore interstitial pages | 1872 // Ignore interstitial pages |
1847 last_transient_entry_index_ == -1 && | 1873 last_transient_entry_index_ == -1 && |
1848 pending_entry_->frame_tree_node_id() == -1 && | 1874 pending_entry_->frame_tree_node_id() == -1 && |
(...skipping 14 matching lines...) Expand all Loading... |
1863 reload_type = ReloadType::NORMAL; | 1889 reload_type = ReloadType::NORMAL; |
1864 } | 1890 } |
1865 | 1891 |
1866 if (last_pending_entry_index_ == -1 && last_pending_entry_) | 1892 if (last_pending_entry_index_ == -1 && last_pending_entry_) |
1867 delete last_pending_entry_; | 1893 delete last_pending_entry_; |
1868 | 1894 |
1869 last_transient_entry_index_ = -1; | 1895 last_transient_entry_index_ = -1; |
1870 last_pending_entry_ = nullptr; | 1896 last_pending_entry_ = nullptr; |
1871 last_pending_entry_index_ = -1; | 1897 last_pending_entry_index_ = -1; |
1872 | 1898 |
1873 // For session history navigations only the pending_entry_index_ is set. | |
1874 if (!pending_entry_) { | |
1875 CHECK_NE(pending_entry_index_, -1); | |
1876 pending_entry_ = entries_[pending_entry_index_].get(); | |
1877 } | |
1878 | |
1879 // Any renderer-side debug URLs or javascript: URLs should be ignored if the | 1899 // Any renderer-side debug URLs or javascript: URLs should be ignored if the |
1880 // renderer process is not live, unless it is the initial navigation of the | 1900 // renderer process is not live, unless it is the initial navigation of the |
1881 // tab. | 1901 // tab. |
1882 if (IsRendererDebugURL(pending_entry_->GetURL())) { | 1902 if (IsRendererDebugURL(pending_entry_->GetURL())) { |
1883 // TODO(creis): Find the RVH for the correct frame. | 1903 // TODO(creis): Find the RVH for the correct frame. |
1884 if (!delegate_->GetRenderViewHost()->IsRenderViewLive() && | 1904 if (!delegate_->GetRenderViewHost()->IsRenderViewLive() && |
1885 !IsInitialNavigation()) { | 1905 !IsInitialNavigation()) { |
1886 DiscardNonCommittedEntries(); | 1906 DiscardNonCommittedEntries(); |
1887 return; | 1907 return; |
1888 } | 1908 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2037 void NavigationControllerImpl::LoadIfNecessary() { | 2057 void NavigationControllerImpl::LoadIfNecessary() { |
2038 if (!needs_reload_) | 2058 if (!needs_reload_) |
2039 return; | 2059 return; |
2040 | 2060 |
2041 // Calling Reload() results in ignoring state, and not loading. | 2061 // Calling Reload() results in ignoring state, and not loading. |
2042 // Explicitly use NavigateToPendingEntry so that the renderer uses the | 2062 // Explicitly use NavigateToPendingEntry so that the renderer uses the |
2043 // cached state. | 2063 // cached state. |
2044 if (pending_entry_) { | 2064 if (pending_entry_) { |
2045 NavigateToPendingEntry(ReloadType::NONE); | 2065 NavigateToPendingEntry(ReloadType::NONE); |
2046 } else if (last_committed_entry_index_ != -1) { | 2066 } else if (last_committed_entry_index_ != -1) { |
| 2067 pending_entry_ = entries_[last_committed_entry_index_].get(); |
2047 pending_entry_index_ = last_committed_entry_index_; | 2068 pending_entry_index_ = last_committed_entry_index_; |
2048 NavigateToPendingEntry(ReloadType::NONE); | 2069 NavigateToPendingEntry(ReloadType::NONE); |
2049 } else { | 2070 } else { |
2050 // If there is something to reload, the successful reload will clear the | 2071 // If there is something to reload, the successful reload will clear the |
2051 // |needs_reload_| flag. Otherwise, just do it here. | 2072 // |needs_reload_| flag. Otherwise, just do it here. |
2052 needs_reload_ = false; | 2073 needs_reload_ = false; |
2053 } | 2074 } |
2054 } | 2075 } |
2055 | 2076 |
2056 void NavigationControllerImpl::NotifyEntryChanged( | 2077 void NavigationControllerImpl::NotifyEntryChanged( |
(...skipping 27 matching lines...) Expand all Loading... |
2084 // when the tab is being destroyed for shutdown, since it won't return to | 2105 // when the tab is being destroyed for shutdown, since it won't return to |
2085 // NavigateToEntry in that case.) http://crbug.com/347742. | 2106 // NavigateToEntry in that case.) http://crbug.com/347742. |
2086 CHECK(!in_navigate_to_pending_entry_ || delegate_->IsBeingDestroyed()); | 2107 CHECK(!in_navigate_to_pending_entry_ || delegate_->IsBeingDestroyed()); |
2087 | 2108 |
2088 if (was_failure && pending_entry_) { | 2109 if (was_failure && pending_entry_) { |
2089 failed_pending_entry_id_ = pending_entry_->GetUniqueID(); | 2110 failed_pending_entry_id_ = pending_entry_->GetUniqueID(); |
2090 } else { | 2111 } else { |
2091 failed_pending_entry_id_ = 0; | 2112 failed_pending_entry_id_ = 0; |
2092 } | 2113 } |
2093 | 2114 |
2094 if (pending_entry_index_ == -1) | 2115 if (pending_entry_) { |
2095 delete pending_entry_; | 2116 if (pending_entry_index_ == -1) |
2096 pending_entry_ = NULL; | 2117 delete pending_entry_; |
2097 pending_entry_index_ = -1; | 2118 pending_entry_index_ = -1; |
| 2119 pending_entry_ = nullptr; |
| 2120 } |
2098 } | 2121 } |
2099 | 2122 |
2100 void NavigationControllerImpl::SetPendingNavigationSSLError(bool error) { | 2123 void NavigationControllerImpl::SetPendingNavigationSSLError(bool error) { |
2101 if (pending_entry_) | 2124 if (pending_entry_) |
2102 pending_entry_->set_ssl_error(error); | 2125 pending_entry_->set_ssl_error(error); |
2103 } | 2126 } |
2104 | 2127 |
2105 void NavigationControllerImpl::DiscardTransientEntry() { | 2128 void NavigationControllerImpl::DiscardTransientEntry() { |
2106 if (transient_entry_index_ == -1) | 2129 if (transient_entry_index_ == -1) |
2107 return; | 2130 return; |
2108 entries_.erase(entries_.begin() + transient_entry_index_); | 2131 entries_.erase(entries_.begin() + transient_entry_index_); |
2109 if (last_committed_entry_index_ > transient_entry_index_) | 2132 if (last_committed_entry_index_ > transient_entry_index_) |
2110 last_committed_entry_index_--; | 2133 last_committed_entry_index_--; |
| 2134 if (pending_entry_index_ > transient_entry_index_) |
| 2135 pending_entry_index_--; |
2111 transient_entry_index_ = -1; | 2136 transient_entry_index_ = -1; |
2112 } | 2137 } |
2113 | 2138 |
2114 int NavigationControllerImpl::GetEntryIndexWithUniqueID( | 2139 int NavigationControllerImpl::GetEntryIndexWithUniqueID( |
2115 int nav_entry_id) const { | 2140 int nav_entry_id) const { |
2116 for (int i = static_cast<int>(entries_.size()) - 1; i >= 0; --i) { | 2141 for (int i = static_cast<int>(entries_.size()) - 1; i >= 0; --i) { |
2117 if (entries_[i]->GetUniqueID() == nav_entry_id) | 2142 if (entries_[i]->GetUniqueID() == nav_entry_id) |
2118 return i; | 2143 return i; |
2119 } | 2144 } |
2120 return -1; | 2145 return -1; |
2121 } | 2146 } |
2122 | 2147 |
2123 NavigationEntryImpl* NavigationControllerImpl::GetTransientEntry() const { | 2148 NavigationEntryImpl* NavigationControllerImpl::GetTransientEntry() const { |
2124 if (transient_entry_index_ == -1) | 2149 if (transient_entry_index_ == -1) |
2125 return NULL; | 2150 return NULL; |
2126 return entries_[transient_entry_index_].get(); | 2151 return entries_[transient_entry_index_].get(); |
2127 } | 2152 } |
2128 | 2153 |
2129 void NavigationControllerImpl::SetTransientEntry( | 2154 void NavigationControllerImpl::SetTransientEntry( |
2130 std::unique_ptr<NavigationEntry> entry) { | 2155 std::unique_ptr<NavigationEntry> entry) { |
2131 // Discard any current transient entry, we can only have one at a time. | 2156 // Discard any current transient entry, we can only have one at a time. |
2132 int index = 0; | 2157 int index = 0; |
2133 if (last_committed_entry_index_ != -1) | 2158 if (last_committed_entry_index_ != -1) |
2134 index = last_committed_entry_index_ + 1; | 2159 index = last_committed_entry_index_ + 1; |
2135 DiscardTransientEntry(); | 2160 DiscardTransientEntry(); |
2136 entries_.insert(entries_.begin() + index, | 2161 entries_.insert(entries_.begin() + index, |
2137 NavigationEntryImpl::FromNavigationEntry(std::move(entry))); | 2162 NavigationEntryImpl::FromNavigationEntry(std::move(entry))); |
| 2163 if (pending_entry_index_ >= index) |
| 2164 pending_entry_index_++; |
2138 transient_entry_index_ = index; | 2165 transient_entry_index_ = index; |
2139 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); | 2166 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); |
2140 } | 2167 } |
2141 | 2168 |
2142 void NavigationControllerImpl::InsertEntriesFrom( | 2169 void NavigationControllerImpl::InsertEntriesFrom( |
2143 const NavigationControllerImpl& source, | 2170 const NavigationControllerImpl& source, |
2144 int max_index) { | 2171 int max_index) { |
2145 DCHECK_LE(max_index, source.GetEntryCount()); | 2172 DCHECK_LE(max_index, source.GetEntryCount()); |
2146 size_t insert_index = 0; | 2173 size_t insert_index = 0; |
2147 for (int i = 0; i < max_index; i++) { | 2174 for (int i = 0; i < max_index; i++) { |
2148 // When cloning a tab, copy all entries except interstitial pages. | 2175 // When cloning a tab, copy all entries except interstitial pages. |
2149 if (source.entries_[i]->GetPageType() != PAGE_TYPE_INTERSTITIAL) { | 2176 if (source.entries_[i]->GetPageType() != PAGE_TYPE_INTERSTITIAL) { |
2150 // TODO(creis): Once we start sharing FrameNavigationEntries between | 2177 // TODO(creis): Once we start sharing FrameNavigationEntries between |
2151 // NavigationEntries, it will not be safe to share them with another tab. | 2178 // NavigationEntries, it will not be safe to share them with another tab. |
2152 // Must have a version of Clone that recreates them. | 2179 // Must have a version of Clone that recreates them. |
2153 entries_.insert(entries_.begin() + insert_index++, | 2180 entries_.insert(entries_.begin() + insert_index++, |
2154 source.entries_[i]->Clone()); | 2181 source.entries_[i]->Clone()); |
2155 } | 2182 } |
2156 } | 2183 } |
| 2184 DCHECK(pending_entry_index_ == -1 || |
| 2185 pending_entry_ == GetEntryAtIndex(pending_entry_index_)); |
2157 } | 2186 } |
2158 | 2187 |
2159 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 2188 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
2160 const base::Callback<base::Time()>& get_timestamp_callback) { | 2189 const base::Callback<base::Time()>& get_timestamp_callback) { |
2161 get_timestamp_callback_ = get_timestamp_callback; | 2190 get_timestamp_callback_ = get_timestamp_callback; |
2162 } | 2191 } |
2163 | 2192 |
2164 } // namespace content | 2193 } // namespace content |
OLD | NEW |