3714c2be88c79d93648bdc9d140d0a08cfd72bcc
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / tab_capture / tab_capture_apitest.cc
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 #include "base/strings/stringprintf.h"
8 #include "chrome/browser/extensions/extension_apitest.h"
9 #include "chrome/browser/extensions/tab_helper.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
12 #include "chrome/common/chrome_version_info.h"
13 #include "content/public/browser/render_frame_host.h"
14 #include "content/public/browser/render_process_host.h"
15 #include "extensions/browser/extension_registry.h"
16 #include "extensions/common/switches.h"
17 #include "extensions/test/extension_test_message_listener.h"
18 #include "extensions/test/result_catcher.h"
19
20 #if defined(OS_WIN)
21 #include "base/win/windows_version.h"
22 #endif
23
24 #if defined(OS_WIN) && defined(USE_ASH)
25 #include "chrome/test/base/test_switches.h"
26 #endif
27
28 namespace extensions {
29
30 namespace {
31
32 const char kExtensionId[] = "ddchlicdkolnonkihahngkmmmjnjlkkf";
33
34 class TabCaptureApiTest : public ExtensionApiTest {
35  public:
36   void AddExtensionToCommandLineWhitelist() {
37     CommandLine::ForCurrentProcess()->AppendSwitchASCII(
38         switches::kWhitelistedExtensionID, kExtensionId);
39   }
40 };
41
42 class TabCaptureApiPixelTest : public TabCaptureApiTest {
43  public:
44   virtual void SetUp() OVERRIDE {
45     EnablePixelOutput();
46     TabCaptureApiTest::SetUp();
47   }
48 };
49
50 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, ApiTests) {
51 #if defined(OS_WIN) && defined(USE_ASH)
52   // Disable this test in Metro+Ash for now (http://crbug.com/262796).
53   if (CommandLine::ForCurrentProcess()->HasSwitch(::switches::kAshBrowserTests))
54     return;
55 #endif
56
57 #if defined(OS_WIN)
58   // TODO(justinlin): Disabled for WinXP due to timeout issues.
59   if (base::win::GetVersion() < base::win::VERSION_VISTA) {
60     return;
61   }
62 #endif
63
64   AddExtensionToCommandLineWhitelist();
65   ASSERT_TRUE(RunExtensionSubtest("tab_capture", "api_tests.html")) << message_;
66 }
67
68 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, ApiTestsAudio) {
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", "api_tests_audio.html"))
78       << message_;
79 }
80
81 // Disabled on ChromeOS for http://crbug.com/406051
82 // Disabled on other platforms for http://crbug.com/177163
83 #if !defined(NDEBUG) || defined(OS_CHROMEOS)
84 #define MAYBE_EndToEnd DISABLED_EndToEnd
85 #else
86 #define MAYBE_EndToEnd EndToEnd
87 #endif
88 IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, MAYBE_EndToEnd) {
89 #if defined(OS_WIN)
90   // TODO(justinlin): Disabled for WinXP due to timeout issues.
91   if (base::win::GetVersion() < base::win::VERSION_VISTA) {
92     return;
93   }
94 #endif
95   // This test is too slow to succeed with OSMesa on the bots.
96   if (UsingOSMesa())
97     return;
98
99   AddExtensionToCommandLineWhitelist();
100   ASSERT_TRUE(RunExtensionSubtest("tab_capture", "end_to_end.html"))
101       << message_;
102 }
103
104 // http://crbug.com/177163
105 #if defined(OS_WIN) && !defined(NDEBUG)
106 #define MAYBE_GetUserMediaTest DISABLED_GetUserMediaTest
107 #else
108 #define MAYBE_GetUserMediaTest GetUserMediaTest
109 #endif
110 // Test that we can't get tabCapture streams using GetUserMedia directly.
111 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GetUserMediaTest) {
112   ExtensionTestMessageListener listener("ready", true);
113
114   ASSERT_TRUE(RunExtensionSubtest("tab_capture", "get_user_media_test.html"))
115       << message_;
116
117   EXPECT_TRUE(listener.WaitUntilSatisfied());
118
119   content::OpenURLParams params(GURL("about:blank"), content::Referrer(),
120                                 NEW_FOREGROUND_TAB,
121                                 ui::PAGE_TRANSITION_LINK, false);
122   content::WebContents* web_contents = browser()->OpenURL(params);
123
124   content::RenderFrameHost* const main_frame = web_contents->GetMainFrame();
125   ASSERT_TRUE(main_frame);
126   listener.Reply(base::StringPrintf("web-contents-media-stream://%i:%i",
127                                     main_frame->GetProcess()->GetID(),
128                                     main_frame->GetRoutingID()));
129
130   ResultCatcher catcher;
131   catcher.RestrictToBrowserContext(browser()->profile());
132   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
133 }
134
135 // http://crbug.com/177163
136 #if defined(OS_WIN) && !defined(NDEBUG)
137 #define MAYBE_ActiveTabPermission DISABLED_ActiveTabPermission
138 #else
139 #define MAYBE_ActiveTabPermission ActiveTabPermission
140 #endif
141 // Make sure tabCapture.capture only works if the tab has been granted
142 // permission via an extension icon click or the extension is whitelisted.
143 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_ActiveTabPermission) {
144   ExtensionTestMessageListener before_open_tab("ready1", true);
145   ExtensionTestMessageListener before_grant_permission("ready2", true);
146   ExtensionTestMessageListener before_open_new_tab("ready3", true);
147   ExtensionTestMessageListener before_whitelist_extension("ready4", true);
148
149   ASSERT_TRUE(RunExtensionSubtest("tab_capture",
150                                   "active_tab_permission_test.html"))
151       << message_;
152
153   // Open a new tab and make sure capture is denied.
154   EXPECT_TRUE(before_open_tab.WaitUntilSatisfied());
155   content::OpenURLParams params(GURL("http://google.com"), content::Referrer(),
156                                 NEW_FOREGROUND_TAB,
157                                 ui::PAGE_TRANSITION_LINK, false);
158   content::WebContents* web_contents = browser()->OpenURL(params);
159   before_open_tab.Reply("");
160
161   // Grant permission and make sure capture succeeds.
162   EXPECT_TRUE(before_grant_permission.WaitUntilSatisfied());
163   const Extension* extension = ExtensionRegistry::Get(
164       web_contents->GetBrowserContext())->enabled_extensions().GetByID(
165           kExtensionId);
166   TabHelper::FromWebContents(web_contents)
167       ->active_tab_permission_granter()->GrantIfRequested(extension);
168   before_grant_permission.Reply("");
169
170   // Open a new tab and make sure capture is denied.
171   EXPECT_TRUE(before_open_new_tab.WaitUntilSatisfied());
172   browser()->OpenURL(params);
173   before_open_new_tab.Reply("");
174
175   // Add extension to whitelist and make sure capture succeeds.
176   EXPECT_TRUE(before_whitelist_extension.WaitUntilSatisfied());
177   AddExtensionToCommandLineWhitelist();
178   before_whitelist_extension.Reply("");
179
180   ResultCatcher catcher;
181   catcher.RestrictToBrowserContext(browser()->profile());
182   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
183 }
184
185 // http://crbug.com/177163
186 #if defined(OS_WIN) && !defined(NDEBUG)
187 #define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
188 #elif defined(USE_AURA) || defined(OS_MACOSX)
189 // These don't always fire fullscreen events when run in tests. Tested manually.
190 #define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
191 #elif defined(OS_LINUX)
192 // Flaky to get out of fullscreen in tests. Tested manually.
193 #define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
194 #else
195 #define MAYBE_FullscreenEvents FullscreenEvents
196 #endif
197 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_FullscreenEvents) {
198 #if defined(OS_WIN)
199   // TODO(justinlin): Disabled for WinXP due to timeout issues.
200   if (base::win::GetVersion() < base::win::VERSION_VISTA) {
201     return;
202   }
203 #endif
204
205   AddExtensionToCommandLineWhitelist();
206
207   content::OpenURLParams params(GURL("chrome://version"),
208                                 content::Referrer(),
209                                 CURRENT_TAB,
210                                 ui::PAGE_TRANSITION_LINK, false);
211   content::WebContents* web_contents = browser()->OpenURL(params);
212
213   ExtensionTestMessageListener listeners_setup("ready1", true);
214   ExtensionTestMessageListener fullscreen_entered("ready2", true);
215
216   ASSERT_TRUE(RunExtensionSubtest("tab_capture", "fullscreen_test.html"))
217       << message_;
218   EXPECT_TRUE(listeners_setup.WaitUntilSatisfied());
219
220   // Toggle fullscreen after setting up listeners.
221   browser()->fullscreen_controller()->ToggleFullscreenModeForTab(web_contents,
222                                                                  true);
223   listeners_setup.Reply("");
224
225   // Toggle again after JS should have the event.
226   EXPECT_TRUE(fullscreen_entered.WaitUntilSatisfied());
227   browser()->fullscreen_controller()->ToggleFullscreenModeForTab(web_contents,
228                                                                  false);
229   fullscreen_entered.Reply("");
230
231   ResultCatcher catcher;
232   catcher.RestrictToBrowserContext(browser()->profile());
233   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
234 }
235
236 // Times out on Win dbg bots: http://crbug.com/177163
237 // #if defined(OS_WIN) && !defined(NDEBUG)
238 // Times out on all Win bots, flaky on MSan bots: http://crbug.com/294431
239 #if defined(OS_WIN) || defined(MEMORY_SANITIZER)
240 #define MAYBE_GrantForChromePages DISABLED_GrantForChromePages
241 #else
242 #define MAYBE_GrantForChromePages GrantForChromePages
243 #endif
244 // Make sure tabCapture API can be granted for Chrome:// pages.
245 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GrantForChromePages) {
246   ExtensionTestMessageListener before_open_tab("ready1", true);
247   ASSERT_TRUE(RunExtensionSubtest("tab_capture",
248                                   "active_tab_chrome_pages.html"))
249       << message_;
250   EXPECT_TRUE(before_open_tab.WaitUntilSatisfied());
251
252   // Open a tab on a chrome:// page and make sure we can capture.
253   content::OpenURLParams params(GURL("chrome://version"), content::Referrer(),
254                                 NEW_FOREGROUND_TAB,
255                                 ui::PAGE_TRANSITION_LINK, false);
256   content::WebContents* web_contents = browser()->OpenURL(params);
257   const Extension* extension = ExtensionRegistry::Get(
258       web_contents->GetBrowserContext())->enabled_extensions().GetByID(
259           kExtensionId);
260   TabHelper::FromWebContents(web_contents)
261       ->active_tab_permission_granter()->GrantIfRequested(extension);
262   before_open_tab.Reply("");
263
264   ResultCatcher catcher;
265   catcher.RestrictToBrowserContext(browser()->profile());
266   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
267 }
268
269 #if (defined(OS_WIN) && !defined(NDEBUG)) || defined(OS_MACOSX)
270 // http://crbug.com/326319
271 #define MAYBE_CaptureInSplitIncognitoMode DISABLED_CaptureInSplitIncognitoMode
272 #else
273 #define MAYBE_CaptureInSplitIncognitoMode CaptureInSplitIncognitoMode
274 #endif
275 // Test that a tab can be captured in split incognito mode.
276 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_CaptureInSplitIncognitoMode) {
277   AddExtensionToCommandLineWhitelist();
278   ASSERT_TRUE(RunExtensionSubtest("tab_capture",
279                                   "incognito.html",
280                                   kFlagEnableIncognito | kFlagUseIncognito))
281       << message_;
282 }
283
284 #if defined(OS_WIN) && !defined(NDEBUG)
285 #define MAYBE_Constraints DISABLED_Constraints
286 #else
287 #define MAYBE_Constraints Constraints
288 #endif
289 IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_Constraints) {
290   AddExtensionToCommandLineWhitelist();
291   ASSERT_TRUE(RunExtensionSubtest("tab_capture", "constraints.html"))
292       << message_;
293 }
294
295 }  // namespace
296
297 }  // namespace extensions