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 #ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_ | 5 #ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_ |
6 #define CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_ | 6 #define CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_vector.h" |
10 #include "base/time/time.h" | 11 #include "base/time/time.h" |
11 #include "content/browser/frame_host/frame_navigation_entry.h" | 12 #include "content/browser/frame_host/frame_navigation_entry.h" |
| 13 #include "content/browser/frame_host/frame_tree_node.h" |
12 #include "content/browser/site_instance_impl.h" | 14 #include "content/browser/site_instance_impl.h" |
13 #include "content/common/frame_message_enums.h" | 15 #include "content/common/frame_message_enums.h" |
14 #include "content/public/browser/favicon_status.h" | 16 #include "content/public/browser/favicon_status.h" |
15 #include "content/public/browser/global_request_id.h" | 17 #include "content/public/browser/global_request_id.h" |
16 #include "content/public/browser/navigation_entry.h" | 18 #include "content/public/browser/navigation_entry.h" |
17 #include "content/public/common/page_state.h" | 19 #include "content/public/common/page_state.h" |
18 #include "content/public/common/ssl_status.h" | 20 #include "content/public/common/ssl_status.h" |
19 | 21 |
20 namespace content { | 22 namespace content { |
21 class NavigationControllerImpl; | 23 class NavigationControllerImpl; |
22 struct CommitNavigationParams; | 24 struct CommitNavigationParams; |
23 struct CommonNavigationParams; | 25 struct CommonNavigationParams; |
24 struct HistoryNavigationParams; | 26 struct HistoryNavigationParams; |
25 struct StartNavigationParams; | 27 struct StartNavigationParams; |
26 | 28 |
27 class CONTENT_EXPORT NavigationEntryImpl | 29 class CONTENT_EXPORT NavigationEntryImpl |
28 : public NON_EXPORTED_BASE(NavigationEntry) { | 30 : public NON_EXPORTED_BASE(NavigationEntry) { |
29 public: | 31 public: |
30 // Represents a tree of FrameNavigationEntries that make up this joint session | 32 // Represents a tree of FrameNavigationEntries that make up this joint session |
31 // history item. The tree currently only tracks the main frame. | 33 // history item. The tree currently only tracks the main frame. |
32 // TODO(creis): Populate the tree with subframe entries in --site-per-process. | 34 // TODO(creis): Populate the tree with subframe entries in --site-per-process. |
33 struct TreeNode { | 35 struct TreeNode { |
34 TreeNode(FrameNavigationEntry* frame_entry); | 36 TreeNode(NavigationEntryImpl* entry, |
| 37 FrameNavigationEntry* frame_entry); |
35 ~TreeNode(); | 38 ~TreeNode(); |
36 | 39 |
37 // Returns a deep copy of the tree with copies of each node's | 40 // Returns a deep copy of the tree with copies of each node's |
38 // FrameNavigationEntries. We do not yet share FrameNavigationEntries | 41 // FrameNavigationEntries. We do not yet share FrameNavigationEntries |
39 // across trees. | 42 // across trees. |
40 // TODO(creis): For --site-per-process, share FrameNavigationEntries between | 43 // TODO(creis): For --site-per-process, share FrameNavigationEntries between |
41 // NavigationEntries of the same tab. | 44 // NavigationEntries of the same tab. |
42 TreeNode* Clone() const; | 45 TreeNode* Clone() const; |
43 | 46 |
| 47 void SetFrameEntry(FrameNavigationEntry* new_frame_entry); |
| 48 |
| 49 // Pointer to the NavigationEntry that owns us. |
| 50 // TODO(creis): Remove this. |
| 51 NavigationEntryImpl* entry; |
| 52 |
44 // Ref counted pointer that keeps the FrameNavigationEntry alive as long as | 53 // Ref counted pointer that keeps the FrameNavigationEntry alive as long as |
45 // it is needed by this node's NavigationEntry. | 54 // it is needed by this node's NavigationEntry. |
46 scoped_refptr<FrameNavigationEntry> frame_entry; | 55 scoped_refptr<FrameNavigationEntry> frame_entry; |
| 56 |
| 57 // List of child TreeNodes, which will be deleted when this node is. |
| 58 ScopedVector<TreeNode> children; |
47 }; | 59 }; |
48 | 60 |
49 static NavigationEntryImpl* FromNavigationEntry(NavigationEntry* entry); | 61 static NavigationEntryImpl* FromNavigationEntry(NavigationEntry* entry); |
50 | 62 |
51 // The value of bindings() before it is set during commit. | 63 // The value of bindings() before it is set during commit. |
52 static int kInvalidBindings; | 64 static int kInvalidBindings; |
53 | 65 |
54 NavigationEntryImpl(); | 66 NavigationEntryImpl(); |
55 NavigationEntryImpl(SiteInstanceImpl* instance, | 67 NavigationEntryImpl(SiteInstanceImpl* instance, |
56 int page_id, | 68 int page_id, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 const base::string16& data) override; | 120 const base::string16& data) override; |
109 bool GetExtraData(const std::string& key, | 121 bool GetExtraData(const std::string& key, |
110 base::string16* data) const override; | 122 base::string16* data) const override; |
111 void ClearExtraData(const std::string& key) override; | 123 void ClearExtraData(const std::string& key) override; |
112 void SetHttpStatusCode(int http_status_code) override; | 124 void SetHttpStatusCode(int http_status_code) override; |
113 int GetHttpStatusCode() const override; | 125 int GetHttpStatusCode() const override; |
114 void SetRedirectChain(const std::vector<GURL>& redirects) override; | 126 void SetRedirectChain(const std::vector<GURL>& redirects) override; |
115 const std::vector<GURL>& GetRedirectChain() const override; | 127 const std::vector<GURL>& GetRedirectChain() const override; |
116 bool IsRestored() const override; | 128 bool IsRestored() const override; |
117 | 129 |
| 130 TreeNode* root_node() const { |
| 131 return frame_tree_.get(); |
| 132 } |
| 133 |
118 // Creates a copy of this NavigationEntryImpl that can be modified | 134 // Creates a copy of this NavigationEntryImpl that can be modified |
119 // independently from the original. Does not copy any value that would be | 135 // independently from the original. Does not copy any value that would be |
120 // cleared in ResetForCommit. | 136 // cleared in ResetForCommit. |
121 // TODO(creis): Once we start sharing FrameNavigationEntries between | 137 // TODO(creis): Once we start sharing FrameNavigationEntries between |
122 // NavigationEntryImpls, we will need to support two versions of Clone: one | 138 // NavigationEntryImpls, we will need to support two versions of Clone: one |
123 // that shares the existing FrameNavigationEntries (for use within the same | 139 // that shares the existing FrameNavigationEntries (for use within the same |
124 // tab) and one that draws them from a different pool (for use in a new tab). | 140 // tab) and one that draws them from a different pool (for use in a new tab). |
125 NavigationEntryImpl* Clone() const; | 141 NavigationEntryImpl* Clone() const; |
126 | 142 |
| 143 // Clears the frame tree before adding new TreeNodes to it. |
| 144 void ResetFrameTree(); |
| 145 |
| 146 TreeNode* GetTreeNodeForFrame(FrameTreeNode* frame_tree_node); |
| 147 |
| 148 // Returns the FrameNavigationEntry corresponding to |frame_tree_node|. |
| 149 FrameNavigationEntry* GetFrameEntryForFrame(FrameTreeNode* frame_tree_node); |
| 150 |
127 // Once a navigation entry is committed, we should no longer track several | 151 // Once a navigation entry is committed, we should no longer track several |
128 // pieces of non-persisted state, as documented on the members below. | 152 // pieces of non-persisted state, as documented on the members below. |
129 void ResetForCommit(); | 153 void ResetForCommit(); |
130 | 154 |
131 void set_unique_id(int unique_id) { | 155 void set_unique_id(int unique_id) { |
132 unique_id_ = unique_id; | 156 unique_id_ = unique_id; |
133 } | 157 } |
134 | 158 |
135 // The SiteInstance represents which pages must share processes. This is a | 159 // The SiteInstance represents which pages must share processes. This is a |
136 // reference counted pointer to a shared SiteInstance. | 160 // reference counted pointer to a shared SiteInstance. |
137 // | 161 // |
138 // Note that the SiteInstance should usually not be changed after it is set, | 162 // Note that the SiteInstance should usually not be changed after it is set, |
139 // but this may happen if the NavigationEntry was cloned and needs to use a | 163 // but this may happen if the NavigationEntry was cloned and needs to use a |
140 // different SiteInstance. | 164 // different SiteInstance. |
| 165 // TODO(creis): This should live on the FNE, not here. |
141 void set_site_instance(SiteInstanceImpl* site_instance); | 166 void set_site_instance(SiteInstanceImpl* site_instance); |
142 SiteInstanceImpl* site_instance() const { | 167 SiteInstanceImpl* site_instance() const { |
143 return frame_tree_->frame_entry->site_instance(); | 168 return frame_tree_->frame_entry->site_instance(); |
144 } | 169 } |
145 | 170 |
146 // The |source_site_instance| is used to identify the SiteInstance of the | 171 // The |source_site_instance| is used to identify the SiteInstance of the |
147 // frame that initiated the navigation. | 172 // frame that initiated the navigation. |
148 void set_source_site_instance(SiteInstanceImpl* source_site_instance); | 173 void set_source_site_instance(SiteInstanceImpl* source_site_instance); |
149 SiteInstanceImpl* source_site_instance() const { | 174 SiteInstanceImpl* source_site_instance() const { |
150 return source_site_instance_.get(); | 175 return source_site_instance_.get(); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 | 268 |
244 // Whether this (pending) navigation should clear the session history. Resets | 269 // Whether this (pending) navigation should clear the session history. Resets |
245 // to false after commit. | 270 // to false after commit. |
246 bool should_clear_history_list() const { | 271 bool should_clear_history_list() const { |
247 return should_clear_history_list_; | 272 return should_clear_history_list_; |
248 } | 273 } |
249 void set_should_clear_history_list(bool should_clear_history_list) { | 274 void set_should_clear_history_list(bool should_clear_history_list) { |
250 should_clear_history_list_ = should_clear_history_list; | 275 should_clear_history_list_ = should_clear_history_list; |
251 } | 276 } |
252 | 277 |
253 // Indicates which FrameTreeNode to navigate. Currently only used if the | |
254 // --site-per-process flag is passed. | |
255 int64 frame_tree_node_id() const { | |
256 return frame_tree_node_id_; | |
257 } | |
258 void set_frame_tree_node_id(int64 frame_tree_node_id) { | |
259 frame_tree_node_id_ = frame_tree_node_id; | |
260 } | |
261 | |
262 // Returns the history URL for a data URL to use in Blink. | 278 // Returns the history URL for a data URL to use in Blink. |
263 GURL GetHistoryURLForDataURL() const; | 279 GURL GetHistoryURLForDataURL() const; |
264 | 280 |
265 CommonNavigationParams ConstructCommonNavigationParams( | 281 CommonNavigationParams ConstructCommonNavigationParams( |
| 282 const FrameNavigationEntry& frame_entry, |
266 FrameMsg_Navigate_Type::Value navigation_type) const; | 283 FrameMsg_Navigate_Type::Value navigation_type) const; |
267 CommitNavigationParams ConstructCommitNavigationParams( | 284 CommitNavigationParams ConstructCommitNavigationParams( |
268 base::TimeTicks navigation_start) const; | 285 base::TimeTicks navigation_start) const; |
| 286 // TODO(creis): NavigationEntry should not depend on NavigationController. |
269 HistoryNavigationParams ConstructHistoryNavigationParams( | 287 HistoryNavigationParams ConstructHistoryNavigationParams( |
| 288 const FrameNavigationEntry& frame_entry, |
270 NavigationControllerImpl* controller) const; | 289 NavigationControllerImpl* controller) const; |
271 StartNavigationParams ConstructStartNavigationParams() const; | 290 StartNavigationParams ConstructStartNavigationParams() const; |
272 | 291 |
273 #if defined(OS_ANDROID) | 292 #if defined(OS_ANDROID) |
274 base::TimeTicks intent_received_timestamp() const { | 293 base::TimeTicks intent_received_timestamp() const { |
275 return intent_received_timestamp_; | 294 return intent_received_timestamp_; |
276 } | 295 } |
277 | 296 |
278 void set_intent_received_timestamp( | 297 void set_intent_received_timestamp( |
279 const base::TimeTicks intent_received_timestamp) { | 298 const base::TimeTicks intent_received_timestamp) { |
280 intent_received_timestamp_ = intent_received_timestamp; | 299 intent_received_timestamp_ = intent_received_timestamp; |
281 } | 300 } |
282 #endif | 301 #endif |
283 | 302 |
284 private: | 303 private: |
285 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING | 304 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING |
286 // Session/Tab restore save portions of this class so that it can be recreated | 305 // Session/Tab restore save portions of this class so that it can be recreated |
287 // later. If you add a new field that needs to be persisted you'll have to | 306 // later. If you add a new field that needs to be persisted you'll have to |
288 // update SessionService/TabRestoreService and Android WebView | 307 // update SessionService/TabRestoreService and Android WebView |
289 // state_serializer.cc appropriately. | 308 // state_serializer.cc appropriately. |
290 // For all new fields, update |Clone| and possibly |ResetForCommit|. | 309 // For all new fields, update |Clone| and possibly |ResetForCommit|. |
291 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING | 310 // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING |
292 | 311 |
| 312 typedef base::hash_map<int64, TreeNode*> FramesToItems; |
| 313 FramesToItems frames_to_items_; |
| 314 |
| 315 typedef base::hash_map<std::string, TreeNode*> UniqueNamesToItems; |
| 316 UniqueNamesToItems unique_names_to_items_; |
| 317 |
293 // Tree of FrameNavigationEntries, one for each frame on the page. | 318 // Tree of FrameNavigationEntries, one for each frame on the page. |
294 // TODO(creis): Once FrameNavigationEntries can be shared across multiple | 319 // TODO(creis): Once FrameNavigationEntries can be shared across multiple |
295 // NavigationEntries, we will need to update Session/Tab restore. For now, | 320 // NavigationEntries, we will need to update Session/Tab restore. For now, |
296 // each NavigationEntry's tree has its own unshared FrameNavigationEntries. | 321 // each NavigationEntry's tree has its own unshared FrameNavigationEntries. |
297 scoped_ptr<TreeNode> frame_tree_; | 322 scoped_ptr<TreeNode> frame_tree_; |
298 | 323 |
299 // See the accessors above for descriptions. | 324 // See the accessors above for descriptions. |
300 int unique_id_; | 325 int unique_id_; |
301 // TODO(creis): Persist bindings_. http://crbug.com/173672. | 326 // TODO(creis): Persist bindings_. http://crbug.com/173672. |
302 int bindings_; | 327 int bindings_; |
303 PageType page_type_; | 328 PageType page_type_; |
304 GURL virtual_url_; | 329 GURL virtual_url_; |
305 bool update_virtual_url_with_url_; | 330 bool update_virtual_url_with_url_; |
306 base::string16 title_; | 331 base::string16 title_; |
307 FaviconStatus favicon_; | 332 FaviconStatus favicon_; |
308 PageState page_state_; | |
309 int32 page_id_; | 333 int32 page_id_; |
310 SSLStatus ssl_; | 334 SSLStatus ssl_; |
311 ui::PageTransition transition_type_; | 335 ui::PageTransition transition_type_; |
312 GURL user_typed_url_; | 336 GURL user_typed_url_; |
313 bool has_post_data_; | 337 bool has_post_data_; |
314 int64 post_id_; | 338 int64 post_id_; |
315 RestoreType restore_type_; | 339 RestoreType restore_type_; |
316 GURL original_request_url_; | 340 GURL original_request_url_; |
317 bool is_overriding_user_agent_; | 341 bool is_overriding_user_agent_; |
318 base::Time timestamp_; | 342 base::Time timestamp_; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 bool should_clear_history_list_; | 413 bool should_clear_history_list_; |
390 | 414 |
391 // Set when this entry should be able to access local file:// resources. This | 415 // Set when this entry should be able to access local file:// resources. This |
392 // value is not needed after the entry commits and is not persisted. | 416 // value is not needed after the entry commits and is not persisted. |
393 bool can_load_local_resources_; | 417 bool can_load_local_resources_; |
394 | 418 |
395 // If not empty, the name of the frame to navigate. This field is not | 419 // If not empty, the name of the frame to navigate. This field is not |
396 // persisted, because it is currently only used in tests. | 420 // persisted, because it is currently only used in tests. |
397 std::string frame_to_navigate_; | 421 std::string frame_to_navigate_; |
398 | 422 |
399 // If not -1, this indicates which FrameTreeNode to navigate. This field is | |
400 // not persisted because it is experimental and only used when the | |
401 // --site-per-process flag is passed. It is cleared in |ResetForCommit| | |
402 // because we only use it while the navigation is pending. | |
403 // TODO(creis): Move this to FrameNavigationEntry. | |
404 int64 frame_tree_node_id_; | |
405 | |
406 #if defined(OS_ANDROID) | 423 #if defined(OS_ANDROID) |
407 // The time at which Chrome received the Android Intent that triggered this | 424 // The time at which Chrome received the Android Intent that triggered this |
408 // URL load operation. Reset at commit and not persisted. | 425 // URL load operation. Reset at commit and not persisted. |
409 base::TimeTicks intent_received_timestamp_; | 426 base::TimeTicks intent_received_timestamp_; |
410 #endif | 427 #endif |
411 | 428 |
412 // Used to store extra data to support browser features. This member is not | 429 // Used to store extra data to support browser features. This member is not |
413 // persisted, unless specific data is taken out/put back in at save/restore | 430 // persisted, unless specific data is taken out/put back in at save/restore |
414 // time (see TabNavigation for an example of this). | 431 // time (see TabNavigation for an example of this). |
415 std::map<std::string, base::string16> extra_data_; | 432 std::map<std::string, base::string16> extra_data_; |
416 | 433 |
417 DISALLOW_COPY_AND_ASSIGN(NavigationEntryImpl); | 434 DISALLOW_COPY_AND_ASSIGN(NavigationEntryImpl); |
418 }; | 435 }; |
419 | 436 |
420 } // namespace content | 437 } // namespace content |
421 | 438 |
422 #endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_ | 439 #endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_ENTRY_IMPL_H_ |
OLD | NEW |