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 : | |
(Do not use) nasko
2014/08/28 16:39:09
nit: no need for space between the constant and ":
clamy
2014/09/02 18:25:19
Done.
| |
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 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
538 if (iter != pending_delete_hosts_.end() && iter->second.get() == rfh) | 579 if (iter != pending_delete_hosts_.end() && iter->second.get() == rfh) |
539 pending_delete_hosts_.erase(site_instance_id); | 580 pending_delete_hosts_.erase(site_instance_id); |
540 } | 581 } |
541 | 582 |
542 void RenderFrameHostManager::ResetProxyHosts() { | 583 void RenderFrameHostManager::ResetProxyHosts() { |
543 STLDeleteValues(&proxy_hosts_); | 584 STLDeleteValues(&proxy_hosts_); |
544 } | 585 } |
545 | 586 |
546 // PlzNavigate | 587 // PlzNavigate |
547 bool RenderFrameHostManager::RequestNavigation( | 588 bool RenderFrameHostManager::RequestNavigation( |
548 const NavigationEntryImpl& entry, | 589 scoped_ptr<FrameMsg_CommitNavigation_Params> commit_navigation_params, |
549 const FrameMsg_Navigate_Params& navigate_params) { | 590 const FrameMsg_Navigate_Params& navigate_params) { |
550 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 591 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
551 switches::kEnableBrowserSideNavigation)); | 592 switches::kEnableBrowserSideNavigation)); |
593 commit_navigation_params_ = commit_navigation_params.Pass(); | |
552 // TODO(clamy): replace RenderViewHost::IsRenderViewLive by | 594 // TODO(clamy): replace RenderViewHost::IsRenderViewLive by |
553 // RenderFrameHost::IsLive. | 595 // RenderFrameHost::IsLive. |
554 if (render_frame_host_->render_view_host()->IsRenderViewLive()) | 596 if (render_frame_host_->render_view_host()->IsRenderViewLive()) |
555 // TODO(clamy): send a RequestNavigation IPC. | 597 // TODO(clamy): send a RequestNavigation IPC. |
556 return true; | 598 return true; |
557 | 599 |
558 // The navigation request is sent directly to the IO thread. | 600 // The navigation request is sent directly to the IO thread. |
559 OnBeginNavigation(BeginNavigationFromNavigate(navigate_params)); | 601 OnBeginNavigation(BeginNavigationFromNavigate( |
602 navigate_params, commit_navigation_params_->navigation_type)); | |
560 return true; | 603 return true; |
561 } | 604 } |
562 | 605 |
563 // PlzNavigate | 606 // PlzNavigate |
564 void RenderFrameHostManager::OnBeginNavigation( | 607 void RenderFrameHostManager::OnBeginNavigation( |
565 const FrameHostMsg_BeginNavigation_Params& params) { | 608 const FrameHostMsg_BeginNavigation_Params& params) { |
566 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 609 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
567 switches::kEnableBrowserSideNavigation)); | 610 switches::kEnableBrowserSideNavigation)); |
568 // TODO(clamy): Check if navigations are blocked and if so, return | 611 // TODO(clamy): Check if navigations are blocked and if so, return |
569 // immediately. | 612 // immediately. |
570 NavigationRequestInfo info(params); | 613 NavigationRequestInfo info(params); |
571 | 614 |
572 info.first_party_for_cookies = frame_tree_node_->IsMainFrame() ? | 615 info.first_party_for_cookies = frame_tree_node_->IsMainFrame() ? |
573 params.url : frame_tree_node_->frame_tree()->root()->current_url(); | 616 params.url : frame_tree_node_->frame_tree()->root()->current_url(); |
574 info.is_main_frame = frame_tree_node_->IsMainFrame(); | 617 info.is_main_frame = frame_tree_node_->IsMainFrame(); |
575 info.parent_is_main_frame = !frame_tree_node_->parent() ? | 618 info.parent_is_main_frame = !frame_tree_node_->parent() ? |
576 false : frame_tree_node_->parent()->IsMainFrame(); | 619 false : frame_tree_node_->parent()->IsMainFrame(); |
577 info.is_showing = GetRenderWidgetHostView()->IsShowing(); | 620 info.is_showing = GetRenderWidgetHostView()->IsShowing(); |
578 | 621 |
579 // TODO(clamy): Check if the current RFH should be initialized (in case it has | 622 // TODO(clamy): Check if the current RFH should be initialized (in case it has |
580 // crashed) not to display a sad tab while navigating. | 623 // crashed) not to display a sad tab while navigating. |
581 // TODO(clamy): Spawn a speculative renderer process if we do not have one to | 624 // TODO(clamy): Spawn a speculative renderer process if we do not have one to |
582 // use for the navigation. | 625 // use for the navigation. |
583 navigation_request_.reset(new NavigationRequest( | 626 navigation_request_.reset(new NavigationRequest( |
584 info, frame_tree_node_->frame_tree_node_id())); | 627 info, frame_tree_node_->frame_tree_node_id())); |
585 navigation_request_->BeginNavigation(params.request_body); | 628 navigation_request_->BeginNavigation(params.request_body); |
629 | |
630 DCHECK(commit_navigation_params_.get()); | |
631 UpdateCommitNavParamsFromBeginNavParams( | |
632 params, commit_navigation_params_.get()); | |
586 } | 633 } |
587 | 634 |
588 // PlzNavigate | 635 // PlzNavigate |
589 void RenderFrameHostManager::CommitNavigation( | 636 void RenderFrameHostManager::CommitNavigation( |
590 const NavigationBeforeCommitInfo& info) { | 637 const NavigationBeforeCommitInfo& info) { |
591 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 638 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
592 switches::kEnableBrowserSideNavigation)); | 639 switches::kEnableBrowserSideNavigation)); |
593 // Pick the right RenderFrameHost to commit the navigation. | 640 // Pick the right RenderFrameHost to commit the navigation. |
594 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 641 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
595 // TODO(clamy): Replace the default values by the right ones. This may require | 642 // TODO(clamy): Replace the default values by the right ones. This may require |
(...skipping 12 matching lines...) Expand all Loading... | |
608 current_instance, new_instance, frame_tree_node_->IsMainFrame()); | 655 current_instance, new_instance, frame_tree_node_->IsMainFrame()); |
609 DCHECK(pending_render_frame_host_.get()); | 656 DCHECK(pending_render_frame_host_.get()); |
610 // TODO(clamy): Wait until the navigation has committed before swapping | 657 // TODO(clamy): Wait until the navigation has committed before swapping |
611 // renderers. | 658 // renderers. |
612 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 659 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
613 SetRenderFrameHost(pending_render_frame_host_.Pass()); | 660 SetRenderFrameHost(pending_render_frame_host_.Pass()); |
614 if (frame_tree_node_->IsMainFrame()) | 661 if (frame_tree_node_->IsMainFrame()) |
615 render_frame_host_->render_view_host()->AttachToFrameTree(); | 662 render_frame_host_->render_view_host()->AttachToFrameTree(); |
616 } | 663 } |
617 | 664 |
665 DCHECK(commit_navigation_params_.get()); | |
666 UpdateCommitNavParamsFromCommitInfo(info, commit_navigation_params_.get()); | |
618 frame_tree_node_->navigator()->CommitNavigation( | 667 frame_tree_node_->navigator()->CommitNavigation( |
619 render_frame_host_.get(), info); | 668 render_frame_host_.get(), commit_navigation_params_.Pass()); |
620 } | 669 } |
621 | 670 |
622 void RenderFrameHostManager::Observe( | 671 void RenderFrameHostManager::Observe( |
623 int type, | 672 int type, |
624 const NotificationSource& source, | 673 const NotificationSource& source, |
625 const NotificationDetails& details) { | 674 const NotificationDetails& details) { |
626 switch (type) { | 675 switch (type) { |
627 case NOTIFICATION_RENDERER_PROCESS_CLOSED: | 676 case NOTIFICATION_RENDERER_PROCESS_CLOSED: |
628 case NOTIFICATION_RENDERER_PROCESS_CLOSING: | 677 case NOTIFICATION_RENDERER_PROCESS_CLOSING: |
629 RendererProcessClosing( | 678 RendererProcessClosing( |
(...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1659 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1708 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1660 SiteInstance* instance) { | 1709 SiteInstance* instance) { |
1661 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1710 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1662 if (iter != proxy_hosts_.end()) { | 1711 if (iter != proxy_hosts_.end()) { |
1663 delete iter->second; | 1712 delete iter->second; |
1664 proxy_hosts_.erase(iter); | 1713 proxy_hosts_.erase(iter); |
1665 } | 1714 } |
1666 } | 1715 } |
1667 | 1716 |
1668 } // namespace content | 1717 } // namespace content |
OLD | NEW |