When starting a provisional load include the parent frame ID in the IPC and pass it down the th WCObservers
This is the first half of the change, the second half will send the parent frame id with the webNavigation events See RenderViewImpl::willSendRequest when it creates the RequestExtraData for a place where we already send the parent frame id (this is for the webRequest API that looks at network requests instead of navigation events) BUG=128927 TEST=FrameNavigationState.* Review URL: https://chromiumcodereview.appspot.com/11090068 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@161570 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
chrome/browser
captive_portal
content_settings
extensions
api
net
prerender
ui
content
browser
browser_plugin
renderer_host
web_contents
common
public
browser
renderer
@ -62,6 +62,7 @@ CaptivePortalTabHelper::~CaptivePortalTabHelper() {
|
||||
|
||||
void CaptivePortalTabHelper::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -67,6 +67,7 @@ class CaptivePortalTabHelper
|
||||
// content::WebContentsObserver:
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -89,7 +89,7 @@ class CaptivePortalTabHelperTest : public TabContentsTestHarness {
|
||||
content::RenderViewHost* render_view_host) {
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, url, false, render_view_host);
|
||||
1, -1, true, url, false, render_view_host);
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1);
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
@ -101,14 +101,14 @@ class CaptivePortalTabHelperTest : public TabContentsTestHarness {
|
||||
content::RenderViewHost* render_view_host) {
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, url, false, render_view_host);
|
||||
1, -1, true, url, false, render_view_host);
|
||||
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
1, true, url, net::ERR_TIMED_OUT, string16(), render_view_host);
|
||||
|
||||
// Provisional load starts for the error page.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, GURL(kErrorPageUrl), true, render_view_host);
|
||||
1, -1, true, GURL(kErrorPageUrl), true, render_view_host);
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_TIMED_OUT)).Times(1);
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
@ -122,7 +122,7 @@ class CaptivePortalTabHelperTest : public TabContentsTestHarness {
|
||||
NavigationType navigation_type) {
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, url, false, render_view_host);
|
||||
1, -1, true, url, false, render_view_host);
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnAbort()).Times(1);
|
||||
if (navigation_type == kSameProcess) {
|
||||
@ -149,14 +149,14 @@ class CaptivePortalTabHelperTest : public TabContentsTestHarness {
|
||||
NavigationType navigation_type) {
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, url, false, render_view_host);
|
||||
1, -1, true, url, false, render_view_host);
|
||||
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
1, true, url, net::ERR_TIMED_OUT, string16(), render_view_host);
|
||||
|
||||
// Start event for the error page.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, url, true, render_view_host);
|
||||
1, -1, true, url, true, render_view_host);
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnAbort()).Times(1);
|
||||
if (navigation_type == kSameProcess) {
|
||||
@ -250,7 +250,7 @@ TEST_F(CaptivePortalTabHelperTest, HttpTimeoutLinkDoctor) {
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1);
|
||||
// Provisional load starts for the error page.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, GURL(kErrorPageUrl), true, render_view_host1());
|
||||
1, -1, true, GURL(kErrorPageUrl), true, render_view_host1());
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::OK)).Times(1);
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
@ -324,7 +324,7 @@ TEST_F(CaptivePortalTabHelperTest, UnexpectedProvisionalLoad) {
|
||||
EXPECT_CALL(mock_reloader(),
|
||||
OnLoadStart(same_site_url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, same_site_url, false, render_view_host1());
|
||||
1, -1, true, same_site_url, false, render_view_host1());
|
||||
|
||||
// It's unexpectedly interrupted by a cross-process navigation, which starts
|
||||
// navigating before the old navigation cancels. We generate an abort message
|
||||
@ -333,7 +333,7 @@ TEST_F(CaptivePortalTabHelperTest, UnexpectedProvisionalLoad) {
|
||||
EXPECT_CALL(mock_reloader(),
|
||||
OnLoadStart(cross_process_url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, cross_process_url, false, render_view_host2());
|
||||
1, -1, true, cross_process_url, false, render_view_host2());
|
||||
|
||||
// The cross-process navigation fails.
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
@ -348,7 +348,7 @@ TEST_F(CaptivePortalTabHelperTest, UnexpectedProvisionalLoad) {
|
||||
// The provisional load starts for the error page for the cross-process
|
||||
// navigation.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, GURL(kErrorPageUrl), true, render_view_host2());
|
||||
1, -1, true, GURL(kErrorPageUrl), true, render_view_host2());
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_FAILED)).Times(1);
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
@ -366,7 +366,7 @@ TEST_F(CaptivePortalTabHelperTest, UnexpectedCommit) {
|
||||
EXPECT_CALL(mock_reloader(),
|
||||
OnLoadStart(same_site_url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, same_site_url, false, render_view_host1());
|
||||
1, -1, true, same_site_url, false, render_view_host1());
|
||||
|
||||
// It's unexpectedly interrupted by a cross-process navigation, which starts
|
||||
// navigating before the old navigation cancels. We generate an abort message
|
||||
@ -375,7 +375,7 @@ TEST_F(CaptivePortalTabHelperTest, UnexpectedCommit) {
|
||||
EXPECT_CALL(mock_reloader(),
|
||||
OnLoadStart(cross_process_url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, cross_process_url, false, render_view_host2());
|
||||
1, -1, true, cross_process_url, false, render_view_host2());
|
||||
|
||||
// The cross-process navigation fails.
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
@ -398,23 +398,23 @@ TEST_F(CaptivePortalTabHelperTest, HttpsSubframe) {
|
||||
GURL url = GURL(kHttpsUrl);
|
||||
// Normal load.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, false, url, false, render_view_host1());
|
||||
1, -1, false, url, false, render_view_host1());
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
1, false, url, content::PAGE_TRANSITION_LINK, render_view_host1());
|
||||
|
||||
// Timeout.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
2, false, url, false, render_view_host1());
|
||||
2, -1, false, url, false, render_view_host1());
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
2, false, url, net::ERR_TIMED_OUT, string16(), render_view_host1());
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
2, false, url, true, render_view_host1());
|
||||
2, -1, false, url, true, render_view_host1());
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
2, false, url, net::ERR_ABORTED, string16(), render_view_host1());
|
||||
|
||||
// Abort.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
3, false, url, false, render_view_host1());
|
||||
3, -1, false, url, false, render_view_host1());
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
3, false, url, net::ERR_ABORTED, string16(), render_view_host1());
|
||||
}
|
||||
@ -432,9 +432,9 @@ TEST_F(CaptivePortalTabHelperTest, HttpsSubframeParallelError) {
|
||||
// Loads start.
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
frame_id, true, url, false, render_view_host1());
|
||||
frame_id, -1, true, url, false, render_view_host1());
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
subframe_id, false, url, false, render_view_host1());
|
||||
subframe_id, frame_id, false, url, false, render_view_host1());
|
||||
|
||||
// Loads return errors.
|
||||
tab_helper().DidFailProvisionalLoad(
|
||||
@ -446,9 +446,9 @@ TEST_F(CaptivePortalTabHelperTest, HttpsSubframeParallelError) {
|
||||
|
||||
// Provisional load starts for the error pages.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
frame_id, true, url, true, render_view_host1());
|
||||
frame_id, -1, true, url, true, render_view_host1());
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
subframe_id, false, url, true, render_view_host1());
|
||||
subframe_id, frame_id, false, url, true, render_view_host1());
|
||||
|
||||
// Error page load finishes.
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
@ -465,7 +465,7 @@ TEST_F(CaptivePortalTabHelperTest, HttpToHttpsRedirectTimeout) {
|
||||
GURL http_url(kHttpUrl);
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, http_url, false, render_view_host1());
|
||||
1, -1, true, http_url, false, render_view_host1());
|
||||
|
||||
GURL https_url(kHttpsUrl);
|
||||
EXPECT_CALL(mock_reloader(), OnRedirect(true)).Times(1);
|
||||
@ -478,7 +478,7 @@ TEST_F(CaptivePortalTabHelperTest, HttpToHttpsRedirectTimeout) {
|
||||
|
||||
// Provisional load starts for the error page.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, GURL(kErrorPageUrl), true, render_view_host1());
|
||||
1, -1, true, GURL(kErrorPageUrl), true, render_view_host1());
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_TIMED_OUT)).Times(1);
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
@ -491,7 +491,7 @@ TEST_F(CaptivePortalTabHelperTest, HttpsToHttpRedirect) {
|
||||
GURL https_url(kHttpsUrl);
|
||||
EXPECT_CALL(mock_reloader(),
|
||||
OnLoadStart(https_url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(1, true, https_url, false,
|
||||
tab_helper().DidStartProvisionalLoadForFrame(1, -1, true, https_url, false,
|
||||
render_view_host1());
|
||||
|
||||
GURL http_url(kHttpUrl);
|
||||
@ -511,7 +511,7 @@ TEST_F(CaptivePortalTabHelperTest, HttpToHttpRedirect) {
|
||||
EXPECT_CALL(mock_reloader(),
|
||||
OnLoadStart(http_url.SchemeIsSecure())).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, http_url, false, render_view_host1());
|
||||
1, -1, true, http_url, false, render_view_host1());
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnRedirect(http_url.SchemeIsSecure())).Times(1);
|
||||
OnRedirect(ResourceType::MAIN_FRAME, http_url,
|
||||
@ -528,7 +528,7 @@ TEST_F(CaptivePortalTabHelperTest, SubframeRedirect) {
|
||||
GURL http_url(kHttpUrl);
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, http_url, false, render_view_host1());
|
||||
1, -1, true, http_url, false, render_view_host1());
|
||||
|
||||
GURL https_url(kHttpsUrl);
|
||||
OnRedirect(ResourceType::SUB_FRAME, https_url,
|
||||
@ -545,7 +545,7 @@ TEST_F(CaptivePortalTabHelperTest, OtherRenderViewHostRedirect) {
|
||||
GURL http_url(kHttpUrl);
|
||||
EXPECT_CALL(mock_reloader(), OnLoadStart(false)).Times(1);
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, http_url, false, render_view_host1());
|
||||
1, -1, true, http_url, false, render_view_host1());
|
||||
|
||||
// Another RenderViewHost sees a redirect. None of the reloader's functions
|
||||
// should be called.
|
||||
@ -559,7 +559,7 @@ TEST_F(CaptivePortalTabHelperTest, OtherRenderViewHostRedirect) {
|
||||
|
||||
// Provisional load starts for the error page.
|
||||
tab_helper().DidStartProvisionalLoadForFrame(
|
||||
1, true, GURL(kErrorPageUrl), true, render_view_host1());
|
||||
1, -1, true, GURL(kErrorPageUrl), true, render_view_host1());
|
||||
|
||||
EXPECT_CALL(mock_reloader(), OnLoadCommitted(net::ERR_TIMED_OUT)).Times(1);
|
||||
tab_helper().DidCommitProvisionalLoadForFrame(
|
||||
|
@ -479,6 +479,7 @@ void TabSpecificContentSettings::DidNavigateMainFrame(
|
||||
|
||||
void TabSpecificContentSettings::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -235,6 +235,7 @@ class TabSpecificContentSettings
|
||||
const content::FrameNavigateParams& params) OVERRIDE;
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -89,6 +89,7 @@ bool FrameNavigationState::IsValidUrl(const GURL& url) const {
|
||||
}
|
||||
|
||||
void FrameNavigationState::TrackFrame(FrameID frame_id,
|
||||
FrameID parent_frame_id,
|
||||
const GURL& url,
|
||||
bool is_main_frame,
|
||||
bool is_error_page) {
|
||||
@ -99,6 +100,12 @@ void FrameNavigationState::TrackFrame(FrameID frame_id,
|
||||
frame_state.is_navigating = true;
|
||||
frame_state.is_committed = false;
|
||||
frame_state.is_server_redirected = false;
|
||||
if (!is_main_frame) {
|
||||
frame_state.parent_frame_num = parent_frame_id.frame_num;
|
||||
} else {
|
||||
DCHECK(parent_frame_id.frame_num == -1);
|
||||
frame_state.parent_frame_num = -1;
|
||||
}
|
||||
frame_ids_.insert(frame_id);
|
||||
}
|
||||
|
||||
@ -156,6 +163,18 @@ FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const {
|
||||
return main_frame_id_;
|
||||
}
|
||||
|
||||
FrameNavigationState::FrameID FrameNavigationState::GetParentFrameID(
|
||||
FrameID frame_id) const {
|
||||
FrameIdToStateMap::const_iterator frame_state =
|
||||
frame_state_map_.find(frame_id);
|
||||
if (frame_state == frame_state_map_.end()) {
|
||||
NOTREACHED();
|
||||
return FrameID();
|
||||
}
|
||||
return FrameID(frame_state->second.parent_frame_num,
|
||||
frame_id.render_view_host);
|
||||
}
|
||||
|
||||
void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) {
|
||||
DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
|
||||
frame_state_map_[frame_id].error_occurred = true;
|
||||
|
@ -53,6 +53,7 @@ class FrameNavigationState {
|
||||
|
||||
// Starts to track a frame identified by its |frame_id| showing the URL |url|.
|
||||
void TrackFrame(FrameID frame_id,
|
||||
FrameID parent_frame_id,
|
||||
const GURL& url,
|
||||
bool is_main_frame,
|
||||
bool is_error_page);
|
||||
@ -79,6 +80,9 @@ class FrameNavigationState {
|
||||
// ID is not known.
|
||||
FrameID GetMainFrameID() const;
|
||||
|
||||
// Get the parent frame ID (or an invalid ID, if |frame_id| is a main frame).
|
||||
FrameID GetParentFrameID(FrameID frame_id) const;
|
||||
|
||||
// Marks a frame as in an error state, i.e. the onErrorOccurred event was
|
||||
// fired for this frame, and no further events should be sent for it.
|
||||
void SetErrorOccurredInFrame(FrameID frame_id);
|
||||
@ -119,6 +123,7 @@ class FrameNavigationState {
|
||||
bool is_navigating; // True if there is a navigation going on.
|
||||
bool is_committed; // True if the navigation is already committed.
|
||||
bool is_server_redirected; // True if a server redirect happened.
|
||||
int64 parent_frame_num;
|
||||
GURL url; // URL of this frame.
|
||||
};
|
||||
typedef std::map<FrameID, FrameState> FrameIdToStateMap;
|
||||
|
@ -16,6 +16,7 @@ content::RenderViewHost* fake_rvh =
|
||||
// goes away.
|
||||
TEST(FrameNavigationStateTest, TrackFrame) {
|
||||
FrameNavigationState navigation_state;
|
||||
const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
|
||||
const GURL url1("http://www.google.com/");
|
||||
@ -24,7 +25,7 @@ TEST(FrameNavigationStateTest, TrackFrame) {
|
||||
// Create a main frame.
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1));
|
||||
navigation_state.TrackFrame(frame_id1, url1, true, false);
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, url1, true, false);
|
||||
navigation_state.SetNavigationCommitted(frame_id1);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_TRUE(navigation_state.IsValidFrame(frame_id1));
|
||||
@ -32,7 +33,7 @@ TEST(FrameNavigationStateTest, TrackFrame) {
|
||||
// Add a sub frame.
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
|
||||
EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2));
|
||||
navigation_state.TrackFrame(frame_id2, url2, false, false);
|
||||
navigation_state.TrackFrame(frame_id2, frame_id1, url2, false, false);
|
||||
navigation_state.SetNavigationCommitted(frame_id2);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
|
||||
EXPECT_TRUE(navigation_state.IsValidFrame(frame_id2));
|
||||
@ -57,39 +58,41 @@ TEST(FrameNavigationStateTest, TrackFrame) {
|
||||
// before a new navigation happened in this frame.
|
||||
TEST(FrameNavigationStateTest, ErrorState) {
|
||||
FrameNavigationState navigation_state;
|
||||
const FrameNavigationState::FrameID frame_id(42, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id1(42, fake_rvh);
|
||||
const GURL url("http://www.google.com/");
|
||||
|
||||
navigation_state.TrackFrame(frame_id, url, true, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id));
|
||||
EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id));
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id1));
|
||||
|
||||
// After an error occurred, no further events should be sent.
|
||||
navigation_state.SetErrorOccurredInFrame(frame_id);
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id));
|
||||
EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id));
|
||||
navigation_state.SetErrorOccurredInFrame(frame_id1);
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id1));
|
||||
|
||||
// Navigations to a network error page should be ignored.
|
||||
navigation_state.TrackFrame(frame_id, GURL(), true, true);
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id));
|
||||
EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id));
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, GURL(), true, true);
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id1));
|
||||
|
||||
// However, when the frame navigates again, it should send events again.
|
||||
navigation_state.TrackFrame(frame_id, url, true, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id));
|
||||
EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id));
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id1));
|
||||
}
|
||||
|
||||
// Tests that for a sub frame, no events are send after an error occurred, but
|
||||
// before a new navigation happened in this frame.
|
||||
TEST(FrameNavigationStateTest, ErrorStateFrame) {
|
||||
FrameNavigationState navigation_state;
|
||||
const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
|
||||
const GURL url("http://www.google.com/");
|
||||
|
||||
navigation_state.TrackFrame(frame_id1, url, true, false);
|
||||
navigation_state.TrackFrame(frame_id2, url, false, false);
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false);
|
||||
navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
|
||||
|
||||
@ -99,12 +102,12 @@ TEST(FrameNavigationStateTest, ErrorStateFrame) {
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
|
||||
|
||||
// Navigations to a network error page should be ignored.
|
||||
navigation_state.TrackFrame(frame_id2, GURL(), false, true);
|
||||
navigation_state.TrackFrame(frame_id2, frame_id1, GURL(), false, true);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
|
||||
|
||||
// However, when the frame navigates again, it should send events again.
|
||||
navigation_state.TrackFrame(frame_id2, url, false, false);
|
||||
navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
|
||||
}
|
||||
@ -112,11 +115,29 @@ TEST(FrameNavigationStateTest, ErrorStateFrame) {
|
||||
// Tests that no events are send for a not web-safe scheme.
|
||||
TEST(FrameNavigationStateTest, WebSafeScheme) {
|
||||
FrameNavigationState navigation_state;
|
||||
const FrameNavigationState::FrameID frame_id(23, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
|
||||
const GURL url("unsafe://www.google.com/");
|
||||
|
||||
navigation_state.TrackFrame(frame_id, url, true, false);
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id));
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false);
|
||||
EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
|
||||
}
|
||||
|
||||
// Test that parent frame IDs are tracked.
|
||||
TEST(FrameNavigationStateTest, ParentFrameID) {
|
||||
FrameNavigationState navigation_state;
|
||||
const FrameNavigationState::FrameID frame_id0(-1, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id1(23, fake_rvh);
|
||||
const FrameNavigationState::FrameID frame_id2(42, fake_rvh);
|
||||
const GURL url("http://www.google.com/");
|
||||
|
||||
navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false);
|
||||
navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false);
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
|
||||
EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
|
||||
|
||||
EXPECT_TRUE(navigation_state.GetParentFrameID(frame_id1) == frame_id0);
|
||||
EXPECT_TRUE(navigation_state.GetParentFrameID(frame_id2) == frame_id1);
|
||||
}
|
||||
|
||||
} // namespace extensions
|
||||
|
@ -368,6 +368,7 @@ void WebNavigationTabObserver::AboutToNavigateRenderView(
|
||||
|
||||
void WebNavigationTabObserver::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_num,
|
||||
int64 parent_frame_num,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
@ -379,8 +380,11 @@ void WebNavigationTabObserver::DidStartProvisionalLoadForFrame(
|
||||
return;
|
||||
|
||||
FrameNavigationState::FrameID frame_id(frame_num, render_view_host);
|
||||
FrameNavigationState::FrameID parent_frame_id(
|
||||
parent_frame_num, render_view_host);
|
||||
|
||||
navigation_state_.TrackFrame(frame_id,
|
||||
parent_frame_id,
|
||||
validated_url,
|
||||
is_main_frame,
|
||||
is_error_page);
|
||||
|
@ -55,6 +55,7 @@ class WebNavigationTabObserver
|
||||
content::RenderViewHost* render_view_host) OVERRIDE;
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_num,
|
||||
int64 parent_frame_num,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -184,6 +184,7 @@ class DelayLoadStartAndExecuteJavascript
|
||||
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -267,6 +267,7 @@ LoadTimeStatsTabHelper::~LoadTimeStatsTabHelper() {
|
||||
|
||||
void LoadTimeStatsTabHelper::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -128,6 +128,7 @@ class LoadTimeStatsTabHelper
|
||||
// content::WebContentsObserver implementation
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -563,6 +563,7 @@ void PrerenderContents::DidStopLoading(
|
||||
|
||||
void PrerenderContents::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -172,6 +172,7 @@ class PrerenderContents : public content::NotificationObserver,
|
||||
content::RenderViewHost* render_view_host) OVERRIDE;
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -200,6 +200,7 @@ void PrerenderTabHelper::DidStopLoading(
|
||||
|
||||
void PrerenderTabHelper::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -32,6 +32,7 @@ class PrerenderTabHelper
|
||||
content::RenderViewHost* render_view_host) OVERRIDE;
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -88,6 +88,7 @@ void SearchTabHelper::NavigateToPendingEntry(
|
||||
|
||||
void SearchTabHelper::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -45,6 +45,7 @@ class SearchTabHelper : public content::WebContentsObserver,
|
||||
content::NavigationController::ReloadType reload_type) OVERRIDE;
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -373,6 +373,7 @@ void BrowserPluginGuest::SetCursor(const WebCursor& cursor) {
|
||||
|
||||
void BrowserPluginGuest::DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -100,6 +100,7 @@ class CONTENT_EXPORT BrowserPluginGuest : public NotificationObserver,
|
||||
// WebContentsObserver implementation.
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -152,6 +152,7 @@ class CONTENT_EXPORT RenderViewHostDelegate {
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
RenderViewHost* render_view_host,
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool main_frame,
|
||||
const GURL& opener_url,
|
||||
const GURL& url) {}
|
||||
|
@ -1166,11 +1166,12 @@ void RenderViewHostImpl::OnMsgRenderViewGone(int status, int exit_code) {
|
||||
|
||||
void RenderViewHostImpl::OnMsgDidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& opener_url,
|
||||
const GURL& url) {
|
||||
delegate_->DidStartProvisionalLoadForFrame(
|
||||
this, frame_id, is_main_frame, opener_url, url);
|
||||
this, frame_id, parent_frame_id, is_main_frame, opener_url, url);
|
||||
}
|
||||
|
||||
void RenderViewHostImpl::OnMsgDidRedirectProvisionalLoad(
|
||||
|
@ -484,6 +484,7 @@ class CONTENT_EXPORT RenderViewHostImpl
|
||||
void OnMsgRenderViewReady();
|
||||
void OnMsgRenderViewGone(int status, int error_code);
|
||||
void OnMsgDidStartProvisionalLoadForFrame(int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool main_frame,
|
||||
const GURL& opener_url,
|
||||
const GURL& url);
|
||||
|
@ -292,13 +292,13 @@ void TestRenderViewHost::SendNavigate(int page_id, const GURL& url) {
|
||||
|
||||
void TestRenderViewHost::SendNavigateWithTransition(
|
||||
int page_id, const GURL& url, PageTransition transition) {
|
||||
OnMsgDidStartProvisionalLoadForFrame(0, true, GURL(), url);
|
||||
OnMsgDidStartProvisionalLoadForFrame(0, -1, true, GURL(), url);
|
||||
SendNavigateWithParameters(page_id, url, transition, url);
|
||||
}
|
||||
|
||||
void TestRenderViewHost::SendNavigateWithOriginalRequestURL(
|
||||
int page_id, const GURL& url, const GURL& original_request_url) {
|
||||
OnMsgDidStartProvisionalLoadForFrame(0, true, GURL(), url);
|
||||
OnMsgDidStartProvisionalLoadForFrame(0, -1, true, GURL(), url);
|
||||
SendNavigateWithParameters(page_id, url, PAGE_TRANSITION_LINK,
|
||||
original_request_url);
|
||||
}
|
||||
|
@ -1999,6 +1999,7 @@ void WebContentsImpl::OnWebIntentDispatch(
|
||||
void WebContentsImpl::DidStartProvisionalLoadForFrame(
|
||||
content::RenderViewHost* render_view_host,
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& opener_url,
|
||||
const GURL& url) {
|
||||
@ -2018,8 +2019,9 @@ void WebContentsImpl::DidStartProvisionalLoadForFrame(
|
||||
|
||||
// Notify observers about the start of the provisional load.
|
||||
FOR_EACH_OBSERVER(WebContentsObserver, observers_,
|
||||
DidStartProvisionalLoadForFrame(frame_id, is_main_frame,
|
||||
validated_url, is_error_page, render_view_host));
|
||||
DidStartProvisionalLoadForFrame(frame_id, parent_frame_id,
|
||||
is_main_frame, validated_url, is_error_page,
|
||||
render_view_host));
|
||||
|
||||
if (is_main_frame) {
|
||||
// Notify observers about the provisional change in the main frame URL.
|
||||
|
@ -301,6 +301,7 @@ class CONTENT_EXPORT WebContentsImpl
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
content::RenderViewHost* render_view_host,
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool main_frame,
|
||||
const GURL& opener_url,
|
||||
const GURL& url) OVERRIDE;
|
||||
|
@ -1672,8 +1672,9 @@ IPC_MESSAGE_ROUTED2(ViewHostMsg_DidRunInsecureContent,
|
||||
GURL /* target URL */)
|
||||
|
||||
// Sent when the renderer starts a provisional load for a frame.
|
||||
IPC_MESSAGE_ROUTED4(ViewHostMsg_DidStartProvisionalLoadForFrame,
|
||||
IPC_MESSAGE_ROUTED5(ViewHostMsg_DidStartProvisionalLoadForFrame,
|
||||
int64 /* frame_id */,
|
||||
int64 /* parent_frame_id */,
|
||||
bool /* true if it is the main frame */,
|
||||
GURL /* opener url if present, else empty */,
|
||||
GURL /* url */)
|
||||
|
@ -49,9 +49,13 @@ class CONTENT_EXPORT WebContentsObserver : public IPC::Listener,
|
||||
const LoadCommittedDetails& details,
|
||||
const FrameNavigateParams& params) {}
|
||||
// |render_view_host| is the RenderViewHost for which the provisional load is
|
||||
// happening.
|
||||
// happening. |frame_id| is a positive, non-zero integer identifying the
|
||||
// navigating frame in the given |render_view_host|. |parent_frame_id| is the
|
||||
// frame identifier of the frame containing the navigating frame, or -1 if the
|
||||
// frame is not contained in another frame.
|
||||
virtual void DidStartProvisionalLoadForFrame(
|
||||
int64 frame_id,
|
||||
int64 parent_frame_id,
|
||||
bool is_main_frame,
|
||||
const GURL& validated_url,
|
||||
bool is_error_page,
|
||||
|
@ -3236,8 +3236,9 @@ void RenderViewImpl::didStartProvisionalLoad(WebFrame* frame) {
|
||||
RenderViewObserver, observers_, DidStartProvisionalLoad(frame));
|
||||
|
||||
Send(new ViewHostMsg_DidStartProvisionalLoadForFrame(
|
||||
routing_id_, frame->identifier(), is_top_most, GetOpenerUrl(),
|
||||
ds->request().url()));
|
||||
routing_id_, frame->identifier(),
|
||||
frame->parent() ? frame->parent()->identifier() : -1,
|
||||
is_top_most, GetOpenerUrl(), ds->request().url()));
|
||||
}
|
||||
|
||||
void RenderViewImpl::didReceiveServerRedirectForProvisionalLoad(
|
||||
|
Reference in New Issue
Block a user