1// Copyright (c) 2012 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 "base/basictypes.h"
6#include "base/command_line.h"
7#if defined(OS_MACOSX)
8#include "base/mac/mac_util.h"
9#endif
10#include "base/strings/stringprintf.h"
11#include "base/win/windows_version.h"
12#include "chrome/browser/extensions/extension_apitest.h"
13#include "chrome/browser/extensions/extension_service.h"
14#include "chrome/browser/extensions/extension_test_message_listener.h"
15#include "chrome/browser/extensions/tab_helper.h"
16#include "chrome/browser/profiles/profile.h"
17#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
18#include "chrome/common/chrome_switches.h"
19#include "chrome/common/chrome_version_info.h"
20#include "chrome/common/extensions/feature_switch.h"
21#include "chrome/common/extensions/features/base_feature_provider.h"
22#include "chrome/common/extensions/features/complex_feature.h"
23#include "chrome/common/extensions/features/feature.h"
24#include "chrome/common/extensions/features/simple_feature.h"
25#include "chrome/test/base/test_switches.h"
26#include "content/public/browser/render_process_host.h"
27#include "content/public/browser/render_view_host.h"
28#include "content/public/common/content_switches.h"
29
30namespace chrome {
31
32namespace {
33
34const char kExtensionId[] = "ddchlicdkolnonkihahngkmmmjnjlkkf";
35
36class TabCaptureApiTest : public ExtensionApiTest {
37 public:
38  TabCaptureApiTest() {}
39
40  virtual void SetUp() OVERRIDE {
41    // TODO(danakj): The GPU Video Decoder needs real GL bindings.
42    // crbug.com/269087
43    UseRealGLBindings();
44
45    ExtensionApiTest::SetUp();
46  }
47
48  void AddExtensionToCommandLineWhitelist() {
49    CommandLine::ForCurrentProcess()->AppendSwitchASCII(
50        switches::kWhitelistedExtensionID, kExtensionId);
51  }
52};
53
54}  // namespace
55
56// http://crbug.com/261493 and http://crbug.com/268644
57#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(USE_AURA)
58#define MAYBE_ApiTests DISABLED_ApiTests
59#else
60#define MAYBE_ApiTests ApiTests
61#endif
62IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_ApiTests) {
63#if defined(OS_WIN) && defined(USE_ASH)
64  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
65  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
66    return;
67#endif
68
69#if defined(OS_WIN)
70  // TODO(justinlin): Disabled for WinXP due to timeout issues.
71  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
72    return;
73  }
74#endif
75
76  AddExtensionToCommandLineWhitelist();
77  ASSERT_TRUE(RunExtensionSubtest("tab_capture/experimental",
78                                  "api_tests.html")) << message_;
79}
80
81// http://crbug.com/268644
82#if defined(USE_AURA)
83#define MAYBE_ApiTestsAudio DISABLED_ApiTestsAudio
84#else
85#define MAYBE_ApiTestsAudio ApiTestsAudio
86#endif
87IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_ApiTestsAudio) {
88#if defined(OS_WIN)
89  // TODO(justinlin): Disabled for WinXP due to timeout issues.
90  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
91    return;
92  }
93#endif
94
95  AddExtensionToCommandLineWhitelist();
96  ASSERT_TRUE(RunExtensionSubtest("tab_capture/experimental",
97                                  "api_tests_audio.html")) << message_;
98}
99
100// http://crbug.com/177163 and http://crbug.com/268644
101#if defined(OS_WIN) && (!defined(NDEBUG) || defined(USE_AURA))
102#define MAYBE_EndToEnd DISABLED_EndToEnd
103#else
104#define MAYBE_EndToEnd EndToEnd
105#endif
106IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_EndToEnd) {
107#if defined(OS_WIN)
108  // TODO(justinlin): Disabled for WinXP due to timeout issues.
109  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
110    return;
111  }
112#endif
113#if defined(OS_MACOSX)
114  // TODO(miu): Disabled for Mac OS X 10.6 due to timeout issues.
115  // http://crbug.com/174640
116  if (base::mac::IsOSSnowLeopard())
117    return;
118#endif
119
120  AddExtensionToCommandLineWhitelist();
121  ASSERT_TRUE(RunExtensionSubtest("tab_capture/experimental",
122                                  "end_to_end.html")) << message_;
123}
124
125// http://crbug.com/177163
126#if defined(OS_WIN) && !defined(NDEBUG)
127#define MAYBE_GetUserMediaTest DISABLED_GetUserMediaTest
128#else
129#define MAYBE_GetUserMediaTest GetUserMediaTest
130#endif
131// Test that we can't get tabCapture streams using GetUserMedia directly.
132IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GetUserMediaTest) {
133  ExtensionTestMessageListener listener("ready", true);
134
135  ASSERT_TRUE(RunExtensionSubtest("tab_capture/experimental",
136                                  "get_user_media_test.html")) << message_;
137
138  EXPECT_TRUE(listener.WaitUntilSatisfied());
139
140  content::OpenURLParams params(GURL("about:blank"), content::Referrer(),
141                                NEW_FOREGROUND_TAB,
142                                content::PAGE_TRANSITION_LINK, false);
143  content::WebContents* web_contents = browser()->OpenURL(params);
144
145  content::RenderViewHost* const rvh = web_contents->GetRenderViewHost();
146  int render_process_id = rvh->GetProcess()->GetID();
147  int routing_id = rvh->GetRoutingID();
148
149  listener.Reply(base::StringPrintf("%i:%i", render_process_id, routing_id));
150
151  ResultCatcher catcher;
152  catcher.RestrictToProfile(browser()->profile());
153  EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
154}
155
156// http://crbug.com/177163
157#if defined(OS_WIN)
158#define MAYBE_ActiveTabPermission DISABLED_ActiveTabPermission
159#else
160#define MAYBE_ActiveTabPermission ActiveTabPermission
161#endif
162// Make sure tabCapture.capture only works if the tab has been granted
163// permission via an extension icon click or the extension is whitelisted.
164IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_ActiveTabPermission) {
165  ExtensionTestMessageListener before_open_tab("ready1", true);
166  ExtensionTestMessageListener before_grant_permission("ready2", true);
167  ExtensionTestMessageListener before_open_new_tab("ready3", true);
168  ExtensionTestMessageListener before_whitelist_extension("ready4", true);
169
170  ASSERT_TRUE(RunExtensionSubtest(
171      "tab_capture/experimental", "active_tab_permission_test.html"))
172          << message_;
173
174  // Open a new tab and make sure capture is denied.
175  EXPECT_TRUE(before_open_tab.WaitUntilSatisfied());
176  content::OpenURLParams params(GURL("http://google.com"), content::Referrer(),
177                                NEW_FOREGROUND_TAB,
178                                content::PAGE_TRANSITION_LINK, false);
179  content::WebContents* web_contents = browser()->OpenURL(params);
180  before_open_tab.Reply("");
181
182  // Grant permission and make sure capture succeeds.
183  EXPECT_TRUE(before_grant_permission.WaitUntilSatisfied());
184  ExtensionService* extension_service =
185      Profile::FromBrowserContext(web_contents->GetBrowserContext())
186          ->GetExtensionService();
187  const extensions::Extension* extension =
188      extension_service->GetExtensionById(kExtensionId, false);
189  extensions::TabHelper::FromWebContents(web_contents)
190      ->active_tab_permission_granter()->GrantIfRequested(extension);
191  before_grant_permission.Reply("");
192
193  // Open a new tab and make sure capture is denied.
194  EXPECT_TRUE(before_open_new_tab.WaitUntilSatisfied());
195  browser()->OpenURL(params);
196  before_open_new_tab.Reply("");
197
198  // Add extension to whitelist and make sure capture succeeds.
199  EXPECT_TRUE(before_whitelist_extension.WaitUntilSatisfied());
200  AddExtensionToCommandLineWhitelist();
201  before_whitelist_extension.Reply("");
202
203  ResultCatcher catcher;
204  catcher.RestrictToProfile(browser()->profile());
205  EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
206}
207
208// http://crbug.com/177163
209#if defined(OS_WIN) && !defined(NDEBUG)
210#define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
211#elif defined(USE_AURA) || defined(OS_MACOSX)
212// These don't always fire fullscreen events when run in tests. Tested manually.
213#define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
214#elif defined(OS_LINUX)
215// Flaky to get out of fullscreen in tests. Tested manually.
216#define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
217#else
218#define MAYBE_FullscreenEvents FullscreenEvents
219#endif
220IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_FullscreenEvents) {
221#if defined(OS_WIN)
222  // TODO(justinlin): Disabled for WinXP due to timeout issues.
223  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
224    return;
225  }
226#endif
227
228  AddExtensionToCommandLineWhitelist();
229
230  content::OpenURLParams params(GURL("chrome://version"),
231                                content::Referrer(),
232                                CURRENT_TAB,
233                                content::PAGE_TRANSITION_LINK, false);
234  content::WebContents* web_contents = browser()->OpenURL(params);
235
236  ExtensionTestMessageListener listeners_setup("ready1", true);
237  ExtensionTestMessageListener fullscreen_entered("ready2", true);
238
239  ASSERT_TRUE(RunExtensionSubtest("tab_capture/experimental",
240                                  "fullscreen_test.html")) << message_;
241  EXPECT_TRUE(listeners_setup.WaitUntilSatisfied());
242
243  // Toggle fullscreen after setting up listeners.
244  browser()->fullscreen_controller()->ToggleFullscreenModeForTab(web_contents,
245                                                                 true);
246  listeners_setup.Reply("");
247
248  // Toggle again after JS should have the event.
249  EXPECT_TRUE(fullscreen_entered.WaitUntilSatisfied());
250  browser()->fullscreen_controller()->ToggleFullscreenModeForTab(web_contents,
251                                                                 false);
252  fullscreen_entered.Reply("");
253
254  ResultCatcher catcher;
255  catcher.RestrictToProfile(browser()->profile());
256  EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
257}
258
259}  // namespace chrome
260