summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/frame_host/frame_tree.cc31
-rw-r--r--content/browser/frame_host/frame_tree.h7
-rw-r--r--content/browser/frame_host/frame_tree_node.cc5
-rw-r--r--content/browser/frame_host/frame_tree_node.h13
-rw-r--r--content/browser/frame_host/frame_tree_unittest.cc7
-rw-r--r--content/browser/frame_host/navigation_controller_impl_unittest.cc25
-rw-r--r--content/browser/frame_host/navigator.h9
-rw-r--r--content/browser/frame_host/navigator_delegate.h22
-rw-r--r--content/browser/frame_host/navigator_impl.cc71
-rw-r--r--content/browser/frame_host/navigator_impl.h17
-rw-r--r--content/browser/frame_host/render_frame_host_factory.cc6
-rw-r--r--content/browser/frame_host/render_frame_host_factory.h3
-rw-r--r--content/browser/frame_host/render_frame_host_impl.cc10
-rw-r--r--content/browser/frame_host/render_frame_host_impl.h8
-rw-r--r--content/browser/renderer_host/render_view_host_delegate.h8
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc10
-rw-r--r--content/browser/web_contents/web_contents_impl.cc66
-rw-r--r--content/browser/web_contents/web_contents_impl.h19
-rw-r--r--content/public/test/test_renderer_host.cc6
-rw-r--r--content/public/test/test_renderer_host.h2
-rw-r--r--content/test/test_render_frame_host.cc2
-rw-r--r--content/test/test_render_frame_host.h1
-rw-r--r--content/test/test_render_frame_host_factory.cc4
-rw-r--r--content/test/test_render_frame_host_factory.h1
-rw-r--r--content/test/test_render_view_host.cc10
-rw-r--r--content/test/test_render_view_host.h2
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: