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/render_frame_host_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 #include "content/public/common/content_switches.h" | 41 #include "content/public/common/content_switches.h" |
42 #include "content/public/common/referrer.h" | 42 #include "content/public/common/referrer.h" |
43 #include "content/public/common/url_constants.h" | 43 #include "content/public/common/url_constants.h" |
44 #include "net/base/load_flags.h" | 44 #include "net/base/load_flags.h" |
45 | 45 |
46 namespace content { | 46 namespace content { |
47 | 47 |
48 namespace { | 48 namespace { |
49 | 49 |
50 // PlzNavigate | 50 // PlzNavigate |
| 51 // Returns the net load flags to use based on the navigation type. |
| 52 int LoadFlagFromNavigationType(FrameMsg_Navigate_Type::Value navigation_type) { |
| 53 int load_flags = net::LOAD_NORMAL; |
| 54 switch (navigation_type) { |
| 55 case FrameMsg_Navigate_Type::RELOAD: |
| 56 case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL: |
| 57 load_flags |= net::LOAD_VALIDATE_CACHE; |
| 58 break; |
| 59 case FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE: |
| 60 load_flags |= net::LOAD_BYPASS_CACHE; |
| 61 break; |
| 62 case FrameMsg_Navigate_Type::RESTORE: |
| 63 load_flags |= net::LOAD_PREFERRING_CACHE; |
| 64 break; |
| 65 case FrameMsg_Navigate_Type::RESTORE_WITH_POST: |
| 66 load_flags |= net::LOAD_ONLY_FROM_CACHE; |
| 67 break; |
| 68 case FrameMsg_Navigate_Type::NORMAL: |
| 69 default : |
| 70 break; |
| 71 } |
| 72 return load_flags; |
| 73 } |
| 74 |
| 75 // PlzNavigate |
51 // Simulates a renderer response to a navigation request when there is no live | 76 // Simulates a renderer response to a navigation request when there is no live |
52 // renderer. | 77 // renderer. |
53 FrameHostMsg_BeginNavigation_Params BeginNavigationFromNavigate( | 78 FrameHostMsg_BeginNavigation_Params BeginNavigationFromNavigate( |
54 const FrameMsg_Navigate_Params& navigate_params) { | 79 const FrameMsg_Navigate_Params& navigate_params, |
| 80 FrameMsg_Navigate_Type::Value navigation_type) { |
55 FrameHostMsg_BeginNavigation_Params begin_navigation_params; | 81 FrameHostMsg_BeginNavigation_Params begin_navigation_params; |
56 begin_navigation_params.method = navigate_params.is_post ? "POST" : "GET"; | 82 begin_navigation_params.method = navigate_params.is_post ? "POST" : "GET"; |
57 begin_navigation_params.url = navigate_params.url; | 83 begin_navigation_params.url = navigate_params.url; |
58 begin_navigation_params.referrer = | 84 begin_navigation_params.referrer = |
59 Referrer(navigate_params.referrer.url, navigate_params.referrer.policy); | 85 Referrer(navigate_params.referrer.url, navigate_params.referrer.policy); |
60 | 86 begin_navigation_params.load_flags = |
61 // TODO(clamy): This should be modified to take into account caching policy | 87 LoadFlagFromNavigationType(navigation_type); |
62 // requirements (eg for POST reloads). | |
63 begin_navigation_params.load_flags = net::LOAD_NORMAL; | |
64 | 88 |
65 // TODO(clamy): Post data from the browser should be put in the request body. | 89 // TODO(clamy): Post data from the browser should be put in the request body. |
66 | 90 |
67 begin_navigation_params.has_user_gesture = false; | 91 begin_navigation_params.has_user_gesture = false; |
68 begin_navigation_params.transition_type = navigate_params.transition; | 92 begin_navigation_params.transition_type = navigate_params.transition; |
69 begin_navigation_params.should_replace_current_entry = | 93 begin_navigation_params.should_replace_current_entry = |
70 navigate_params.should_replace_current_entry; | 94 navigate_params.should_replace_current_entry; |
71 begin_navigation_params.allow_download = | 95 begin_navigation_params.allow_download = |
72 navigate_params.allow_download; | 96 navigate_params.allow_download; |
73 return begin_navigation_params; | 97 return begin_navigation_params; |
74 } | 98 } |
75 | 99 |
| 100 void UpdateCommitNavParamsFromBeginNavParams( |
| 101 const FrameHostMsg_BeginNavigation_Params& begin_navigation_params, |
| 102 FrameMsg_CommitNavigation_Params* commit_navigation_params) { |
| 103 commit_navigation_params->referrer = begin_navigation_params.referrer; |
| 104 commit_navigation_params->transition = |
| 105 begin_navigation_params.transition_type; |
| 106 } |
| 107 |
| 108 void UpdateCommitNavParamsFromCommitInfo( |
| 109 const NavigationBeforeCommitInfo& commit_info, |
| 110 FrameMsg_CommitNavigation_Params* commit_navigation_params) { |
| 111 commit_navigation_params->url = commit_info.navigation_url; |
| 112 commit_navigation_params->stream_url = commit_info.stream_url; |
| 113 commit_navigation_params->browser_navigation_start = |
| 114 commit_info.browser_navigation_start; |
| 115 } |
| 116 |
76 } // namespace | 117 } // namespace |
77 | 118 |
78 bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { | 119 bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { |
79 node->render_manager()->pending_delete_hosts_.clear(); | 120 node->render_manager()->pending_delete_hosts_.clear(); |
80 return true; | 121 return true; |
81 } | 122 } |
82 | 123 |
83 RenderFrameHostManager::RenderFrameHostManager( | 124 RenderFrameHostManager::RenderFrameHostManager( |
84 FrameTreeNode* frame_tree_node, | 125 FrameTreeNode* frame_tree_node, |
85 RenderFrameHostDelegate* render_frame_delegate, | 126 RenderFrameHostDelegate* render_frame_delegate, |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 if (iter != pending_delete_hosts_.end() && iter->second.get() == rfh) | 582 if (iter != pending_delete_hosts_.end() && iter->second.get() == rfh) |
542 pending_delete_hosts_.erase(site_instance_id); | 583 pending_delete_hosts_.erase(site_instance_id); |
543 } | 584 } |
544 | 585 |
545 void RenderFrameHostManager::ResetProxyHosts() { | 586 void RenderFrameHostManager::ResetProxyHosts() { |
546 STLDeleteValues(&proxy_hosts_); | 587 STLDeleteValues(&proxy_hosts_); |
547 } | 588 } |
548 | 589 |
549 // PlzNavigate | 590 // PlzNavigate |
550 bool RenderFrameHostManager::RequestNavigation( | 591 bool RenderFrameHostManager::RequestNavigation( |
551 const NavigationEntryImpl& entry, | 592 scoped_ptr<FrameMsg_CommitNavigation_Params> commit_navigation_params, |
552 const FrameMsg_Navigate_Params& navigate_params) { | 593 const FrameMsg_Navigate_Params& navigate_params) { |
553 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 594 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
554 switches::kEnableBrowserSideNavigation)); | 595 switches::kEnableBrowserSideNavigation)); |
| 596 commit_navigation_params_ = commit_navigation_params.Pass(); |
555 // TODO(clamy): replace RenderViewHost::IsRenderViewLive by | 597 // TODO(clamy): replace RenderViewHost::IsRenderViewLive by |
556 // RenderFrameHost::IsLive. | 598 // RenderFrameHost::IsLive. |
557 if (render_frame_host_->render_view_host()->IsRenderViewLive()) | 599 if (render_frame_host_->render_view_host()->IsRenderViewLive()) |
558 // TODO(clamy): send a RequestNavigation IPC. | 600 // TODO(clamy): send a RequestNavigation IPC. |
559 return true; | 601 return true; |
560 | 602 |
561 // The navigation request is sent directly to the IO thread. | 603 // The navigation request is sent directly to the IO thread. |
562 OnBeginNavigation(BeginNavigationFromNavigate(navigate_params)); | 604 OnBeginNavigation(BeginNavigationFromNavigate( |
| 605 navigate_params, commit_navigation_params_->navigation_type)); |
563 return true; | 606 return true; |
564 } | 607 } |
565 | 608 |
566 // PlzNavigate | 609 // PlzNavigate |
567 void RenderFrameHostManager::OnBeginNavigation( | 610 void RenderFrameHostManager::OnBeginNavigation( |
568 const FrameHostMsg_BeginNavigation_Params& params) { | 611 const FrameHostMsg_BeginNavigation_Params& params) { |
569 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 612 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
570 switches::kEnableBrowserSideNavigation)); | 613 switches::kEnableBrowserSideNavigation)); |
571 // TODO(clamy): Check if navigations are blocked and if so, return | 614 // TODO(clamy): Check if navigations are blocked and if so, return |
572 // immediately. | 615 // immediately. |
573 NavigationRequestInfo info(params); | 616 NavigationRequestInfo info(params); |
574 | 617 |
575 info.first_party_for_cookies = frame_tree_node_->IsMainFrame() ? | 618 info.first_party_for_cookies = frame_tree_node_->IsMainFrame() ? |
576 params.url : frame_tree_node_->frame_tree()->root()->current_url(); | 619 params.url : frame_tree_node_->frame_tree()->root()->current_url(); |
577 info.is_main_frame = frame_tree_node_->IsMainFrame(); | 620 info.is_main_frame = frame_tree_node_->IsMainFrame(); |
578 info.parent_is_main_frame = !frame_tree_node_->parent() ? | 621 info.parent_is_main_frame = !frame_tree_node_->parent() ? |
579 false : frame_tree_node_->parent()->IsMainFrame(); | 622 false : frame_tree_node_->parent()->IsMainFrame(); |
580 info.is_showing = GetRenderWidgetHostView()->IsShowing(); | 623 info.is_showing = GetRenderWidgetHostView()->IsShowing(); |
581 | 624 |
582 // TODO(clamy): Check if the current RFH should be initialized (in case it has | 625 // TODO(clamy): Check if the current RFH should be initialized (in case it has |
583 // crashed) not to display a sad tab while navigating. | 626 // crashed) not to display a sad tab while navigating. |
584 // TODO(clamy): Spawn a speculative renderer process if we do not have one to | 627 // TODO(clamy): Spawn a speculative renderer process if we do not have one to |
585 // use for the navigation. | 628 // use for the navigation. |
586 navigation_request_.reset(new NavigationRequest( | 629 navigation_request_.reset(new NavigationRequest( |
587 info, frame_tree_node_->frame_tree_node_id())); | 630 info, frame_tree_node_->frame_tree_node_id())); |
588 navigation_request_->BeginNavigation(params.request_body); | 631 navigation_request_->BeginNavigation(params.request_body); |
| 632 |
| 633 DCHECK(commit_navigation_params_.get()); |
| 634 UpdateCommitNavParamsFromBeginNavParams( |
| 635 params, commit_navigation_params_.get()); |
589 } | 636 } |
590 | 637 |
591 // PlzNavigate | 638 // PlzNavigate |
592 void RenderFrameHostManager::CommitNavigation( | 639 void RenderFrameHostManager::CommitNavigation( |
593 const NavigationBeforeCommitInfo& info) { | 640 const NavigationBeforeCommitInfo& info) { |
594 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 641 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
595 switches::kEnableBrowserSideNavigation)); | 642 switches::kEnableBrowserSideNavigation)); |
596 // Pick the right RenderFrameHost to commit the navigation. | 643 // Pick the right RenderFrameHost to commit the navigation. |
597 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 644 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
598 // TODO(clamy): Replace the default values by the right ones. This may require | 645 // TODO(clamy): Replace the default values by the right ones. This may require |
(...skipping 12 matching lines...) Expand all Loading... |
611 current_instance, new_instance, frame_tree_node_->IsMainFrame()); | 658 current_instance, new_instance, frame_tree_node_->IsMainFrame()); |
612 DCHECK(pending_render_frame_host_.get()); | 659 DCHECK(pending_render_frame_host_.get()); |
613 // TODO(clamy): Wait until the navigation has committed before swapping | 660 // TODO(clamy): Wait until the navigation has committed before swapping |
614 // renderers. | 661 // renderers. |
615 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 662 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
616 SetRenderFrameHost(pending_render_frame_host_.Pass()); | 663 SetRenderFrameHost(pending_render_frame_host_.Pass()); |
617 if (frame_tree_node_->IsMainFrame()) | 664 if (frame_tree_node_->IsMainFrame()) |
618 render_frame_host_->render_view_host()->AttachToFrameTree(); | 665 render_frame_host_->render_view_host()->AttachToFrameTree(); |
619 } | 666 } |
620 | 667 |
| 668 DCHECK(commit_navigation_params_.get()); |
| 669 UpdateCommitNavParamsFromCommitInfo(info, commit_navigation_params_.get()); |
621 frame_tree_node_->navigator()->CommitNavigation( | 670 frame_tree_node_->navigator()->CommitNavigation( |
622 render_frame_host_.get(), info); | 671 render_frame_host_.get(), commit_navigation_params_.Pass()); |
623 } | 672 } |
624 | 673 |
625 void RenderFrameHostManager::Observe( | 674 void RenderFrameHostManager::Observe( |
626 int type, | 675 int type, |
627 const NotificationSource& source, | 676 const NotificationSource& source, |
628 const NotificationDetails& details) { | 677 const NotificationDetails& details) { |
629 switch (type) { | 678 switch (type) { |
630 case NOTIFICATION_RENDERER_PROCESS_CLOSED: | 679 case NOTIFICATION_RENDERER_PROCESS_CLOSED: |
631 case NOTIFICATION_RENDERER_PROCESS_CLOSING: | 680 case NOTIFICATION_RENDERER_PROCESS_CLOSING: |
632 RendererProcessClosing( | 681 RendererProcessClosing( |
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1673 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1722 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1674 SiteInstance* instance) { | 1723 SiteInstance* instance) { |
1675 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1724 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1676 if (iter != proxy_hosts_.end()) { | 1725 if (iter != proxy_hosts_.end()) { |
1677 delete iter->second; | 1726 delete iter->second; |
1678 proxy_hosts_.erase(iter); | 1727 proxy_hosts_.erase(iter); |
1679 } | 1728 } |
1680 } | 1729 } |
1681 | 1730 |
1682 } // namespace content | 1731 } // namespace content |
OLD | NEW |