OLD | NEW |
| (Empty) |
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/command_line.h" | |
6 #include "base/files/file_util.h" | |
7 #include "base/path_service.h" | |
8 #include "base/strings/string_util.h" | |
9 #include "base/strings/utf_string_conversions.h" | |
10 #include "content/browser/loader/resource_dispatcher_host_impl.h" | |
11 #include "content/public/browser/browser_thread.h" | |
12 #include "content/public/browser/resource_dispatcher_host_delegate.h" | |
13 #include "content/public/common/content_switches.h" | |
14 #include "content/public/test/browser_test_utils.h" | |
15 #include "content/public/test/content_browser_test.h" | |
16 #include "content/public/test/content_browser_test_utils.h" | |
17 #include "content/public/test/test_utils.h" | |
18 #include "content/shell/browser/shell.h" | |
19 #include "content/shell/common/shell_switches.h" | |
20 #include "net/test/embedded_test_server/embedded_test_server.h" | |
21 #include "net/test/url_request/url_request_mock_http_job.h" | |
22 #include "net/url_request/url_request.h" | |
23 #include "ui/gfx/geometry/rect.h" | |
24 | |
25 #if defined(OS_WIN) | |
26 #include "base/win/registry.h" | |
27 #endif | |
28 | |
29 // TODO(jschuh): Finish plugins on Win64. crbug.com/180861 | |
30 #if defined(OS_WIN) && defined(ARCH_CPU_X86_64) | |
31 #define MAYBE(x) DISABLED_##x | |
32 #else | |
33 #define MAYBE(x) x | |
34 #endif | |
35 | |
36 // In-process windowless plugin tests that create canvas break on Windows since | |
37 // Win32k Renderer Lockdown was enabled in M42. | |
38 #if defined(OS_WIN) | |
39 #define MAYBE_INPROC_WINDOWLESS(x) DISABLED_##x | |
40 #else | |
41 #define MAYBE_INPROC_WINDOWLESS(x) x | |
42 #endif | |
43 | |
44 using base::ASCIIToUTF16; | |
45 | |
46 namespace content { | |
47 namespace { | |
48 | |
49 void SetUrlRequestMock(const base::FilePath& path) { | |
50 net::URLRequestMockHTTPJob::AddUrlHandlers( | |
51 path, content::BrowserThread::GetBlockingPool()); | |
52 } | |
53 | |
54 } | |
55 | |
56 class PluginTest : public ContentBrowserTest { | |
57 protected: | |
58 PluginTest() {} | |
59 | |
60 void SetUpCommandLine(base::CommandLine* command_line) override { | |
61 // Some NPAPI tests schedule garbage collection to force object tear-down. | |
62 command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose_gc"); | |
63 | |
64 #if defined(OS_WIN) | |
65 const testing::TestInfo* const test_info = | |
66 testing::UnitTest::GetInstance()->current_test_info(); | |
67 if (strcmp(test_info->name(), "MediaPlayerNew") == 0) { | |
68 // The installer adds our process names to the registry key below. Since | |
69 // the installer might not have run on this machine, add it manually. | |
70 base::win::RegKey regkey; | |
71 if (regkey.Open(HKEY_LOCAL_MACHINE, | |
72 L"Software\\Microsoft\\MediaPlayer\\ShimInclusionList", | |
73 KEY_WRITE) == ERROR_SUCCESS) { | |
74 regkey.CreateKey(L"BROWSER_TESTS.EXE", KEY_READ); | |
75 } | |
76 } | |
77 #elif defined(OS_MACOSX) | |
78 base::FilePath plugin_dir; | |
79 PathService::Get(base::DIR_MODULE, &plugin_dir); | |
80 plugin_dir = plugin_dir.AppendASCII("plugins"); | |
81 // The plugins directory isn't read by default on the Mac, so it needs to be | |
82 // explicitly registered. | |
83 command_line->AppendSwitchPath(switches::kExtraPluginDir, plugin_dir); | |
84 #endif | |
85 command_line->AppendSwitch(switches::kEnableNpapiForTesting); | |
86 } | |
87 | |
88 void SetUpOnMainThread() override { | |
89 base::FilePath path = GetTestFilePath("", ""); | |
90 BrowserThread::PostTask( | |
91 BrowserThread::IO, FROM_HERE, base::Bind(&SetUrlRequestMock, path)); | |
92 } | |
93 | |
94 static void LoadAndWaitInWindow(Shell* window, const GURL& url) { | |
95 base::string16 expected_title(ASCIIToUTF16("OK")); | |
96 TitleWatcher title_watcher(window->web_contents(), expected_title); | |
97 title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); | |
98 title_watcher.AlsoWaitForTitle(ASCIIToUTF16("plugin_not_found")); | |
99 NavigateToURL(window, url); | |
100 base::string16 title = title_watcher.WaitAndGetTitle(); | |
101 if (title == ASCIIToUTF16("plugin_not_found")) { | |
102 const testing::TestInfo* const test_info = | |
103 testing::UnitTest::GetInstance()->current_test_info(); | |
104 VLOG(0) << "PluginTest." << test_info->name() | |
105 << " not running because plugin not installed."; | |
106 } else { | |
107 EXPECT_EQ(expected_title, title); | |
108 } | |
109 } | |
110 | |
111 void LoadAndWait(const GURL& url) { | |
112 LoadAndWaitInWindow(shell(), url); | |
113 } | |
114 | |
115 GURL GetURL(const char* filename) { | |
116 return GetTestUrl("npapi", filename); | |
117 } | |
118 | |
119 void NavigateAway() { | |
120 GURL url = GetTestUrl("", "simple_page.html"); | |
121 LoadAndWait(url); | |
122 } | |
123 | |
124 void TestPlugin(const char* filename) { | |
125 base::FilePath path = GetTestFilePath("plugin", filename); | |
126 if (!base::PathExists(path)) { | |
127 const testing::TestInfo* const test_info = | |
128 testing::UnitTest::GetInstance()->current_test_info(); | |
129 VLOG(0) << "PluginTest." << test_info->name() | |
130 << " not running because test data wasn't found."; | |
131 return; | |
132 } | |
133 | |
134 GURL url = GetTestUrl("plugin", filename); | |
135 LoadAndWait(url); | |
136 } | |
137 }; | |
138 | |
139 // Make sure that navigating away from a plugin referenced by JS doesn't | |
140 // crash. | |
141 IN_PROC_BROWSER_TEST_F(PluginTest, UnloadNoCrash) { | |
142 LoadAndWait(GetURL("layout_test_plugin.html")); | |
143 NavigateAway(); | |
144 } | |
145 | |
146 // Tests if a plugin executing a self deleting script using NPN_GetURL | |
147 // works without crashing or hanging | |
148 // Flaky: http://crbug.com/59327 | |
149 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginGetUrl)) { | |
150 LoadAndWait(GetURL("self_delete_plugin_geturl.html")); | |
151 } | |
152 | |
153 // Tests if a plugin executing a self deleting script using Invoke | |
154 // works without crashing or hanging | |
155 // Flaky. See http://crbug.com/30702 | |
156 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInvoke)) { | |
157 LoadAndWait(GetURL("self_delete_plugin_invoke.html")); | |
158 } | |
159 | |
160 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectReleasedOnDestruction)) { | |
161 NavigateToURL(shell(), GetURL("npobject_released_on_destruction.html")); | |
162 NavigateAway(); | |
163 } | |
164 | |
165 // Test that a dialog is properly created when a plugin throws an | |
166 // exception. Should be run for in and out of process plugins, but | |
167 // the more interesting case is out of process, where we must route | |
168 // the exception to the correct renderer. | |
169 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectSetException)) { | |
170 LoadAndWait(GetURL("npobject_set_exception.html")); | |
171 } | |
172 | |
173 #if defined(OS_WIN) | |
174 // Tests if a plugin executing a self deleting script in the context of | |
175 // a synchronous mouseup works correctly. | |
176 // This was never ported to Mac. The only thing remaining is to make | |
177 // SimulateMouseClick get to Mac plugins, currently it doesn't work. | |
178 IN_PROC_BROWSER_TEST_F( | |
179 PluginTest, | |
180 MAYBE_INPROC_WINDOWLESS(SelfDeletePluginInvokeInSynchronousMouseUp)) { | |
181 NavigateToURL(shell(), GetURL("execute_script_delete_in_mouse_up.html")); | |
182 | |
183 base::string16 expected_title(ASCIIToUTF16("OK")); | |
184 TitleWatcher title_watcher(shell()->web_contents(), expected_title); | |
185 title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); | |
186 SimulateMouseClick(shell()->web_contents(), 0, | |
187 blink::WebMouseEvent::ButtonLeft); | |
188 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); | |
189 } | |
190 #endif | |
191 | |
192 // Flaky, http://crbug.com/302274. | |
193 #if defined(OS_MACOSX) | |
194 #define MAYBE_GetURLRequest404Response DISABLED_GetURLRequest404Response | |
195 #else | |
196 #define MAYBE_GetURLRequest404Response MAYBE(GetURLRequest404Response) | |
197 #endif | |
198 | |
199 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE_GetURLRequest404Response) { | |
200 GURL url(net::URLRequestMockHTTPJob::GetMockUrl( | |
201 base::FilePath().AppendASCII("npapi").AppendASCII( | |
202 "plugin_url_request_404.html"))); | |
203 LoadAndWait(url); | |
204 } | |
205 | |
206 // Tests if a plugin executing a self deleting script using Invoke with | |
207 // a modal dialog showing works without crashing or hanging | |
208 // Disabled, flakily exceeds timeout, http://crbug.com/46257. | |
209 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInvokeAlert)) { | |
210 // Navigate asynchronously because if we waitd until it completes, there's a | |
211 // race condition where the alert can come up before we start watching for it. | |
212 shell()->LoadURL(GetURL("self_delete_plugin_invoke_alert.html")); | |
213 | |
214 base::string16 expected_title(ASCIIToUTF16("OK")); | |
215 TitleWatcher title_watcher(shell()->web_contents(), expected_title); | |
216 title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); | |
217 | |
218 WaitForAppModalDialog(shell()); | |
219 | |
220 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); | |
221 } | |
222 | |
223 // Test passing arguments to a plugin. | |
224 // crbug.com/306318 | |
225 #if !defined(OS_LINUX) | |
226 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Arguments)) { | |
227 LoadAndWait(GetURL("arguments.html")); | |
228 } | |
229 #endif | |
230 | |
231 // Test invoking many plugins within a single page. | |
232 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(ManyPlugins)) { | |
233 LoadAndWait(GetURL("many_plugins.html")); | |
234 } | |
235 | |
236 #if !defined(OS_MACOSX) // http://crbug.com/402164 | |
237 // Test various calls to GetURL from a plugin. | |
238 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetURL)) { | |
239 LoadAndWait(GetURL("geturl.html")); | |
240 } | |
241 #endif | |
242 | |
243 // Test various calls to GetURL for javascript URLs with | |
244 // non NULL targets from a plugin. | |
245 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetJavaScriptURL)) { | |
246 LoadAndWait(GetURL("get_javascript_url.html")); | |
247 } | |
248 | |
249 // Test that calling GetURL with a javascript URL and target=_self | |
250 // works properly when the plugin is embedded in a subframe. | |
251 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetJavaScriptURL2)) { | |
252 LoadAndWait(GetURL("get_javascript_url2.html")); | |
253 } | |
254 | |
255 // Test is flaky on linux/cros/win builders. http://crbug.com/71904 | |
256 IN_PROC_BROWSER_TEST_F(PluginTest, GetURLRedirectNotification) { | |
257 LoadAndWait(GetURL("geturl_redirect_notify.html")); | |
258 } | |
259 | |
260 // Tests that identity is preserved for NPObjects passed from a plugin | |
261 // into JavaScript. | |
262 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectIdentity)) { | |
263 LoadAndWait(GetURL("npobject_identity.html")); | |
264 } | |
265 | |
266 // Tests that if an NPObject is proxies back to its original process, the | |
267 // original pointer is returned and not a proxy. If this fails the plugin | |
268 // will crash. | |
269 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectProxy)) { | |
270 LoadAndWait(GetURL("npobject_proxy.html")); | |
271 } | |
272 | |
273 #if defined(OS_WIN) || defined(OS_MACOSX) | |
274 // Tests if a plugin executing a self deleting script in the context of | |
275 // a synchronous paint event works correctly | |
276 // http://crbug.com/44960 | |
277 IN_PROC_BROWSER_TEST_F( | |
278 PluginTest, | |
279 MAYBE_INPROC_WINDOWLESS(SelfDeletePluginInvokeInSynchronousPaint)) { | |
280 LoadAndWait(GetURL("execute_script_delete_in_paint.html")); | |
281 } | |
282 #endif | |
283 | |
284 // Tests that if a plugin executes a self resizing script in the context of a | |
285 // synchronous paint, the plugin doesn't use deallocated memory. | |
286 // http://crbug.com/139462 | |
287 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE_INPROC_WINDOWLESS(ResizeDuringPaint)) { | |
288 LoadAndWait(GetURL("resize_during_paint.html")); | |
289 } | |
290 | |
291 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInNewStream)) { | |
292 LoadAndWait(GetURL("self_delete_plugin_stream.html")); | |
293 } | |
294 | |
295 // On Mac this test asserts in plugin_host: http://crbug.com/95558 | |
296 // On all platforms it flakes in ~URLRequestContext: http://crbug.com/310336 | |
297 #if !defined(NDEBUG) | |
298 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_DeletePluginInDeallocate) { | |
299 LoadAndWait(GetURL("plugin_delete_in_deallocate.html")); | |
300 } | |
301 #endif | |
302 | |
303 #if defined(OS_WIN) | |
304 | |
305 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(VerifyPluginWindowRect)) { | |
306 LoadAndWait(GetURL("verify_plugin_window_rect.html")); | |
307 } | |
308 | |
309 // Tests that creating a new instance of a plugin while another one is handling | |
310 // a paint message doesn't cause deadlock. | |
311 // http://crbug.com/406184 | |
312 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_CreateInstanceInPaint) { | |
313 LoadAndWait(GetURL("create_instance_in_paint.html")); | |
314 } | |
315 | |
316 // Tests that putting up an alert in response to a paint doesn't deadlock. | |
317 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_AlertInWindowMessage) { | |
318 NavigateToURL(shell(), GetURL("alert_in_window_message.html")); | |
319 | |
320 WaitForAppModalDialog(shell()); | |
321 WaitForAppModalDialog(shell()); | |
322 } | |
323 | |
324 // http://crbug.com/406184 | |
325 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_VerifyNPObjectLifetimeTest) { | |
326 LoadAndWait(GetURL("npobject_lifetime_test.html")); | |
327 } | |
328 | |
329 // Tests that we don't crash or assert if NPP_New fails | |
330 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NewFails)) { | |
331 LoadAndWait(GetURL("new_fails.html")); | |
332 } | |
333 | |
334 IN_PROC_BROWSER_TEST_F(PluginTest, | |
335 MAYBE_INPROC_WINDOWLESS(SelfDeletePluginInNPNEvaluate)) { | |
336 LoadAndWait(GetURL("execute_script_delete_in_npn_evaluate.html")); | |
337 } | |
338 | |
339 IN_PROC_BROWSER_TEST_F( | |
340 PluginTest, | |
341 MAYBE_INPROC_WINDOWLESS(SelfDeleteCreatePluginInNPNEvaluate)) { | |
342 LoadAndWait(GetURL("npn_plugin_delete_create_in_evaluate.html")); | |
343 } | |
344 | |
345 #endif // OS_WIN | |
346 | |
347 // If this flakes, reopen http://crbug.com/17645 | |
348 // As of 6 July 2011, this test is flaky on Windows (perhaps due to timing out). | |
349 #if !defined(OS_MACOSX) && !defined(OS_LINUX) | |
350 // Disabled on Mac because the plugin side isn't implemented yet, see | |
351 // "TODO(port)" in plugin_javascript_open_popup.cc. | |
352 // Disabled on Linux because we don't support NPAPI any more. | |
353 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(OpenPopupWindowWithPlugin)) { | |
354 LoadAndWait(GetURL("get_javascript_open_popup_with_plugin.html")); | |
355 } | |
356 #endif | |
357 | |
358 // Test checking the privacy mode is off. | |
359 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PrivateDisabled)) { | |
360 LoadAndWait(GetURL("private.html")); | |
361 } | |
362 | |
363 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(ScheduleTimer)) { | |
364 LoadAndWait(GetURL("schedule_timer.html")); | |
365 } | |
366 | |
367 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PluginThreadAsyncCall)) { | |
368 LoadAndWait(GetURL("plugin_thread_async_call.html")); | |
369 } | |
370 | |
371 IN_PROC_BROWSER_TEST_F(PluginTest, PluginSingleRangeRequest) { | |
372 LoadAndWait(GetURL("plugin_single_range_request.html")); | |
373 } | |
374 | |
375 #if !defined(OS_WIN) // http://crbug.com/396373 | |
376 // Test checking the privacy mode is on. | |
377 // If this flakes on Linux, use http://crbug.com/104380 | |
378 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PrivateEnabled)) { | |
379 GURL url = GetURL("private.html"); | |
380 url = GURL(url.spec() + "?private"); | |
381 LoadAndWaitInWindow(CreateOffTheRecordBrowser(), url); | |
382 } | |
383 #endif | |
384 | |
385 // These used to run on Windows: http://crbug.com/396373 | |
386 #if defined(OS_MACOSX) | |
387 // Test a browser hang due to special case of multiple | |
388 // plugin instances indulged in sync calls across renderer. | |
389 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(MultipleInstancesSyncCalls)) { | |
390 LoadAndWait(GetURL("multiple_instances_sync_calls.html")); | |
391 } | |
392 | |
393 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetURLRequestFailWrite)) { | |
394 GURL url(net::URLRequestMockHTTPJob::GetMockUrl( | |
395 base::FilePath().AppendASCII("npapi").AppendASCII( | |
396 "plugin_url_request_fail_write.html"))); | |
397 LoadAndWait(url); | |
398 } | |
399 #endif | |
400 | |
401 #if defined(OS_WIN) | |
402 // Flaky on Windows x86. http://crbug.com/388245 | |
403 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_EnsureScriptingWorksInDestroy) { | |
404 LoadAndWait(GetURL("ensure_scripting_works_in_destroy.html")); | |
405 } | |
406 | |
407 // This test uses a Windows Event to signal to the plugin that it should crash | |
408 // on NP_Initialize. | |
409 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NoHangIfInitCrashes)) { | |
410 HANDLE crash_event = CreateEvent(NULL, TRUE, FALSE, L"TestPluginCrashOnInit"); | |
411 SetEvent(crash_event); | |
412 LoadAndWait(GetURL("no_hang_if_init_crashes.html")); | |
413 CloseHandle(crash_event); | |
414 } | |
415 #endif | |
416 | |
417 // If this flakes on Mac, use http://crbug.com/111508 | |
418 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PluginReferrerTest)) { | |
419 GURL url(net::URLRequestMockHTTPJob::GetMockUrl( | |
420 base::FilePath().AppendASCII("npapi").AppendASCII( | |
421 "plugin_url_request_referrer_test.html"))); | |
422 LoadAndWait(url); | |
423 } | |
424 | |
425 #if defined(OS_MACOSX) | |
426 // Test is flaky, see http://crbug.com/134515. | |
427 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_PluginConvertPointTest) { | |
428 gfx::Rect bounds(50, 50, 400, 400); | |
429 SetWindowBounds(shell()->window(), bounds); | |
430 | |
431 NavigateToURL(shell(), GetURL("convert_point.html")); | |
432 | |
433 base::string16 expected_title(ASCIIToUTF16("OK")); | |
434 TitleWatcher title_watcher(shell()->web_contents(), expected_title); | |
435 title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); | |
436 // TODO(stuartmorgan): When the automation system supports sending clicks, | |
437 // change the test to trigger on mouse-down rather than window focus. | |
438 | |
439 // TODO: is this code still needed? It was here when it used to run in | |
440 // browser_tests. | |
441 //static_cast<WebContentsDelegate*>(shell())-> | |
442 // ActivateContents(shell()->web_contents()); | |
443 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); | |
444 } | |
445 #endif | |
446 | |
447 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Flash)) { | |
448 TestPlugin("flash.html"); | |
449 } | |
450 | |
451 #if defined(OS_WIN) | |
452 // Windows only test | |
453 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_FlashSecurity) { | |
454 TestPlugin("flash.html"); | |
455 } | |
456 #endif // defined(OS_WIN) | |
457 | |
458 #if defined(OS_WIN) | |
459 // TODO(port) Port the following tests to platforms that have the required | |
460 // plugins. | |
461 // Flaky: http://crbug.com/55915 | |
462 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_Quicktime) { | |
463 TestPlugin("quicktime.html"); | |
464 } | |
465 | |
466 // Disabled - http://crbug.com/44662 | |
467 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(MediaPlayerNew)) { | |
468 TestPlugin("wmp_new.html"); | |
469 } | |
470 | |
471 // Disabled - http://crbug.com/44673 | |
472 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Real)) { | |
473 TestPlugin("real.html"); | |
474 } | |
475 | |
476 // http://crbug.com/320041 | |
477 #if (defined(OS_WIN) && defined(ARCH_CPU_X86_64)) || \ | |
478 (defined(GOOGLE_CHROME_BUILD) && defined(OS_WIN)) | |
479 #define MAYBE_FlashOctetStream DISABLED_FlashOctetStream | |
480 #else | |
481 #define MAYBE_FlashOctetStream FlashOctetStream | |
482 #endif | |
483 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE_FlashOctetStream) { | |
484 TestPlugin("flash-octet-stream.html"); | |
485 } | |
486 | |
487 #if defined(OS_WIN) | |
488 // http://crbug.com/53926 | |
489 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_FlashLayoutWhilePainting) { | |
490 #else | |
491 IN_PROC_BROWSER_TEST_F(PluginTest, FlashLayoutWhilePainting) { | |
492 #endif | |
493 TestPlugin("flash-layout-while-painting.html"); | |
494 } | |
495 | |
496 // http://crbug.com/8690 | |
497 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_Java) { | |
498 TestPlugin("Java.html"); | |
499 } | |
500 | |
501 // Flaky: http://crbug.com/55915 | |
502 IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_Silverlight) { | |
503 TestPlugin("silverlight.html"); | |
504 } | |
505 #endif // defined(OS_WIN) | |
506 | |
507 class TestResourceDispatcherHostDelegate | |
508 : public ResourceDispatcherHostDelegate { | |
509 public: | |
510 TestResourceDispatcherHostDelegate() : found_cookie_(false) {} | |
511 | |
512 bool found_cookie() { return found_cookie_; } | |
513 | |
514 void WaitForPluginRequest() { | |
515 if (found_cookie_) | |
516 return; | |
517 | |
518 runner_ = new MessageLoopRunner; | |
519 runner_->Run(); | |
520 } | |
521 | |
522 private: | |
523 // ResourceDispatcherHostDelegate implementation: | |
524 void OnResponseStarted(net::URLRequest* request, | |
525 ResourceContext* resource_context, | |
526 ResourceResponse* response, | |
527 IPC::Sender* sender) override { | |
528 // The URL below comes from plugin_geturl_test.cc. | |
529 if (!base::EndsWith(request->url().spec(), | |
530 "npapi/plugin_ref_target_page.html", | |
531 base::CompareCase::SENSITIVE)) { | |
532 return; | |
533 } | |
534 net::HttpRequestHeaders headers; | |
535 bool found_cookie = false; | |
536 if (request->GetFullRequestHeaders(&headers) && | |
537 headers.ToString().find("Cookie: blah") != std::string::npos) { | |
538 found_cookie = true; | |
539 } | |
540 BrowserThread::PostTask( | |
541 BrowserThread::UI, | |
542 FROM_HERE, | |
543 base::Bind(&TestResourceDispatcherHostDelegate::GotCookie, | |
544 base::Unretained(this), found_cookie)); | |
545 } | |
546 | |
547 void GotCookie(bool found_cookie) { | |
548 found_cookie_ = found_cookie; | |
549 if (runner_.get()) | |
550 runner_->QuitClosure().Run(); | |
551 } | |
552 | |
553 scoped_refptr<MessageLoopRunner> runner_; | |
554 bool found_cookie_; | |
555 | |
556 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate); | |
557 }; | |
558 | |
559 // Ensure that cookies get sent with plugin requests. | |
560 IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Cookies)) { | |
561 // Create a new browser just to ensure that the plugin process' child_id is | |
562 // not equal to its type (PROCESS_TYPE_PLUGIN), as that was the error which | |
563 // caused this bug. | |
564 NavigateToURL(CreateBrowser(), GURL("about:blank")); | |
565 | |
566 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
567 GURL url(embedded_test_server()->GetURL("/npapi/cookies.html")); | |
568 | |
569 TestResourceDispatcherHostDelegate test_delegate; | |
570 ResourceDispatcherHostDelegate* old_delegate = | |
571 ResourceDispatcherHostImpl::Get()->delegate(); | |
572 ResourceDispatcherHostImpl::Get()->SetDelegate(&test_delegate); | |
573 LoadAndWait(url); | |
574 test_delegate.WaitForPluginRequest(); | |
575 ASSERT_TRUE(test_delegate.found_cookie()); | |
576 ResourceDispatcherHostImpl::Get()->SetDelegate(old_delegate); | |
577 } | |
578 | |
579 } // namespace content | |
OLD | NEW |