1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
// 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_IMPL_H_
#define CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_IMPL_H_
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "content/browser/frame_host/navigation_controller_impl.h"
#include "content/browser/frame_host/navigator.h"
#include "content/common/content_export.h"
#include "url/gurl.h"
class GURL;
struct FrameMsg_Navigate_Params;
namespace content {
class NavigationControllerImpl;
class NavigatorDelegate;
class NavigatorTest;
struct LoadCommittedDetails;
struct CommitNavigationParams;
struct CommonNavigationParams;
struct RequestNavigationParams;
// This class is an implementation of Navigator, responsible for managing
// navigations in regular browser tabs.
class CONTENT_EXPORT NavigatorImpl : public Navigator {
public:
NavigatorImpl(NavigationControllerImpl* navigation_controller,
NavigatorDelegate* delegate);
// Navigator implementation.
NavigationController* GetController() override;
void DidStartProvisionalLoad(RenderFrameHostImpl* render_frame_host,
const GURL& url,
bool is_transition_navigation) override;
void DidFailProvisionalLoadWithError(
RenderFrameHostImpl* render_frame_host,
const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params)
override;
void DidFailLoadWithError(RenderFrameHostImpl* render_frame_host,
const GURL& url,
int error_code,
const base::string16& error_description) override;
void DidNavigate(RenderFrameHostImpl* render_frame_host,
const FrameHostMsg_DidCommitProvisionalLoad_Params&
input_params) override;
bool NavigateToPendingEntry(
RenderFrameHostImpl* render_frame_host,
NavigationController::ReloadType reload_type) override;
void RequestOpenURL(RenderFrameHostImpl* render_frame_host,
const GURL& url,
SiteInstance* source_site_instance,
const Referrer& referrer,
WindowOpenDisposition disposition,
bool should_replace_current_entry,
bool user_gesture) override;
void RequestTransferURL(RenderFrameHostImpl* render_frame_host,
const GURL& url,
SiteInstance* source_site_instance,
const std::vector<GURL>& redirect_chain,
const Referrer& referrer,
ui::PageTransition page_transition,
WindowOpenDisposition disposition,
const GlobalRequestID& transferred_global_request_id,
bool should_replace_current_entry,
bool user_gesture) override;
void OnBeginNavigation(FrameTreeNode* frame_tree_node,
const FrameHostMsg_BeginNavigation_Params& params,
const CommonNavigationParams& common_params) override;
void CommitNavigation(FrameTreeNode* frame_tree_node,
ResourceResponse* response,
scoped_ptr<StreamHandle> body) override;
void LogResourceRequestTime(base::TimeTicks timestamp,
const GURL& url) override;
void LogBeforeUnloadTime(
const base::TimeTicks& renderer_before_unload_start_time,
const base::TimeTicks& renderer_before_unload_end_time) override;
void CancelNavigation(FrameTreeNode* frame_tree_node) override;
// PlzNavigate
// Returns the navigation request for a given node. Used in tests.
NavigationRequest* GetNavigationRequestForNodeForTesting(
FrameTreeNode* frame_tree_node);
private:
// Holds data used to track browser side navigation metrics.
struct NavigationMetricsData;
friend class NavigatorTestWithBrowserSideNavigation;
~NavigatorImpl() override;
// Navigates to the given entry, which must be the pending entry. Private
// because all callers should use NavigateToPendingEntry.
bool NavigateToEntry(
RenderFrameHostImpl* render_frame_host,
const NavigationEntryImpl& entry,
NavigationController::ReloadType reload_type);
bool ShouldAssignSiteForURL(const GURL& url);
void CheckWebUIRendererDoesNotDisplayNormalURL(
RenderFrameHostImpl* render_frame_host,
const GURL& url);
// PlzNavigate: sends a RequestNavigation IPC to the renderer to ask it to
// navigate. If no live renderer is present, then the navigation request will
// be sent directly to the ResourceDispatcherHost.
bool RequestNavigation(FrameTreeNode* frame_tree_node,
const NavigationEntryImpl& entry,
NavigationController::ReloadType reload_type,
base::TimeTicks navigation_start);
void RecordNavigationMetrics(
const LoadCommittedDetails& details,
const FrameHostMsg_DidCommitProvisionalLoad_Params& params,
SiteInstance* site_instance);
// 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_;
scoped_ptr<NavigatorImpl::NavigationMetricsData> navigation_data_;
// PlzNavigate: used to track the various ongoing NavigationRequests in the
// different FrameTreeNodes, based on the frame_tree_node_id.
typedef base::ScopedPtrHashMap<int64, NavigationRequest> NavigationRequestMap;
NavigationRequestMap navigation_request_map_;
DISALLOW_COPY_AND_ASSIGN(NavigatorImpl);
};
} // namespace content
#endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATOR_IMPL_H_
|