| Index: chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
 | 
| diff --git a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
 | 
| index 7455c4bfd6e2c40cfbe6e125c0f8a24ad518d9a6..9a372f342bd9acb4b06add6ecb231afcb1f5f2ca 100644
 | 
| --- a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
 | 
| +++ b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
 | 
| @@ -4,8 +4,10 @@
 | 
|  
 | 
|  #include "base/bind.h"
 | 
|  #include "base/threading/thread_task_runner_handle.h"
 | 
| +#include "chrome/app/chrome_command_ids.h"
 | 
|  #include "chrome/browser/extensions/browser_action_test_util.h"
 | 
|  #include "chrome/browser/media/router/media_router_ui_service.h"
 | 
| +#include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h"
 | 
|  #include "chrome/browser/ui/browser.h"
 | 
|  #include "chrome/browser/ui/browser_commands.h"
 | 
|  #include "chrome/browser/ui/tabs/tab_strip_model.h"
 | 
| @@ -14,6 +16,7 @@
 | 
|  #include "chrome/browser/ui/toolbar/media_router_action_controller.h"
 | 
|  #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
 | 
|  #include "chrome/browser/ui/views/frame/browser_view.h"
 | 
| +#include "chrome/browser/ui/views/toolbar/app_menu.h"
 | 
|  #include "chrome/browser/ui/views/toolbar/app_menu_button.h"
 | 
|  #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
 | 
|  #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h"
 | 
| @@ -22,7 +25,9 @@
 | 
|  #include "chrome/common/url_constants.h"
 | 
|  #include "chrome/test/base/in_process_browser_test.h"
 | 
|  #include "chrome/test/base/ui_test_utils.h"
 | 
| +#include "content/public/browser/navigation_entry.h"
 | 
|  #include "content/public/browser/web_contents.h"
 | 
| +#include "content/public/common/context_menu_params.h"
 | 
|  #include "content/public/test/test_navigation_observer.h"
 | 
|  #include "content/public/test/test_utils.h"
 | 
|  #include "ui/views/widget/widget.h"
 | 
| @@ -58,10 +63,7 @@ class MediaRouterUIBrowserTest : public InProcessBrowserTest {
 | 
|      content::TestNavigationObserver nav_observer(NULL);
 | 
|      nav_observer.StartWatchingNewWebContents();
 | 
|  
 | 
| -    AppMenuButton* app_menu_button =
 | 
| -        BrowserView::GetBrowserViewForBrowser(browser())
 | 
| -            ->toolbar()
 | 
| -            ->app_menu_button();
 | 
| +    AppMenuButton* app_menu_button = GetAppMenuButton();
 | 
|  
 | 
|      // When the Media Router Action executes, it opens a dialog with web
 | 
|      // contents to chrome://media-router.
 | 
| @@ -105,6 +107,12 @@ class MediaRouterUIBrowserTest : public InProcessBrowserTest {
 | 
|              ComponentToolbarActionsFactory::kMediaRouterActionId, always_show);
 | 
|    }
 | 
|  
 | 
| +  AppMenuButton* GetAppMenuButton() {
 | 
| +    return BrowserView::GetBrowserViewForBrowser(browser())
 | 
| +        ->toolbar()
 | 
| +        ->app_menu_button();
 | 
| +  }
 | 
| +
 | 
|   protected:
 | 
|    ToolbarActionsBar* toolbar_actions_bar_ = nullptr;
 | 
|  
 | 
| @@ -147,6 +155,98 @@ IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
 | 
|    SetAlwaysShowActionPref(false);
 | 
|  }
 | 
|  
 | 
| +IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, OpenDialogFromContextMenu) {
 | 
| +  // Start with one tab showing about:blank.
 | 
| +  ASSERT_EQ(1, browser()->tab_strip_model()->count());
 | 
| +
 | 
| +  content::WebContents* web_contents =
 | 
| +      browser()->tab_strip_model()->GetActiveWebContents();
 | 
| +  MediaRouterDialogController* dialog_controller =
 | 
| +      MediaRouterDialogController::GetOrCreateForWebContents(
 | 
| +          browser()->tab_strip_model()->GetActiveWebContents());
 | 
| +  content::ContextMenuParams params;
 | 
| +  params.page_url = web_contents->GetController().GetActiveEntry()->GetURL();
 | 
| +  TestRenderViewContextMenu menu(web_contents->GetMainFrame(), params);
 | 
| +  menu.Init();
 | 
| +
 | 
| +  ASSERT_TRUE(menu.IsItemPresent(IDC_ROUTE_MEDIA));
 | 
| +  ASSERT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +  menu.ExecuteCommand(IDC_ROUTE_MEDIA, 0);
 | 
| +  EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +
 | 
| +  // Executing the command again should be a no-op, and there should only be one
 | 
| +  // dialog opened per tab.
 | 
| +  menu.ExecuteCommand(IDC_ROUTE_MEDIA, 0);
 | 
| +  EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +  dialog_controller->HideMediaRouterDialog();
 | 
| +  EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +}
 | 
