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 12 matching lines...) Expand all Loading... | |
23 #include "content/browser/frame_host/navigator.h" | 23 #include "content/browser/frame_host/navigator.h" |
24 #include "content/browser/frame_host/render_frame_host_factory.h" | 24 #include "content/browser/frame_host/render_frame_host_factory.h" |
25 #include "content/browser/frame_host/render_frame_host_impl.h" | 25 #include "content/browser/frame_host/render_frame_host_impl.h" |
26 #include "content/browser/frame_host/render_frame_proxy_host.h" | 26 #include "content/browser/frame_host/render_frame_proxy_host.h" |
27 #include "content/browser/renderer_host/render_process_host_impl.h" | 27 #include "content/browser/renderer_host/render_process_host_impl.h" |
28 #include "content/browser/renderer_host/render_view_host_factory.h" | 28 #include "content/browser/renderer_host/render_view_host_factory.h" |
29 #include "content/browser/renderer_host/render_view_host_impl.h" | 29 #include "content/browser/renderer_host/render_view_host_impl.h" |
30 #include "content/browser/site_instance_impl.h" | 30 #include "content/browser/site_instance_impl.h" |
31 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 31 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
32 #include "content/browser/webui/web_ui_impl.h" | 32 #include "content/browser/webui/web_ui_impl.h" |
33 #include "content/common/navigation_params.h" | |
33 #include "content/common/view_messages.h" | 34 #include "content/common/view_messages.h" |
34 #include "content/public/browser/content_browser_client.h" | 35 #include "content/public/browser/content_browser_client.h" |
35 #include "content/public/browser/notification_service.h" | 36 #include "content/public/browser/notification_service.h" |
36 #include "content/public/browser/notification_types.h" | 37 #include "content/public/browser/notification_types.h" |
37 #include "content/public/browser/render_widget_host_iterator.h" | 38 #include "content/public/browser/render_widget_host_iterator.h" |
38 #include "content/public/browser/render_widget_host_view.h" | 39 #include "content/public/browser/render_widget_host_view.h" |
39 #include "content/public/browser/user_metrics.h" | 40 #include "content/public/browser/user_metrics.h" |
40 #include "content/public/browser/web_ui_controller.h" | 41 #include "content/public/browser/web_ui_controller.h" |
41 #include "content/public/common/content_switches.h" | 42 #include "content/public/common/content_switches.h" |
42 #include "content/public/common/referrer.h" | 43 #include "content/public/common/referrer.h" |
43 #include "content/public/common/url_constants.h" | 44 #include "content/public/common/url_constants.h" |
44 #include "net/base/load_flags.h" | 45 #include "net/base/load_flags.h" |
45 | 46 |
46 namespace content { | 47 namespace content { |
47 | 48 |
48 namespace { | 49 // PlzNavigate |
50 // Returns the net load flags to use based on the navigation type. | |
51 int LoadFlagFromNavigationType(FrameMsg_Navigate_Type::Value navigation_type) { | |
52 int load_flags = net::LOAD_NORMAL; | |
53 switch (navigation_type) { | |
54 case FrameMsg_Navigate_Type::RELOAD: | |
55 case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL: | |
56 load_flags |= net::LOAD_VALIDATE_CACHE; | |
57 break; | |
58 case FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE: | |
59 load_flags |= net::LOAD_BYPASS_CACHE; | |
60 break; | |
61 case FrameMsg_Navigate_Type::RESTORE: | |
62 load_flags |= net::LOAD_PREFERRING_CACHE; | |
63 break; | |
64 case FrameMsg_Navigate_Type::RESTORE_WITH_POST: | |
65 load_flags |= net::LOAD_ONLY_FROM_CACHE; | |
66 break; | |
67 case FrameMsg_Navigate_Type::NORMAL: | |
68 default : | |
69 break; | |
70 } | |
71 return load_flags; | |
72 } | |
49 | 73 |
50 // PlzNavigate | 74 // PlzNavigate |
51 // Simulates a renderer response to a navigation request when there is no live | 75 // Generates a default FrameHostMsg_BeginNavigation_Params to be used when there |
52 // renderer. | 76 // is no live renderer. |
53 FrameHostMsg_BeginNavigation_Params BeginNavigationFromNavigate( | 77 FrameHostMsg_BeginNavigation_Params MakeDefaultBeginNavigation( |
54 const FrameMsg_Navigate_Params& navigate_params) { | 78 const NavigationParamsWithRequestAndCommitInfo& navigation_params) { |
55 FrameHostMsg_BeginNavigation_Params begin_navigation_params; | 79 FrameHostMsg_BeginNavigation_Params begin_navigation_params; |
56 begin_navigation_params.method = navigate_params.is_post ? "POST" : "GET"; | 80 begin_navigation_params.url = navigation_params.url; |
57 begin_navigation_params.url = navigate_params.url; | 81 begin_navigation_params.referrer = navigation_params.referrer; |
58 begin_navigation_params.referrer = | 82 begin_navigation_params.transition = navigation_params.transition; |
59 Referrer(navigate_params.referrer.url, navigate_params.referrer.policy); | 83 begin_navigation_params.method = navigation_params.is_post? "POST" : "GET"; |
60 | 84 begin_navigation_params.load_flags = |
61 // TODO(clamy): This should be modified to take into account caching policy | 85 LoadFlagFromNavigationType(navigation_params.navigation_type); |
62 // requirements (eg for POST reloads). | |
63 begin_navigation_params.load_flags = net::LOAD_NORMAL; | |
64 | 86 |
65 // TODO(clamy): Post data from the browser should be put in the request body. | 87 // TODO(clamy): Post data from the browser should be put in the request body. |
66 | 88 |
67 begin_navigation_params.has_user_gesture = false; | 89 begin_navigation_params.has_user_gesture = false; |
68 begin_navigation_params.transition_type = navigate_params.transition; | |
69 begin_navigation_params.should_replace_current_entry = | |
70 navigate_params.should_replace_current_entry; | |
71 begin_navigation_params.allow_download = | |
72 navigate_params.allow_download; | |
73 return begin_navigation_params; | 90 return begin_navigation_params; |
74 } | 91 } |
75 | 92 |
76 } // namespace | 93 // PlzNavigate |
94 FrameMsg_CommitNavigation_Params MakeCommitNavigationParams( | |
Charlie Reis
2014/09/15 21:19:39
This kind of conversion makes me think we may not
| |
95 const NavigationParamsWithRequestAndCommitInfo& navigation_params, | |
96 const GURL& stream_url) { | |
97 FrameMsg_CommitNavigation_Params commit_navigation_params; | |
98 commit_navigation_params.url = navigation_params.url; | |
99 commit_navigation_params.referrer = navigation_params.referrer; | |
100 commit_navigation_params.transition = navigation_params.transition; | |
101 commit_navigation_params.page_id = navigation_params.page_id; | |
102 commit_navigation_params.should_clear_history_list = | |
103 navigation_params.should_clear_history_list; | |
104 commit_navigation_params.pending_history_list_offset = | |
105 navigation_params.pending_history_list_offset; | |
106 commit_navigation_params.current_history_list_offset = | |
107 navigation_params.current_history_list_offset; | |
108 commit_navigation_params.current_history_list_length = | |
109 navigation_params.current_history_list_length; | |
110 commit_navigation_params.page_state = navigation_params.page_state; | |
111 commit_navigation_params.navigation_type = navigation_params.navigation_type; | |
112 commit_navigation_params.is_overriding_user_agent = | |
113 navigation_params.is_overriding_user_agent; | |
114 commit_navigation_params.browser_navigation_start = | |
115 navigation_params.browser_navigation_start; | |
116 commit_navigation_params.stream_url = stream_url; | |
117 return commit_navigation_params; | |
118 } | |
77 | 119 |
78 bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { | 120 bool RenderFrameHostManager::ClearRFHsPendingShutdown(FrameTreeNode* node) { |
79 node->render_manager()->pending_delete_hosts_.clear(); | 121 node->render_manager()->pending_delete_hosts_.clear(); |
80 return true; | 122 return true; |
81 } | 123 } |
82 | 124 |
83 RenderFrameHostManager::RenderFrameHostManager( | 125 RenderFrameHostManager::RenderFrameHostManager( |
84 FrameTreeNode* frame_tree_node, | 126 FrameTreeNode* frame_tree_node, |
85 RenderFrameHostDelegate* render_frame_delegate, | 127 RenderFrameHostDelegate* render_frame_delegate, |
86 RenderViewHostDelegate* render_view_delegate, | 128 RenderViewHostDelegate* render_view_delegate, |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
559 if (iter != pending_delete_hosts_.end() && iter->second.get() == rfh) | 601 if (iter != pending_delete_hosts_.end() && iter->second.get() == rfh) |
560 pending_delete_hosts_.erase(site_instance_id); | 602 pending_delete_hosts_.erase(site_instance_id); |
561 } | 603 } |
562 | 604 |
563 void RenderFrameHostManager::ResetProxyHosts() { | 605 void RenderFrameHostManager::ResetProxyHosts() { |
564 STLDeleteValues(&proxy_hosts_); | 606 STLDeleteValues(&proxy_hosts_); |
565 } | 607 } |
566 | 608 |
567 // PlzNavigate | 609 // PlzNavigate |
568 bool RenderFrameHostManager::RequestNavigation( | 610 bool RenderFrameHostManager::RequestNavigation( |
569 const NavigationEntryImpl& entry, | 611 scoped_ptr<NavigationParamsWithRequestAndCommitInfo> navigation_params) { |
570 const FrameMsg_Navigate_Params& navigate_params) { | |
571 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 612 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
572 switches::kEnableBrowserSideNavigation)); | 613 switches::kEnableBrowserSideNavigation)); |
614 DCHECK(navigation_params.get()); | |
615 navigation_params_ = navigation_params.Pass(); | |
573 // TODO(clamy): replace RenderViewHost::IsRenderViewLive by | 616 // TODO(clamy): replace RenderViewHost::IsRenderViewLive by |
574 // RenderFrameHost::IsLive. | 617 // RenderFrameHost::IsLive. |
575 if (render_frame_host_->render_view_host()->IsRenderViewLive()) | 618 if (render_frame_host_->render_view_host()->IsRenderViewLive()) |
576 // TODO(clamy): send a RequestNavigation IPC. | 619 // TODO(clamy): send a RequestNavigation IPC. |
577 return true; | 620 return true; |
578 | 621 |
579 // The navigation request is sent directly to the IO thread. | 622 // The navigation request is sent directly to the IO thread. |
580 OnBeginNavigation(BeginNavigationFromNavigate(navigate_params)); | 623 OnBeginNavigation(MakeDefaultBeginNavigation(*navigation_params_)); |
581 return true; | 624 return true; |
582 } | 625 } |
583 | 626 |
584 // PlzNavigate | 627 // PlzNavigate |
585 void RenderFrameHostManager::OnBeginNavigation( | 628 void RenderFrameHostManager::OnBeginNavigation( |
586 const FrameHostMsg_BeginNavigation_Params& params) { | 629 const FrameHostMsg_BeginNavigation_Params& params) { |
587 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 630 CHECK(CommandLine::ForCurrentProcess()->HasSwitch( |
588 switches::kEnableBrowserSideNavigation)); | 631 switches::kEnableBrowserSideNavigation)); |
632 DCHECK(navigation_params_.get()); | |
633 navigation_params_->referrer = params.referrer; | |
634 navigation_params_->transition = params.transition; | |
589 // TODO(clamy): Check if navigations are blocked and if so, return | 635 // TODO(clamy): Check if navigations are blocked and if so, return |
590 // immediately. | 636 // immediately. |
591 NavigationRequestInfo info(params); | 637 NavigationRequestInfo info(params); |
592 | 638 |
593 info.first_party_for_cookies = frame_tree_node_->IsMainFrame() ? | 639 info.first_party_for_cookies = frame_tree_node_->IsMainFrame() ? |
594 params.url : frame_tree_node_->frame_tree()->root()->current_url(); | 640 params.url : frame_tree_node_->frame_tree()->root()->current_url(); |
595 info.is_main_frame = frame_tree_node_->IsMainFrame(); | 641 info.is_main_frame = frame_tree_node_->IsMainFrame(); |
596 info.parent_is_main_frame = !frame_tree_node_->parent() ? | 642 info.parent_is_main_frame = !frame_tree_node_->parent() ? |
597 false : frame_tree_node_->parent()->IsMainFrame(); | 643 false : frame_tree_node_->parent()->IsMainFrame(); |
644 info.allow_download = navigation_params_->allow_download; | |
598 | 645 |
599 // TODO(clamy): Check if the current RFH should be initialized (in case it has | 646 // TODO(clamy): Check if the current RFH should be initialized (in case it has |
600 // crashed) not to display a sad tab while navigating. | 647 // crashed) not to display a sad tab while navigating. |
601 // TODO(clamy): Spawn a speculative renderer process if we do not have one to | 648 // TODO(clamy): Spawn a speculative renderer process if we do not have one to |
602 // use for the navigation. | 649 // use for the navigation. |
603 | 650 |
604 // If there is an ongoing request it must be canceled. | 651 // If there is an ongoing request it must be canceled. |
605 if (navigation_request_.get()) | 652 if (navigation_request_.get()) |
606 navigation_request_->CancelNavigation(); | 653 navigation_request_->CancelNavigation(); |
607 | 654 |
(...skipping 15 matching lines...) Expand all Loading... | |
623 return; | 670 return; |
624 } | 671 } |
625 | 672 |
626 // Pick the right RenderFrameHost to commit the navigation. | 673 // Pick the right RenderFrameHost to commit the navigation. |
627 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); | 674 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); |
628 // TODO(clamy): Replace the default values by the right ones. This may require | 675 // TODO(clamy): Replace the default values by the right ones. This may require |
629 // some storing in RequestNavigation. | 676 // some storing in RequestNavigation. |
630 SiteInstance* new_instance = GetSiteInstanceForNavigation( | 677 SiteInstance* new_instance = GetSiteInstanceForNavigation( |
631 info.navigation_url, | 678 info.navigation_url, |
632 NULL, | 679 NULL, |
633 navigation_request_->info().navigation_params.transition_type, | 680 navigation_params_->transition, |
634 false, | 681 false, |
635 false); | 682 false); |
636 DCHECK(!pending_render_frame_host_.get()); | 683 DCHECK(!pending_render_frame_host_.get()); |
637 | 684 |
638 // TODO(clamy): Update how pending WebUI objects are handled. | 685 // TODO(clamy): Update how pending WebUI objects are handled. |
639 if (current_instance != new_instance) { | 686 if (current_instance != new_instance) { |
640 CreateRenderFrameHostForNewSiteInstance( | 687 CreateRenderFrameHostForNewSiteInstance( |
641 current_instance, new_instance, frame_tree_node_->IsMainFrame()); | 688 current_instance, new_instance, frame_tree_node_->IsMainFrame()); |
642 DCHECK(pending_render_frame_host_.get()); | 689 DCHECK(pending_render_frame_host_.get()); |
643 // TODO(clamy): Wait until the navigation has committed before swapping | 690 // TODO(clamy): Wait until the navigation has committed before swapping |
(...skipping 11 matching lines...) Expand all Loading... | |
655 int opener_route_id = delegate_->CreateOpenerRenderViewsForRenderManager( | 702 int opener_route_id = delegate_->CreateOpenerRenderViewsForRenderManager( |
656 render_frame_host_->GetSiteInstance()); | 703 render_frame_host_->GetSiteInstance()); |
657 if (!InitRenderView(render_frame_host_->render_view_host(), | 704 if (!InitRenderView(render_frame_host_->render_view_host(), |
658 opener_route_id, | 705 opener_route_id, |
659 MSG_ROUTING_NONE, | 706 MSG_ROUTING_NONE, |
660 frame_tree_node_->IsMainFrame())) { | 707 frame_tree_node_->IsMainFrame())) { |
661 return; | 708 return; |
662 } | 709 } |
663 } | 710 } |
664 | 711 |
712 DCHECK(navigation_params_.get()); | |
713 navigation_params_->url = info.navigation_url; | |
665 frame_tree_node_->navigator()->CommitNavigation( | 714 frame_tree_node_->navigator()->CommitNavigation( |
666 render_frame_host_.get(), info); | 715 render_frame_host_.get(), |
716 MakeCommitNavigationParams(*navigation_params_, info.stream_url)); | |
667 } | 717 } |
668 | 718 |
669 void RenderFrameHostManager::Observe( | 719 void RenderFrameHostManager::Observe( |
670 int type, | 720 int type, |
671 const NotificationSource& source, | 721 const NotificationSource& source, |
672 const NotificationDetails& details) { | 722 const NotificationDetails& details) { |
673 switch (type) { | 723 switch (type) { |
674 case NOTIFICATION_RENDERER_PROCESS_CLOSED: | 724 case NOTIFICATION_RENDERER_PROCESS_CLOSED: |
675 case NOTIFICATION_RENDERER_PROCESS_CLOSING: | 725 case NOTIFICATION_RENDERER_PROCESS_CLOSING: |
676 RendererProcessClosing( | 726 RendererProcessClosing( |
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1717 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1767 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1718 SiteInstance* instance) { | 1768 SiteInstance* instance) { |
1719 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1769 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1720 if (iter != proxy_hosts_.end()) { | 1770 if (iter != proxy_hosts_.end()) { |
1721 delete iter->second; | 1771 delete iter->second; |
1722 proxy_hosts_.erase(iter); | 1772 proxy_hosts_.erase(iter); |
1723 } | 1773 } |
1724 } | 1774 } |
1725 | 1775 |
1726 } // namespace content | 1776 } // namespace content |
OLD | NEW |