page_action_apitest.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/browser.h"
6#include "chrome/browser/browser_window.h"
7#include "chrome/browser/extensions/extension_apitest.h"
8#include "chrome/browser/extensions/extension_browser_event_router.h"
9#include "chrome/browser/extensions/extension_tabs_module.h"
10#include "chrome/browser/profile.h"
11#include "chrome/browser/location_bar.h"
12#include "chrome/browser/tab_contents/tab_contents.h"
13#include "chrome/common/extensions/extension.h"
14#include "chrome/common/extensions/extension_action.h"
15#include "chrome/test/ui_test_utils.h"
16
17IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageAction) {
18  ASSERT_TRUE(StartHTTPServer());
19  ASSERT_TRUE(RunExtensionTest("page_action/basics")) << message_;
20  Extension* extension = GetSingleLoadedExtension();
21  ASSERT_TRUE(extension) << message_;
22  {
23    // Tell the extension to update the page action state.
24    ResultCatcher catcher;
25    ui_test_utils::NavigateToURL(browser(),
26        GURL(extension->GetResourceURL("update.html")));
27    ASSERT_TRUE(catcher.GetNextResult());
28  }
29
30  // Test that we received the changes.
31  int tab_id =
32      browser()->GetSelectedTabContents()->controller().session_id().id();
33  ExtensionAction* action = extension->page_action();
34  ASSERT_TRUE(action);
35  EXPECT_EQ("Modified", action->GetTitle(tab_id));
36
37  {
38    // Simulate the page action being clicked.
39    ResultCatcher catcher;
40    int tab_id =
41        ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
42    ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
43        browser()->profile(), extension->id(), "", tab_id, "", 0);
44    EXPECT_TRUE(catcher.GetNextResult());
45  }
46
47  {
48    // Tell the extension to update the page action state again.
49    ResultCatcher catcher;
50    ui_test_utils::NavigateToURL(browser(),
51        GURL(extension->GetResourceURL("update2.html")));
52    ASSERT_TRUE(catcher.GetNextResult());
53  }
54
55  // Test that we received the changes.
56  tab_id = browser()->GetSelectedTabContents()->controller().session_id().id();
57  EXPECT_FALSE(action->GetIcon(tab_id).isNull());
58}
59
60// Test that calling chrome.pageAction.setPopup() can enable a popup.
61IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageActionAddPopup) {
62  // Load the extension, which has no default popup.
63  ASSERT_TRUE(RunExtensionTest("page_action/add_popup")) << message_;
64  Extension* extension = GetSingleLoadedExtension();
65  ASSERT_TRUE(extension) << message_;
66
67  int tab_id = ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
68
69  ExtensionAction* page_action = extension->page_action();
70  ASSERT_TRUE(page_action)
71      << "Page action test extension should have a page action.";
72
73  ASSERT_FALSE(page_action->HasPopup(tab_id));
74
75  // Simulate the page action being clicked.  The resulting event should
76  // install a page action popup.
77  {
78    ResultCatcher catcher;
79    ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
80        browser()->profile(), extension->id(), "action", tab_id, "", 1);
81    ASSERT_TRUE(catcher.GetNextResult());
82  }
83
84  ASSERT_TRUE(page_action->HasPopup(tab_id))
85      << "Clicking on the page action should have caused a popup to be added.";
86
87  ASSERT_STREQ("/a_popup.html",
88               page_action->GetPopupUrl(tab_id).path().c_str());
89
90  // Now change the popup from a_popup.html to a_second_popup.html .
91  // Load a page which removes the popup using chrome.pageAction.setPopup().
92  {
93    ResultCatcher catcher;
94    ui_test_utils::NavigateToURL(
95        browser(),
96        GURL(extension->GetResourceURL("change_popup.html")));
97    ASSERT_TRUE(catcher.GetNextResult());
98  }
99
100  ASSERT_TRUE(page_action->HasPopup(tab_id));
101  ASSERT_STREQ("/another_popup.html",
102               page_action->GetPopupUrl(tab_id).path().c_str());
103}
104
105// Test that calling chrome.pageAction.setPopup() can remove a popup.
106IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PageActionRemovePopup) {
107  // Load the extension, which has a page action with a default popup.
108  ASSERT_TRUE(RunExtensionTest("page_action/remove_popup")) << message_;
109  Extension* extension = GetSingleLoadedExtension();
110  ASSERT_TRUE(extension) << message_;
111
112  int tab_id = ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
113
114  ExtensionAction* page_action = extension->page_action();
115  ASSERT_TRUE(page_action)
116      << "Page action test extension should have a page action.";
117
118  ASSERT_TRUE(page_action->HasPopup(tab_id))
119      << "Expect a page action popup before the test removes it.";
120
121  // Load a page which removes the popup using chrome.pageAction.setPopup().
122  {
123    ResultCatcher catcher;
124    ui_test_utils::NavigateToURL(
125        browser(),
126        GURL(extension->GetResourceURL("remove_popup.html")));
127    ASSERT_TRUE(catcher.GetNextResult());
128  }
129
130  ASSERT_FALSE(page_action->HasPopup(tab_id))
131      << "Page action popup should have been removed.";
132}
133
134// Tests old-style pageActions API that is deprecated but we don't want to
135// break.
136IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OldPageActions) {
137  ASSERT_TRUE(RunExtensionTest("page_action/old_api")) << message_;
138  Extension* extension = GetSingleLoadedExtension();
139  ASSERT_TRUE(extension) << message_;
140
141  // Have the extension enable the page action.
142  {
143    ResultCatcher catcher;
144    ui_test_utils::NavigateToURL(browser(),
145        GURL(extension->GetResourceURL("page.html")));
146    ASSERT_TRUE(catcher.GetNextResult());
147  }
148
149  // Simulate the page action being clicked.
150  {
151    ResultCatcher catcher;
152    int tab_id =
153        ExtensionTabUtil::GetTabId(browser()->GetSelectedTabContents());
154    ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
155        browser()->profile(), extension->id(), "action", tab_id, "", 1);
156    EXPECT_TRUE(catcher.GetNextResult());
157  }
158}
159
160// Tests popups in page actions.
161IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ShowPageActionPopup) {
162  ASSERT_TRUE(RunExtensionTest("page_action/popup")) << message_;
163  Extension* extension = GetSingleLoadedExtension();
164  ASSERT_TRUE(extension) << message_;
165
166  ASSERT_TRUE(WaitForPageActionVisibilityChangeTo(1));
167
168  {
169    ResultCatcher catcher;
170    LocationBarTesting* location_bar =
171        browser()->window()->GetLocationBar()->GetLocationBarForTesting();
172    location_bar->TestPageActionPressed(0);
173    ASSERT_TRUE(catcher.GetNextResult());
174  }
175}
176