// Copyright (c) 2010 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 "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_browser_event_router.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/omnibox/location_bar.h"
#include "chrome/common/extensions/extension_action.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/test/ui_test_utils.h"
#include "content/browser/tab_contents/tab_contents.h"
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageAction) {
ASSERT_TRUE(test_server()->Start());
ASSERT_TRUE(RunExtensionTest("page_action/basics")) << message_;
const Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
{
// Tell the extension to update the page action state.
ResultCatcher catcher;
ui_test_utils::NavigateToURL(browser(),
GURL(extension->GetResourceURL("update.html")));
ASSERT_TRUE(catcher.GetNextResult());
}
// Test that we received the changes.
int tab_id =
browser()->GetSelectedTabContents()->controller().session_id().id();
ExtensionAction* action = extension->page_action();
ASSERT_TRUE(action);
EXPECT_EQ("Modified", action->GetTitle(tab_id));
{
// Simulate the page action being clicked.
ResultCatcher catcher;
int tab_id =
ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
ExtensionService* service = browser()->profile()->GetExtensionService();
service->browser_event_router()->PageActionExecuted(
browser()->profile(), extension->id(), "", tab_id, "", 0);
EXPECT_TRUE(catcher.GetNextResult());
}
{
// Tell the extension to update the page action state again.
ResultCatcher catcher;
ui_test_utils::NavigateToURL(browser(),
GURL(extension->GetResourceURL("update2.html")));
ASSERT_TRUE(catcher.GetNextResult());
}
// Test that we received the changes.
tab_id = browser()->GetSelectedTabContents()->controller().session_id().id();
EXPECT_FALSE(action->GetIcon(tab_id).isNull());
}
// Test that calling chrome.pageAction.setPopup() can enable a popup.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageActionAddPopup) {
// Load the extension, which has no default popup.
ASSERT_TRUE(RunExtensionTest("page_action/add_popup")) << message_;
const Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
int tab_id = ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
ExtensionAction* page_action = extension->page_action();
ASSERT_TRUE(page_action)
<< "Page action test extension should have a page action.";
ASSERT_FALSE(page_action->HasPopup(tab_id));
// Simulate the page action being clicked. The resulting event should
// install a page action popup.
{
ResultCatcher catcher;
ExtensionService* service = browser()->profile()->GetExtensionService();
service->browser_event_router()->PageActionExecuted(
browser()->profile(), extension->id(), "action", tab_id, "", 1);
ASSERT_TRUE(catcher.GetNextResult());
}
ASSERT_TRUE(page_action->HasPopup(tab_id))
<< "Clicking on the page action should have caused a popup to be added.";
ASSERT_STREQ("/a_popup.html",
page_action->GetPopupUrl(tab_id).path().c_str());
// Now change the popup from a_popup.html to a_second_popup.html .
// Load a page which removes the popup using chrome.pageAction.setPopup().
{
ResultCatcher catcher;
ui_test_utils::NavigateToURL(
browser(),
GURL(extension->GetResourceURL("change_popup.html")));
ASSERT_TRUE(catcher.GetNextResult());
}
ASSERT_TRUE(page_action->HasPopup(tab_id));
ASSERT_STREQ("/another_popup.html",
page_action->GetPopupUrl(tab_id).path().c_str());
}
// Test that calling chrome.pageAction.setPopup() can remove a popup.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageActionRemovePopup) {
// Load the extension, which has a page action with a default popup.
ASSERT_TRUE(RunExtensionTest("page_action/remove_popup")) << message_;
const Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
int tab_id = ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
ExtensionAction* page_action = extension->page_action();
ASSERT_TRUE(page_action)
<< "Page action test extension should have a page action.";
ASSERT_TRUE(page_action->HasPopup(tab_id))
<< "Expect a page action popup before the test removes it.";
// Load a page which removes the popup using chrome.pageAction.setPopup().
{
ResultCatcher catcher;
ui_test_utils::NavigateToURL(
browser(),
GURL(extension->GetResourceURL("remove_popup.html")));
ASSERT_TRUE(catcher.GetNextResult());
}
ASSERT_FALSE(page_action->HasPopup(tab_id))
<< "Page action popup should have been removed.";
}
// Tests old-style pageActions API that is deprecated but we don't want to
// break.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OldPageActions) {
ASSERT_TRUE(RunExtensionTest("page_action/old_api")) << message_;
const Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
// Have the extension enable the page action.
{
ResultCatcher catcher;
ui_test_utils::NavigateToURL(browser(),
GURL(extension->GetResourceURL("page.html")));
ASSERT_TRUE(catcher.GetNextResult());
}
// Simulate the page action being clicked.
{
ResultCatcher catcher;
int tab_id =
ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
ExtensionService* service = browser()->profile()->GetExtensionService();
service->browser_event_router()->PageActionExecuted(
browser()->profile(), extension->id(), "action", tab_id, "", 1);
EXPECT_TRUE(catcher.GetNextResult());
}
}
// Tests popups in page actions.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ShowPageActionPopup) {
ASSERT_TRUE(RunExtensionTest("page_action/popup")) << message_;
const Extension* extension = GetSingleLoadedExtension();
ASSERT_TRUE(extension) << message_;
ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(1));
{
ResultCatcher catcher;
LocationBarTesting* location_bar =
browser()->window()->GetLocationBar()->GetLocationBarForTesting();
location_bar->TestPageActionPressed(0);
ASSERT_TRUE(catcher.GetNextResult());
}
}
// Test http://crbug.com/57333: that two page action extensions using the same
// icon for the page action icon and the extension icon do not crash.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TestCrash57333) {
// Load extension A.
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("page_action")
.AppendASCII("crash_57333")
.AppendASCII("Extension1")));
// Load extension B.
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("page_action")
.AppendASCII("crash_57333")
.AppendASCII("Extension2")));
}