summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-09 01:35:44 +0000
committernasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-09 01:35:44 +0000
commit190b8c5d848077c5a3402eb04f835e5fb1a44ecc (patch)
treea5dc598bbaedcb793530ef28f35f35bbea7a9c97
parent9d64cb3cb87eee2483eab03fe45a01fe04139f38 (diff)
downloadchromium_src-190b8c5d848077c5a3402eb04f835e5fb1a44ecc.zip
chromium_src-190b8c5d848077c5a3402eb04f835e5fb1a44ecc.tar.gz
chromium_src-190b8c5d848077c5a3402eb04f835e5fb1a44ecc.tar.bz2
Add Navigator and NavigatorDelegate objects.
BUG=304341 Review URL: https://codereview.chromium.org/65363002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@234067 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/frame_host/frame_tree.cc11
-rw-r--r--content/browser/frame_host/frame_tree.h6
-rw-r--r--content/browser/frame_host/frame_tree_node.cc10
-rw-r--r--content/browser/frame_host/frame_tree_node.h19
-rw-r--r--content/browser/frame_host/frame_tree_unittest.cc8
-rw-r--r--content/browser/frame_host/interstitial_page_impl.cc6
-rw-r--r--content/browser/frame_host/interstitial_page_impl.h5
-rw-r--r--content/browser/frame_host/navigator.cc18
-rw-r--r--content/browser/frame_host/navigator.h53
-rw-r--r--content/browser/frame_host/navigator_delegate.h23
-rw-r--r--content/browser/web_contents/web_contents_impl.cc2
-rw-r--r--content/browser/web_contents/web_contents_impl.h5
-rw-r--r--content/content_browser.gypi3
13 files changed, 153 insertions, 16 deletions
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc
index 440b095..34d117b 100644
--- a/content/browser/frame_host/frame_tree.cc
+++ b/content/browser/frame_host/frame_tree.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/callback.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_impl.h"
namespace content {
@@ -41,9 +42,9 @@ bool FrameTreeNodeForFrameId(int64 frame_id,
} // namespace
-FrameTree::FrameTree()
+FrameTree::FrameTree(Navigator* navigator)
: root_(new FrameTreeNode(FrameTreeNode::kInvalidFrameId, std::string(),
- scoped_ptr<RenderFrameHostImpl>())) {
+ navigator, scoped_ptr<RenderFrameHostImpl>())) {
}
FrameTree::~FrameTree() {
@@ -90,6 +91,7 @@ void FrameTree::AddFrame(int render_frame_host_id,
return;
parent->AddChild(CreateNode(frame_id, frame_name, render_frame_host_id,
+ parent->navigator(),
parent->render_frame_host()->GetProcess()));
}
@@ -150,13 +152,14 @@ scoped_ptr<FrameTreeNode> FrameTree::CreateNode(
int64 frame_id,
const std::string& frame_name,
int render_frame_host_id,
+ Navigator* navigator,
RenderProcessHost* render_process_host) {
scoped_ptr<RenderFrameHostImpl> render_frame_host(
new RenderFrameHostImpl(root_->render_frame_host()->render_view_host(),
this, render_frame_host_id, false));
- return make_scoped_ptr(new FrameTreeNode(frame_id, frame_name,
- render_frame_host.Pass()));
+ return make_scoped_ptr(new FrameTreeNode(
+ frame_id, frame_name, navigator, render_frame_host.Pass()));
}
} // namespace content
diff --git a/content/browser/frame_host/frame_tree.h b/content/browser/frame_host/frame_tree.h
index 6824e7e..91a0c29 100644
--- a/content/browser/frame_host/frame_tree.h
+++ b/content/browser/frame_host/frame_tree.h
@@ -15,6 +15,7 @@
namespace content {
class FrameTreeNode;
+class Navigator;
class RenderProcessHost;
class RenderViewHostImpl;
@@ -35,7 +36,9 @@ class RenderViewHostImpl;
// This object is only used on the UI thread.
class CONTENT_EXPORT FrameTree {
public:
- FrameTree();
+ // Each FrameTreeNode will default to using the given |navigator| for
+ // navigation tasks in the frame.
+ FrameTree(Navigator* navigator);
~FrameTree();
// Returns the FrameTreeNode with the given |frame_tree_node_id|.
@@ -100,6 +103,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);
scoped_ptr<FrameTreeNode> root_;
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index fc45dc1..fd9a3bf 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -7,6 +7,7 @@
#include <queue>
#include "base/stl_util.h"
+#include "content/browser/frame_host/navigator.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
namespace content {
@@ -14,12 +15,15 @@ namespace content {
const int64 FrameTreeNode::kInvalidFrameId = -1;
int64 FrameTreeNode::next_frame_tree_node_id_ = 1;
-FrameTreeNode::FrameTreeNode(int64 frame_id,
- const std::string& name,
- scoped_ptr<RenderFrameHostImpl> render_frame_host)
+FrameTreeNode::FrameTreeNode(
+ int64 frame_id,
+ const std::string& name,
+ Navigator* navigator,
+ scoped_ptr<RenderFrameHostImpl> render_frame_host)
: frame_tree_node_id_(next_frame_tree_node_id_++),
frame_id_(frame_id),
frame_name_(name),
+ navigator_(navigator),
owns_render_frame_host_(true),
render_frame_host_(render_frame_host.release()) {
}
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h
index 36faa1a..8bacc77 100644
--- a/content/browser/frame_host/frame_tree_node.h
+++ b/content/browser/frame_host/frame_tree_node.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "content/common/content_export.h"
@@ -15,6 +16,7 @@
namespace content {
+class Navigator;
class RenderFrameHostImpl;
// When a page contains iframes, its renderer process maintains a tree structure
@@ -25,9 +27,12 @@ class CONTENT_EXPORT FrameTreeNode {
public:
static const int64 kInvalidFrameId;
- FrameTreeNode(int64 frame_id,
- const std::string& name,
- scoped_ptr<RenderFrameHostImpl> render_frame_host);
+ FrameTreeNode(
+ int64 frame_id,
+ const std::string& name,
+ Navigator* navigator,
+ scoped_ptr<RenderFrameHostImpl> render_frame_host);
+
~FrameTreeNode();
void AddChild(scoped_ptr<FrameTreeNode> child);
@@ -81,6 +86,10 @@ class CONTENT_EXPORT FrameTreeNode {
return render_frame_host_;
}
+ Navigator* navigator() {
+ return navigator_.get();
+ }
+
private:
// The next available browser-global FrameTreeNode ID.
static int64 next_frame_tree_node_id_;
@@ -102,6 +111,10 @@ class CONTENT_EXPORT FrameTreeNode {
// The immediate children of this specific frame.
ScopedVector<FrameTreeNode> children_;
+ // The Navigator object responsible for managing navigations at this node
+ // of the frame tree.
+ scoped_refptr<Navigator> navigator_;
+
// When ResetForMainFrame() is called, this is set to false and the
// |render_frame_host_| below is not deleted on destruction.
//
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc
index 20295dc..28f1b88 100644
--- a/content/browser/frame_host/frame_tree_unittest.cc
+++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -6,6 +6,7 @@
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
+#include "content/browser/frame_host/navigator.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/public/test/mock_render_process_host.h"
@@ -51,7 +52,7 @@ class FrameTreeTest : public RenderViewHostTestHarness {
// - Swapping back to NULL doesn't crash (easier tear-down for interstitials).
// - Main frame does not own RenderFrameHost.
TEST_F(FrameTreeTest, RootNode) {
- FrameTree frame_tree;
+ FrameTree frame_tree(new Navigator(NULL, NULL));
// Initial state has empty node.
FrameTreeNode* root = frame_tree.GetRootForTesting();
@@ -78,7 +79,7 @@ TEST_F(FrameTreeTest, RootNode) {
// - On creation, frame id is unassigned.
// - After a swap, frame id is unassigned.
TEST_F(FrameTreeTest, FirstNavigationAfterSwap) {
- FrameTree frame_tree;
+ FrameTree frame_tree(new Navigator(NULL, NULL));
EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap());
EXPECT_EQ(FrameTreeNode::kInvalidFrameId,
@@ -97,7 +98,8 @@ TEST_F(FrameTreeTest, FirstNavigationAfterSwap) {
// - Add a series of nodes and verify tree structure.
// - Remove a series of nodes and verify tree structure.
TEST_F(FrameTreeTest, Shape) {
- FrameTree frame_tree;
+ FrameTree frame_tree(new Navigator(NULL, NULL));
+
std::string no_children_node("no children node");
std::string deep_subtree("node with deep subtree");
diff --git a/content/browser/frame_host/interstitial_page_impl.cc b/content/browser/frame_host/interstitial_page_impl.cc
index 2516621..6899149 100644
--- a/content/browser/frame_host/interstitial_page_impl.cc
+++ b/content/browser/frame_host/interstitial_page_impl.cc
@@ -16,6 +16,7 @@
#include "content/browser/dom_storage/session_storage_namespace_impl.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.h"
#include "content/browser/loader/resource_dispatcher_host_impl.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/renderer_host/render_view_host_factory.h"
@@ -154,6 +155,11 @@ InterstitialPageImpl::InterstitialPageImpl(
enabled_(true),
action_taken_(NO_ACTION),
render_view_host_(NULL),
+ // TODO(nasko): The InterstitialPageImpl will need to provide its own
+ // NavigationControllerImpl to the Navigator, which is separate from
+ // the WebContents one, so we can enforce no navigation policy here.
+ // While we get the code to a point to do this, pass NULL for it.
+ frame_tree_(new Navigator(NULL, this)),
original_child_id_(web_contents->GetRenderProcessHost()->GetID()),
original_rvh_id_(web_contents->GetRenderViewHost()->GetRoutingID()),
should_revert_web_contents_title_(false),
diff --git a/content/browser/frame_host/interstitial_page_impl.h b/content/browser/frame_host/interstitial_page_impl.h
index 347a014..47a127e 100644
--- a/content/browser/frame_host/interstitial_page_impl.h
+++ b/content/browser/frame_host/interstitial_page_impl.h
@@ -9,6 +9,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/frame_host/frame_tree.h"
+#include "content/browser/frame_host/navigator_delegate.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/public/browser/interstitial_page.h"
@@ -21,6 +22,7 @@
namespace content {
class NavigationEntry;
class NavigationControllerImpl;
+class Navigator;
class RenderViewHostImpl;
class RenderWidgetHostView;
class WebContentsView;
@@ -37,7 +39,8 @@ class CONTENT_EXPORT InterstitialPageImpl
public NotificationObserver,
public WebContentsObserver,
public RenderViewHostDelegate,
- public RenderWidgetHostDelegate {
+ public RenderWidgetHostDelegate,
+ public NON_EXPORTED_BASE(NavigatorDelegate) {
public:
// The different state of actions the user can take in an interstitial.
enum ActionState {
diff --git a/content/browser/frame_host/navigator.cc b/content/browser/frame_host/navigator.cc
new file mode 100644
index 0000000..4ca26b6
--- /dev/null
+++ b/content/browser/frame_host/navigator.cc
@@ -0,0 +1,18 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/frame_host/navigator.h"
+
+#include "content/browser/frame_host/navigator_delegate.h"
+
+namespace content {
+
+Navigator::Navigator(
+ NavigationControllerImpl* nav_controller,
+ NavigatorDelegate* delegate)
+ : controller_(nav_controller),
+ delegate_(delegate) {
+}
+
+} // namespace content
diff --git a/content/browser/frame_host/navigator.h b/content/browser/frame_host/navigator.h
new file mode 100644
index 0000000..c20c9dd
--- /dev/null
+++ b/content/browser/frame_host/navigator.h
@@ -0,0 +1,53 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_H_
+#define CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_H_
+
+#include "base/memory/ref_counted.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+class NavigationControllerImpl;
+class NavigatorDelegate;
+
+// This class is responsible for performing navigations in a node of the
+// FrameTree. Its lifetime is bound to all FrameTreeNode objects that are
+// using it and will be released once all nodes that use it are freed.
+// The Navigator is bound to a single frame tree and cannot be used by multiple
+// instances of FrameTree.
+// TODO(nasko): Move all navigation methods, such as didStartProvisionalLoad
+// from WebContentsImpl to this class.
+class CONTENT_EXPORT Navigator : public base::RefCounted<Navigator> {
+ public:
+ Navigator(NavigationControllerImpl* nav_controller,
+ NavigatorDelegate* delegate);
+
+ NavigationControllerImpl* controller() {
+ return controller_;
+ }
+
+ NavigatorDelegate* delegate() {
+ return delegate_;
+ }
+
+ private:
+ friend class base::RefCounted<Navigator>;
+ virtual ~Navigator() {}
+
+ // The NavigationController that will keep track of session history for all
+ // RenderFrameHost objects using this Navigator.
+ // 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_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_H_
diff --git a/content/browser/frame_host/navigator_delegate.h b/content/browser/frame_host/navigator_delegate.h
new file mode 100644
index 0000000..c906b6b
--- /dev/null
+++ b/content/browser/frame_host/navigator_delegate.h
@@ -0,0 +1,23 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_DELEGATE_H_
+#define CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_DELEGATE_H_
+
+namespace content {
+
+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.
+};
+
+} // namspace content
+
+#endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_DELEGATE_H_
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 3ca6c66..99d7e60 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -29,6 +29,7 @@
#include "content/browser/download/save_package.h"
#include "content/browser/frame_host/interstitial_page_impl.h"
#include "content/browser/frame_host/navigation_entry_impl.h"
+#include "content/browser/frame_host/navigator.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"
@@ -342,6 +343,7 @@ WebContentsImpl::WebContentsImpl(
accessible_parent_(NULL),
#endif
render_manager_(this, this, this),
+ frame_tree_(new Navigator(&controller_, this)),
is_loading_(false),
crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING),
crashed_error_code_(0),
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index d0ac6b3..a4530af 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -18,6 +18,7 @@
#include "content/browser/frame_host/frame_tree.h"
#include "content/browser/frame_host/navigation_controller_delegate.h"
#include "content/browser/frame_host/navigation_controller_impl.h"
+#include "content/browser/frame_host/navigator_delegate.h"
#include "content/browser/frame_host/render_view_host_manager.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
@@ -48,6 +49,7 @@ class DownloadItem;
class InterstitialPageImpl;
class JavaBridgeDispatcherHostManager;
class JavaScriptDialogManager;
+class Navigator;
class PowerSaveBlocker;
class RenderViewHost;
class RenderViewHostDelegateView;
@@ -79,7 +81,8 @@ class CONTENT_EXPORT WebContentsImpl
public RenderWidgetHostDelegate,
public RenderViewHostManager::Delegate,
public NotificationObserver,
- public NON_EXPORTED_BASE(NavigationControllerDelegate) {
+ public NON_EXPORTED_BASE(NavigationControllerDelegate),
+ public NON_EXPORTED_BASE(NavigatorDelegate) {
public:
virtual ~WebContentsImpl();
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 7e9958e..aa96c87 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -516,6 +516,9 @@
'browser/frame_host/navigation_entry_impl.h',
'browser/frame_host/navigation_entry_screenshot_manager.cc',
'browser/frame_host/navigation_entry_screenshot_manager.h',
+ 'browser/frame_host/navigator.cc',
+ 'browser/frame_host/navigator.h',
+ 'browser/frame_host/navigator_delegate.h',
'browser/frame_host/render_frame_host_impl.cc',
'browser/frame_host/render_frame_host_impl.h',
'browser/frame_host/render_frame_message_filter.cc',