1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_apitest.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browser_event_router.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_tabs_module.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/omnibox/location_bar.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_action.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/extensions/extension.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageAction) { 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(RunExtensionTest("page_action/basics")) << message_; 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetSingleLoadedExtension(); 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(extension) << message_; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the extension to update the page action state. 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(extension->GetResourceURL("update.html"))); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test that we received the changes. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id = 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->GetSelectedTabContents()->controller().session_id().id(); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionAction* action = extension->page_action(); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(action); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("Modified", action->GetTitle(tab_id)); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the page action being clicked. 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id = 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents()); 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = browser()->profile()->GetExtensionService(); 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->browser_event_router()->PageActionExecuted( 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->profile(), extension->id(), "", tab_id, "", 0); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(catcher.GetNextResult()); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the extension to update the page action state again. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(extension->GetResourceURL("update2.html"))); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test that we received the changes. 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_id = browser()->GetSelectedTabContents()->controller().session_id().id(); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(action->GetIcon(tab_id).isNull()); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that calling chrome.pageAction.setPopup() can enable a popup. 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageActionAddPopup) { 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Load the extension, which has no default popup. 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(RunExtensionTest("page_action/add_popup")) << message_; 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetSingleLoadedExtension(); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(extension) << message_; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id = ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents()); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionAction* page_action = extension->page_action(); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(page_action) 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << "Page action test extension should have a page action."; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(page_action->HasPopup(tab_id)); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the page action being clicked. The resulting event should 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // install a page action popup. 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = browser()->profile()->GetExtensionService(); 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->browser_event_router()->PageActionExecuted( 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->profile(), extension->id(), "action", tab_id, "", 1); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(page_action->HasPopup(tab_id)) 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << "Clicking on the page action should have caused a popup to be added."; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ("/a_popup.html", 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action->GetPopupUrl(tab_id).path().c_str()); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now change the popup from a_popup.html to a_second_popup.html . 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Load a page which removes the popup using chrome.pageAction.setPopup(). 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL( 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser(), 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(extension->GetResourceURL("change_popup.html"))); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(page_action->HasPopup(tab_id)); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ("/another_popup.html", 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_action->GetPopupUrl(tab_id).path().c_str()); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that calling chrome.pageAction.setPopup() can remove a popup. 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageActionRemovePopup) { 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Load the extension, which has a page action with a default popup. 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(RunExtensionTest("page_action/remove_popup")) << message_; 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetSingleLoadedExtension(); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(extension) << message_; 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id = ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents()); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionAction* page_action = extension->page_action(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(page_action) 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << "Page action test extension should have a page action."; 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(page_action->HasPopup(tab_id)) 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << "Expect a page action popup before the test removes it."; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Load a page which removes the popup using chrome.pageAction.setPopup(). 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL( 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser(), 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(extension->GetResourceURL("remove_popup.html"))); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(page_action->HasPopup(tab_id)) 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << "Page action popup should have been removed."; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests old-style pageActions API that is deprecated but we don't want to 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// break. 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, OldPageActions) { 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(RunExtensionTest("page_action/old_api")) << message_; 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetSingleLoadedExtension(); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(extension) << message_; 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Have the extension enable the page action. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(extension->GetResourceURL("page.html"))); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Simulate the page action being clicked. 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int tab_id = 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents()); 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = browser()->profile()->GetExtensionService(); 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->browser_event_router()->PageActionExecuted( 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->profile(), extension->id(), "action", tab_id, "", 1); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(catcher.GetNextResult()); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests popups in page actions. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionApiTest, ShowPageActionPopup) { 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(RunExtensionTest("page_action/popup")) << message_; 167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetSingleLoadedExtension(); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(extension) << message_; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(1)); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCatcher catcher; 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LocationBarTesting* location_bar = 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->window()->GetLocationBar()->GetLocationBarForTesting(); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch location_bar->TestPageActionPressed(0); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(catcher.GetNextResult()); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Test http://crbug.com/57333: that two page action extensions using the same 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// icon for the page action icon and the extension icon do not crash. 183731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickIN_PROC_BROWSER_TEST_F(ExtensionApiTest, TestCrash57333) { 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Load extension A. 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("page_action") 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .AppendASCII("crash_57333") 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .AppendASCII("Extension1"))); 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Load extension B. 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("page_action") 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .AppendASCII("crash_57333") 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick .AppendASCII("Extension2"))); 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 193