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 #include "content/browser/frame_host/navigation_entry_impl.h" | 5 #include "content/browser/frame_host/navigation_entry_impl.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 | 8 |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 } | 88 } |
89 | 89 |
90 NavigationEntryImpl::NavigationEntryImpl(SiteInstanceImpl* instance, | 90 NavigationEntryImpl::NavigationEntryImpl(SiteInstanceImpl* instance, |
91 int page_id, | 91 int page_id, |
92 const GURL& url, | 92 const GURL& url, |
93 const Referrer& referrer, | 93 const Referrer& referrer, |
94 const base::string16& title, | 94 const base::string16& title, |
95 ui::PageTransition transition_type, | 95 ui::PageTransition transition_type, |
96 bool is_renderer_initiated) | 96 bool is_renderer_initiated) |
97 : frame_tree_( | 97 : frame_tree_( |
98 new TreeNode(new FrameNavigationEntry(-1, instance, url, referrer))), | 98 new TreeNode(new FrameNavigationEntry(-1, -1, -1, instance, url, |
| 99 referrer))), |
99 unique_id_(GetUniqueIDInConstructor()), | 100 unique_id_(GetUniqueIDInConstructor()), |
100 bindings_(kInvalidBindings), | 101 bindings_(kInvalidBindings), |
101 page_type_(PAGE_TYPE_NORMAL), | 102 page_type_(PAGE_TYPE_NORMAL), |
102 update_virtual_url_with_url_(false), | 103 update_virtual_url_with_url_(false), |
103 title_(title), | 104 title_(title), |
104 page_id_(page_id), | 105 page_id_(page_id), |
105 transition_type_(transition_type), | 106 transition_type_(transition_type), |
106 has_post_data_(false), | 107 has_post_data_(false), |
107 post_id_(-1), | 108 post_id_(-1), |
108 restore_type_(RESTORE_NONE), | 109 restore_type_(RESTORE_NONE), |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 set_frame_tree_node_id(-1); | 498 set_frame_tree_node_id(-1); |
498 | 499 |
499 #if defined(OS_ANDROID) | 500 #if defined(OS_ANDROID) |
500 // Reset the time stamp so that the metrics are not reported if this entry is | 501 // Reset the time stamp so that the metrics are not reported if this entry is |
501 // loaded again in the future. | 502 // loaded again in the future. |
502 set_intent_received_timestamp(base::TimeTicks()); | 503 set_intent_received_timestamp(base::TimeTicks()); |
503 #endif | 504 #endif |
504 } | 505 } |
505 | 506 |
506 void NavigationEntryImpl::AddOrUpdateFrameEntry(FrameTreeNode* frame_tree_node, | 507 void NavigationEntryImpl::AddOrUpdateFrameEntry(FrameTreeNode* frame_tree_node, |
| 508 int64 item_sequence_number, |
| 509 int64 document_sequence_number, |
507 SiteInstanceImpl* site_instance, | 510 SiteInstanceImpl* site_instance, |
508 const GURL& url, | 511 const GURL& url, |
509 const Referrer& referrer, | 512 const Referrer& referrer, |
510 const PageState& page_state) { | 513 const PageState& page_state) { |
511 // We should already have a TreeNode for the parent node by the time this node | 514 // We should already have a TreeNode for the parent node by the time this node |
512 // commits. Find it first. | 515 // commits. Find it first. |
513 DCHECK(frame_tree_node->parent()); | 516 DCHECK(frame_tree_node->parent()); |
514 NavigationEntryImpl::TreeNode* parent_node = | 517 NavigationEntryImpl::TreeNode* parent_node = |
515 FindFrameEntry(frame_tree_node->parent()); | 518 FindFrameEntry(frame_tree_node->parent()); |
516 if (!parent_node) { | 519 if (!parent_node) { |
517 // The renderer should not send a commit for a subframe before its parent. | 520 // The renderer should not send a commit for a subframe before its parent. |
518 // However, we may see commits of subframes when their parent or ancestor is | 521 // However, we may see commits of subframes when their parent or ancestor is |
519 // still the initial about:blank page, and we don't currently keep a | 522 // still the initial about:blank page, and we don't currently keep a |
520 // FrameNavigationEntry for that. We ignore such commits, similar to how we | 523 // FrameNavigationEntry for that. We ignore such commits, similar to how we |
521 // handle them at the top level. | 524 // handle them at the top level. |
522 // TODO(creis): Consider creating FNEs for initial about:blank commits. | 525 // TODO(creis): Consider creating FNEs for initial about:blank commits. |
523 return; | 526 return; |
524 } | 527 } |
525 | 528 |
526 // Now check whether we have a TreeNode for the node itself. | 529 // Now check whether we have a TreeNode for the node itself. |
527 int frame_tree_node_id = frame_tree_node->frame_tree_node_id(); | 530 int frame_tree_node_id = frame_tree_node->frame_tree_node_id(); |
528 for (TreeNode* child : parent_node->children) { | 531 for (TreeNode* child : parent_node->children) { |
529 if (child->frame_entry->frame_tree_node_id() == frame_tree_node_id) { | 532 if (child->frame_entry->frame_tree_node_id() == frame_tree_node_id) { |
530 // Update the existing FrameNavigationEntry (e.g., for replaceState). | 533 // Update the existing FrameNavigationEntry (e.g., for replaceState). |
531 child->frame_entry->UpdateEntry(site_instance, url, referrer, page_state); | 534 child->frame_entry->UpdateEntry(item_sequence_number, |
| 535 document_sequence_number, site_instance, |
| 536 url, referrer, page_state); |
532 return; | 537 return; |
533 } | 538 } |
534 } | 539 } |
535 | 540 |
536 // No entry exists yet, so create a new one unless it's for about:blank. | 541 // No entry exists yet, so create a new one unless it's for about:blank. |
537 // Unordered list, since we expect to look up entries by frame sequence number | 542 // Unordered list, since we expect to look up entries by frame sequence number |
538 // or unique name. | 543 // or unique name. |
539 if (url == GURL(url::kAboutBlankURL)) | 544 if (url == GURL(url::kAboutBlankURL)) |
540 return; | 545 return; |
541 FrameNavigationEntry* frame_entry = new FrameNavigationEntry( | 546 FrameNavigationEntry* frame_entry = new FrameNavigationEntry( |
542 frame_tree_node_id, site_instance, url, referrer); | 547 frame_tree_node_id, item_sequence_number, document_sequence_number, |
| 548 site_instance, url, referrer); |
543 frame_entry->set_page_state(page_state); | 549 frame_entry->set_page_state(page_state); |
544 parent_node->children.push_back( | 550 parent_node->children.push_back( |
545 new NavigationEntryImpl::TreeNode(frame_entry)); | 551 new NavigationEntryImpl::TreeNode(frame_entry)); |
546 } | 552 } |
547 | 553 |
548 bool NavigationEntryImpl::HasFrameEntry(FrameTreeNode* frame_tree_node) const { | 554 FrameNavigationEntry* NavigationEntryImpl::GetFrameEntry( |
549 return FindFrameEntry(frame_tree_node) != nullptr; | 555 FrameTreeNode* frame_tree_node) const { |
| 556 NavigationEntryImpl::TreeNode* tree_node = FindFrameEntry(frame_tree_node); |
| 557 return tree_node ? tree_node->frame_entry.get() : nullptr; |
550 } | 558 } |
551 | 559 |
552 void NavigationEntryImpl::SetScreenshotPNGData( | 560 void NavigationEntryImpl::SetScreenshotPNGData( |
553 scoped_refptr<base::RefCountedBytes> png_data) { | 561 scoped_refptr<base::RefCountedBytes> png_data) { |
554 screenshot_ = png_data; | 562 screenshot_ = png_data; |
555 if (screenshot_.get()) | 563 if (screenshot_.get()) |
556 UMA_HISTOGRAM_MEMORY_KB("Overscroll.ScreenshotSize", screenshot_->size()); | 564 UMA_HISTOGRAM_MEMORY_KB("Overscroll.ScreenshotSize", screenshot_->size()); |
557 } | 565 } |
558 | 566 |
559 GURL NavigationEntryImpl::GetHistoryURLForDataURL() const { | 567 GURL NavigationEntryImpl::GetHistoryURLForDataURL() const { |
(...skipping 15 matching lines...) Expand all Loading... |
575 return node; | 583 return node; |
576 } | 584 } |
577 // Enqueue any children and keep looking. | 585 // Enqueue any children and keep looking. |
578 for (auto& child : node->children) | 586 for (auto& child : node->children) |
579 work_queue.push(child); | 587 work_queue.push(child); |
580 } | 588 } |
581 return nullptr; | 589 return nullptr; |
582 } | 590 } |
583 | 591 |
584 } // namespace content | 592 } // namespace content |
OLD | NEW |