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