Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: chrome/browser/extensions/app_background_page_apitest.cc

Issue 2882513005: Propagate opener to BackgroundsContents. (Closed)
Patch Set: Tweaked the comment in DriveWebContentsManager::ShouldCreateWebContents Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/location.h" 5 #include "base/location.h"
6 #include "base/path_service.h" 6 #include "base/path_service.h"
7 #include "base/single_thread_task_runner.h" 7 #include "base/single_thread_task_runner.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "base/threading/thread_restrictions.h" 10 #include "base/threading/thread_restrictions.h"
11 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
12 #include "build/build_config.h" 12 #include "build/build_config.h"
13 #include "chrome/browser/background/background_contents_service.h" 13 #include "chrome/browser/background/background_contents_service.h"
14 #include "chrome/browser/background/background_contents_service_factory.h" 14 #include "chrome/browser/background/background_contents_service_factory.h"
15 #include "chrome/browser/background/background_mode_manager.h" 15 #include "chrome/browser/background/background_mode_manager.h"
16 #include "chrome/browser/browser_process.h" 16 #include "chrome/browser/browser_process.h"
17 #include "chrome/browser/chrome_notification_types.h" 17 #include "chrome/browser/chrome_notification_types.h"
18 #include "chrome/browser/extensions/extension_apitest.h" 18 #include "chrome/browser/extensions/extension_apitest.h"
19 #include "chrome/browser/extensions/extension_service.h" 19 #include "chrome/browser/extensions/extension_service.h"
20 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
21 #include "chrome/browser/ui/browser.h" 21 #include "chrome/browser/ui/browser.h"
22 #include "chrome/browser/ui/browser_dialogs.h" 22 #include "chrome/browser/ui/browser_dialogs.h"
23 #include "chrome/browser/ui/browser_window.h" 23 #include "chrome/browser/ui/browser_window.h"
24 #include "chrome/browser/ui/extensions/application_launch.h" 24 #include "chrome/browser/ui/extensions/application_launch.h"
25 #include "chrome/common/chrome_paths.h" 25 #include "chrome/common/chrome_paths.h"
26 #include "chrome/common/chrome_switches.h" 26 #include "chrome/common/chrome_switches.h"
27 #include "content/public/browser/notification_service.h" 27 #include "content/public/browser/notification_service.h"
28 #include "content/public/browser/render_frame_host.h"
29 #include "content/public/test/browser_test_utils.h"
28 #include "content/public/test/test_notification_tracker.h" 30 #include "content/public/test/test_notification_tracker.h"
29 #include "content/public/test/test_utils.h" 31 #include "content/public/test/test_utils.h"
30 #include "extensions/browser/process_manager.h" 32 #include "extensions/browser/process_manager.h"
31 #include "extensions/common/extension.h" 33 #include "extensions/common/extension.h"
32 #include "extensions/common/switches.h" 34 #include "extensions/common/switches.h"
33 #include "extensions/test/extension_test_message_listener.h" 35 #include "extensions/test/extension_test_message_listener.h"
34 #include "net/dns/mock_host_resolver.h" 36 #include "net/dns/mock_host_resolver.h"
35 #include "net/test/embedded_test_server/embedded_test_server.h" 37 #include "net/test/embedded_test_server/embedded_test_server.h"
38 #include "url/gurl.h"
36 39
37 #if !defined(DISABLE_NACL) 40 #if !defined(DISABLE_NACL)
38 #include "components/nacl/browser/nacl_process_host.h" 41 #include "components/nacl/browser/nacl_process_host.h"
39 #endif 42 #endif
40 43
41 #if defined(OS_MACOSX) 44 #if defined(OS_MACOSX)
42 #include "base/mac/scoped_nsautorelease_pool.h" 45 #include "base/mac/scoped_nsautorelease_pool.h"
43 #endif 46 #endif
44 47
45 using base::ASCIIToUTF16; 48 using base::ASCIIToUTF16;
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 241
239 base::FilePath app_dir; 242 base::FilePath app_dir;
240 ASSERT_TRUE(CreateApp(app_manifest, &app_dir)); 243 ASSERT_TRUE(CreateApp(app_manifest, &app_dir));
241 // Background mode should not be active now because no background app was 244 // Background mode should not be active now because no background app was
242 // loaded. 245 // loaded.
243 ASSERT_TRUE(LoadExtension(app_dir)); 246 ASSERT_TRUE(LoadExtension(app_dir));
244 // Background mode be active now because a background page was created when 247 // Background mode be active now because a background page was created when
245 // the app was loaded. 248 // the app was loaded.
246 ASSERT_TRUE(WaitForBackgroundMode(true)); 249 ASSERT_TRUE(WaitForBackgroundMode(true));
247 250
251 // Verify that the background contents exist.
248 const Extension* extension = GetSingleLoadedExtension(); 252 const Extension* extension = GetSingleLoadedExtension();
249 ASSERT_TRUE( 253 BackgroundContents* background_contents =
250 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 254 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())
251 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 255 ->GetAppBackgroundContents(ASCIIToUTF16(extension->id()));
256 ASSERT_TRUE(background_contents);
257
258 // Verify that window.opener in the background contents is not set when
259 // creating the background page through the manifest (not through
260 // window.open).
261 EXPECT_FALSE(background_contents->web_contents()->GetOpener());
262 bool window_opener_null_in_js;
263 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
264 background_contents->web_contents(),
265 "domAutomationController.send(window.opener == null);",
266 &window_opener_null_in_js));
267 EXPECT_TRUE(window_opener_null_in_js);
268
252 UnloadExtension(extension->id()); 269 UnloadExtension(extension->id());
253 } 270 }
254 271
255 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, NoJsBackgroundPage) { 272 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, NoJsBackgroundPage) {
256 // Keep the task manager up through this test to verify that a crash doesn't 273 // Keep the task manager up through this test to verify that a crash doesn't
257 // happen when window.open creates a background page that switches 274 // happen when window.open creates a background page that switches
258 // RenderViewHosts. See http://crbug.com/165138. 275 // RenderViewHosts. See http://crbug.com/165138.
259 chrome::ShowTaskManager(browser()); 276 chrome::ShowTaskManager(browser());
260 277
261 // Make sure that no BackgroundContentses get deleted (a signal that repeated 278 // Make sure that no BackgroundContentses get deleted (a signal that repeated
(...skipping 27 matching lines...) Expand all
289 ASSERT_TRUE(LoadExtension(app_dir)); 306 ASSERT_TRUE(LoadExtension(app_dir));
290 307
291 // There isn't a background page loaded initially. 308 // There isn't a background page loaded initially.
292 const Extension* extension = GetSingleLoadedExtension(); 309 const Extension* extension = GetSingleLoadedExtension();
293 ASSERT_FALSE( 310 ASSERT_FALSE(
294 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 311 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())->
295 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 312 GetAppBackgroundContents(ASCIIToUTF16(extension->id())));
296 // The test makes sure that window.open returns null. 313 // The test makes sure that window.open returns null.
297 ASSERT_TRUE(RunExtensionTest("app_background_page/no_js")) << message_; 314 ASSERT_TRUE(RunExtensionTest("app_background_page/no_js")) << message_;
298 // And after it runs there should be a background page. 315 // And after it runs there should be a background page.
299 ASSERT_TRUE( 316 BackgroundContents* background_contents =
300 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 317 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())
301 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 318 ->GetAppBackgroundContents(ASCIIToUTF16(extension->id()));
319 ASSERT_TRUE(background_contents);
320
321 // Verify that window.opener in the background contents is not set when
322 // allow_js_access=false.
323 EXPECT_FALSE(background_contents->web_contents()->GetOpener());
324 bool window_opener_null_in_js;
325 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
326 background_contents->web_contents(),
327 "domAutomationController.send(window.opener == null);",
328 &window_opener_null_in_js));
329 EXPECT_TRUE(window_opener_null_in_js);
302 330
303 EXPECT_EQ(0u, background_deleted_tracker.size()); 331 EXPECT_EQ(0u, background_deleted_tracker.size());
304 UnloadExtension(extension->id()); 332 UnloadExtension(extension->id());
305 } 333 }
306 334
307 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, NoJsManifestBackgroundPage) { 335 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, NoJsManifestBackgroundPage) {
308 std::string app_manifest = base::StringPrintf( 336 std::string app_manifest = base::StringPrintf(
309 "{" 337 "{"
310 " \"name\": \"App\"," 338 " \"name\": \"App\","
311 " \"version\": \"0.1\"," 339 " \"version\": \"0.1\","
(...skipping 12 matching lines...) Expand all
324 " \"allow_js_access\": false" 352 " \"allow_js_access\": false"
325 " }" 353 " }"
326 "}", 354 "}",
327 embedded_test_server()->port(), 355 embedded_test_server()->port(),
328 embedded_test_server()->port()); 356 embedded_test_server()->port());
329 357
330 base::FilePath app_dir; 358 base::FilePath app_dir;
331 ASSERT_TRUE(CreateApp(app_manifest, &app_dir)); 359 ASSERT_TRUE(CreateApp(app_manifest, &app_dir));
332 ASSERT_TRUE(LoadExtension(app_dir)); 360 ASSERT_TRUE(LoadExtension(app_dir));
333 361
334 // The background page should load, but window.open should return null. 362 // The background page should load.
335 const Extension* extension = GetSingleLoadedExtension(); 363 const Extension* extension = GetSingleLoadedExtension();
336 ASSERT_TRUE( 364 BackgroundContents* background_contents =
337 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 365 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())
338 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 366 ->GetAppBackgroundContents(ASCIIToUTF16(extension->id()));
367 ASSERT_TRUE(background_contents);
368
369 // Verify that window.opener in the background contents is not set when
370 // creating the background page through the manifest (not through
371 // window.open).
372 EXPECT_FALSE(background_contents->web_contents()->GetOpener());
373 bool window_opener_null_in_js;
374 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
375 background_contents->web_contents(),
376 "domAutomationController.send(window.opener == null);",
377 &window_opener_null_in_js));
378 EXPECT_TRUE(window_opener_null_in_js);
379
380 // window.open should return null.
339 ASSERT_TRUE(RunExtensionTest("app_background_page/no_js_manifest")) << 381 ASSERT_TRUE(RunExtensionTest("app_background_page/no_js_manifest")) <<
340 message_; 382 message_;
383
384 // Verify that window.opener in the background contents is still not set.
385 EXPECT_FALSE(background_contents->web_contents()->GetOpener());
386 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
387 background_contents->web_contents(),
388 "domAutomationController.send(window.opener == null);",
389 &window_opener_null_in_js));
390 EXPECT_TRUE(window_opener_null_in_js);
391
341 UnloadExtension(extension->id()); 392 UnloadExtension(extension->id());
342 } 393 }
343 394
344 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, OpenTwoBackgroundPages) { 395 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, OpenTwoBackgroundPages) {
345 std::string app_manifest = base::StringPrintf( 396 std::string app_manifest = base::StringPrintf(
346 "{" 397 "{"
347 " \"name\": \"App\"," 398 " \"name\": \"App\","
348 " \"version\": \"0.1\"," 399 " \"version\": \"0.1\","
349 " \"manifest_version\": 2," 400 " \"manifest_version\": 2,"
350 " \"app\": {" 401 " \"app\": {"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 "}", 470 "}",
420 embedded_test_server()->port(), 471 embedded_test_server()->port(),
421 embedded_test_server()->port()); 472 embedded_test_server()->port());
422 473
423 base::FilePath app_dir; 474 base::FilePath app_dir;
424 ASSERT_TRUE(CreateApp(app_manifest, &app_dir)); 475 ASSERT_TRUE(CreateApp(app_manifest, &app_dir));
425 ASSERT_TRUE(LoadExtension(app_dir)); 476 ASSERT_TRUE(LoadExtension(app_dir));
426 ASSERT_TRUE(RunExtensionTest("app_background_page/bg_open")) << message_; 477 ASSERT_TRUE(RunExtensionTest("app_background_page/bg_open")) << message_;
427 } 478 }
428 479
429 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, DISABLED_OpenThenClose) { 480 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, OpenThenClose) {
430 std::string app_manifest = base::StringPrintf( 481 std::string app_manifest = base::StringPrintf(
431 "{" 482 "{"
432 " \"name\": \"App\"," 483 " \"name\": \"App\","
433 " \"version\": \"0.1\"," 484 " \"version\": \"0.1\","
434 " \"manifest_version\": 2," 485 " \"manifest_version\": 2,"
435 " \"app\": {" 486 " \"app\": {"
436 " \"urls\": [" 487 " \"urls\": ["
437 " \"http://a.com/\"" 488 " \"http://a.com/\""
438 " ]," 489 " ],"
439 " \"launch\": {" 490 " \"launch\": {"
(...skipping 10 matching lines...) Expand all
450 // There isn't a background page loaded initially. 501 // There isn't a background page loaded initially.
451 const Extension* extension = GetSingleLoadedExtension(); 502 const Extension* extension = GetSingleLoadedExtension();
452 ASSERT_FALSE( 503 ASSERT_FALSE(
453 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 504 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())->
454 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 505 GetAppBackgroundContents(ASCIIToUTF16(extension->id())));
455 // Background mode should not be active until a background page is created. 506 // Background mode should not be active until a background page is created.
456 ASSERT_TRUE(WaitForBackgroundMode(false)); 507 ASSERT_TRUE(WaitForBackgroundMode(false));
457 ASSERT_TRUE(RunExtensionTest("app_background_page/basic_open")) << message_; 508 ASSERT_TRUE(RunExtensionTest("app_background_page/basic_open")) << message_;
458 // Background mode should be active now because a background page was created. 509 // Background mode should be active now because a background page was created.
459 ASSERT_TRUE(WaitForBackgroundMode(true)); 510 ASSERT_TRUE(WaitForBackgroundMode(true));
460 ASSERT_TRUE( 511
461 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 512 // Verify that the background contents exist.
462 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 513 BackgroundContents* background_contents =
514 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())
515 ->GetAppBackgroundContents(ASCIIToUTF16(extension->id()));
516 ASSERT_TRUE(background_contents);
517
518 // Verify that window.opener in the background contents is set.
519 content::RenderFrameHost* background_opener =
520 background_contents->web_contents()->GetOpener();
521 ASSERT_TRUE(background_opener);
522 std::string window_opener_href;
523 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
524 background_contents->web_contents(),
525 "domAutomationController.send(window.opener.location.href);",
526 &window_opener_href));
527 EXPECT_EQ(window_opener_href,
528 background_opener->GetLastCommittedURL().spec());
529
463 // Now close the BackgroundContents. 530 // Now close the BackgroundContents.
464 ASSERT_TRUE(RunExtensionTest("app_background_page/basic_close")) << message_; 531 ASSERT_TRUE(RunExtensionTest("app_background_page/basic_close")) << message_;
532
465 // Background mode should no longer be active. 533 // Background mode should no longer be active.
466 ASSERT_TRUE(WaitForBackgroundMode(false)); 534 ASSERT_TRUE(WaitForBackgroundMode(false));
467 ASSERT_FALSE( 535 ASSERT_FALSE(
468 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())-> 536 BackgroundContentsServiceFactory::GetForProfile(browser()->profile())->
469 GetAppBackgroundContents(ASCIIToUTF16(extension->id()))); 537 GetAppBackgroundContents(ASCIIToUTF16(extension->id())));
470 } 538 }
471 539
472 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, UnloadExtensionWhileHidden) { 540 IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, UnloadExtensionWhileHidden) {
473 std::string app_manifest = base::StringPrintf( 541 std::string app_manifest = base::StringPrintf(
474 "{" 542 "{"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 ExtensionTestMessageListener ready_listener("ready", true); 637 ExtensionTestMessageListener ready_listener("ready", true);
570 LaunchTestingApp(); 638 LaunchTestingApp();
571 EXPECT_TRUE(ready_listener.WaitUntilSatisfied()); 639 EXPECT_TRUE(ready_listener.WaitUntilSatisfied());
572 640
573 ExtensionTestMessageListener created_listener("created_module:1", false); 641 ExtensionTestMessageListener created_listener("created_module:1", false);
574 ready_listener.Reply("create_module_without_hack"); 642 ready_listener.Reply("create_module_without_hack");
575 EXPECT_TRUE(created_listener.WaitUntilSatisfied()); 643 EXPECT_TRUE(created_listener.WaitUntilSatisfied());
576 } 644 }
577 645
578 #endif // !defined(DISABLE_NACL) 646 #endif // !defined(DISABLE_NACL)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698