| +
 | 
| +IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, OpenDialogFromAppMenu) {
 | 
| +  // Start with one tab showing about:blank.
 | 
| +  ASSERT_EQ(1, browser()->tab_strip_model()->count());
 | 
| +
 | 
| +  AppMenuButton* menu_button = GetAppMenuButton();
 | 
| +  base::RunLoop run_loop;
 | 
| +  menu_button->ShowMenu(false);
 | 
| +  run_loop.RunUntilIdle();
 | 
| +
 | 
| +  MediaRouterDialogController* dialog_controller =
 | 
| +      MediaRouterDialogController::GetOrCreateForWebContents(
 | 
| +          browser()->tab_strip_model()->GetActiveWebContents());
 | 
| +  AppMenu* menu = menu_button->app_menu_for_testing();
 | 
| +  ASSERT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +  menu->ExecuteCommand(IDC_ROUTE_MEDIA, 0);
 | 
| +  EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +
 | 
| +  // Executing the command again should be a no-op, and there should only be one
 | 
| +  // dialog opened per tab.
 | 
| +  menu->ExecuteCommand(IDC_ROUTE_MEDIA, 0);
 | 
| +  EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +  dialog_controller->HideMediaRouterDialog();
 | 
| +  EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
 | 
| +}
 | 
| +
 | 
| +IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, OpenDialogsInMultipleTabs) {
 | 
| +  // Start with two tabs.
 | 
| +  chrome::NewTab(browser());
 | 
| +  ASSERT_EQ(2, browser()->tab_strip_model()->count());
 | 
| +  MediaRouterDialogController* dialog_controller1 =
 | 
| +      MediaRouterDialogController::GetOrCreateForWebContents(
 | 
| +          browser()->tab_strip_model()->GetWebContentsAt(0));
 | 
| +  MediaRouterDialogController* dialog_controller2 =
 | 
| +      MediaRouterDialogController::GetOrCreateForWebContents(
 | 
| +          browser()->tab_strip_model()->GetWebContentsAt(1));
 | 
| +
 | 
| +  // Show the media router action on the toolbar.
 | 
| +  SetAlwaysShowActionPref(true);
 | 
| +
 | 
| +  // Open a dialog in the first tab using the toolbar action.
 | 
| +  browser()->tab_strip_model()->ActivateTabAt(0, true);
 | 
| +  EXPECT_FALSE(dialog_controller1->IsShowingMediaRouterDialog());
 | 
| +  GetMediaRouterAction()->ExecuteAction(true);
 | 
| +  EXPECT_TRUE(dialog_controller1->IsShowingMediaRouterDialog());
 | 
| +
 | 
| +  // Move to the second tab, which shouldn't have a dialog at first. Open and
 | 
| +  // close a dialog in that tab.
 | 
| +  browser()->tab_strip_model()->ActivateTabAt(1, true);
 | 
| +  EXPECT_FALSE(dialog_controller2->IsShowingMediaRouterDialog());
 | 
| +  GetMediaRouterAction()->ExecuteAction(true);
 | 
| +  EXPECT_TRUE(dialog_controller2->IsShowingMediaRouterDialog());
 | 
| +  GetMediaRouterAction()->ExecuteAction(true);
 | 
| +  EXPECT_FALSE(dialog_controller2->IsShowingMediaRouterDialog());
 | 
| +
 | 
| +  // Move back to the first tab, whose dialog should still be open. Hide the
 | 
| +  // dialog.
 | 
| +  browser()->tab_strip_model()->ActivateTabAt(0, true);
 | 
| +  EXPECT_TRUE(dialog_controller1->IsShowingMediaRouterDialog());
 | 
| +  GetMediaRouterAction()->ExecuteAction(true);
 | 
| +  EXPECT_FALSE(dialog_controller1->IsShowingMediaRouterDialog());
 | 
| +
 | 
| +  // Reset the preference showing the toolbar action.
 | 
| +  SetAlwaysShowActionPref(false);
 | 
| +}
 | 
| +
 | 
|  IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
 | 
|                         EphemeralToolbarIconForRoutesAndIssues) {
 | 
|    action_controller_->OnIssue(issue_);
 | 
| 
 |