15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_icon_factory.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_action_test_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using content::WebContents; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageActionApiTest : public ExtensionApiTest { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* GetPageAction(const Extension& extension) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExtensionActionManager::Get(browser()->profile())-> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPageAction(extension); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, Basic) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("page_action/basics")) << message_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetSingleLoadedExtension(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension) << message_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the extension to update the page action state. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(extension->GetResourceURL("update.html"))); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we received the changes. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab_id = SessionTabHelper::FromWebContents( 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents())->session_id().id(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* action = GetPageAction(*extension); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(action); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Modified", action->GetTitle(tab_id)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate the page action being clicked. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionActionAPI::Get(browser()->profile())->ExecuteExtensionAction( 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension, browser(), true); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the extension to update the page action state again. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(extension->GetResourceURL("update2.html"))); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not be creating icons asynchronously, so we don't need an 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionActionIconFactory icon_factory(profile(), extension, action, NULL); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we received the changes. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_id = SessionTabHelper::FromWebContents( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents())->session_id().id(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(icon_factory.GetIcon(tab_id).IsEmpty()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that calling chrome.pageAction.setPopup() can enable a popup. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, AddPopup) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the extension, which has no default popup. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("page_action/add_popup")) << message_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetSingleLoadedExtension(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension) << message_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab_id = ExtensionTabUtil::GetTabId( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* page_action = GetPageAction(*extension); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(page_action) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Page action test extension should have a page action."; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(page_action->HasPopup(tab_id)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate the page action being clicked. The resulting event should 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // install a page action popup. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionActionAPI::Get(browser()->profile())->ExecuteExtensionAction( 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension, browser(), true); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(page_action->HasPopup(tab_id)) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Clicking on the page action should have caused a popup to be added."; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STREQ("/a_popup.html", 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action->GetPopupUrl(tab_id).path().c_str()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now change the popup from a_popup.html to a_second_popup.html . 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load a page which removes the popup using chrome.pageAction.setPopup(). 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(extension->GetResourceURL("change_popup.html"))); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(page_action->HasPopup(tab_id)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STREQ("/another_popup.html", 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action->GetPopupUrl(tab_id).path().c_str()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that calling chrome.pageAction.setPopup() can remove a popup. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, RemovePopup) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the extension, which has a page action with a default popup. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("page_action/remove_popup")) << message_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetSingleLoadedExtension(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension) << message_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab_id = ExtensionTabUtil::GetTabId( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* page_action = GetPageAction(*extension); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(page_action) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Page action test extension should have a page action."; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(page_action->HasPopup(tab_id)) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Expect a page action popup before the test removes it."; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load a page which removes the popup using chrome.pageAction.setPopup(). 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(extension->GetResourceURL("remove_popup.html"))); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(page_action->HasPopup(tab_id)) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Page action popup should have been removed."; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests popups in page actions. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky on the trybots. See http://crbug.com/96725. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, DISABLED_ShowPageActionPopup) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("page_action/popup")) << message_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetSingleLoadedExtension(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension) << message_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(1)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionActionAPI::Get(browser()->profile())->ShowExtensionActionPopup( 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension, browser(), true); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test http://crbug.com/57333: that two page action extensions using the same 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// icon for the page action icon and the extension icon do not crash. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, TestCrash57333) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load extension A. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("page_action") 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("crash_57333") 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("Extension1"))); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load extension B. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("page_action") 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("crash_57333") 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("Extension2"))); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, Getters) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("page_action/getters")) << message_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetSingleLoadedExtension(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension) << message_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(extension->GetResourceURL("update.html"))); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify triggering page action. 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PageActionApiTest, TestTriggerPageAction) { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("trigger_actions/page_action")) << message_; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Extension* extension = GetSingleLoadedExtension(); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(extension) << message_; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Page action icon is displayed when a tab is created. 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server()->GetURL("files/simple.html")); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NewTab(browser()); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->tab_strip_model()->ActivateTabAt(0, true); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Give the extension time to show the page action on the tab. 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WaitForPageActionVisibilityChangeTo(1); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionAction* page_action = GetPageAction(*extension); 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(page_action); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebContents* tab = 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->GetActiveWebContents(); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(tab); 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(page_action->GetIsVisible(ExtensionTabUtil::GetTabId(tab))); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Simulate the page action being clicked. 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResultCatcher catcher; 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionActionAPI::Get(browser()->profile())->ExecuteExtensionAction( 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension, browser(), true); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that the browser action turned the background color red. 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string script = 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "window.domAutomationController.send(document.body.style." 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "backgroundColor);"; 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string result; 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractString(tab, script, &result)); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(result, "red"); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 247