Index: chrome/browser/media/router/presentation_service_delegate_impl_browsertest.cc |
diff --git a/chrome/browser/media/router/presentation_service_delegate_impl_browsertest.cc b/chrome/browser/media/router/presentation_service_delegate_impl_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4466fb1dd47fc9fb7ed3a5b9bfd27aea531af3db |
--- /dev/null |
+++ b/chrome/browser/media/router/presentation_service_delegate_impl_browsertest.cc |
@@ -0,0 +1,121 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/command_line.h" |
+#include "chrome/browser/media/router/media_router_impl.h" |
+#include "chrome/browser/media/router/mock_media_router.h" |
+#include "chrome/browser/media/router/mock_screen_availability_listener.h" |
+#include "chrome/browser/media/router/presentation_service_delegate_impl.h" |
+#include "chrome/browser/ui/browser_commands.h" |
+#include "chrome/browser/ui/browser_finder.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "content/public/browser/navigation_details.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/common/url_constants.h" |
+#include "content/public/test/browser_test.h" |
+#include "content/public/test/browser_test_utils.h" |
+#include "net/test/embedded_test_server/embedded_test_server.h" |
+ |
+using ::testing::_; |
+using ::testing::Return; |
+ |
+namespace media_router { |
+ |
+namespace { |
+const char kTestingPage[] = "/empty.html"; |
+} |
+ |
+using content::WebContents; |
+using content::RenderFrameHost; |
+ |
+class PresentationServiceDelegateImplBrowserTest : public InProcessBrowserTest { |
+ public: |
+ PresentationServiceDelegateImplBrowserTest() { |
+ base::CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kEnableMediaRouter); |
+ } |
+ ~PresentationServiceDelegateImplBrowserTest() override {} |
+ |
+ void SetUpOnMainThread() override { |
+ InProcessBrowserTest::SetUpOnMainThread(); |
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
+ |
+ WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ ASSERT_TRUE(web_contents); |
+ |
+ source_manager_ = |
+ PresentationServiceDelegateImpl::FromWebContents(web_contents); |
+ ASSERT_TRUE(source_manager_); |
+ |
+ // TODO(imcheng): Should probably stub out the MediaRouteProviderManagerHost |
+ // instead of MediaRouter in browser tests. |
+ source_manager_->SetMediaRouterForTest(&router_); |
+ } |
+ |
+ void TearDown() override { InProcessBrowserTest::TearDown(); } |
+ |
+ PresentationServiceDelegateImpl* source_manager_; |
+ MockMediaRouter router_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PresentationServiceDelegateImplBrowserTest); |
+}; |
+ |
+// Test disabled for now since currently there is currently no way to |
+// trigger the creation of PresentationServiceImpl on the RenderFrameHost from |
+// here. It is lazily initialized via mojo from PresentationDispatcher on |
+// renderer process. |
+// TODO(imcheng): Re-enable this test when we find a way to trigger the |
+// instantiation of PresentationServiceImpl. |
+IN_PROC_BROWSER_TEST_F(PresentationServiceDelegateImplBrowserTest, |
+ DISABLED_RemoveObserversOnNavigation) { |
+ WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ RenderFrameHost* rfh = web_contents->GetMainFrame(); |
+ ASSERT_TRUE(rfh); |
+ |
+ GURL gurl = embedded_test_server()->GetURL(kTestingPage); |
+ |
+ ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), gurl, 1); |
+ |
+ MockScreenAvailabilityListener mock_listener1("http://fooUrl"); |
+ MockScreenAvailabilityListener mock_listener2("http://barUrl"); |
+ |
+ PresentationServiceDelegateImpl::RenderFrameHostId rfh_id( |
+ PresentationServiceDelegateImpl::GetRenderFrameHostId( |
+ web_contents->GetMainFrame())); |
+ EXPECT_CALL(router_, RegisterMediaSinksObserver(_)) |
+ .Times(2) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener( |
+ rfh_id.first, rfh_id.second, &mock_listener1)); |
+ EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener( |
+ rfh_id.first, rfh_id.second, &mock_listener2)); |
+ |
+ const auto& observers = source_manager_->observers_; |
+ auto it = observers.find(rfh_id); |
+ ASSERT_TRUE(it != observers.end()); |
+ EXPECT_EQ(2u, it->second.size()); |
+ |
+ // In-page navigation; should not unregister observers. |
+ ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
+ browser(), GURL(gurl.spec() + "#blah"), 1); |
+ it = observers.find(rfh_id); |
+ ASSERT_TRUE(it != observers.end()); |
+ EXPECT_EQ(2u, it->second.size()); |
+ |
+ EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(2); |
+ // Navigating away should cause registered observers to be removed. |
+ ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
+ browser(), GURL("about:blank"), 1); |
+ it = observers.find(rfh_id); |
+ EXPECT_TRUE(it == observers.end()); |
+} |
+ |
+} // namespace media_router |