| Index: chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc | 
| diff --git a/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc | 
| index 67e41c687f6cda753faee488f5e9ba55d17bffb0..b98b15a41245400f6eb262eb0971bc9a5b29ca51 100644 | 
| --- a/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc | 
| +++ b/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc | 
| @@ -18,8 +18,8 @@ | 
| #include "chrome/browser/sessions/session_tab_helper.h" | 
| #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h" | 
| #include "chrome/grit/generated_resources.h" | 
| +#include "chrome/test/base/chrome_render_view_host_test_harness.h" | 
| #include "chrome/test/base/testing_profile.h" | 
| -#include "content/public/test/test_browser_thread_bundle.h" | 
| #include "content/public/test/test_web_ui.h" | 
| #include "extensions/browser/extension_registry.h" | 
| #include "extensions/common/extension.h" | 
| @@ -30,11 +30,12 @@ | 
| #include "testing/gtest/include/gtest/gtest.h" | 
| #include "ui/base/l10n/l10n_util.h" | 
|  | 
| +using content::WebContents; | 
| using testing::_; | 
| using testing::AnyNumber; | 
| using testing::Invoke; | 
| -using testing::SaveArg; | 
| using testing::Return; | 
| +using testing::SaveArg; | 
|  | 
| namespace media_router { | 
|  | 
| @@ -62,22 +63,33 @@ class MockRoutesUpdatedCallback { | 
| const std::vector<MediaRoute::Id>& joinable_route_ids)); | 
| }; | 
|  | 
| -class MediaRouterUITest : public ::testing::Test { | 
| +class MediaRouterUITest : public ChromeRenderViewHostTestHarness { | 
| public: | 
| -  ~MediaRouterUITest() override { | 
| +  void TearDown() override { | 
| EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)) | 
| .Times(AnyNumber()); | 
| EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)) | 
| .Times(AnyNumber()); | 
| +    web_ui_contents_.reset(); | 
| +    create_session_request_.reset(); | 
| +    media_router_ui_.reset(); | 
| +    message_handler_.reset(); | 
| +    ChromeRenderViewHostTestHarness::TearDown(); | 
| +  } | 
| + | 
| +  void CreateMediaRouterUIForURL(Profile* profile, const GURL& url) { | 
| +    web_contents()->GetController().LoadURL(url, content::Referrer(), | 
| +                                            ui::PAGE_TRANSITION_LINK, ""); | 
| +    content::RenderFrameHostTester::CommitPendingLoad( | 
| +        &web_contents()->GetController()); | 
| +    CreateMediaRouterUI(profile); | 
| } | 
|  | 
| void CreateMediaRouterUI(Profile* profile) { | 
| -    initiator_.reset(content::WebContents::Create( | 
| -        content::WebContents::CreateParams(profile))); | 
| -    SessionTabHelper::CreateForWebContents(initiator_.get()); | 
| -    web_contents_.reset(content::WebContents::Create( | 
| -        content::WebContents::CreateParams(profile))); | 
| -    web_ui_.set_web_contents(web_contents_.get()); | 
| +    SessionTabHelper::CreateForWebContents(web_contents()); | 
| +    web_ui_contents_.reset( | 
| +        WebContents::Create(WebContents::CreateParams(profile))); | 
| +    web_ui_.set_web_contents(web_ui_contents_.get()); | 
| media_router_ui_.reset(new MediaRouterUI(&web_ui_)); | 
| message_handler_.reset( | 
| new MediaRouterWebUIMessageHandler(media_router_ui_.get())); | 
| @@ -88,7 +100,7 @@ class MediaRouterUITest : public ::testing::Test { | 
| })); | 
| EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)) | 
| .Times(AnyNumber()); | 
| -    media_router_ui_->InitForTest(&mock_router_, initiator_.get(), | 
| +    media_router_ui_->InitForTest(&mock_router_, web_contents(), | 
| message_handler_.get(), | 
| std::move(create_session_request_)); | 
| message_handler_->SetWebUIForTest(&web_ui_); | 
| @@ -103,11 +115,8 @@ class MediaRouterUITest : public ::testing::Test { | 
|  | 
| protected: | 
| MockMediaRouter mock_router_; | 
| -  content::TestBrowserThreadBundle thread_bundle_; | 
| -  TestingProfile profile_; | 
| -  std::unique_ptr<content::WebContents> initiator_; | 
| content::TestWebUI web_ui_; | 
| -  std::unique_ptr<content::WebContents> web_contents_; | 
| +  std::unique_ptr<WebContents> web_ui_contents_; | 
| std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_; | 
| std::unique_ptr<MediaRouterUI> media_router_ui_; | 
| std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_; | 
| @@ -115,7 +124,7 @@ class MediaRouterUITest : public ::testing::Test { | 
| }; | 
|  | 
| TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| std::vector<MediaRouteResponseCallback> callbacks; | 
| EXPECT_CALL( | 
| mock_router_, | 
| @@ -134,7 +143,7 @@ TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, RouteCreationTimeoutForDesktop) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| std::vector<MediaRouteResponseCallback> callbacks; | 
| EXPECT_CALL( | 
| mock_router_, | 
| @@ -153,7 +162,7 @@ TEST_F(MediaRouterUITest, RouteCreationTimeoutForDesktop) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, RouteCreationTimeoutForPresentation) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| PresentationRequest presentation_request( | 
| RenderFrameHostId(0, 0), {GURL("https://presentationurl.com")}, | 
| GURL("https://frameurl.fakeurl")); | 
| @@ -177,7 +186,7 @@ TEST_F(MediaRouterUITest, RouteCreationTimeoutForPresentation) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, RouteCreationParametersCantBeCreated) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| MediaSinkSearchResponseCallback sink_callback; | 
| EXPECT_CALL(mock_router_, SearchSinks(_, _, _, _, _)) | 
| .WillOnce(SaveArg<4>(&sink_callback)); | 
| @@ -192,7 +201,7 @@ TEST_F(MediaRouterUITest, RouteCreationParametersCantBeCreated) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, RouteRequestFromIncognito) { | 
| -  CreateMediaRouterUI(profile_.GetOffTheRecordProfile()); | 
| +  CreateMediaRouterUI(profile()->GetOffTheRecordProfile()); | 
|  | 
| PresentationRequest presentation_request(RenderFrameHostId(0, 0), | 
| {GURL("https://foo.url.com/")}, | 
| @@ -207,7 +216,7 @@ TEST_F(MediaRouterUITest, RouteRequestFromIncognito) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, SortedSinks) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| std::vector<MediaSinkWithCastModes> unsorted_sinks; | 
| std::string sink_id1("sink3"); | 
| std::string sink_name1("B sink"); | 
| @@ -236,7 +245,7 @@ TEST_F(MediaRouterUITest, SortedSinks) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, SortSinksByIconType) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| std::vector<MediaSinkWithCastModes> unsorted_sinks; | 
|  | 
| MediaSinkWithCastModes sink1( | 
| @@ -348,8 +357,8 @@ TEST_F(MediaRouterUITest, | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, UIMediaRoutesObserverAssignsCurrentCastModes) { | 
| -  CreateMediaRouterUI(&profile_); | 
| -  SessionID::id_type tab_id = SessionTabHelper::IdForTab(initiator_.get()); | 
| +  CreateMediaRouterUI(profile()); | 
| +  SessionID::id_type tab_id = SessionTabHelper::IdForTab(web_contents()); | 
| MediaSource media_source_1(MediaSourceForTab(tab_id)); | 
| MediaSource media_source_2("mediaSource"); | 
| MediaSource media_source_3(MediaSourceForDesktop()); | 
| @@ -398,7 +407,7 @@ TEST_F(MediaRouterUITest, UIMediaRoutesObserverAssignsCurrentCastModes) { | 
| } | 
|  | 
| TEST_F(MediaRouterUITest, UIMediaRoutesObserverSkipsUnavailableCastModes) { | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| MediaSource media_source_1("mediaSource1"); | 
| MediaSource media_source_2("mediaSource2"); | 
| MediaSource media_source_3(MediaSourceForDesktop()); | 
| @@ -493,7 +502,7 @@ TEST_F(MediaRouterUITest, NotFoundErrorOnCloseWithNoSinks) { | 
| base::Unretained(&request_callbacks)), | 
| base::Bind(&PresentationRequestCallbacks::Error, | 
| base::Unretained(&request_callbacks)))); | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
| // Destroying the UI should return the expected error from above to the error | 
| // callback. | 
| media_router_ui_.reset(); | 
| @@ -511,7 +520,7 @@ TEST_F(MediaRouterUITest, NotFoundErrorOnCloseWithNoCompatibleSinks) { | 
| base::Unretained(&request_callbacks)), | 
| base::Bind(&PresentationRequestCallbacks::Error, | 
| base::Unretained(&request_callbacks)))); | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
|  | 
| // Send a sink to the UI that is compatible with sources other than the | 
| // presentation url to cause a NotFoundError. | 
| @@ -541,7 +550,7 @@ TEST_F(MediaRouterUITest, AbortErrorOnClose) { | 
| base::Unretained(&request_callbacks)), | 
| base::Bind(&PresentationRequestCallbacks::Error, | 
| base::Unretained(&request_callbacks)))); | 
| -  CreateMediaRouterUI(&profile_); | 
| +  CreateMediaRouterUI(profile()); | 
|  | 
| // Send a sink to the UI that is compatible with the presentation url to avoid | 
| // a NotFoundError. | 
| @@ -559,4 +568,48 @@ TEST_F(MediaRouterUITest, AbortErrorOnClose) { | 
| // callback. | 
| media_router_ui_.reset(); | 
| } | 
| + | 
| +TEST_F(MediaRouterUITest, RecordCastModeSelections) { | 
| +  const GURL url_1a = GURL("https://www.example.com/watch?v=AAAA"); | 
| +  const GURL url_1b = GURL("https://www.example.com/watch?v=BBBB"); | 
| +  const GURL url_2 = GURL("https://example2.com/0000"); | 
| +  const GURL url_3 = GURL("https://www3.example.com/index.html"); | 
| + | 
| +  CreateMediaRouterUIForURL(profile(), url_1a); | 
| +  EXPECT_FALSE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| +  media_router_ui_->RecordCastModeSelection(MediaCastMode::TAB_MIRROR); | 
| +  EXPECT_TRUE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| + | 
| +  CreateMediaRouterUIForURL(profile(), url_2); | 
| +  EXPECT_FALSE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| + | 
| +  CreateMediaRouterUIForURL(profile(), url_1b); | 
| +  // |url_1a| and |url_1b| have the same origin, so the selection made for | 
| +  // |url_1a| should be retrieved. | 
| +  EXPECT_TRUE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| +  media_router_ui_->RecordCastModeSelection(MediaCastMode::DEFAULT); | 
| +  EXPECT_FALSE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| + | 
| +  media_router_ui_->RecordCastModeSelection(MediaCastMode::TAB_MIRROR); | 
| +  CreateMediaRouterUIForURL(profile(), url_3); | 
| +  // |url_1a| and |url_3| have the same domain "example.com" but different | 
| +  // origins, so their preferences should be separate. | 
| +  EXPECT_FALSE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| +} | 
| + | 
| +TEST_F(MediaRouterUITest, RecordDesktopMirroringCastModeSelection) { | 
| +  const GURL url = GURL("https://www.example.com/watch?v=AAAA"); | 
| +  CreateMediaRouterUIForURL(profile(), url); | 
| + | 
| +  EXPECT_FALSE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| +  media_router_ui_->RecordCastModeSelection(MediaCastMode::DESKTOP_MIRROR); | 
| +  // Selecting desktop mirroring should not change the recorded preferences. | 
| +  EXPECT_FALSE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| + | 
| +  media_router_ui_->RecordCastModeSelection(MediaCastMode::TAB_MIRROR); | 
| +  EXPECT_TRUE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| +  media_router_ui_->RecordCastModeSelection(MediaCastMode::DESKTOP_MIRROR); | 
| +  // Selecting desktop mirroring should not change the recorded preferences. | 
| +  EXPECT_TRUE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); | 
| +} | 
| }  // namespace media_router | 
|  |