OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/web_contents/navigation_controller_impl.h" | 5 #include "content/browser/web_contents/navigation_controller_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/string_number_conversions.h" // Temporary | 9 #include "base/string_number_conversions.h" // Temporary |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 #include "content/public/browser/storage_partition.h" | 33 #include "content/public/browser/storage_partition.h" |
34 #include "content/public/browser/user_metrics.h" | 34 #include "content/public/browser/user_metrics.h" |
35 #include "content/public/browser/web_contents_delegate.h" | 35 #include "content/public/browser/web_contents_delegate.h" |
36 #include "content/public/common/content_client.h" | 36 #include "content/public/common/content_client.h" |
37 #include "content/public/common/content_constants.h" | 37 #include "content/public/common/content_constants.h" |
38 #include "content/public/common/url_constants.h" | 38 #include "content/public/common/url_constants.h" |
39 #include "net/base/escape.h" | 39 #include "net/base/escape.h" |
40 #include "net/base/mime_util.h" | 40 #include "net/base/mime_util.h" |
41 #include "net/base/net_util.h" | 41 #include "net/base/net_util.h" |
42 #include "skia/ext/platform_canvas.h" | 42 #include "skia/ext/platform_canvas.h" |
43 #include "webkit/glue/glue_serialize.h" | |
44 | 43 |
45 namespace content { | 44 namespace content { |
46 namespace { | 45 namespace { |
47 | 46 |
48 const int kInvalidateAll = 0xFFFFFFFF; | 47 const int kInvalidateAll = 0xFFFFFFFF; |
49 | 48 |
50 // Invoked when entries have been pruned, or removed. For example, if the | 49 // Invoked when entries have been pruned, or removed. For example, if the |
51 // current entries are [google, digg, yahoo], with the current entry google, | 50 // current entries are [google, digg, yahoo], with the current entry google, |
52 // and the user types in cnet, then digg and yahoo are pruned. | 51 // and the user types in cnet, then digg and yahoo are pruned. |
53 void NotifyPrunedEntries(NavigationControllerImpl* nav_controller, | 52 void NotifyPrunedEntries(NavigationControllerImpl* nav_controller, |
54 bool from_front, | 53 bool from_front, |
55 int count) { | 54 int count) { |
56 PrunedDetails details; | 55 PrunedDetails details; |
57 details.from_front = from_front; | 56 details.from_front = from_front; |
58 details.count = count; | 57 details.count = count; |
59 NotificationService::current()->Notify( | 58 NotificationService::current()->Notify( |
60 NOTIFICATION_NAV_LIST_PRUNED, | 59 NOTIFICATION_NAV_LIST_PRUNED, |
61 Source<NavigationController>(nav_controller), | 60 Source<NavigationController>(nav_controller), |
62 Details<PrunedDetails>(&details)); | 61 Details<PrunedDetails>(&details)); |
63 } | 62 } |
64 | 63 |
65 // Ensure the given NavigationEntry has a valid state, so that WebKit does not | 64 // Ensure the given NavigationEntry has a valid state, so that WebKit does not |
66 // get confused if we navigate back to it. | 65 // get confused if we navigate back to it. |
67 // | 66 // |
68 // An empty state is treated as a new navigation by WebKit, which would mean | 67 // An empty state is treated as a new navigation by WebKit, which would mean |
69 // losing the navigation entries and generating a new navigation entry after | 68 // losing the navigation entries and generating a new navigation entry after |
70 // this one. We don't want that. To avoid this we create a valid state which | 69 // this one. We don't want that. To avoid this we create a valid state which |
71 // WebKit will not treat as a new navigation. | 70 // WebKit will not treat as a new navigation. |
72 void SetContentStateIfEmpty(NavigationEntryImpl* entry) { | 71 void SetPageStateIfEmpty(NavigationEntryImpl* entry) { |
73 if (entry->GetContentState().empty()) { | 72 if (!entry->GetPageState().IsValid()) |
74 entry->SetContentState( | 73 entry->SetPageState(PageState::CreateFromURL(entry->GetURL())); |
75 webkit_glue::CreateHistoryStateForURL(entry->GetURL())); | |
76 } | |
77 } | 74 } |
78 | 75 |
79 NavigationEntryImpl::RestoreType ControllerRestoreTypeToEntryType( | 76 NavigationEntryImpl::RestoreType ControllerRestoreTypeToEntryType( |
80 NavigationController::RestoreType type) { | 77 NavigationController::RestoreType type) { |
81 switch (type) { | 78 switch (type) { |
82 case NavigationController::RESTORE_CURRENT_SESSION: | 79 case NavigationController::RESTORE_CURRENT_SESSION: |
83 return NavigationEntryImpl::RESTORE_CURRENT_SESSION; | 80 return NavigationEntryImpl::RESTORE_CURRENT_SESSION; |
84 case NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY: | 81 case NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY: |
85 return NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY; | 82 return NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY; |
86 case NavigationController::RESTORE_LAST_SESSION_CRASHED: | 83 case NavigationController::RESTORE_LAST_SESSION_CRASHED: |
87 return NavigationEntryImpl::RESTORE_LAST_SESSION_CRASHED; | 84 return NavigationEntryImpl::RESTORE_LAST_SESSION_CRASHED; |
88 } | 85 } |
89 NOTREACHED(); | 86 NOTREACHED(); |
90 return NavigationEntryImpl::RESTORE_CURRENT_SESSION; | 87 return NavigationEntryImpl::RESTORE_CURRENT_SESSION; |
91 } | 88 } |
92 | 89 |
93 // Configure all the NavigationEntries in entries for restore. This resets | 90 // Configure all the NavigationEntries in entries for restore. This resets |
94 // the transition type to reload and makes sure the content state isn't empty. | 91 // the transition type to reload and makes sure the content state isn't empty. |
95 void ConfigureEntriesForRestore( | 92 void ConfigureEntriesForRestore( |
96 std::vector<linked_ptr<NavigationEntryImpl> >* entries, | 93 std::vector<linked_ptr<NavigationEntryImpl> >* entries, |
97 NavigationController::RestoreType type) { | 94 NavigationController::RestoreType type) { |
98 for (size_t i = 0; i < entries->size(); ++i) { | 95 for (size_t i = 0; i < entries->size(); ++i) { |
99 // Use a transition type of reload so that we don't incorrectly increase | 96 // Use a transition type of reload so that we don't incorrectly increase |
100 // the typed count. | 97 // the typed count. |
101 (*entries)[i]->SetTransitionType(PAGE_TRANSITION_RELOAD); | 98 (*entries)[i]->SetTransitionType(PAGE_TRANSITION_RELOAD); |
102 (*entries)[i]->set_restore_type(ControllerRestoreTypeToEntryType(type)); | 99 (*entries)[i]->set_restore_type(ControllerRestoreTypeToEntryType(type)); |
103 // NOTE(darin): This code is only needed for backwards compat. | 100 // NOTE(darin): This code is only needed for backwards compat. |
104 SetContentStateIfEmpty((*entries)[i].get()); | 101 SetPageStateIfEmpty((*entries)[i].get()); |
105 } | 102 } |
106 } | 103 } |
107 | 104 |
108 // See NavigationController::IsURLInPageNavigation for how this works and why. | 105 // See NavigationController::IsURLInPageNavigation for how this works and why. |
109 bool AreURLsInPageNavigation(const GURL& existing_url, | 106 bool AreURLsInPageNavigation(const GURL& existing_url, |
110 const GURL& new_url, | 107 const GURL& new_url, |
111 bool renderer_says_in_page) { | 108 bool renderer_says_in_page) { |
112 if (existing_url == new_url) | 109 if (existing_url == new_url) |
113 return renderer_says_in_page; | 110 return renderer_says_in_page; |
114 | 111 |
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 time_smoother_.GetSmoothedTime(get_timestamp_callback_.Run()); | 759 time_smoother_.GetSmoothedTime(get_timestamp_callback_.Run()); |
763 DVLOG(1) << "Navigation finished at (smoothed) timestamp " | 760 DVLOG(1) << "Navigation finished at (smoothed) timestamp " |
764 << timestamp.ToInternalValue(); | 761 << timestamp.ToInternalValue(); |
765 | 762 |
766 // We should not have a pending entry anymore. Clear it again in case any | 763 // We should not have a pending entry anymore. Clear it again in case any |
767 // error cases above forgot to do so. | 764 // error cases above forgot to do so. |
768 DiscardNonCommittedEntriesInternal(); | 765 DiscardNonCommittedEntriesInternal(); |
769 | 766 |
770 // All committed entries should have nonempty content state so WebKit doesn't | 767 // All committed entries should have nonempty content state so WebKit doesn't |
771 // get confused when we go back to them (see the function for details). | 768 // get confused when we go back to them (see the function for details). |
772 DCHECK(!params.content_state.empty()); | 769 DCHECK(params.page_state.IsValid()); |
773 NavigationEntryImpl* active_entry = | 770 NavigationEntryImpl* active_entry = |
774 NavigationEntryImpl::FromNavigationEntry(GetLastCommittedEntry()); | 771 NavigationEntryImpl::FromNavigationEntry(GetLastCommittedEntry()); |
775 active_entry->SetTimestamp(timestamp); | 772 active_entry->SetTimestamp(timestamp); |
776 active_entry->SetContentState(params.content_state); | 773 active_entry->SetPageState(params.page_state); |
777 // No longer needed since content state will hold the post data if any. | 774 // No longer needed since content state will hold the post data if any. |
778 active_entry->SetBrowserInitiatedPostData(NULL); | 775 active_entry->SetBrowserInitiatedPostData(NULL); |
779 | 776 |
780 // Once committed, we do not need to track if the entry was initiated by | 777 // Once committed, we do not need to track if the entry was initiated by |
781 // the renderer. | 778 // the renderer. |
782 active_entry->set_is_renderer_initiated(false); | 779 active_entry->set_is_renderer_initiated(false); |
783 | 780 |
784 // Once committed, we no longer need to track whether the session history was | 781 // Once committed, we no longer need to track whether the session history was |
785 // cleared. Navigating to this entry again shouldn't clear it again. | 782 // cleared. Navigating to this entry again shouldn't clear it again. |
786 active_entry->set_should_clear_history_list(false); | 783 active_entry->set_should_clear_history_list(false); |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 } | 1674 } |
1678 } | 1675 } |
1679 } | 1676 } |
1680 | 1677 |
1681 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 1678 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
1682 const base::Callback<base::Time()>& get_timestamp_callback) { | 1679 const base::Callback<base::Time()>& get_timestamp_callback) { |
1683 get_timestamp_callback_ = get_timestamp_callback; | 1680 get_timestamp_callback_ = get_timestamp_callback; |
1684 } | 1681 } |
1685 | 1682 |
1686 } // namespace content | 1683 } // namespace content |
OLD | NEW |