Chromium Code Reviews| 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 is no entries, it must be -1. On the other side, when | |
|
Charlie Reis
2017/04/24 17:34:55
nit: s/is/are/
arthursonzogni
2017/04/26 12:13:48
Done.
| |
| 545 // is is -1, it doesn't always mean that there is no entries. A transient | |
| 546 // entry can be inserted before any navigation. | |
|
Charlie Reis
2017/04/24 17:34:55
Thanks for clarifying. Let's shorten these last t
arthursonzogni
2017/04/26 12:13:48
Done.
| |
| 547 DCHECK_LT(last_committed_entry_index_, GetEntryCount()); | |
| 548 DCHECK(GetEntryCount() || last_committed_entry_index_ == -1); | |
| 537 return last_committed_entry_index_; | 549 return last_committed_entry_index_; |
| 538 } | 550 } |
| 539 | 551 |
| 540 int NavigationControllerImpl::GetEntryCount() const { | 552 int NavigationControllerImpl::GetEntryCount() const { |
| 541 DCHECK(entries_.size() <= max_entry_count()); | 553 DCHECK_LE(entries_.size(), max_entry_count()); |
| 542 return static_cast<int>(entries_.size()); | 554 return static_cast<int>(entries_.size()); |
| 543 } | 555 } |
| 544 | 556 |
| 545 NavigationEntryImpl* NavigationControllerImpl::GetEntryAtIndex( | 557 NavigationEntryImpl* NavigationControllerImpl::GetEntryAtIndex( |
| 546 int index) const { | 558 int index) const { |
| 547 if (index < 0 || index >= GetEntryCount()) | 559 if (index < 0 || index >= GetEntryCount()) |
| 548 return nullptr; | 560 return nullptr; |
| 549 | 561 |
| 550 return entries_[index].get(); | 562 return entries_[index].get(); |
| 551 } | 563 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 608 return; | 620 return; |
| 609 } | 621 } |
| 610 if (index > transient_entry_index_) { | 622 if (index > transient_entry_index_) { |
| 611 // Removing the transient is goint to shift all entries by 1. | 623 // Removing the transient is goint to shift all entries by 1. |
| 612 index--; | 624 index--; |
| 613 } | 625 } |
| 614 } | 626 } |
| 615 | 627 |
| 616 DiscardNonCommittedEntries(); | 628 DiscardNonCommittedEntries(); |
| 617 | 629 |
| 630 DCHECK_EQ(nullptr, pending_entry_); | |
| 631 DCHECK_EQ(-1, pending_entry_index_); | |
| 632 pending_entry_ = entries_[index].get(); | |
| 618 pending_entry_index_ = index; | 633 pending_entry_index_ = index; |
| 619 entries_[pending_entry_index_]->SetTransitionType( | 634 pending_entry_->SetTransitionType(ui::PageTransitionFromInt( |
| 620 ui::PageTransitionFromInt( | 635 pending_entry_->GetTransitionType() | ui::PAGE_TRANSITION_FORWARD_BACK)); |
| 621 entries_[pending_entry_index_]->GetTransitionType() | | |
| 622 ui::PAGE_TRANSITION_FORWARD_BACK)); | |
| 623 NavigateToPendingEntry(ReloadType::NONE); | 636 NavigateToPendingEntry(ReloadType::NONE); |
| 624 } | 637 } |
| 625 | 638 |
| 626 void NavigationControllerImpl::GoToOffset(int offset) { | 639 void NavigationControllerImpl::GoToOffset(int offset) { |
| 627 // Note: This is actually reached in unit tests. | 640 // Note: This is actually reached in unit tests. |
| 628 if (!CanGoToOffset(offset)) | 641 if (!CanGoToOffset(offset)) |
| 629 return; | 642 return; |
| 630 | 643 |
| 631 GoToIndex(GetIndexForOffset(offset)); | 644 GoToIndex(GetIndexForOffset(offset)); |
| 632 } | 645 } |
| (...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1719 DiscardNonCommittedEntriesInternal(); | 1732 DiscardNonCommittedEntriesInternal(); |
| 1720 | 1733 |
| 1721 // If there was a transient entry, invalidate everything so the new active | 1734 // If there was a transient entry, invalidate everything so the new active |
| 1722 // entry state is shown. | 1735 // entry state is shown. |
| 1723 if (transient) { | 1736 if (transient) { |
| 1724 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); | 1737 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_ALL); |
| 1725 } | 1738 } |
| 1726 } | 1739 } |
| 1727 | 1740 |
| 1728 NavigationEntryImpl* NavigationControllerImpl::GetPendingEntry() const { | 1741 NavigationEntryImpl* NavigationControllerImpl::GetPendingEntry() const { |
| 1742 // If there is no pending_entry_, there should be no pending_entry_index_. | |
| 1743 DCHECK(pending_entry_ || pending_entry_index_ == -1); | |
| 1744 | |
| 1745 // If there is a pending_entry_index_, then pending_entry_ must be the entry | |
| 1746 // at that index. | |
| 1747 DCHECK(pending_entry_index_ == -1 || | |
| 1748 pending_entry_ == GetEntryAtIndex(pending_entry_index_)); | |
| 1749 | |
| 1729 return pending_entry_; | 1750 return pending_entry_; |
| 1730 } | 1751 } |
| 1731 | 1752 |
| 1732 int NavigationControllerImpl::GetPendingEntryIndex() const { | 1753 int NavigationControllerImpl::GetPendingEntryIndex() const { |
| 1754 // The pending entry index must always be less than the number of entries. | |
| 1755 // If there are no entries, it must be exactly -1. | |
| 1756 DCHECK_LT(pending_entry_index_, GetEntryCount()); | |
| 1757 DCHECK(GetEntryCount() != 0 || pending_entry_index_ == -1); | |
| 1733 return pending_entry_index_; | 1758 return pending_entry_index_; |
| 1734 } | 1759 } |
| 1735 | 1760 |
| 1736 void NavigationControllerImpl::InsertOrReplaceEntry( | 1761 void NavigationControllerImpl::InsertOrReplaceEntry( |
| 1737 std::unique_ptr<NavigationEntryImpl> entry, | 1762 std::unique_ptr<NavigationEntryImpl> entry, |
| 1738 bool replace) { | 1763 bool replace) { |
| 1739 DCHECK(!ui::PageTransitionCoreTypeIs(entry->GetTransitionType(), | 1764 DCHECK(!ui::PageTransitionCoreTypeIs(entry->GetTransitionType(), |
| 1740 ui::PAGE_TRANSITION_AUTO_SUBFRAME)); | 1765 ui::PAGE_TRANSITION_AUTO_SUBFRAME)); |
| 1741 | 1766 |
| 1742 // If the pending_entry_index_ is -1, the navigation was to a new page, and we | 1767 // 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() { | 1809 void NavigationControllerImpl::PruneOldestEntryIfFull() { |
| 1785 if (entries_.size() >= max_entry_count()) { | 1810 if (entries_.size() >= max_entry_count()) { |
| 1786 DCHECK_EQ(max_entry_count(), entries_.size()); | 1811 DCHECK_EQ(max_entry_count(), entries_.size()); |
| 1787 DCHECK_GT(last_committed_entry_index_, 0); | 1812 DCHECK_GT(last_committed_entry_index_, 0); |
| 1788 RemoveEntryAtIndex(0); | 1813 RemoveEntryAtIndex(0); |
| 1789 NotifyPrunedEntries(this, true, 1); | 1814 NotifyPrunedEntries(this, true, 1); |
| 1790 } | 1815 } |
| 1791 } | 1816 } |
| 1792 | 1817 |
| 1793 void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { | 1818 void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { |
| 1819 DCHECK(pending_entry_); | |
| 1794 needs_reload_ = false; | 1820 needs_reload_ = false; |
| 1795 | 1821 |
| 1796 // If we were navigating to a slow-to-commit page, and the user performs | 1822 // 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 | 1823 // a session history navigation to the last committed page, RenderViewHost |
| 1798 // will force the throbber to start, but WebKit will essentially ignore the | 1824 // 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 | 1825 // 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 | 1826 // from happening, we drop the navigation here and stop the slow-to-commit |
| 1801 // page from loading (which would normally happen during the navigation). | 1827 // page from loading (which would normally happen during the navigation). |
| 1802 if (pending_entry_index_ != -1 && | 1828 if (pending_entry_index_ != -1 && |
| 1803 pending_entry_index_ == last_committed_entry_index_ && | 1829 pending_entry_index_ == last_committed_entry_index_ && |
| 1804 (entries_[pending_entry_index_]->restore_type() == RestoreType::NONE) && | 1830 pending_entry_->restore_type() == RestoreType::NONE && |
| 1805 (entries_[pending_entry_index_]->GetTransitionType() & | 1831 pending_entry_->GetTransitionType() & ui::PAGE_TRANSITION_FORWARD_BACK) { |
| 1806 ui::PAGE_TRANSITION_FORWARD_BACK)) { | |
| 1807 delegate_->Stop(); | 1832 delegate_->Stop(); |
| 1808 | 1833 |
| 1809 // If an interstitial page is showing, we want to close it to get back | 1834 // If an interstitial page is showing, we want to close it to get back |
| 1810 // to what was showing before. | 1835 // to what was showing before. |
| 1811 if (delegate_->GetInterstitialPage()) | 1836 if (delegate_->GetInterstitialPage()) |
| 1812 delegate_->GetInterstitialPage()->DontProceed(); | 1837 delegate_->GetInterstitialPage()->DontProceed(); |
| 1813 | 1838 |
| 1814 DiscardNonCommittedEntries(); | 1839 DiscardNonCommittedEntries(); |
| 1815 return; | 1840 return; |
| 1816 } | 1841 } |
| 1817 | 1842 |
| 1818 // If an interstitial page is showing, the previous renderer is blocked and | 1843 // If an interstitial page is showing, the previous renderer is blocked and |
| 1819 // cannot make new requests. Unblock (and disable) it to allow this | 1844 // cannot make new requests. Unblock (and disable) it to allow this |
| 1820 // navigation to succeed. The interstitial will stay visible until the | 1845 // navigation to succeed. The interstitial will stay visible until the |
| 1821 // resulting DidNavigate. | 1846 // resulting DidNavigate. |
| 1822 if (delegate_->GetInterstitialPage()) { | 1847 if (delegate_->GetInterstitialPage()) { |
| 1823 static_cast<InterstitialPageImpl*>(delegate_->GetInterstitialPage()) | 1848 static_cast<InterstitialPageImpl*>(delegate_->GetInterstitialPage()) |
| 1824 ->CancelForNavigation(); | 1849 ->CancelForNavigation(); |
| 1825 } | 1850 } |
| 1826 | 1851 |
| 1827 // The last navigation is the last pending navigation which hasn't been | 1852 // The last navigation is the last pending navigation which hasn't been |
| 1828 // committed yet, or the last committed navigation. | 1853 // committed yet, or the last committed navigation. |
| 1829 NavigationEntryImpl* last_navigation = | 1854 NavigationEntryImpl* last_navigation = |
| 1830 last_pending_entry_ ? last_pending_entry_ : GetLastCommittedEntry(); | 1855 last_pending_entry_ ? last_pending_entry_ : GetLastCommittedEntry(); |
| 1831 | 1856 |
| 1832 // Convert Enter-in-omnibox to a reload. This is what Blink does in | 1857 // 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 | 1858 // 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 | 1859 // 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 | 1860 // same behaviour as Blink would. |
| 1836 // reload for history navigations, so this must be above the retrieval of the | 1861 if (reload_type == ReloadType::NONE && last_navigation && |
| 1837 // pending_entry_ below when pending_entry_index_ is used. | 1862 // When pending_entry is different from -1, it means this is an history |
| 1838 if (reload_type == ReloadType::NONE && last_navigation && pending_entry_ && | 1863 // navigation. History navigation mustn't be converted to a 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 |