#include "content/browser/frame_host/cross_site_transferring_request.h"
#include "content/browser/frame_host/interstitial_page_impl.h"
#include "content/browser/frame_host/navigation_entry_impl.h"
+#include "content/browser/media/audio_stream_monitor.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/site_instance_impl.h"
#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/public/test/test_utils.h"
#include "content/test/test_content_browser_client.h"
#include "content/test/test_content_client.h"
+#include "content/test/test_render_frame_host.h"
#include "content/test/test_render_view_host.h"
#include "content/test/test_web_contents.h"
#include "testing/gtest/include/gtest/gtest.h"
void TestDidNavigate(int page_id, const GURL& url) {
FrameHostMsg_DidCommitProvisionalLoad_Params params;
- InitNavigateParams(¶ms, page_id, url, PAGE_TRANSITION_TYPED);
+ InitNavigateParams(¶ms, page_id, url, ui::PAGE_TRANSITION_TYPED);
DidNavigate(GetRenderViewHostForTesting(), params);
}
}
virtual ~TestWebContentsObserver() {}
- virtual void DidFinishLoad(int64 frame_id,
- const GURL& validated_url,
- bool is_main_frame,
- RenderViewHost* render_view_host) OVERRIDE {
+ virtual void DidFinishLoad(RenderFrameHost* render_frame_host,
+ const GURL& validated_url) OVERRIDE {
last_url_ = validated_url;
}
- virtual void DidFailLoad(int64 frame_id,
+ virtual void DidFailLoad(RenderFrameHost* render_frame_host,
const GURL& validated_url,
- bool is_main_frame,
int error_code,
- const base::string16& error_description,
- RenderViewHost* render_view_host) OVERRIDE {
+ const base::string16& error_description) OVERRIDE {
last_url_ = validated_url;
}
DISALLOW_COPY_AND_ASSIGN(FakeFullscreenDelegate);
};
+class FakeValidationMessageDelegate : public WebContentsDelegate {
+ public:
+ FakeValidationMessageDelegate()
+ : hide_validation_message_was_called_(false) {}
+ virtual ~FakeValidationMessageDelegate() {}
+
+ virtual void HideValidationMessage(WebContents* web_contents) OVERRIDE {
+ hide_validation_message_was_called_ = true;
+ }
+
+ bool hide_validation_message_was_called() const {
+ return hide_validation_message_was_called_;
+ }
+
+ private:
+ bool hide_validation_message_was_called_;
+
+ DISALLOW_COPY_AND_ASSIGN(FakeValidationMessageDelegate);
+};
+
} // namespace
// Test to make sure that title updates get stripped of whitespace.
NavigationControllerImpl& cont =
static_cast<NavigationControllerImpl&>(controller());
FrameHostMsg_DidCommitProvisionalLoad_Params params;
- InitNavigateParams(¶ms, 0, GURL(kAboutBlankURL), PAGE_TRANSITION_TYPED);
+ InitNavigateParams(
+ ¶ms, 0, GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_TYPED);
LoadCommittedDetails details;
- cont.RendererDidNavigate(main_test_rfh(), params, &details);
+ cont.RendererDidNavigate(contents()->GetMainFrame(), params, &details);
- contents()->UpdateTitle(rvh(), 0,
+ contents()->UpdateTitle(contents()->GetMainFrame(), 0,
base::ASCIIToUTF16(" Lots O' Whitespace\n"),
base::i18n::LEFT_TO_RIGHT);
EXPECT_EQ(base::ASCIIToUTF16("Lots O' Whitespace"), contents()->GetTitle());
TEST_F(WebContentsImplTest, DontUseTitleFromPendingEntry) {
const GURL kGURL("chrome://blah");
controller().LoadURL(
- kGURL, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_EQ(base::string16(), contents()->GetTitle());
}
const GURL kGURL("chrome://blah");
const base::string16 title = base::ASCIIToUTF16("My Title");
controller().LoadURL(
- kGURL, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
NavigationEntry* entry = controller().GetVisibleEntry();
ASSERT_EQ(kGURL, entry->GetURL());
process()->sink().ClearMessages();
cont.LoadURL(
- kGURL, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
rvh()->GetDelegate()->RenderViewCreated(rvh());
// Did we get the expected message?
EXPECT_TRUE(process()->sink().GetFirstMessageMatching(
ViewMsg_EnableViewSourceMode::ID));
FrameHostMsg_DidCommitProvisionalLoad_Params params;
- InitNavigateParams(¶ms, 0, kGURL, PAGE_TRANSITION_TYPED);
+ InitNavigateParams(¶ms, 0, kGURL, ui::PAGE_TRANSITION_TYPED);
LoadCommittedDetails details;
- cont.RendererDidNavigate(main_test_rfh(), params, &details);
+ cont.RendererDidNavigate(contents()->GetMainFrame(), params, &details);
// Also check title and url.
EXPECT_EQ(base::ASCIIToUTF16(kUrl), contents()->GetTitle());
}
// Test simple same-SiteInstance navigation.
TEST_F(WebContentsImplTest, SimpleNavigation) {
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
SiteInstance* instance1 = contents()->GetSiteInstance();
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
// Navigate to URL
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(instance1, orig_rvh->GetSiteInstance());
+ EXPECT_EQ(instance1, orig_rfh->GetSiteInstance());
// Controller's pending entry will have a NULL site instance until we assign
// it in DidNavigate.
EXPECT_TRUE(
site_instance() == NULL);
// DidNavigate from the page
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
- EXPECT_EQ(instance1, orig_rvh->GetSiteInstance());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
+ EXPECT_EQ(instance1, orig_rfh->GetSiteInstance());
// Controller's entry should now have the SiteInstance, or else we won't be
// able to find it later.
EXPECT_EQ(
GetMaxURLChars() + 1, 'a'));
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_GENERATED, std::string());
+ url, Referrer(), ui::PAGE_TRANSITION_GENERATED, std::string());
EXPECT_TRUE(controller().GetVisibleEntry() == NULL);
}
// Test that navigating across a site boundary creates a new RenderViewHost
// with a new SiteInstance. Going back should do the same.
TEST_F(WebContentsImplTest, CrossSiteBoundaries) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
- RenderFrameHostImpl* orig_rfh =
- contents()->GetFrameTree()->root()->current_frame_host();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
int orig_rvh_delete_count = 0;
- orig_rvh->set_delete_counter(&orig_rvh_delete_count);
+ orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count);
SiteInstance* instance1 = contents()->GetSiteInstance();
// Navigate to URL. First URL should use first RenderViewHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
- // Keep the number of active views in orig_rvh's SiteInstance
- // non-zero so that orig_rvh doesn't get deleted when it gets
- // swapped out.
- static_cast<SiteInstanceImpl*>(orig_rvh->GetSiteInstance())->
+ // Keep the number of active views in orig_rfh's SiteInstance non-zero so that
+ // orig_rfh doesn't get deleted when it gets swapped out.
+ static_cast<SiteInstanceImpl*>(orig_rfh->GetSiteInstance())->
increment_active_view_count();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost());
EXPECT_EQ(url, contents()->GetLastCommittedURL());
EXPECT_EQ(url, contents()->GetVisibleURL());
// Navigate to new site
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_TRUE(contents()->cross_navigation_pending());
EXPECT_EQ(url, contents()->GetLastCommittedURL());
EXPECT_EQ(url2, contents()->GetVisibleURL());
- TestRenderViewHost* pending_rvh =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
int pending_rvh_delete_count = 0;
- pending_rvh->set_delete_counter(&pending_rvh_delete_count);
- RenderFrameHostImpl* pending_rfh = contents()->GetFrameTree()->root()->
- render_manager()->pending_frame_host();
+ pending_rfh->GetRenderViewHost()->set_delete_counter(
+ &pending_rvh_delete_count);
- // Navigations should be suspended in pending_rvh until BeforeUnloadACK.
- EXPECT_TRUE(pending_rvh->are_navigations_suspended());
- orig_rvh->SendBeforeUnloadACK(true);
- EXPECT_FALSE(pending_rvh->are_navigations_suspended());
+ // Navigations should be suspended in pending_rfh until BeforeUnloadACK.
+ EXPECT_TRUE(pending_rfh->are_navigations_suspended());
+ orig_rfh->GetRenderViewHost()->SendBeforeUnloadACK(true);
+ EXPECT_FALSE(pending_rfh->are_navigations_suspended());
// DidNavigate from the pending page
contents()->TestDidNavigate(
- pending_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance2 = contents()->GetSiteInstance();
- // Keep the number of active views in pending_rvh's SiteInstance
- // non-zero so that orig_rvh doesn't get deleted when it gets
+ // Keep the number of active views in pending_rfh's SiteInstance
+ // non-zero so that orig_rfh doesn't get deleted when it gets
// swapped out.
- static_cast<SiteInstanceImpl*>(pending_rvh->GetSiteInstance())->
+ static_cast<SiteInstanceImpl*>(pending_rfh->GetSiteInstance())->
increment_active_view_count();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(pending_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(pending_rfh, contents()->GetMainFrame());
EXPECT_EQ(url2, contents()->GetLastCommittedURL());
EXPECT_EQ(url2, contents()->GetVisibleURL());
EXPECT_NE(instance1, instance2);
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
// We keep the original RFH around, swapped out.
EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList(
orig_rfh));
// Going back should switch SiteInstances again. The first SiteInstance is
// stored in the NavigationEntry, so it should be the same as at the start.
- // We should use the same RVH as before, swapping it back in.
+ // We should use the same RFH as before, swapping it back in.
controller().GoBack();
- TestRenderViewHost* goback_rvh =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
- EXPECT_EQ(orig_rvh, goback_rvh);
+ TestRenderFrameHost* goback_rfh = contents()->GetPendingMainFrame();
+ EXPECT_EQ(orig_rfh, goback_rfh);
EXPECT_TRUE(contents()->cross_navigation_pending());
- // Navigations should be suspended in goback_rvh until BeforeUnloadACK.
- EXPECT_TRUE(goback_rvh->are_navigations_suspended());
- pending_rvh->SendBeforeUnloadACK(true);
- EXPECT_FALSE(goback_rvh->are_navigations_suspended());
+ // Navigations should be suspended in goback_rfh until BeforeUnloadACK.
+ EXPECT_TRUE(goback_rfh->are_navigations_suspended());
+ pending_rfh->GetRenderViewHost()->SendBeforeUnloadACK(true);
+ EXPECT_FALSE(goback_rfh->are_navigations_suspended());
// DidNavigate from the back action
- contents()->TestDidNavigate(
- goback_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(goback_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(goback_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(goback_rfh, contents()->GetMainFrame());
EXPECT_EQ(instance1, contents()->GetSiteInstance());
// The pending RFH should now be swapped out, not deleted.
EXPECT_TRUE(contents()->GetRenderManagerForTesting()->
IsOnSwappedOutList(pending_rfh));
EXPECT_EQ(pending_rvh_delete_count, 0);
- pending_rvh->OnSwappedOut(false);
+ pending_rfh->OnSwappedOut(false);
// Close contents and ensure RVHs are deleted.
DeleteContents();
}
// Test that navigating across a site boundary after a crash creates a new
-// RVH without requiring a cross-site transition (i.e., PENDING state).
+// RFH without requiring a cross-site transition (i.e., PENDING state).
TEST_F(WebContentsImplTest, CrossSiteBoundariesAfterCrash) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
+
int orig_rvh_delete_count = 0;
- orig_rvh->set_delete_counter(&orig_rvh_delete_count);
+ orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count);
SiteInstance* instance1 = contents()->GetSiteInstance();
// Navigate to URL. First URL should use first RenderViewHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost());
- // Crash the renderer.
- orig_rvh->set_render_view_created(false);
+ // Simulate a renderer crash.
+ orig_rfh->GetRenderViewHost()->set_render_view_created(false);
+ orig_rfh->set_render_frame_created(false);
// Navigate to new site. We should not go into PENDING.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- RenderViewHost* new_rvh = rvh();
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ TestRenderFrameHost* new_rfh = contents()->GetMainFrame();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
- EXPECT_NE(orig_rvh, new_rvh);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
+ EXPECT_NE(orig_rfh, new_rfh);
EXPECT_EQ(orig_rvh_delete_count, 1);
// DidNavigate from the new page
- contents()->TestDidNavigate(new_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(new_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance2 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(new_rvh, rvh());
+ EXPECT_EQ(new_rfh, main_rfh());
EXPECT_NE(instance1, instance2);
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
// Close contents and ensure RVHs are deleted.
DeleteContents();
// both contentses to a new site will place both contentses in a single
// SiteInstance.
TEST_F(WebContentsImplTest, NavigateTwoTabsCrossSite) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
SiteInstance* instance1 = contents()->GetSiteInstance();
// Navigate to URL. First URL should use first RenderViewHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
// Open a new contents with the same SiteInstance, navigated to the same site.
scoped_ptr<TestWebContents> contents2(
TestWebContents::Create(browser_context(), instance1));
- contents2->transition_cross_site = true;
contents2->GetController().LoadURL(url, Referrer(),
- PAGE_TRANSITION_TYPED,
- std::string());
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
// Need this page id to be 2 since the site instance is the same (which is the
// scope of page IDs) and we want to consider this a new page.
contents2->TestDidNavigate(
- contents2->GetRenderViewHost(), 2, url, PAGE_TRANSITION_TYPED);
+ contents2->GetMainFrame(), 2, url, ui::PAGE_TRANSITION_TYPED);
// Navigate first contents to a new site.
const GURL url2a("http://www.yahoo.com");
controller().LoadURL(
- url2a, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- orig_rvh->SendBeforeUnloadACK(true);
- TestRenderViewHost* pending_rvh_a =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
+ url2a, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ orig_rfh->GetRenderViewHost()->SendBeforeUnloadACK(true);
+ TestRenderFrameHost* pending_rfh_a = contents()->GetPendingMainFrame();
contents()->TestDidNavigate(
- pending_rvh_a, 1, url2a, PAGE_TRANSITION_TYPED);
+ pending_rfh_a, 1, url2a, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance2a = contents()->GetSiteInstance();
EXPECT_NE(instance1, instance2a);
// Navigate second contents to the same site as the first tab.
const GURL url2b("http://mail.yahoo.com");
contents2->GetController().LoadURL(url2b, Referrer(),
- PAGE_TRANSITION_TYPED,
- std::string());
- TestRenderViewHost* rvh2 =
- static_cast<TestRenderViewHost*>(contents2->GetRenderViewHost());
- rvh2->SendBeforeUnloadACK(true);
- TestRenderViewHost* pending_rvh_b =
- static_cast<TestRenderViewHost*>(contents2->GetPendingRenderViewHost());
- EXPECT_TRUE(pending_rvh_b != NULL);
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
+ TestRenderFrameHost* rfh2 = contents2->GetMainFrame();
+ rfh2->GetRenderViewHost()->SendBeforeUnloadACK(true);
+ TestRenderFrameHost* pending_rfh_b = contents2->GetPendingMainFrame();
+ EXPECT_TRUE(pending_rfh_b != NULL);
EXPECT_TRUE(contents2->cross_navigation_pending());
// NOTE(creis): We used to be in danger of showing a crash page here if the
// second contents hadn't navigated somewhere first (bug 1145430). That case
// is now covered by the CrossSiteBoundariesAfterCrash test.
contents2->TestDidNavigate(
- pending_rvh_b, 2, url2b, PAGE_TRANSITION_TYPED);
+ pending_rfh_b, 2, url2b, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance2b = contents2->GetSiteInstance();
EXPECT_NE(instance1, instance2b);
EXPECT_EQ(instance2a, instance2b);
}
-TEST_F(WebContentsImplTest, NavigateDoesNotUseUpSiteInstance) {
+// The embedder can request sites for certain urls not be be assigned to the
+// SiteInstance through ShouldAssignSiteForURL() in content browser client,
+// allowing to reuse the renderer backing certain chrome urls for subsequent
+// navigation. The test verifies that the override is honored.
+TEST_F(WebContentsImplTest, NavigateFromSitelessUrl) {
WebContentsImplTestBrowserClient browser_client;
SetBrowserClientForTesting(&browser_client);
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
- RenderFrameHostImpl* orig_rfh =
- contents()->GetFrameTree()->root()->current_frame_host();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
int orig_rvh_delete_count = 0;
- orig_rvh->set_delete_counter(&orig_rvh_delete_count);
+ orig_rfh->GetRenderViewHost()->set_delete_counter(&orig_rvh_delete_count);
SiteInstanceImpl* orig_instance =
static_cast<SiteInstanceImpl*>(contents()->GetSiteInstance());
// Navigate to an URL that will not assign a new SiteInstance.
const GURL native_url("non-site-url://stuffandthings");
controller().LoadURL(
- native_url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, native_url, PAGE_TRANSITION_TYPED);
+ native_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(
+ orig_rfh, 1, native_url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
EXPECT_EQ(native_url, contents()->GetLastCommittedURL());
EXPECT_EQ(native_url, contents()->GetVisibleURL());
EXPECT_EQ(orig_instance, contents()->GetSiteInstance());
// Navigate to new site (should keep same site instance).
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(contents()->cross_navigation_pending());
EXPECT_EQ(native_url, contents()->GetLastCommittedURL());
EXPECT_EQ(url, contents()->GetVisibleURL());
- EXPECT_FALSE(contents()->GetPendingRenderViewHost());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ EXPECT_FALSE(contents()->GetPendingMainFrame());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
- // Keep the number of active views in orig_rvh's SiteInstance
- // non-zero so that orig_rvh doesn't get deleted when it gets
+ // Keep the number of active views in orig_rfh's SiteInstance
+ // non-zero so that orig_rfh doesn't get deleted when it gets
// swapped out.
- static_cast<SiteInstanceImpl*>(orig_rvh->GetSiteInstance())->
+ static_cast<SiteInstanceImpl*>(orig_rfh->GetSiteInstance())->
increment_active_view_count();
EXPECT_EQ(orig_instance, contents()->GetSiteInstance());
// Navigate to another new site (should create a new site instance).
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_TRUE(contents()->cross_navigation_pending());
EXPECT_EQ(url, contents()->GetLastCommittedURL());
EXPECT_EQ(url2, contents()->GetVisibleURL());
- TestRenderViewHost* pending_rvh =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
int pending_rvh_delete_count = 0;
- pending_rvh->set_delete_counter(&pending_rvh_delete_count);
+ pending_rfh->GetRenderViewHost()->set_delete_counter(
+ &pending_rvh_delete_count);
// Navigations should be suspended in pending_rvh until BeforeUnloadACK.
- EXPECT_TRUE(pending_rvh->are_navigations_suspended());
- orig_rvh->SendBeforeUnloadACK(true);
- EXPECT_FALSE(pending_rvh->are_navigations_suspended());
+ EXPECT_TRUE(pending_rfh->are_navigations_suspended());
+ orig_rfh->GetRenderViewHost()->SendBeforeUnloadACK(true);
+ EXPECT_FALSE(pending_rfh->are_navigations_suspended());
// DidNavigate from the pending page.
contents()->TestDidNavigate(
- pending_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
SiteInstance* new_instance = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(pending_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(pending_rfh, contents()->GetMainFrame());
EXPECT_EQ(url2, contents()->GetLastCommittedURL());
EXPECT_EQ(url2, contents()->GetVisibleURL());
EXPECT_NE(new_instance, orig_instance);
- EXPECT_FALSE(contents()->GetPendingRenderViewHost());
+ EXPECT_FALSE(contents()->GetPendingMainFrame());
// We keep the original RFH around, swapped out.
EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList(
orig_rfh));
EXPECT_EQ(orig_rvh_delete_count, 0);
- orig_rvh->OnSwappedOut(false);
+ orig_rfh->OnSwappedOut(false);
// Close contents and ensure RVHs are deleted.
DeleteContents();
EXPECT_EQ(pending_rvh_delete_count, 1);
}
+// Regression test for http://crbug.com/386542 - variation of
+// NavigateFromSitelessUrl in which the original navigation is a session
+// restore.
+TEST_F(WebContentsImplTest, NavigateFromRestoredSitelessUrl) {
+ WebContentsImplTestBrowserClient browser_client;
+ SetBrowserClientForTesting(&browser_client);
+ SiteInstanceImpl* orig_instance =
+ static_cast<SiteInstanceImpl*>(contents()->GetSiteInstance());
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
+
+ // Restore a navigation entry for URL that should not assign site to the
+ // SiteInstance.
+ browser_client.set_assign_site_for_url(false);
+ const GURL native_url("non-site-url://stuffandthings");
+ std::vector<NavigationEntry*> entries;
+ NavigationEntry* entry = NavigationControllerImpl::CreateNavigationEntry(
+ native_url, Referrer(), ui::PAGE_TRANSITION_LINK, false, std::string(),
+ browser_context());
+ entry->SetPageID(0);
+ entries.push_back(entry);
+ controller().Restore(
+ 0,
+ NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY,
+ &entries);
+ ASSERT_EQ(0u, entries.size());
+ ASSERT_EQ(1, controller().GetEntryCount());
+ controller().GoToIndex(0);
+ contents()->TestDidNavigate(
+ orig_rfh, 0, native_url, ui::PAGE_TRANSITION_RELOAD);
+ EXPECT_EQ(orig_instance, contents()->GetSiteInstance());
+ EXPECT_EQ(GURL(), contents()->GetSiteInstance()->GetSiteURL());
+ EXPECT_FALSE(orig_instance->HasSite());
+
+ // Navigate to a regular site and verify that the SiteInstance was kept.
+ browser_client.set_assign_site_for_url(true);
+ const GURL url("http://www.google.com");
+ controller().LoadURL(
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 2, url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_EQ(orig_instance, contents()->GetSiteInstance());
+
+ // Cleanup.
+ DeleteContents();
+}
+
+// Complement for NavigateFromRestoredSitelessUrl, verifying that when a regular
+// tab is restored, the SiteInstance will change upon navigation.
+TEST_F(WebContentsImplTest, NavigateFromRestoredRegularUrl) {
+ WebContentsImplTestBrowserClient browser_client;
+ SetBrowserClientForTesting(&browser_client);
+ SiteInstanceImpl* orig_instance =
+ static_cast<SiteInstanceImpl*>(contents()->GetSiteInstance());
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
+
+ // Restore a navigation entry for a regular URL ensuring that the embedder
+ // ShouldAssignSiteForUrl override is disabled (i.e. returns true).
+ browser_client.set_assign_site_for_url(true);
+ const GURL regular_url("http://www.yahoo.com");
+ std::vector<NavigationEntry*> entries;
+ NavigationEntry* entry = NavigationControllerImpl::CreateNavigationEntry(
+ regular_url, Referrer(), ui::PAGE_TRANSITION_LINK, false, std::string(),
+ browser_context());
+ entry->SetPageID(0);
+ entries.push_back(entry);
+ controller().Restore(
+ 0,
+ NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY,
+ &entries);
+ ASSERT_EQ(0u, entries.size());
+ ASSERT_EQ(1, controller().GetEntryCount());
+ controller().GoToIndex(0);
+ contents()->TestDidNavigate(
+ orig_rfh, 0, regular_url, ui::PAGE_TRANSITION_RELOAD);
+ EXPECT_EQ(orig_instance, contents()->GetSiteInstance());
+ EXPECT_TRUE(orig_instance->HasSite());
+
+ // Navigate to another site and verify that a new SiteInstance was created.
+ const GURL url("http://www.google.com");
+ controller().LoadURL(
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(
+ contents()->GetPendingMainFrame(), 2, url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_NE(orig_instance, contents()->GetSiteInstance());
+
+ // Cleanup.
+ DeleteContents();
+}
+
// Test that we can find an opener RVH even if it's pending.
// http://crbug.com/176252.
TEST_F(WebContentsImplTest, FindOpenerRVHWhenPending) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
// Navigate to a URL.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
// Start to navigate first tab to a new site, so that it has a pending RVH.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- orig_rvh->SendBeforeUnloadACK(true);
- TestRenderViewHost* pending_rvh =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ orig_rfh->GetRenderViewHost()->SendBeforeUnloadACK(true);
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
// While it is still pending, simulate opening a new tab with the first tab
// as its opener. This will call WebContentsImpl::CreateOpenerRenderViews
// on the opener to ensure that an RVH exists.
- int opener_routing_id = contents()->CreateOpenerRenderViews(
- pending_rvh->GetSiteInstance());
+ int opener_routing_id =
+ contents()->CreateOpenerRenderViews(pending_rfh->GetSiteInstance());
// We should find the pending RVH and not create a new one.
- EXPECT_EQ(pending_rvh->GetRoutingID(), opener_routing_id);
+ EXPECT_EQ(pending_rfh->GetRenderViewHost()->GetRoutingID(),
+ opener_routing_id);
}
// Tests that WebContentsImpl uses the current URL, not the SiteInstance's site,
// to determine whether a navigation is cross-site.
TEST_F(WebContentsImplTest, CrossSiteComparesAgainstCurrentPage) {
- contents()->transition_cross_site = true;
- RenderViewHost* orig_rvh = rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
SiteInstance* instance1 = contents()->GetSiteInstance();
// Navigate to URL.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
contents()->TestDidNavigate(
- orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
// Open a related contents to a second site.
scoped_ptr<TestWebContents> contents2(
TestWebContents::Create(browser_context(), instance1));
- contents2->transition_cross_site = true;
const GURL url2("http://www.yahoo.com");
contents2->GetController().LoadURL(url2, Referrer(),
- PAGE_TRANSITION_TYPED,
- std::string());
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
// The first RVH in contents2 isn't live yet, so we shortcut the cross site
// pending.
- TestRenderViewHost* rvh2 = static_cast<TestRenderViewHost*>(
- contents2->GetRenderViewHost());
+ TestRenderFrameHost* rfh2 = contents2->GetMainFrame();
EXPECT_FALSE(contents2->cross_navigation_pending());
- contents2->TestDidNavigate(rvh2, 2, url2, PAGE_TRANSITION_TYPED);
+ contents2->TestDidNavigate(rfh2, 2, url2, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance2 = contents2->GetSiteInstance();
EXPECT_NE(instance1, instance2);
EXPECT_FALSE(contents2->cross_navigation_pending());
// Simulate a link click in first contents to second site. Doesn't switch
// SiteInstances, because we don't intercept WebKit navigations.
contents()->TestDidNavigate(
- orig_rvh, 2, url2, PAGE_TRANSITION_TYPED);
+ orig_rfh, 2, url2, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance3 = contents()->GetSiteInstance();
EXPECT_EQ(instance1, instance3);
EXPECT_FALSE(contents()->cross_navigation_pending());
// compare against the current URL, not the SiteInstance's site.
const GURL url3("http://mail.yahoo.com");
controller().LoadURL(
- url3, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(contents()->cross_navigation_pending());
contents()->TestDidNavigate(
- orig_rvh, 3, url3, PAGE_TRANSITION_TYPED);
+ orig_rfh, 3, url3, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance4 = contents()->GetSiteInstance();
EXPECT_EQ(instance1, instance4);
}
// Test that the onbeforeunload and onunload handlers run when navigating
// across site boundaries.
TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
SiteInstance* instance1 = contents()->GetSiteInstance();
// Navigate to URL. First URL should use first RenderViewHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Navigate to new site, but simulate an onbeforeunload denial.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ EXPECT_TRUE(orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
base::TimeTicks now = base::TimeTicks::Now();
- orig_rvh->GetMainFrame()->OnMessageReceived(
+ orig_rfh->OnMessageReceived(
FrameHostMsg_BeforeUnload_ACK(0, false, now, now));
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_FALSE(
+ orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Navigate again, but simulate an onbeforeunload approval.
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ EXPECT_TRUE(orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
now = base::TimeTicks::Now();
- orig_rvh->GetMainFrame()->OnMessageReceived(
+ orig_rfh->OnMessageReceived(
FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_FALSE(
+ orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
EXPECT_TRUE(contents()->cross_navigation_pending());
- TestRenderViewHost* pending_rvh = static_cast<TestRenderViewHost*>(
- contents()->GetPendingRenderViewHost());
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
// We won't hear DidNavigate until the onunload handler has finished running.
// DidNavigate from the pending page.
contents()->TestDidNavigate(
- pending_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
SiteInstance* instance2 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(pending_rvh, rvh());
+ EXPECT_EQ(pending_rfh, contents()->GetMainFrame());
EXPECT_NE(instance1, instance2);
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
}
// Test that during a slow cross-site navigation, the original renderer can
// navigate to a different URL and have it displayed, canceling the slow
// navigation.
TEST_F(WebContentsImplTest, CrossSiteNavigationPreempted) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
SiteInstance* instance1 = contents()->GetSiteInstance();
- // Navigate to URL. First URL should use first RenderViewHost.
+ // Navigate to URL. First URL should use first RenderFrameHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Navigate to new site, simulating an onbeforeunload approval.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ EXPECT_TRUE(orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
base::TimeTicks now = base::TimeTicks::Now();
- orig_rvh->GetMainFrame()->OnMessageReceived(
- FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
+ orig_rfh->OnMessageReceived(FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
EXPECT_TRUE(contents()->cross_navigation_pending());
// Suppose the original renderer navigates before the new one is ready.
- orig_rvh->SendNavigate(2, GURL("http://www.google.com/foo"));
+ orig_rfh->SendNavigate(2, GURL("http://www.google.com/foo"));
// Verify that the pending navigation is cancelled.
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_FALSE(
+ orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
SiteInstance* instance2 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, rvh());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
EXPECT_EQ(instance1, instance2);
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
}
TEST_F(WebContentsImplTest, CrossSiteNavigationBackPreempted) {
- contents()->transition_cross_site = true;
-
// Start with a web ui page, which gets a new RVH with WebUI bindings.
const GURL url1("chrome://blah");
controller().LoadURL(
- url1, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- TestRenderViewHost* ntp_rvh = test_rvh();
- contents()->TestDidNavigate(ntp_rvh, 1, url1, PAGE_TRANSITION_TYPED);
+ url1, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame();
+ contents()->TestDidNavigate(ntp_rfh, 1, url1, ui::PAGE_TRANSITION_TYPED);
NavigationEntry* entry1 = controller().GetLastCommittedEntry();
SiteInstance* instance1 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(ntp_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(ntp_rfh, contents()->GetMainFrame());
EXPECT_EQ(url1, entry1->GetURL());
EXPECT_EQ(instance1,
NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance());
- EXPECT_TRUE(ntp_rvh->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
+ EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->GetEnabledBindings() &
+ BINDINGS_POLICY_WEB_UI);
// Navigate to new site.
const GURL url2("http://www.google.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_TRUE(contents()->cross_navigation_pending());
- TestRenderViewHost* google_rvh =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
+ TestRenderFrameHost* google_rfh = contents()->GetPendingMainFrame();
// Simulate beforeunload approval.
- EXPECT_TRUE(ntp_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
base::TimeTicks now = base::TimeTicks::Now();
- ntp_rvh->GetMainFrame()->OnMessageReceived(
+ ntp_rfh->OnMessageReceived(
FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
// DidNavigate from the pending page.
contents()->TestDidNavigate(
- google_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ google_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
NavigationEntry* entry2 = controller().GetLastCommittedEntry();
SiteInstance* instance2 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(google_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(google_rfh, contents()->GetMainFrame());
EXPECT_NE(instance1, instance2);
- EXPECT_FALSE(contents()->GetPendingRenderViewHost());
+ EXPECT_FALSE(contents()->GetPendingMainFrame());
EXPECT_EQ(url2, entry2->GetURL());
EXPECT_EQ(instance2,
NavigationEntryImpl::FromNavigationEntry(entry2)->site_instance());
- EXPECT_FALSE(google_rvh->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
+ EXPECT_FALSE(google_rfh->GetRenderViewHost()->GetEnabledBindings() &
+ BINDINGS_POLICY_WEB_UI);
// Navigate to third page on same site.
const GURL url3("http://news.google.com");
controller().LoadURL(
- url3, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(contents()->cross_navigation_pending());
contents()->TestDidNavigate(
- google_rvh, 2, url3, PAGE_TRANSITION_TYPED);
+ google_rfh, 2, url3, ui::PAGE_TRANSITION_TYPED);
NavigationEntry* entry3 = controller().GetLastCommittedEntry();
SiteInstance* instance3 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(google_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(google_rfh, contents()->GetMainFrame());
EXPECT_EQ(instance2, instance3);
- EXPECT_FALSE(contents()->GetPendingRenderViewHost());
+ EXPECT_FALSE(contents()->GetPendingMainFrame());
EXPECT_EQ(url3, entry3->GetURL());
EXPECT_EQ(instance3,
NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance());
// Before that commits, go back again.
controller().GoBack();
EXPECT_TRUE(contents()->cross_navigation_pending());
- EXPECT_TRUE(contents()->GetPendingRenderViewHost());
+ EXPECT_TRUE(contents()->GetPendingMainFrame());
EXPECT_EQ(entry1, controller().GetPendingEntry());
// Simulate beforeunload approval.
- EXPECT_TRUE(google_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_TRUE(
+ google_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
now = base::TimeTicks::Now();
- google_rvh->GetMainFrame()->OnMessageReceived(
+ google_rfh->OnMessageReceived(
FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
- // DidNavigate from the first back. This aborts the second back's pending RVH.
- contents()->TestDidNavigate(google_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ // DidNavigate from the first back. This aborts the second back's pending RFH.
+ contents()->TestDidNavigate(google_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
// We should commit this page and forget about the second back.
EXPECT_FALSE(contents()->cross_navigation_pending());
EXPECT_FALSE(controller().GetPendingEntry());
- EXPECT_EQ(google_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(google_rfh, contents()->GetMainFrame());
EXPECT_EQ(url2, controller().GetLastCommittedEntry()->GetURL());
// We should not have corrupted the NTP entry.
// Test that during a slow cross-site navigation, a sub-frame navigation in the
// original renderer will not cancel the slow navigation (bug 42029).
TEST_F(WebContentsImplTest, CrossSiteNavigationNotPreemptedByFrame) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
- // Navigate to URL. First URL should use first RenderViewHost.
+ // Navigate to URL. First URL should use the original RenderFrameHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Start navigating to new site.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
// Simulate a sub-frame navigation arriving and ensure the RVH is still
// waiting for a before unload response.
- orig_rvh->SendNavigateWithTransition(1, GURL("http://google.com/frame"),
- PAGE_TRANSITION_AUTO_SUBFRAME);
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
+ TestRenderFrameHost* child_rfh = orig_rfh->AppendChild("subframe");
+ child_rfh->SendNavigateWithTransition(
+ 1, GURL("http://google.com/frame"), ui::PAGE_TRANSITION_AUTO_SUBFRAME);
+ EXPECT_TRUE(orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
// Now simulate the onbeforeunload approval and verify the navigation is
// not canceled.
base::TimeTicks now = base::TimeTicks::Now();
- orig_rvh->GetMainFrame()->OnMessageReceived(
+ orig_rfh->OnMessageReceived(
FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_FALSE(
+ orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
EXPECT_TRUE(contents()->cross_navigation_pending());
}
// We should only preempt the cross-site navigation if the previous renderer
// has started a new navigation. See http://crbug.com/79176.
TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) {
- contents()->transition_cross_site = true;
-
// Navigate to NTP URL.
const GURL url("chrome://blah");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- TestRenderViewHost* orig_rvh = test_rvh();
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
EXPECT_FALSE(contents()->cross_navigation_pending());
// Navigate to new site, with the beforeunload request in flight.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- TestRenderViewHost* pending_rvh =
- static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost());
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
EXPECT_TRUE(contents()->cross_navigation_pending());
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_TRUE(orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
// Suppose the first navigation tries to commit now, with a
- // ViewMsg_Stop in flight. This should not cancel the pending navigation,
+ // FrameMsg_Stop in flight. This should not cancel the pending navigation,
// but it should act as if the beforeunload ack arrived.
- orig_rvh->SendNavigate(1, GURL("chrome://blah"));
+ orig_rfh->SendNavigate(1, GURL("chrome://blah"));
EXPECT_TRUE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
+ EXPECT_FALSE(
+ orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
// The pending navigation should be able to commit successfully.
- contents()->TestDidNavigate(pending_rvh, 1, url2, PAGE_TRANSITION_TYPED);
- EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(pending_rvh, contents()->GetRenderViewHost());
-}
-
-// Test that the original renderer cannot preempt a cross-site navigation once
-// the unload request has been made. At this point, the cross-site navigation
-// is almost ready to be displayed, and the original renderer is only given a
-// short chance to run an unload handler. Prevents regression of bug 23942.
-TEST_F(WebContentsImplTest, CrossSiteCantPreemptAfterUnload) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
- SiteInstance* instance1 = contents()->GetSiteInstance();
-
- // Navigate to URL. First URL should use first RenderViewHost.
- const GURL url("http://www.google.com");
- controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
- EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
-
- // Navigate to new site, simulating an onbeforeunload approval.
- const GURL url2("http://www.yahoo.com");
- controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- base::TimeTicks now = base::TimeTicks::Now();
- orig_rvh->GetMainFrame()->OnMessageReceived(
- FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
- EXPECT_TRUE(contents()->cross_navigation_pending());
- TestRenderViewHost* pending_rvh = static_cast<TestRenderViewHost*>(
- contents()->GetPendingRenderViewHost());
-
- // Simulate the pending renderer's response, which leads to an unload request
- // being sent to orig_rvh.
- std::vector<GURL> url_chain;
- url_chain.push_back(GURL());
- contents()->GetRenderManagerForTesting()->OnCrossSiteResponse(
- contents()->GetRenderManagerForTesting()->pending_frame_host(),
- GlobalRequestID(0, 0), scoped_ptr<CrossSiteTransferringRequest>(),
- url_chain, Referrer(), PAGE_TRANSITION_TYPED, false);
-
- // Suppose the original renderer navigates now, while the unload request is in
- // flight. We should ignore it, wait for the unload ack, and let the pending
- // request continue. Otherwise, the contents may close spontaneously or stop
- // responding to navigation requests. (See bug 23942.)
- FrameHostMsg_DidCommitProvisionalLoad_Params params1a;
- InitNavigateParams(¶ms1a, 2, GURL("http://www.google.com/foo"),
- PAGE_TRANSITION_TYPED);
- orig_rvh->SendNavigate(2, GURL("http://www.google.com/foo"));
-
- // Verify that the pending navigation is still in progress.
- EXPECT_TRUE(contents()->cross_navigation_pending());
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() != NULL);
-
- // DidNavigate from the pending page should commit it.
- contents()->TestDidNavigate(
- pending_rvh, 1, url2, PAGE_TRANSITION_TYPED);
- SiteInstance* instance2 = contents()->GetSiteInstance();
+ contents()->TestDidNavigate(pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(pending_rvh, rvh());
- EXPECT_NE(instance1, instance2);
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_EQ(pending_rfh, contents()->GetMainFrame());
}
// Test that a cross-site navigation that doesn't commit after the unload
// handler doesn't leave the contents in a stuck state. http://crbug.com/88562
TEST_F(WebContentsImplTest, CrossSiteNavigationCanceled) {
- contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
SiteInstance* instance1 = contents()->GetSiteInstance();
- // Navigate to URL. First URL should use first RenderViewHost.
+ // Navigate to URL. First URL should use original RenderFrameHost.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Navigate to new site, simulating an onbeforeunload approval.
const GURL url2("http://www.yahoo.com");
- controller().LoadURL(url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
+ controller().LoadURL(
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ EXPECT_TRUE(orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
base::TimeTicks now = base::TimeTicks::Now();
- orig_rvh->GetMainFrame()->OnMessageReceived(
+ orig_rfh->OnMessageReceived(
FrameHostMsg_BeforeUnload_ACK(0, true, now, now));
EXPECT_TRUE(contents()->cross_navigation_pending());
// Simulate swap out message when the response arrives.
- orig_rvh->OnSwappedOut(false);
+ orig_rfh->OnSwappedOut(false);
// Suppose the navigation doesn't get a chance to commit, and the user
- // navigates in the current RVH's SiteInstance.
- controller().LoadURL(url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ // navigates in the current RFH's SiteInstance.
+ controller().LoadURL(
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
// Verify that the pending navigation is cancelled and the renderer is no
// longer swapped out.
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
+ EXPECT_FALSE(
+ orig_rfh->GetRenderViewHost()->is_waiting_for_beforeunload_ack());
SiteInstance* instance2 = contents()->GetSiteInstance();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, rvh());
- EXPECT_EQ(RenderViewHostImpl::STATE_DEFAULT, orig_rvh->rvh_state());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
+ EXPECT_EQ(RenderViewHostImpl::STATE_DEFAULT,
+ orig_rfh->GetRenderViewHost()->rvh_state());
EXPECT_EQ(instance1, instance2);
- EXPECT_TRUE(contents()->GetPendingRenderViewHost() == NULL);
+ EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
}
// Test that NavigationEntries have the correct page state after going
// forward and back. Prevents regression for bug 1116137.
TEST_F(WebContentsImplTest, NavigationEntryContentState) {
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
// Navigate to URL. There should be no committed entry yet.
const GURL url("http://www.google.com");
- controller().LoadURL(url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ controller().LoadURL(
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
NavigationEntry* entry = controller().GetLastCommittedEntry();
EXPECT_TRUE(entry == NULL);
// Committed entry should have page state after DidNavigate.
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
entry = controller().GetLastCommittedEntry();
EXPECT_TRUE(entry->GetPageState().IsValid());
// Navigate to same site.
const GURL url2("http://images.google.com");
- controller().LoadURL(url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ controller().LoadURL(
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
entry = controller().GetLastCommittedEntry();
EXPECT_TRUE(entry->GetPageState().IsValid());
// Committed entry should have page state after DidNavigate.
- contents()->TestDidNavigate(orig_rvh, 2, url2, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(orig_rfh, 2, url2, ui::PAGE_TRANSITION_TYPED);
entry = controller().GetLastCommittedEntry();
EXPECT_TRUE(entry->GetPageState().IsValid());
// Now go back. Committed entry should still have page state.
controller().GoBack();
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
entry = controller().GetLastCommittedEntry();
EXPECT_TRUE(entry->GetPageState().IsValid());
}
// state after opening a new window to about:blank. Prevents regression for
// bugs b/1116137 and http://crbug.com/111975.
TEST_F(WebContentsImplTest, NavigationEntryContentStateNewWindow) {
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
// When opening a new window, it is navigated to about:blank internally.
// Currently, this results in two DidNavigate events.
- const GURL url(kAboutBlankURL);
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
+ const GURL url(url::kAboutBlankURL);
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
// Should have a page state here.
NavigationEntry* entry = controller().GetLastCommittedEntry();
// Navigating to a normal page should not cause a process swap.
const GURL new_url("http://www.google.com");
controller().LoadURL(new_url, Referrer(),
- PAGE_TRANSITION_TYPED, std::string());
+ ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
- contents()->TestDidNavigate(orig_rvh, 1, new_url, PAGE_TRANSITION_TYPED);
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
+ contents()->TestDidNavigate(orig_rfh, 1, new_url, ui::PAGE_TRANSITION_TYPED);
NavigationEntryImpl* entry_impl2 = NavigationEntryImpl::FromNavigationEntry(
controller().GetLastCommittedEntry());
EXPECT_EQ(site_instance_id, entry_impl2->site_instance()->GetId());
TEST_F(WebContentsImplTest, NavigationExitsFullscreen) {
FakeFullscreenDelegate fake_delegate;
contents()->SetDelegate(&fake_delegate);
- TestRenderViewHost* orig_rvh = test_rvh();
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
+ TestRenderViewHost* orig_rvh = orig_rfh->GetRenderViewHost();
// Navigate to a site.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Toggle fullscreen mode on (as if initiated via IPC from renderer).
EXPECT_FALSE(orig_rvh->IsFullscreen());
// Navigate to a new site.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(
- url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- RenderViewHost* const pending_rvh = contents()->GetPendingRenderViewHost();
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ TestRenderFrameHost* const pending_rfh = contents()->GetPendingMainFrame();
contents()->TestDidNavigate(
- pending_rvh, 1, url2, PAGE_TRANSITION_TYPED);
+ pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
// Confirm fullscreen has exited.
EXPECT_FALSE(orig_rvh->IsFullscreen());
TEST_F(WebContentsImplTest, HistoryNavigationExitsFullscreen) {
FakeFullscreenDelegate fake_delegate;
contents()->SetDelegate(&fake_delegate);
- TestRenderViewHost* const orig_rvh = test_rvh();
+ TestRenderFrameHost* const orig_rfh = contents()->GetMainFrame();
+ TestRenderViewHost* const orig_rvh = orig_rfh->GetRenderViewHost();
// Navigate to a site.
const GURL url("http://www.google.com");
- controller().LoadURL(url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(orig_rvh, 1, url, PAGE_TRANSITION_TYPED);
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ controller().LoadURL(
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Now, navigate to another page on the same site.
const GURL url2("http://www.google.com/search?q=kittens");
- controller().LoadURL(url2, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ controller().LoadURL(
+ url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(contents()->cross_navigation_pending());
- contents()->TestDidNavigate(orig_rvh, 2, url2, PAGE_TRANSITION_TYPED);
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ contents()->TestDidNavigate(orig_rfh, 2, url2, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
// Sanity-check: Confirm we're not starting out in fullscreen mode.
EXPECT_FALSE(orig_rvh->IsFullscreen());
else
controller().GoForward();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
contents()->TestDidNavigate(
- orig_rvh, i + 1, url, PAGE_TRANSITION_FORWARD_BACK);
+ orig_rfh, i + 1, url, ui::PAGE_TRANSITION_FORWARD_BACK);
// Confirm fullscreen has exited.
EXPECT_FALSE(orig_rvh->IsFullscreen());
contents()->SetDelegate(NULL);
}
+TEST_F(WebContentsImplTest, TerminateHidesValidationMessage) {
+ FakeValidationMessageDelegate fake_delegate;
+ contents()->SetDelegate(&fake_delegate);
+ EXPECT_FALSE(fake_delegate.hide_validation_message_was_called());
+
+ // Crash the renderer.
+ contents()->GetMainFrame()->GetRenderViewHost()->OnMessageReceived(
+ ViewHostMsg_RenderProcessGone(
+ 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1));
+
+ // Confirm HideValidationMessage was called.
+ EXPECT_TRUE(fake_delegate.hide_validation_message_was_called());
+
+ contents()->SetDelegate(NULL);
+}
+
// Tests that fullscreen is exited throughout the object hierarchy on a renderer
// crash.
TEST_F(WebContentsImplTest, CrashExitsFullscreen) {
// Navigate to a site.
const GURL url("http://www.google.com");
controller().LoadURL(
- url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
- contents()->TestDidNavigate(test_rvh(), 1, url, PAGE_TRANSITION_TYPED);
- EXPECT_EQ(test_rvh(), contents()->GetRenderViewHost());
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(
+ contents()->GetMainFrame(), 1, url, ui::PAGE_TRANSITION_TYPED);
// Toggle fullscreen mode on (as if initiated via IPC from renderer).
EXPECT_FALSE(test_rvh()->IsFullscreen());
ShowInterstitialFromBrowserWithNewNavigationDontProceed) {
// Navigate to a page.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Initiate a browser navigation that will trigger the interstitial
controller().LoadURL(GURL("http://www.evil.com"), Referrer(),
- PAGE_TRANSITION_TYPED, std::string());
+ ui::PAGE_TRANSITION_TYPED, std::string());
// Show an interstitial.
TestInterstitialPage::InterstitialState state =
ShowInterstitiaFromRendererlWithNewNavigationDontProceed) {
// Navigate to a page.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial (no pending entry, the interstitial would have been
TEST_F(WebContentsImplTest, ShowInterstitialNoNewNavigationDontProceed) {
// Navigate to a page.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial.
ShowInterstitialFromBrowserNewNavigationProceed) {
// Navigate to a page.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Initiate a browser navigation that will trigger the interstitial
controller().LoadURL(GURL("http://www.evil.com"), Referrer(),
- PAGE_TRANSITION_TYPED, std::string());
+ ui::PAGE_TRANSITION_TYPED, std::string());
// Show an interstitial.
TestInterstitialPage::InterstitialState state =
// Simulate the navigation to the page, that's when the interstitial gets
// hidden.
GURL url3("http://www.thepage.com");
- test_rvh()->SendNavigate(2, url3);
+ contents()->GetMainFrame()->SendNavigate(2, url3);
EXPECT_FALSE(contents()->ShowingInterstitialPage());
EXPECT_TRUE(contents()->GetInterstitialPage() == NULL);
ShowInterstitialFromRendererNewNavigationProceed) {
// Navigate to a page.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial.
// Simulate the navigation to the page, that's when the interstitial gets
// hidden.
GURL url3("http://www.thepage.com");
- test_rvh()->SendNavigate(2, url3);
+ contents()->GetMainFrame()->SendNavigate(2, url3);
EXPECT_FALSE(contents()->ShowingInterstitialPage());
EXPECT_TRUE(contents()->GetInterstitialPage() == NULL);
TEST_F(WebContentsImplTest, ShowInterstitialNoNewNavigationProceed) {
// Navigate to a page so we have a navigation entry in the controller.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial.
// While interstitial showing, navigate to a new URL.
const GURL url2("http://www.yahoo.com");
- test_rvh()->SendNavigate(1, url2);
+ contents()->GetMainFrame()->SendNavigate(1, url2);
EXPECT_EQ(TestInterstitialPage::CANCELED, state);
TEST_F(WebContentsImplTest, ShowInterstitialThenGoBack) {
// Navigate to a page so we have a navigation entry in the controller.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show interstitial.
// While the interstitial is showing, go back.
controller().GoBack();
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
// Make sure we are back to the original page and that the interstitial is
// gone.
TEST_F(WebContentsImplTest, ShowInterstitialCrashRendererThenGoBack) {
// Navigate to a page so we have a navigation entry in the controller.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show interstitial.
// While the interstitial is showing, go back.
controller().GoBack();
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
// Make sure we are back to the original page and that the interstitial is
// gone.
TEST_F(WebContentsImplTest, ShowInterstitialCrashRendererThenNavigate) {
// Navigate to a page so we have a navigation entry in the controller.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show interstitial.
TEST_F(WebContentsImplTest, ShowInterstitialProceedMultipleCommands) {
// Navigate to a page so we have a navigation entry in the controller.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial.
TEST_F(WebContentsImplTest, ShowInterstitialOnInterstitial) {
// Navigate to a page so we have a navigation entry in the controller.
GURL start_url("http://www.google.com");
- test_rvh()->SendNavigate(1, start_url);
+ contents()->GetMainFrame()->SendNavigate(1, start_url);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial.
// Let's make sure interstitial2 is working as intended.
interstitial2->Proceed();
GURL landing_url("http://www.thepage.com");
- test_rvh()->SendNavigate(2, landing_url);
+ contents()->GetMainFrame()->SendNavigate(2, landing_url);
EXPECT_FALSE(contents()->ShowingInterstitialPage());
EXPECT_TRUE(contents()->GetInterstitialPage() == NULL);
TEST_F(WebContentsImplTest, ShowInterstitialProceedShowInterstitial) {
// Navigate to a page so we have a navigation entry in the controller.
GURL start_url("http://www.google.com");
- test_rvh()->SendNavigate(1, start_url);
+ contents()->GetMainFrame()->SendNavigate(1, start_url);
EXPECT_EQ(1, controller().GetEntryCount());
// Show an interstitial.
// Let's make sure interstitial2 is working as intended.
interstitial2->Proceed();
GURL landing_url("http://www.thepage.com");
- test_rvh()->SendNavigate(2, landing_url);
+ contents()->GetMainFrame()->SendNavigate(2, landing_url);
RunAllPendingInMessageLoop();
EXPECT_TRUE(deleted2);
// Let's simulate a navigation initiated from the browser before the
// interstitial finishes loading.
const GURL url("http://www.google.com");
- controller().LoadURL(url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ controller().LoadURL(
+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
EXPECT_FALSE(interstitial->is_showing());
RunAllPendingInMessageLoop();
ASSERT_FALSE(deleted);
// Start a navigation to a page
contents()->GetController().LoadURL(
- kGURL, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
// Simulate that navigation triggering an interstitial.
TestInterstitialPage::InterstitialState state =
// Initiate a new navigation from the browser that also triggers an
// interstitial.
contents()->GetController().LoadURL(
- kGURL, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
TestInterstitialPage::InterstitialState state2 =
TestInterstitialPage::INVALID;
bool deleted2 = false;
// Start a navigation to a page
contents()->GetController().LoadURL(
- kGURL, Referrer(), PAGE_TRANSITION_TYPED, std::string());
+ kGURL, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
// DidNavigate from the page
- contents()->TestDidNavigate(rvh(), 1, kGURL, PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(
+ contents()->GetMainFrame(), 1, kGURL, ui::PAGE_TRANSITION_TYPED);
// Simulate showing an interstitial while the page is showing.
TestInterstitialPage::InterstitialState state =
// While the interstitial is showing, let's simulate the hidden page
// attempting to show a JS message.
IPC::Message* dummy_message = new IPC::Message;
- bool did_suppress_message = false;
- contents()->RunJavaScriptMessage(contents()->GetRenderViewHost(),
+ contents()->RunJavaScriptMessage(contents()->GetMainFrame(),
base::ASCIIToUTF16("This is an informative message"),
base::ASCIIToUTF16("OK"),
- kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message,
- &did_suppress_message);
- EXPECT_TRUE(did_suppress_message);
+ kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message);
+ EXPECT_TRUE(contents()->last_dialog_suppressed_);
}
// Makes sure that if the source passed to CopyStateFromAndPrune has an
TEST_F(WebContentsImplTest, CopyStateFromAndPruneSourceInterstitial) {
// Navigate to a page.
GURL url1("http://www.google.com");
- test_rvh()->SendNavigate(1, url1);
+ contents()->GetMainFrame()->SendNavigate(1, url1);
EXPECT_EQ(1, controller().GetEntryCount());
// Initiate a browser navigation that will trigger the interstitial
controller().LoadURL(GURL("http://www.evil.com"), Referrer(),
- PAGE_TRANSITION_TYPED, std::string());
+ ui::PAGE_TRANSITION_TYPED, std::string());
// Show an interstitial.
TestInterstitialPage::InterstitialState state =
// A navigation to about:whatever should always look like a navigation to
// about:blank
- GURL url_normalized(kAboutBlankURL);
+ GURL url_normalized(url::kAboutBlankURL);
GURL url_from_ipc("about:whatever");
// We navigate the test WebContents to about:blank, since NavigateAndCommit
contents()->SetDelegate(delegate.get());
int modifiers = 0;
- float dy = 1;
// Verify that normal mouse wheel events do nothing to change the zoom level.
blink::WebMouseWheelEvent event =
- SyntheticWebMouseWheelEventBuilder::Build(0, dy, modifiers, false);
+ SyntheticWebMouseWheelEventBuilder::Build(0, 1, modifiers, false);
EXPECT_FALSE(contents()->HandleWheelEvent(event));
EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
modifiers = WebInputEvent::ShiftKey | WebInputEvent::AltKey;
- event = SyntheticWebMouseWheelEventBuilder::Build(0, dy, modifiers, false);
+ event = SyntheticWebMouseWheelEventBuilder::Build(0, 1, modifiers, false);
EXPECT_FALSE(contents()->HandleWheelEvent(event));
EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
// But whenever the ctrl modifier is applied, they can increase/decrease zoom.
// Except on MacOS where we never want to adjust zoom with mousewheel.
modifiers = WebInputEvent::ControlKey;
- event = SyntheticWebMouseWheelEventBuilder::Build(0, dy, modifiers, false);
+ event = SyntheticWebMouseWheelEventBuilder::Build(0, 1, modifiers, false);
bool handled = contents()->HandleWheelEvent(event);
#if defined(OS_MACOSX)
EXPECT_FALSE(handled);
modifiers = WebInputEvent::ControlKey | WebInputEvent::ShiftKey |
WebInputEvent::AltKey;
- dy = -5;
- event = SyntheticWebMouseWheelEventBuilder::Build(2, dy, modifiers, false);
+ event = SyntheticWebMouseWheelEventBuilder::Build(2, -5, modifiers, false);
handled = contents()->HandleWheelEvent(event);
#if defined(OS_MACOSX)
EXPECT_FALSE(handled);
#endif
// Unless there is no vertical movement.
- dy = 0;
- event = SyntheticWebMouseWheelEventBuilder::Build(2, dy, modifiers, false);
+ event = SyntheticWebMouseWheelEventBuilder::Build(2, 0, modifiers, false);
EXPECT_FALSE(contents()->HandleWheelEvent(event));
EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
+ // Events containing precise scrolling deltas also shouldn't result in the
+ // zoom being adjusted, to avoid accidental adjustments caused by
+ // two-finger-scrolling on a touchpad.
+ modifiers = WebInputEvent::ControlKey;
+ event = SyntheticWebMouseWheelEventBuilder::Build(0, 5, modifiers, true);
+ EXPECT_FALSE(contents()->HandleWheelEvent(event));
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
+
+ // Ensure pointers to the delegate aren't kept beyond its lifetime.
+ contents()->SetDelegate(NULL);
+}
+
+// Tests that trackpad GesturePinchUpdate events get turned into browser zoom.
+TEST_F(WebContentsImplTest, HandleGestureEvent) {
+ using blink::WebGestureEvent;
+ using blink::WebInputEvent;
+
+ scoped_ptr<ContentsZoomChangedDelegate> delegate(
+ new ContentsZoomChangedDelegate());
+ contents()->SetDelegate(delegate.get());
+
+ const float kZoomStepValue = 0.6f;
+ blink::WebGestureEvent event = SyntheticWebGestureEventBuilder::Build(
+ WebInputEvent::GesturePinchUpdate, blink::WebGestureDeviceTouchpad);
+
+ // A pinch less than the step value doesn't change the zoom level.
+ event.data.pinchUpdate.scale = 1.0f + kZoomStepValue * 0.8f;
+ EXPECT_TRUE(contents()->HandleGestureEvent(event));
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
+
+ // But repeating the event so the combined scale is greater does.
+ EXPECT_TRUE(contents()->HandleGestureEvent(event));
+ EXPECT_EQ(1, delegate->GetAndResetContentsZoomChangedCallCount());
+ EXPECT_TRUE(delegate->last_zoom_in());
+
+ // Pinching back out one step goes back to 100%.
+ event.data.pinchUpdate.scale = 1.0f - kZoomStepValue;
+ EXPECT_TRUE(contents()->HandleGestureEvent(event));
+ EXPECT_EQ(1, delegate->GetAndResetContentsZoomChangedCallCount());
+ EXPECT_FALSE(delegate->last_zoom_in());
+
+ // Pinching out again doesn't zoom (step is twice as large around 100%).
+ EXPECT_TRUE(contents()->HandleGestureEvent(event));
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
+
+ // And again now it zooms once per step.
+ EXPECT_TRUE(contents()->HandleGestureEvent(event));
+ EXPECT_EQ(1, delegate->GetAndResetContentsZoomChangedCallCount());
+ EXPECT_FALSE(delegate->last_zoom_in());
+
+ // No other type of gesture event is handled by WebContentsImpl (for example
+ // a touchscreen pinch gesture).
+ event = SyntheticWebGestureEventBuilder::Build(
+ WebInputEvent::GesturePinchUpdate, blink::WebGestureDeviceTouchscreen);
+ event.data.pinchUpdate.scale = 1.0f + kZoomStepValue * 3;
+ EXPECT_FALSE(contents()->HandleGestureEvent(event));
+ EXPECT_EQ(0, delegate->GetAndResetContentsZoomChangedCallCount());
+
// Ensure pointers to the delegate aren't kept beyond it's lifetime.
contents()->SetDelegate(NULL);
}
+// Tests that GetRelatedActiveContentsCount is shared between related
+// SiteInstances and includes WebContents that have not navigated yet.
+TEST_F(WebContentsImplTest, ActiveContentsCountBasic) {
+ scoped_refptr<SiteInstance> instance1(
+ SiteInstance::CreateForURL(browser_context(), GURL("http://a.com")));
+ scoped_refptr<SiteInstance> instance2(
+ instance1->GetRelatedSiteInstance(GURL("http://b.com")));
+
+ EXPECT_EQ(0u, instance1->GetRelatedActiveContentsCount());
+ EXPECT_EQ(0u, instance2->GetRelatedActiveContentsCount());
+
+ scoped_ptr<TestWebContents> contents1(
+ TestWebContents::Create(browser_context(), instance1.get()));
+ EXPECT_EQ(1u, instance1->GetRelatedActiveContentsCount());
+ EXPECT_EQ(1u, instance2->GetRelatedActiveContentsCount());
+
+ scoped_ptr<TestWebContents> contents2(
+ TestWebContents::Create(browser_context(), instance1.get()));
+ EXPECT_EQ(2u, instance1->GetRelatedActiveContentsCount());
+ EXPECT_EQ(2u, instance2->GetRelatedActiveContentsCount());
+
+ contents1.reset();
+ EXPECT_EQ(1u, instance1->GetRelatedActiveContentsCount());
+ EXPECT_EQ(1u, instance2->GetRelatedActiveContentsCount());
+
+ contents2.reset();
+ EXPECT_EQ(0u, instance1->GetRelatedActiveContentsCount());
+ EXPECT_EQ(0u, instance2->GetRelatedActiveContentsCount());
+}
+
+// Tests that GetRelatedActiveContentsCount is preserved correctly across
+// same-site and cross-site navigations.
+TEST_F(WebContentsImplTest, ActiveContentsCountNavigate) {
+ scoped_refptr<SiteInstance> instance(
+ SiteInstance::Create(browser_context()));
+
+ EXPECT_EQ(0u, instance->GetRelatedActiveContentsCount());
+
+ scoped_ptr<TestWebContents> contents(
+ TestWebContents::Create(browser_context(), instance.get()));
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+
+ // Navigate to a URL.
+ contents->GetController().LoadURL(GURL("http://a.com/1"),
+ Referrer(),
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+ contents->CommitPendingNavigation();
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+
+ // Navigate to a URL in the same site.
+ contents->GetController().LoadURL(GURL("http://a.com/2"),
+ Referrer(),
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+ contents->CommitPendingNavigation();
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+
+ // Navigate to a URL in a different site.
+ contents->GetController().LoadURL(GURL("http://b.com"),
+ Referrer(),
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
+ EXPECT_TRUE(contents->cross_navigation_pending());
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+ contents->CommitPendingNavigation();
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+
+ contents.reset();
+ EXPECT_EQ(0u, instance->GetRelatedActiveContentsCount());
+}
+
+// Tests that GetRelatedActiveContentsCount tracks BrowsingInstance changes
+// from WebUI.
+TEST_F(WebContentsImplTest, ActiveContentsCountChangeBrowsingInstance) {
+ scoped_refptr<SiteInstance> instance(
+ SiteInstance::Create(browser_context()));
+
+ EXPECT_EQ(0u, instance->GetRelatedActiveContentsCount());
+
+ scoped_ptr<TestWebContents> contents(
+ TestWebContents::Create(browser_context(), instance.get()));
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+
+ // Navigate to a URL.
+ contents->NavigateAndCommit(GURL("http://a.com"));
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+
+ // Navigate to a URL with WebUI. This will change BrowsingInstances.
+ contents->GetController().LoadURL(GURL(kTestWebUIUrl),
+ Referrer(),
+ ui::PAGE_TRANSITION_TYPED,
+ std::string());
+ EXPECT_TRUE(contents->cross_navigation_pending());
+ scoped_refptr<SiteInstance> instance_webui(
+ contents->GetPendingMainFrame()->GetSiteInstance());
+ EXPECT_FALSE(instance->IsRelatedSiteInstance(instance_webui.get()));
+
+ // At this point, contents still counts for the old BrowsingInstance.
+ EXPECT_EQ(1u, instance->GetRelatedActiveContentsCount());
+ EXPECT_EQ(0u, instance_webui->GetRelatedActiveContentsCount());
+
+ // Commit and contents counts for the new one.
+ contents->CommitPendingNavigation();
+ EXPECT_EQ(0u, instance->GetRelatedActiveContentsCount());
+ EXPECT_EQ(1u, instance_webui->GetRelatedActiveContentsCount());
+
+ contents.reset();
+ EXPECT_EQ(0u, instance->GetRelatedActiveContentsCount());
+ EXPECT_EQ(0u, instance_webui->GetRelatedActiveContentsCount());
+}
+
+// ChromeOS doesn't use WebContents based power save blocking.
+#if !defined(OS_CHROMEOS)
+TEST_F(WebContentsImplTest, MediaPowerSaveBlocking) {
+ // PlayerIDs are actually pointers cast to int64, so verify that both negative
+ // and positive player ids don't blow up.
+ const int kPlayerAudioVideoId = 15;
+ const int kPlayerAudioOnlyId = -15;
+ const int kPlayerVideoOnlyId = 30;
+
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing());
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing());
+
+ TestRenderFrameHost* rfh = contents()->GetMainFrame();
+ AudioStreamMonitor* monitor = contents()->audio_stream_monitor();
+
+ // The audio power save blocker should not be based on having a media player
+ // when audio stream monitoring is available.
+ if (AudioStreamMonitor::monitoring_available()) {
+ // Send a fake audio stream monitor notification. The audio power save
+ // blocker should be created.
+ monitor->set_was_recently_audible_for_testing(true);
+ contents()->NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB);
+ EXPECT_TRUE(contents()->has_audio_power_save_blocker_for_testing());
+
+ // Send another fake notification, this time when WasRecentlyAudible() will
+ // be false. The power save blocker should be released.
+ monitor->set_was_recently_audible_for_testing(false);
+ contents()->NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB);
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing());
+ }
+
+ // Start a player with both audio and video. A video power save blocker
+ // should be created. If audio stream monitoring is available, an audio power
+ // save blocker should be created too.
+ rfh->OnMessageReceived(FrameHostMsg_MediaPlayingNotification(
+ 0, kPlayerAudioVideoId, true, true));
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing());
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(),
+ !AudioStreamMonitor::monitoring_available());
+
+ // Upon hiding the video power save blocker should be released.
+ contents()->WasHidden();
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing());
+
+ // Start another player that only has video. There should be no change in
+ // the power save blockers. The notification should take into account the
+ // visibility state of the WebContents.
+ rfh->OnMessageReceived(FrameHostMsg_MediaPlayingNotification(
+ 0, kPlayerVideoOnlyId, true, false));
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing());
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(),
+ !AudioStreamMonitor::monitoring_available());
+
+ // Showing the WebContents should result in the creation of the blocker.
+ contents()->WasShown();
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing());
+
+ // Start another player that only has audio. There should be no change in
+ // the power save blockers.
+ rfh->OnMessageReceived(FrameHostMsg_MediaPlayingNotification(
+ 0, kPlayerAudioOnlyId, false, true));
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing());
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(),
+ !AudioStreamMonitor::monitoring_available());
+
+ // Destroy the original audio video player. Both power save blockers should
+ // remain.
+ rfh->OnMessageReceived(
+ FrameHostMsg_MediaPausedNotification(0, kPlayerAudioVideoId));
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing());
+ EXPECT_EQ(contents()->has_audio_power_save_blocker_for_testing(),
+ !AudioStreamMonitor::monitoring_available());
+
+ // Destroy the audio only player. The video power save blocker should remain.
+ rfh->OnMessageReceived(
+ FrameHostMsg_MediaPausedNotification(0, kPlayerAudioOnlyId));
+ EXPECT_TRUE(contents()->has_video_power_save_blocker_for_testing());
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing());
+
+ // Destroy the video only player. No power save blockers should remain.
+ rfh->OnMessageReceived(
+ FrameHostMsg_MediaPausedNotification(0, kPlayerVideoOnlyId));
+ EXPECT_FALSE(contents()->has_video_power_save_blocker_for_testing());
+ EXPECT_FALSE(contents()->has_audio_power_save_blocker_for_testing());
+}
+#endif
+
} // namespace content