blob: 1495871395c6ca345e6c038f1cc3dcd13213d94d [file] [log] [blame]
[email protected]6ea6bdf2013-12-06 13:35:011// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_IMPL_H_
6#define CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_IMPL_H_
7
dcheng9bfa5162016-04-09 01:00:578#include <memory>
9
clamy71a42ec2014-10-02 18:43:2210#include "base/containers/scoped_ptr_hash_map.h"
avib7348942015-12-25 20:57:1011#include "base/macros.h"
[email protected]6ea6bdf2013-12-06 13:35:0112#include "base/memory/ref_counted.h"
carloskbb156a042014-09-30 11:55:1013#include "base/time/time.h"
[email protected]3691e5cf2014-01-22 10:16:2014#include "content/browser/frame_host/navigation_controller_impl.h"
[email protected]6ea6bdf2013-12-06 13:35:0115#include "content/browser/frame_host/navigator.h"
16#include "content/common/content_export.h"
clamy4b0b18202016-02-11 19:56:0617#include "content/common/navigation_params.h"
carloskbb156a042014-09-30 11:55:1018#include "url/gurl.h"
[email protected]6ea6bdf2013-12-06 13:35:0119
clamy9bfeef42014-09-30 20:50:4220class GURL;
[email protected]8a58a8e2014-08-19 15:59:0821
[email protected]6ea6bdf2013-12-06 13:35:0122namespace content {
23
24class NavigationControllerImpl;
25class NavigatorDelegate;
clamy71a42ec2014-10-02 18:43:2226class NavigatorTest;
[email protected]37567b432014-02-12 01:12:2227struct LoadCommittedDetails;
[email protected]6ea6bdf2013-12-06 13:35:0128
29// This class is an implementation of Navigator, responsible for managing
30// navigations in regular browser tabs.
31class CONTENT_EXPORT NavigatorImpl : public Navigator {
32 public:
33 NavigatorImpl(NavigationControllerImpl* navigation_controller,
34 NavigatorDelegate* delegate);
35
clamy5a3c3642016-03-24 17:46:5636 static void CheckWebUIRendererDoesNotDisplayNormalURL(
37 RenderFrameHostImpl* render_frame_host,
38 const GURL& url);
39
[email protected]52913802013-12-10 05:52:1840 // Navigator implementation.
fdegansa696e5112015-04-17 01:57:5941 NavigatorDelegate* GetDelegate() override;
dchengc2282aa2014-10-21 12:07:5842 NavigationController* GetController() override;
csharrisone77e5ce2015-11-15 02:31:1943 void DidStartProvisionalLoad(
44 RenderFrameHostImpl* render_frame_host,
45 const GURL& url,
46 const base::TimeTicks& navigation_start) override;
dchengc2282aa2014-10-21 12:07:5847 void DidFailProvisionalLoadWithError(
[email protected]3109fbb72014-01-06 23:57:1548 RenderFrameHostImpl* render_frame_host,
49 const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params)
mohan.reddy383f53b32014-10-07 05:56:2850 override;
dchengc2282aa2014-10-21 12:07:5851 void DidFailLoadWithError(RenderFrameHostImpl* render_frame_host,
52 const GURL& url,
53 int error_code,
gsennton6fbb38692015-06-24 19:23:5554 const base::string16& error_description,
55 bool was_ignored_by_handler) override;
avib81c9222015-08-21 16:28:1756 void DidNavigate(
57 RenderFrameHostImpl* render_frame_host,
58 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) override;
creis4e2ecb72015-06-20 00:46:3059 bool NavigateToPendingEntry(FrameTreeNode* frame_tree_node,
60 const FrameNavigationEntry& frame_entry,
61 NavigationController::ReloadType reload_type,
62 bool is_same_document_history_load) override;
creise18ce072015-12-02 02:00:0263 bool NavigateNewChildFrame(RenderFrameHostImpl* render_frame_host,
64 const std::string& unique_name) override;
dchengc2282aa2014-10-21 12:07:5865 void RequestOpenURL(RenderFrameHostImpl* render_frame_host,
66 const GURL& url,
lfg9ef7d2d2014-12-15 22:32:3067 SiteInstance* source_site_instance,
dchengc2282aa2014-10-21 12:07:5868 const Referrer& referrer,
69 WindowOpenDisposition disposition,
70 bool should_replace_current_entry,
71 bool user_gesture) override;
72 void RequestTransferURL(RenderFrameHostImpl* render_frame_host,
73 const GURL& url,
alexmos9ab970c92016-02-26 06:40:5174 SiteInstance* source_site_instance,
dchengc2282aa2014-10-21 12:07:5875 const std::vector<GURL>& redirect_chain,
76 const Referrer& referrer,
77 ui::PageTransition page_transition,
dchengc2282aa2014-10-21 12:07:5878 const GlobalRequestID& transferred_global_request_id,
creis29460272015-12-16 04:38:2279 bool should_replace_current_entry) override;
clamy0ab288e2015-02-05 17:39:1480 void OnBeforeUnloadACK(FrameTreeNode* frame_tree_node, bool proceed) override;
dchengc2282aa2014-10-21 12:07:5881 void OnBeginNavigation(FrameTreeNode* frame_tree_node,
clamy0ab288e2015-02-05 17:39:1482 const CommonNavigationParams& common_params,
83 const BeginNavigationParams& begin_params,
84 scoped_refptr<ResourceRequestBody> body) override;
clamy62b271d2015-04-16 11:54:5785 void FailedNavigation(FrameTreeNode* frame_tree_node,
86 bool has_stale_copy_in_cache,
87 int error_code) override;
dchengc2282aa2014-10-21 12:07:5888 void LogResourceRequestTime(base::TimeTicks timestamp,
89 const GURL& url) override;
90 void LogBeforeUnloadTime(
carloska045c8c2014-10-14 10:43:1891 const base::TimeTicks& renderer_before_unload_start_time,
92 const base::TimeTicks& renderer_before_unload_end_time) override;
dchengc2282aa2014-10-21 12:07:5893 void CancelNavigation(FrameTreeNode* frame_tree_node) override;
carloskbb156a042014-09-30 11:55:1094
[email protected]6ea6bdf2013-12-06 13:35:0195 private:
carloska045c8c2014-10-14 10:43:1896 // Holds data used to track browser side navigation metrics.
97 struct NavigationMetricsData;
98
clamy72c72792014-11-18 18:09:4699 friend class NavigatorTestWithBrowserSideNavigation;
dchengc2282aa2014-10-21 12:07:58100 ~NavigatorImpl() override;
[email protected]6ea6bdf2013-12-06 13:35:01101
creise18ce072015-12-02 02:00:02102 // Navigates to the given entry, which might be the pending entry (if
103 // |is_pending_entry| is true). Private because all callers should use either
104 // NavigateToPendingEntry or NavigateToNewChildFrame.
creis4e2ecb72015-06-20 00:46:30105 bool NavigateToEntry(FrameTreeNode* frame_tree_node,
106 const FrameNavigationEntry& frame_entry,
107 const NavigationEntryImpl& entry,
108 NavigationController::ReloadType reload_type,
creise18ce072015-12-02 02:00:02109 bool is_same_document_history_load,
110 bool is_pending_entry);
[email protected]0449c3f2014-02-28 20:31:22111
[email protected]37567b432014-02-12 01:12:22112 bool ShouldAssignSiteForURL(const GURL& url);
113
clamy0ab288e2015-02-05 17:39:14114 // PlzNavigate: if needed, sends a BeforeUnload IPC to the renderer to ask it
115 // to execute the beforeUnload event. Otherwise, the navigation request will
116 // be started.
117 void RequestNavigation(FrameTreeNode* frame_tree_node,
lfg573e8be62015-07-15 16:00:11118 const GURL& dest_url,
119 const Referrer& dest_referrer,
creis4e2ecb72015-06-20 00:46:30120 const FrameNavigationEntry& frame_entry,
clamy71a42ec2014-10-02 18:43:22121 const NavigationEntryImpl& entry,
122 NavigationController::ReloadType reload_type,
clamy4b0b18202016-02-11 19:56:06123 LoFiState lofi_state,
creis4e2ecb72015-06-20 00:46:30124 bool is_same_document_history_load,
clamy71a42ec2014-10-02 18:43:22125 base::TimeTicks navigation_start);
126
carloska045c8c2014-10-14 10:43:18127 void RecordNavigationMetrics(
128 const LoadCommittedDetails& details,
129 const FrameHostMsg_DidCommitProvisionalLoad_Params& params,
130 SiteInstance* site_instance);
131
clamyfa0939fd2015-06-04 08:39:11132 // Called when a navigation has started in a main frame, to update the pending
133 // NavigationEntry if the controller does not currently have a
134 // browser-initiated one.
135 void DidStartMainFrameNavigation(const GURL& url,
creisb4dc9332016-03-14 21:39:19136 SiteInstanceImpl* site_instance,
137 NavigationHandleImpl* navigation_handle);
clamyfa0939fd2015-06-04 08:39:11138
clamyd4244312016-03-14 14:58:13139 // Called when a navigation has failed to discard the pending entry in order
140 // to avoid url spoofs.
141 void DiscardPendingEntryOnFailureIfNeeded(NavigationHandleImpl* handle);
142
[email protected]52913802013-12-10 05:52:18143 // The NavigationController that will keep track of session history for all
144 // RenderFrameHost objects using this NavigatorImpl.
145 // TODO(nasko): Move ownership of the NavigationController from
146 // WebContentsImpl to this class.
147 NavigationControllerImpl* controller_;
148
149 // Used to notify the object embedding this Navigator about navigation
150 // events. Can be NULL in tests.
151 NavigatorDelegate* delegate_;
152
dcheng9bfa5162016-04-09 01:00:57153 std::unique_ptr<NavigatorImpl::NavigationMetricsData> navigation_data_;
carloskbb156a042014-09-30 11:55:10154
[email protected]6ea6bdf2013-12-06 13:35:01155 DISALLOW_COPY_AND_ASSIGN(NavigatorImpl);
156};
157
158} // namespace content
159
160#endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_IMPL_H_