diff options
26 files changed, 250 insertions, 115 deletions
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc index 814ca9e..c3f1d8d 100644 --- a/content/browser/frame_host/frame_tree.cc +++ b/content/browser/frame_host/frame_tree.cc @@ -58,8 +58,7 @@ FrameTree::FrameTree(Navigator* navigator, render_widget_delegate, manager_delegate, FrameTreeNode::kInvalidFrameId, - std::string(), - scoped_ptr<RenderFrameHostImpl>())) { + std::string())) { } FrameTree::~FrameTree() { @@ -105,12 +104,13 @@ void FrameTree::AddFrame(int render_frame_host_id, if (!parent) return; - parent->AddChild(CreateNode(frame_id, frame_name, render_frame_host_id, - parent->navigator(), - parent->render_frame_host()->GetProcess())); + parent->AddChild( + CreateNode(frame_id, frame_name, render_frame_host_id, parent)); } -void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { +void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, + int64 parent_frame_id, + int64 frame_id) { // If switches::kSitePerProcess is not specified, then the FrameTree only // contains a node for the root element. However, even in this case // frame detachments need to be broadcast outwards. @@ -122,7 +122,7 @@ void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { FrameTreeNode* child = FindByFrameID(frame_id); if (!on_frame_removed_.is_null()) { on_frame_removed_.Run( - root_->render_frame_host()->render_view_host(), frame_id); + render_frame_host->render_view_host(), frame_id); } // TODO(ajwong): Should the renderer be killed here? Would there be a race on @@ -167,19 +167,22 @@ scoped_ptr<FrameTreeNode> FrameTree::CreateNode( int64 frame_id, const std::string& frame_name, int render_frame_host_id, - Navigator* navigator, - RenderProcessHost* render_process_host) { + FrameTreeNode* parent_node) { + scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode( + parent_node->navigator(), render_frame_delegate_, render_view_delegate_, + render_widget_delegate_, manager_delegate_, frame_id, frame_name)); + scoped_ptr<RenderFrameHostImpl> render_frame_host( RenderFrameHostFactory::Create( - root_->render_frame_host()->render_view_host(), - root_->render_frame_host()->delegate(), + parent_node->render_frame_host()->render_view_host(), + parent_node->render_frame_host()->delegate(), this, + frame_tree_node.get(), render_frame_host_id, false)); - return make_scoped_ptr(new FrameTreeNode(navigator, - render_frame_delegate_, render_view_delegate_, render_widget_delegate_, - manager_delegate_, frame_id, frame_name, render_frame_host.Pass())); + frame_tree_node->set_render_frame_host(render_frame_host.release(), true); + return frame_tree_node.Pass(); } } // namespace content diff --git a/content/browser/frame_host/frame_tree.h b/content/browser/frame_host/frame_tree.h index 11a41b8..6bd4e54 100644 --- a/content/browser/frame_host/frame_tree.h +++ b/content/browser/frame_host/frame_tree.h @@ -78,7 +78,9 @@ class CONTENT_EXPORT FrameTree { int64 parent_frame_tree_node_id, int64 frame_id, const std::string& frame_name); - void RemoveFrame(int64 parent_frame_id, int64 frame_id); + void RemoveFrame(RenderFrameHostImpl* render_frame_host, + int64 parent_frame_id, + int64 frame_id); void SetFrameUrl(int64 frame_id, const GURL& url); // Resets the FrameTree and changes RenderFrameHost for the main frame. @@ -115,8 +117,7 @@ class CONTENT_EXPORT FrameTree { scoped_ptr<FrameTreeNode> CreateNode(int64 frame_id, const std::string& frame_name, int render_frame_host_id, - Navigator* navigator, - RenderProcessHost* render_process_host); + FrameTreeNode* parent_node); // These delegates are installed into all the RenderViewHosts and // RenderFrameHosts that we create. diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index cf5d906..37b61b4 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc @@ -21,8 +21,7 @@ FrameTreeNode::FrameTreeNode(Navigator* navigator, RenderWidgetHostDelegate* render_widget_delegate, RenderFrameHostManager::Delegate* manager_delegate, int64 frame_id, - const std::string& name, - scoped_ptr<RenderFrameHostImpl> render_frame_host) + const std::string& name) : navigator_(navigator), render_manager_(render_frame_delegate, render_view_delegate, @@ -32,7 +31,7 @@ FrameTreeNode::FrameTreeNode(Navigator* navigator, frame_id_(frame_id), frame_name_(name), owns_render_frame_host_(true), - render_frame_host_(render_frame_host.release()) { + render_frame_host_(NULL) { } FrameTreeNode::~FrameTreeNode() { diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h index 145d036..9c22b12 100644 --- a/content/browser/frame_host/frame_tree_node.h +++ b/content/browser/frame_host/frame_tree_node.h @@ -11,6 +11,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/frame_host/render_frame_host_manager.h" #include "content/common/content_export.h" #include "url/gurl.h" @@ -34,14 +35,22 @@ class CONTENT_EXPORT FrameTreeNode { RenderWidgetHostDelegate* render_widget_delegate, RenderFrameHostManager::Delegate* manager_delegate, int64 frame_id, - const std::string& name, - scoped_ptr<RenderFrameHostImpl> render_frame_host); + const std::string& name); ~FrameTreeNode(); void AddChild(scoped_ptr<FrameTreeNode> child); void RemoveChild(FrameTreeNode* child); + // TODO(nasko): This method should be removed once RenderFrameHosts are + // created by RenderFrameHostManager. + void set_render_frame_host( + RenderFrameHostImpl* render_frame_host, + bool owns_render_frame_host) { + render_frame_host_ = render_frame_host; + owns_render_frame_host_ = owns_render_frame_host; + } + // Transitional API allowing the RenderFrameHost of a FrameTreeNode // representing the main frame to be provided by someone else. After // this is called, the FrameTreeNode no longer owns its RenderFrameHost. diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc index ebdf311..6f1bb33 100644 --- a/content/browser/frame_host/frame_tree_unittest.cc +++ b/content/browser/frame_host/frame_tree_unittest.cc @@ -110,6 +110,7 @@ TEST_F(FrameTreeTest, Shape) { RenderFrameHostFactory::Create(static_cast<RenderViewHostImpl*>(rvh()), NULL, &frame_tree, + frame_tree.root(), process()->GetNextRoutingID(), false); frame_tree.SwapMainFrame(render_frame_host.get()); @@ -151,7 +152,7 @@ TEST_F(FrameTreeTest, Shape) { GetTreeState(&frame_tree)); // Test removing of nodes. - frame_tree.RemoveFrame(555, 655); + frame_tree.RemoveFrame(NULL, 555, 655); ASSERT_EQ("5: [14: [244: [], 245: []], " "15: [255 'no children node': []], " "16: [264: [], 265: [], 266: [], " @@ -159,7 +160,7 @@ TEST_F(FrameTreeTest, Shape) { "[365: [455: [555: []]]], 268: []]]", GetTreeState(&frame_tree)); - frame_tree.RemoveFrame(16, 265); + frame_tree.RemoveFrame(NULL, 16, 265); ASSERT_EQ("5: [14: [244: [], 245: []], " "15: [255 'no children node': []], " "16: [264: [], 266: [], " @@ -167,7 +168,7 @@ TEST_F(FrameTreeTest, Shape) { "[365: [455: [555: []]]], 268: []]]", GetTreeState(&frame_tree)); - frame_tree.RemoveFrame(5, 15); + frame_tree.RemoveFrame(NULL, 5, 15); ASSERT_EQ("5: [14: [244: [], 245: []], " "16: [264: [], 266: [], " "267 'node with deep subtree': " diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index c68e199..2f0cac2 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc @@ -14,6 +14,7 @@ #include "content/browser/frame_host/navigation_controller_impl.h" #include "content/browser/frame_host/navigation_entry_impl.h" #include "content/browser/frame_host/navigation_entry_screenshot_manager.h" +#include "content/browser/frame_host/navigator.h" #include "content/browser/site_instance_impl.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/view_messages.h" @@ -2648,6 +2649,8 @@ TEST_F(NavigationControllerTest, ReloadTransient) { // See http://crbug.com/266922. TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) { NavigationControllerImpl& controller = controller_impl(); + Navigator* navigator = + contents()->GetFrameTree()->root()->navigator(); const GURL url1("nonexistent:12121"); const GURL url1_fixed("http://nonexistent:12121/"); @@ -2655,8 +2658,7 @@ TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) { // We create pending entries for renderer-initiated navigations so that we // can show them in new tabs when it is safe. - contents()->DidStartProvisionalLoadForFrame( - test_rvh(), 1, -1, true, url1); + navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url1); // Simulate what happens if a BrowserURLHandler rewrites the URL, causing // the virtual URL to differ from the URL. @@ -2670,8 +2672,7 @@ TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) { is_renderer_initiated()); // If the user clicks another link, we should replace the pending entry. - contents()->DidStartProvisionalLoadForFrame( - test_rvh(), 1, -1, true, url2); + navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url2); EXPECT_EQ(url2, controller.GetPendingEntry()->GetURL()); EXPECT_EQ(url2, controller.GetPendingEntry()->GetVirtualURL()); @@ -2681,24 +2682,24 @@ TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) { EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetVirtualURL()); // We should not replace the pending entry for an error URL. - contents()->DidStartProvisionalLoadForFrame( - test_rvh(), 1, -1, true, url1); + navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url1); EXPECT_EQ(url1, controller.GetPendingEntry()->GetURL()); - contents()->DidStartProvisionalLoadForFrame( - test_rvh(), 1, -1, true, GURL(kUnreachableWebDataURL)); + navigator->DidStartProvisionalLoad( + main_test_rfh(), 1, -1, true, GURL(kUnreachableWebDataURL)); EXPECT_EQ(url1, controller.GetPendingEntry()->GetURL()); // We should remember if the pending entry will replace the current one. // http://crbug.com/308444. - contents()->DidStartProvisionalLoadForFrame( - test_rvh(), 1, -1, true, url1); + navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url1); NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> set_should_replace_entry(true); - contents()->DidStartProvisionalLoadForFrame( - test_rvh(), 1, -1, true, url2); + navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url2); EXPECT_TRUE( NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> should_replace_entry()); + // TODO(nasko): Until OnNavigate is moved to RenderFrameHost, we need + // to go through the RenderViewHost. The TestRenderViewHost routes navigations + // to the main frame. test_rvh()->SendNavigate(0, url2); EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL()); } diff --git a/content/browser/frame_host/navigator.h b/content/browser/frame_host/navigator.h index c670edc..d6658e4 100644 --- a/content/browser/frame_host/navigator.h +++ b/content/browser/frame_host/navigator.h @@ -8,10 +8,13 @@ #include "base/memory/ref_counted.h" #include "content/common/content_export.h" +class GURL; + namespace content { class NavigationControllerImpl; class NavigatorDelegate; +class RenderFrameHostImpl; // Implementations of this interface are responsible for performing navigations // in a node of the FrameTree. Its lifetime is bound to all FrameTreeNode @@ -22,6 +25,12 @@ class NavigatorDelegate; // from WebContentsImpl to this interface. class CONTENT_EXPORT Navigator : public base::RefCounted<Navigator> { public: + // The RenderFrameHostImpl started a provisional load. + virtual void DidStartProvisionalLoad(RenderFrameHostImpl* render_frame_host, + int64 frame_id, + int64 parent_frame_id, + bool main_frame, + const GURL& url) {}; protected: friend class base::RefCounted<Navigator>; diff --git a/content/browser/frame_host/navigator_delegate.h b/content/browser/frame_host/navigator_delegate.h index c906b6b..62b5b48 100644 --- a/content/browser/frame_host/navigator_delegate.h +++ b/content/browser/frame_host/navigator_delegate.h @@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_DELEGATE_H_ #define CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_DELEGATE_H_ +#include "content/public/browser/invalidate_type.h" + namespace content { class RenderFrameHost; @@ -12,10 +14,22 @@ class RenderFrameHost; // A delegate API used by Navigator to notify its embedder of navigation // related events. class NavigatorDelegate { - // TODO(nasko): This class will be used to dispatch notifications to - // WebContentsImpl, such as DidStartProvisionalLoad and - // NotifyNavigationStateChanged. Longer term, most of the - // NavigationControllerDelegate methods will likely move here. + public: + // The RenderFrameHost started a provisional load for the frame + // represented by |render_frame_host|. + virtual void DidStartProvisionalLoad( + RenderFrameHostImpl* render_frame_host, + int64 frame_id, + int64 parent_frame_id, + bool is_main_frame, + const GURL& validated_url, + bool is_error_page, + bool is_iframe_srcdoc) {} + + // Notification to the Navigator embedder that navigation state has + // changed. This method corresponds to + // WebContents::NotifyNavigationStateChanged. + virtual void NotifyChangedNavigationState(InvalidateTypes changed_flags) {} }; } // namspace content diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc index 49d50a0..6cc9dad 100644 --- a/content/browser/frame_host/navigator_impl.cc +++ b/content/browser/frame_host/navigator_impl.cc @@ -4,13 +4,82 @@ #include "content/browser/frame_host/navigator_impl.h" +#include "content/browser/frame_host/frame_tree_node.h" +#include "content/browser/frame_host/navigation_controller_impl.h" +#include "content/browser/frame_host/navigation_entry_impl.h" #include "content/browser/frame_host/navigator_delegate.h" +#include "content/browser/frame_host/render_frame_host_impl.h" +#include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/site_instance_impl.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/invalidate_type.h" +#include "content/public/browser/navigation_controller.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/common/url_constants.h" namespace content { NavigatorImpl::NavigatorImpl( NavigationControllerImpl* navigation_controller, - NavigatorDelegate* delegate) { + NavigatorDelegate* delegate) + : controller_(navigation_controller), + delegate_(delegate) { +} + +void NavigatorImpl::DidStartProvisionalLoad( + RenderFrameHostImpl* render_frame_host, + int64 frame_id, + int64 parent_frame_id, + bool is_main_frame, + const GURL& url) { + bool is_error_page = (url.spec() == kUnreachableWebDataURL); + bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); + GURL validated_url(url); + RenderProcessHost* render_process_host = render_frame_host->GetProcess(); + RenderViewHost::FilterURL(render_process_host, false, &validated_url); + + if (is_main_frame) { + // If there is no browser-initiated pending entry for this navigation and it + // is not for the error URL, create a pending entry using the current + // SiteInstance, and ensure the address bar updates accordingly. We don't + // know the referrer or extra headers at this point, but the referrer will + // be set properly upon commit. + NavigationEntryImpl* pending_entry = + NavigationEntryImpl::FromNavigationEntry( + controller_->GetPendingEntry()); + bool has_browser_initiated_pending_entry = pending_entry && + !pending_entry->is_renderer_initiated(); + if (!has_browser_initiated_pending_entry && !is_error_page) { + NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( + controller_->CreateNavigationEntry(validated_url, + content::Referrer(), + content::PAGE_TRANSITION_LINK, + true /* is_renderer_initiated */, + std::string(), + controller_->GetBrowserContext())); + entry->set_site_instance( + static_cast<SiteInstanceImpl*>( + render_frame_host->render_view_host()->GetSiteInstance())); + // TODO(creis): If there's a pending entry already, find a safe way to + // update it instead of replacing it and copying over things like this. + if (pending_entry) { + entry->set_transferred_global_request_id( + pending_entry->transferred_global_request_id()); + entry->set_should_replace_entry(pending_entry->should_replace_entry()); + entry->set_redirect_chain(pending_entry->redirect_chain()); + } + controller_->SetPendingEntry(entry); + if (delegate_) + delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); + } + } + + if (delegate_) { + // Notify the observer about the start of the provisional load. + delegate_->DidStartProvisionalLoad( + render_frame_host, frame_id, parent_frame_id, is_main_frame, + validated_url, is_error_page, is_iframe_srcdoc); + } } } // namespace content diff --git a/content/browser/frame_host/navigator_impl.h b/content/browser/frame_host/navigator_impl.h index 2bfc842e..b66b87d 100644 --- a/content/browser/frame_host/navigator_impl.h +++ b/content/browser/frame_host/navigator_impl.h @@ -21,9 +21,26 @@ class CONTENT_EXPORT NavigatorImpl : public Navigator { NavigatorImpl(NavigationControllerImpl* navigation_controller, NavigatorDelegate* delegate); + // Navigator implementation. + virtual void DidStartProvisionalLoad(RenderFrameHostImpl* render_frame_host, + int64 frame_id, + int64 parent_frame_id, + bool main_frame, + const GURL& url) OVERRIDE; + private: virtual ~NavigatorImpl() {} + // The NavigationController that will keep track of session history for all + // RenderFrameHost objects using this NavigatorImpl. + // TODO(nasko): Move ownership of the NavigationController from + // WebContentsImpl to this class. + NavigationControllerImpl* controller_; + + // Used to notify the object embedding this Navigator about navigation + // events. Can be NULL in tests. + NavigatorDelegate* delegate_; + DISALLOW_COPY_AND_ASSIGN(NavigatorImpl); }; diff --git a/content/browser/frame_host/render_frame_host_factory.cc b/content/browser/frame_host/render_frame_host_factory.cc index 1a1daa2..4262c1c 100644 --- a/content/browser/frame_host/render_frame_host_factory.cc +++ b/content/browser/frame_host/render_frame_host_factory.cc @@ -5,6 +5,7 @@ #include "content/browser/frame_host/render_frame_host_factory.h" #include "base/logging.h" +#include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/render_frame_host_impl.h" namespace content { @@ -17,17 +18,20 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostFactory::Create( RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out) { if (factory_) { return factory_->CreateRenderFrameHost(render_view_host, delegate, frame_tree, + frame_tree_node, routing_id, is_swapped_out).Pass(); } return make_scoped_ptr(new RenderFrameHostImpl( - render_view_host, delegate, frame_tree, routing_id, is_swapped_out)); + render_view_host, delegate, frame_tree, frame_tree_node, routing_id, + is_swapped_out)); } // static diff --git a/content/browser/frame_host/render_frame_host_factory.h b/content/browser/frame_host/render_frame_host_factory.h index 2332922..ce8433d 100644 --- a/content/browser/frame_host/render_frame_host_factory.h +++ b/content/browser/frame_host/render_frame_host_factory.h @@ -12,6 +12,7 @@ namespace content { class FrameTree; +class FrameTreeNode; class RenderFrameHostDelegate; class RenderFrameHostImpl; class RenderViewHostImpl; @@ -27,6 +28,7 @@ class CONTENT_EXPORT RenderFrameHostFactory { RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out); @@ -43,6 +45,7 @@ class CONTENT_EXPORT RenderFrameHostFactory { RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out) = 0; diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index e41fc01..de2bb7c 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc @@ -7,6 +7,8 @@ #include "base/containers/hash_tables.h" #include "base/lazy_instance.h" #include "content/browser/frame_host/frame_tree.h" +#include "content/browser/frame_host/frame_tree_node.h" +#include "content/browser/frame_host/navigator.h" #include "content/browser/frame_host/render_frame_host_delegate.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/common/frame_messages.h" @@ -37,11 +39,13 @@ RenderFrameHostImpl::RenderFrameHostImpl( RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out) : render_view_host_(render_view_host), delegate_(delegate), frame_tree_(frame_tree), + frame_tree_node_(frame_tree_node), routing_id_(routing_id), is_swapped_out_(is_swapped_out) { GetProcess()->AddRoute(routing_id_, this); @@ -106,7 +110,7 @@ void RenderFrameHostImpl::OnCreateChildFrame(int new_frame_routing_id, } void RenderFrameHostImpl::OnDetach(int64 parent_frame_id, int64 frame_id) { - frame_tree_->RemoveFrame(parent_frame_id, frame_id); + frame_tree_->RemoveFrame(this, parent_frame_id, frame_id); } void RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame( @@ -114,8 +118,8 @@ void RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame( int64 parent_frame_id, bool is_main_frame, const GURL& url) { - render_view_host_->OnDidStartProvisionalLoadForFrame( - frame_id, parent_frame_id, is_main_frame, url); + frame_tree_node_->navigator()->DidStartProvisionalLoad( + this, frame_id, parent_frame_id, is_main_frame, url); } } // namespace content diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 127d96a..2822724 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h @@ -20,6 +20,7 @@ class FilePath; namespace content { class FrameTree; +class FrameTreeNode; class RenderFrameHostDelegate; class RenderProcessHost; class RenderViewHostImpl; @@ -59,10 +60,13 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { RenderFrameHostImpl(RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out); private: + friend class TestRenderViewHost; + // IPC Message handlers. void OnDetach(int64 parent_frame_id, int64 frame_id); void OnDidStartProvisionalLoadForFrame(int64 frame_id, @@ -81,6 +85,10 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { // Allows this RenderFrameHost to add and remove nodes in response to // messages from the renderer requesting DOM manipulation. FrameTree* frame_tree_; + + // The FrameTreeNode which this RenderFrameHostImpl is hosted in. + FrameTreeNode* frame_tree_node_; + int routing_id_; bool is_swapped_out_; diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index 6f5cb81..a258c36 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -151,14 +151,6 @@ class CONTENT_EXPORT RenderViewHostDelegate { // RenderView is going to be destroyed virtual void RenderViewDeleted(RenderViewHost* render_view_host) {} - // The RenderView started a provisional load for a given frame. - virtual void DidStartProvisionalLoadForFrame( - RenderViewHost* render_view_host, - int64 frame_id, - int64 parent_frame_id, - bool main_frame, - const GURL& url) {} - // The RenderView processed a redirect during a provisional load. // // TODO(creis): Remove this method and have the pre-rendering code listen to diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 346f98f..491944e 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -194,8 +194,11 @@ RenderViewHostImpl::RenderViewHostImpl( main_frame_routing_id = GetProcess()->GetNextRoutingID(); main_render_frame_host_ = RenderFrameHostFactory::Create( - this, frame_delegate, delegate_->GetFrameTree(), main_frame_routing_id, - is_swapped_out_); + this, frame_delegate, delegate_->GetFrameTree(), + delegate_->GetFrameTree()->root(), + main_frame_routing_id, is_swapped_out_); + delegate_->GetFrameTree()->root()->set_render_frame_host( + main_render_frame_host_.get(), false); GetProcess()->EnableSendQueue(); @@ -1416,8 +1419,7 @@ void RenderViewHostImpl::OnDidStartProvisionalLoadForFrame( int64 parent_frame_id, bool is_main_frame, const GURL& url) { - delegate_->DidStartProvisionalLoadForFrame( - this, frame_id, parent_frame_id, is_main_frame, url); + NOTREACHED(); } void RenderViewHostImpl::OnDidRedirectProvisionalLoad( diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 3c5437c..d3e808e 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -31,6 +31,7 @@ #include "content/browser/frame_host/interstitial_page_impl.h" #include "content/browser/frame_host/navigation_entry_impl.h" #include "content/browser/frame_host/navigator_impl.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/host_zoom_map_impl.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/message_port_message_filter.h" @@ -2035,68 +2036,37 @@ void WebContentsImpl::SetFocusToLocationBar(bool select_all) { delegate_->SetFocusToLocationBar(select_all); } -void WebContentsImpl::DidStartProvisionalLoadForFrame( - RenderViewHost* render_view_host, +void WebContentsImpl::DidStartProvisionalLoad( + RenderFrameHostImpl* render_frame_host, int64 frame_id, int64 parent_frame_id, bool is_main_frame, - const GURL& url) { - bool is_error_page = (url.spec() == kUnreachableWebDataURL); - bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); - GURL validated_url(url); - RenderProcessHost* render_process_host = - render_view_host->GetProcess(); - RenderViewHost::FilterURL(render_process_host, false, &validated_url); - - if (is_main_frame) { + const GURL& validated_url, + bool is_error_page, + bool is_iframe_srcdoc) { + if (is_main_frame) DidChangeLoadProgress(0); - // If there is no browser-initiated pending entry for this navigation and it - // is not for the error URL, create a pending entry using the current - // SiteInstance, and ensure the address bar updates accordingly. We don't - // know the referrer or extra headers at this point, but the referrer will - // be set properly upon commit. - NavigationEntryImpl* pending_entry = - NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()); - bool has_browser_initiated_pending_entry = pending_entry && - !pending_entry->is_renderer_initiated(); - if (!has_browser_initiated_pending_entry && !is_error_page) { - NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( - controller_.CreateNavigationEntry(validated_url, - content::Referrer(), - content::PAGE_TRANSITION_LINK, - true /* is_renderer_initiated */, - std::string(), - GetBrowserContext())); - entry->set_site_instance( - static_cast<SiteInstanceImpl*>(GetSiteInstance())); - // TODO(creis): If there's a pending entry already, find a safe way to - // update it instead of replacing it and copying over things like this. - if (pending_entry) { - entry->set_transferred_global_request_id( - pending_entry->transferred_global_request_id()); - entry->set_should_replace_entry(pending_entry->should_replace_entry()); - entry->set_redirect_chain(pending_entry->redirect_chain()); - } - controller_.SetPendingEntry(entry); - NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); - } - } - // Notify observers about the start of the provisional load. FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidStartProvisionalLoadForFrame(frame_id, parent_frame_id, is_main_frame, validated_url, is_error_page, - is_iframe_srcdoc, render_view_host)); + is_iframe_srcdoc, render_frame_host->render_view_host())); if (is_main_frame) { - // Notify observers about the provisional change in the main frame URL. - FOR_EACH_OBSERVER(WebContentsObserver, observers_, - ProvisionalChangeToMainFrameUrl(validated_url, - render_view_host)); + FOR_EACH_OBSERVER( + WebContentsObserver, + observers_, + ProvisionalChangeToMainFrameUrl(validated_url, + render_frame_host->render_view_host())); } } +void WebContentsImpl::NotifyChangedNavigationState( + InvalidateTypes changed_flags) { + NotifyNavigationStateChanged(changed_flags); +} + void WebContentsImpl::DidRedirectProvisionalLoad( RenderViewHost* render_view_host, int32 page_id, diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 79bfc23..04719d7 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -300,12 +300,6 @@ class CONTENT_EXPORT WebContentsImpl base::TerminationStatus status, int error_code) OVERRIDE; virtual void RenderViewDeleted(RenderViewHost* render_view_host) OVERRIDE; - virtual void DidStartProvisionalLoadForFrame( - RenderViewHost* render_view_host, - int64 frame_id, - int64 parent_frame_id, - bool main_frame, - const GURL& url) OVERRIDE; virtual void DidRedirectProvisionalLoad( RenderViewHost* render_view_host, int32 page_id, @@ -440,6 +434,19 @@ class CONTENT_EXPORT WebContentsImpl SiteInstance* instance) OVERRIDE; virtual FrameTree* GetFrameTree() OVERRIDE; + // NavigatorDelegate --------------------------------------------------------- + + virtual void DidStartProvisionalLoad( + RenderFrameHostImpl* render_frame_host, + int64 frame_id, + int64 parent_frame_id, + bool is_main_frame, + const GURL& validated_url, + bool is_error_page, + bool is_iframe_srcdoc) OVERRIDE; + virtual void NotifyChangedNavigationState( + InvalidateTypes changed_flags) OVERRIDE; + // RenderWidgetHostDelegate -------------------------------------------------- virtual void RenderWidgetDeleted( diff --git a/content/public/test/test_renderer_host.cc b/content/public/test/test_renderer_host.cc index a876c4f..1f9290c 100644 --- a/content/public/test/test_renderer_host.cc +++ b/content/public/test/test_renderer_host.cc @@ -101,6 +101,12 @@ RenderViewHost* RenderViewHostTestHarness::active_rvh() { return pending_rvh() ? pending_rvh() : rvh(); } +RenderFrameHost* RenderViewHostTestHarness::main_rfh() { + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + this->web_contents()); + return web_contents->GetFrameTree()->GetMainFrame(); +} + BrowserContext* RenderViewHostTestHarness::browser_context() { return browser_context_.get(); } diff --git a/content/public/test/test_renderer_host.h b/content/public/test/test_renderer_host.h index 5eb5777..bd741a7 100644 --- a/content/public/test/test_renderer_host.h +++ b/content/public/test/test_renderer_host.h @@ -7,6 +7,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/common/page_transition_types.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -131,6 +132,7 @@ class RenderViewHostTestHarness : public testing::Test { RenderViewHost* rvh(); RenderViewHost* pending_rvh(); RenderViewHost* active_rvh(); + RenderFrameHost* main_rfh(); BrowserContext* browser_context(); MockRenderProcessHost* process(); diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc index 263eb45..57f8c0f 100644 --- a/content/test/test_render_frame_host.cc +++ b/content/test/test_render_frame_host.cc @@ -9,11 +9,13 @@ namespace content { TestRenderFrameHost::TestRenderFrameHost(RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out) : RenderFrameHostImpl(render_view_host, delegate, frame_tree, + frame_tree_node, routing_id, is_swapped_out) {} diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h index 9f74e39..7668b25 100644 --- a/content/test/test_render_frame_host.h +++ b/content/test/test_render_frame_host.h @@ -15,6 +15,7 @@ class TestRenderFrameHost : public RenderFrameHostImpl { TestRenderFrameHost(RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out); virtual ~TestRenderFrameHost(); diff --git a/content/test/test_render_frame_host_factory.cc b/content/test/test_render_frame_host_factory.cc index 8bf5b88..d2e740e 100644 --- a/content/test/test_render_frame_host_factory.cc +++ b/content/test/test_render_frame_host_factory.cc @@ -24,11 +24,13 @@ TestRenderFrameHostFactory::CreateRenderFrameHost( RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out) { return make_scoped_ptr( new TestRenderFrameHost( - render_view_host, delegate, frame_tree, routing_id, is_swapped_out)) + render_view_host, delegate, frame_tree, frame_tree_node, routing_id, + is_swapped_out)) .PassAs<RenderFrameHostImpl>(); } diff --git a/content/test/test_render_frame_host_factory.h b/content/test/test_render_frame_host_factory.h index 91287bf..6b3e71c 100644 --- a/content/test/test_render_frame_host_factory.h +++ b/content/test/test_render_frame_host_factory.h @@ -28,6 +28,7 @@ class TestRenderFrameHostFactory : public RenderFrameHostFactory { RenderViewHostImpl* render_view_host, RenderFrameHostDelegate* delegate, FrameTree* frame_tree, + FrameTreeNode* frame_tree_node, int routing_id, bool is_swapped_out) OVERRIDE; diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc index 772adda..fe8a8d9 100644 --- a/content/test/test_render_view_host.cc +++ b/content/test/test_render_view_host.cc @@ -300,7 +300,8 @@ void TestRenderViewHost::SendNavigateWithTransition( void TestRenderViewHost::SendNavigateWithOriginalRequestURL( int page_id, const GURL& url, const GURL& original_request_url) { - OnDidStartProvisionalLoadForFrame(kFrameId, -1, true, url); + main_render_frame_host()->OnDidStartProvisionalLoadForFrame( + kFrameId, -1, true, url); SendNavigateWithParameters(page_id, url, PAGE_TRANSITION_LINK, original_request_url, 200, 0); } @@ -317,7 +318,8 @@ void TestRenderViewHost::SendNavigateWithTransitionAndResponseCode( // DidStartProvisionalLoad may delete the pending entry that holds |url|, // so we keep a copy of it to use in SendNavigateWithParameters. GURL url_copy(url); - OnDidStartProvisionalLoadForFrame(kFrameId, -1, true, url_copy); + main_render_frame_host()->OnDidStartProvisionalLoadForFrame( + kFrameId, -1, true, url_copy); SendNavigateWithParameters(page_id, url_copy, transition, url_copy, response_code, 0); } @@ -427,6 +429,10 @@ TestRenderViewHost* RenderViewHostImplTestHarness::active_test_rvh() { return static_cast<TestRenderViewHost*>(active_rvh()); } +TestRenderFrameHost* RenderViewHostImplTestHarness::main_test_rfh() { + return static_cast<TestRenderFrameHost*>(main_rfh()); +} + TestWebContents* RenderViewHostImplTestHarness::contents() { return static_cast<TestWebContents*>(web_contents()); } diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h index fd44b5c..bda0fde 100644 --- a/content/test/test_render_view_host.h +++ b/content/test/test_render_view_host.h @@ -15,6 +15,7 @@ #include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/public/common/page_transition_types.h" #include "content/public/test/test_renderer_host.h" +#include "content/test/test_render_frame_host.h" #include "ui/base/layout.h" #include "ui/gfx/vector2d_f.h" @@ -372,6 +373,7 @@ class RenderViewHostImplTestHarness : public RenderViewHostTestHarness { TestRenderViewHost* test_rvh(); TestRenderViewHost* pending_test_rvh(); TestRenderViewHost* active_test_rvh(); + TestRenderFrameHost* main_test_rfh(); TestWebContents* contents(); private: |