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

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

Issue 1502963004: Use content::NavigateIframeToURL in ProcessManagerBrowserTest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoid 2 concurrent domAutomationController to pass ChromeSitePerProcessTest.PluginWithRemoteTopFrame Created 5 years 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "extensions/browser/process_manager.h" 5 #include "extensions/browser/process_manager.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/strings/stringprintf.h"
11 #include "chrome/browser/extensions/browser_action_test_util.h" 10 #include "chrome/browser/extensions/browser_action_test_util.h"
12 #include "chrome/browser/extensions/extension_browsertest.h" 11 #include "chrome/browser/extensions/extension_browsertest.h"
13 #include "chrome/browser/extensions/extension_service.h" 12 #include "chrome/browser/extensions/extension_service.h"
14 #include "chrome/browser/extensions/test_extension_dir.h" 13 #include "chrome/browser/extensions/test_extension_dir.h"
15 #include "chrome/browser/ui/tabs/tab_strip_model.h" 14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
16 #include "chrome/common/extensions/extension_process_policy.h" 15 #include "chrome/common/extensions/extension_process_policy.h"
17 #include "chrome/test/base/in_process_browser_test.h" 16 #include "chrome/test/base/in_process_browser_test.h"
18 #include "chrome/test/base/ui_test_utils.h" 17 #include "chrome/test/base/ui_test_utils.h"
19 #include "content/public/browser/notification_service.h" 18 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/render_frame_host.h" 19 #include "content/public/browser/render_frame_host.h"
21 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
22 #include "content/public/test/browser_test_utils.h" 21 #include "content/public/test/browser_test_utils.h"
23 #include "content/public/test/test_utils.h" 22 #include "content/public/test/test_utils.h"
24 #include "extensions/common/value_builder.h" 23 #include "extensions/common/value_builder.h"
25 #include "extensions/test/background_page_watcher.h" 24 #include "extensions/test/background_page_watcher.h"
26 #include "extensions/test/extension_test_message_listener.h"
27 #include "net/dns/mock_host_resolver.h" 25 #include "net/dns/mock_host_resolver.h"
28 #include "net/test/embedded_test_server/embedded_test_server.h" 26 #include "net/test/embedded_test_server/embedded_test_server.h"
29 27
30 namespace extensions { 28 namespace extensions {
31 29
32 namespace { 30 namespace {
33 31
34 void AddFrameToSet(std::set<content::RenderFrameHost*>* frames, 32 void AddFrameToSet(std::set<content::RenderFrameHost*>* frames,
35 content::RenderFrameHost* rfh) { 33 content::RenderFrameHost* rfh) {
36 if (rfh->IsRenderFrameLive()) 34 if (rfh->IsRenderFrameLive())
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 NavigationCompletedObserver observer( 142 NavigationCompletedObserver observer(
145 browser()->tab_strip_model()->GetActiveWebContents()); 143 browser()->tab_strip_model()->GetActiveWebContents());
146 144
147 ui_test_utils::NavigateToURL(browser(), url); 145 ui_test_utils::NavigateToURL(browser(), url);
148 146
149 // Wait until the last RenderFrameHosts are deleted. This wait doesn't take 147 // Wait until the last RenderFrameHosts are deleted. This wait doesn't take
150 // long. 148 // long.
151 observer.Wait(); 149 observer.Wait();
152 } 150 }
153 151
154 void NavigateIframeToURLAndWait(content::WebContents* web_contents,
155 const std::string iframe_id,
156 const GURL& url) {
157 // This is an improved version of content::NavigateIframeToURL. Unlike the
158 // other method, this does actually wait until the load of all child frames
159 // completes.
160 std::string script = base::StringPrintf(
161 "var frame = document.getElementById('%s');"
162 "frame.onload = frame.onerror = function(event) {"
163 " frame.onload = frame.onerror = null;"
164 " domAutomationController.send(event.type === 'load');"
165 "};"
166 "frame.src = '%s';",
167 iframe_id.c_str(), url.spec().c_str());
168 bool is_loaded = false;
169 EXPECT_TRUE(ExecuteScriptAndExtractBool(web_contents, script, &is_loaded));
170 EXPECT_TRUE(is_loaded);
171 }
172
173 size_t IfExtensionsIsolated(size_t if_enabled, size_t if_disabled) { 152 size_t IfExtensionsIsolated(size_t if_enabled, size_t if_disabled) {
174 return content::AreAllSitesIsolatedForTesting() || 153 return content::AreAllSitesIsolatedForTesting() ||
175 IsIsolateExtensionsEnabled() 154 IsIsolateExtensionsEnabled()
176 ? if_enabled 155 ? if_enabled
177 : if_disabled; 156 : if_disabled;
178 } 157 }
179 158
180 private: 159 private:
181 std::vector<scoped_ptr<TestExtensionDir>> temp_dirs_; 160 std::vector<scoped_ptr<TestExtensionDir>> temp_dirs_;
182 }; 161 };
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 EXPECT_EQ(0u, pm->GetAllFrames().size()); 355 EXPECT_EQ(0u, pm->GetAllFrames().size());
377 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 356 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
378 357
379 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); 358 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html"));
380 EXPECT_EQ(0u, pm->GetAllFrames().size()); 359 EXPECT_EQ(0u, pm->GetAllFrames().size());
381 360
382 content::WebContents* tab = 361 content::WebContents* tab =
383 browser()->tab_strip_model()->GetActiveWebContents(); 362 browser()->tab_strip_model()->GetActiveWebContents();
384 363
385 // Tests extension frames in non-extension page. 364 // Tests extension frames in non-extension page.
386 NavigateIframeToURLAndWait(tab, "frame1", kExt1EmptyUrl); 365 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl));
387 EXPECT_EQ(IfExtensionsIsolated(1, 0), 366 EXPECT_EQ(IfExtensionsIsolated(1, 0),
388 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 367 pm->GetRenderFrameHostsForExtension(extension1->id()).size());
389 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size()); 368 EXPECT_EQ(IfExtensionsIsolated(1, 0), pm->GetAllFrames().size());
390 369
391 NavigateIframeToURLAndWait(tab, "frame2", kExt2EmptyUrl); 370 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", kExt2EmptyUrl));
392 EXPECT_EQ(IfExtensionsIsolated(1, 0), 371 EXPECT_EQ(IfExtensionsIsolated(1, 0),
393 pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 372 pm->GetRenderFrameHostsForExtension(extension2->id()).size());
394 EXPECT_EQ(IfExtensionsIsolated(2, 0), pm->GetAllFrames().size()); 373 EXPECT_EQ(IfExtensionsIsolated(2, 0), pm->GetAllFrames().size());
395 374
396 // Tests non-extension page in extension frame. 375 // Tests non-extension page in extension frame.
397 NavigateToURL(kExt1TwoFramesUrl); 376 NavigateToURL(kExt1TwoFramesUrl);
398 // 1 top-level + 2 child frames from Extension 1. 377 // 1 top-level + 2 child frames from Extension 1.
399 EXPECT_EQ(3u, pm->GetAllFrames().size()); 378 EXPECT_EQ(3u, pm->GetAllFrames().size());
400 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 379 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
401 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 380 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
402 381
403 NavigateIframeToURLAndWait(tab, "frame1", 382 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1",
404 embedded_test_server()->GetURL("/empty.html")); 383 embedded_test_server()
384 ->GetURL("/empty.html")));
405 // 1 top-level + 1 child frame from Extension 1. 385 // 1 top-level + 1 child frame from Extension 1.
406 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 386 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
407 EXPECT_EQ(2u, pm->GetAllFrames().size()); 387 EXPECT_EQ(2u, pm->GetAllFrames().size());
408 388
409 NavigateIframeToURLAndWait(tab, "frame1", kExt1EmptyUrl); 389 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl));
410 // 1 top-level + 2 child frames from Extension 1. 390 // 1 top-level + 2 child frames from Extension 1.
411 EXPECT_EQ(3u, pm->GetAllFrames().size()); 391 EXPECT_EQ(3u, pm->GetAllFrames().size());
412 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 392 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
413 393
414 // Load a frame from another extension. 394 // Load a frame from another extension.
415 NavigateIframeToURLAndWait(tab, "frame1", kExt2EmptyUrl); 395 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt2EmptyUrl));
416 // 1 top-level + 1 child frame from Extension 1, 396 // 1 top-level + 1 child frame from Extension 1,
417 // 1 child frame from Extension 2. 397 // 1 child frame from Extension 2.
418 EXPECT_EQ(IfExtensionsIsolated(3, 2), pm->GetAllFrames().size()); 398 EXPECT_EQ(IfExtensionsIsolated(3, 2), pm->GetAllFrames().size());
419 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 399 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
420 EXPECT_EQ(IfExtensionsIsolated(1, 0), 400 EXPECT_EQ(IfExtensionsIsolated(1, 0),
421 pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 401 pm->GetRenderFrameHostsForExtension(extension2->id()).size());
422 402
423 // Destroy all existing frames by navigating to another extension. 403 // Destroy all existing frames by navigating to another extension.
424 NavigateToURL(extension2->url().Resolve("empty.html")); 404 NavigateToURL(extension2->url().Resolve("empty.html"));
425 EXPECT_EQ(1u, pm->GetAllFrames().size()); 405 EXPECT_EQ(1u, pm->GetAllFrames().size());
426 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 406 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
427 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 407 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
428 408
429 // Test about:blank and about:srcdoc child frames. 409 // Test about:blank and about:srcdoc child frames.
430 NavigateToURL(extension2->url().Resolve("srcdoc_iframe.html")); 410 NavigateToURL(extension2->url().Resolve("srcdoc_iframe.html"));
431 // 1 top-level frame + 1 child frame from Extension 2. 411 // 1 top-level frame + 1 child frame from Extension 2.
432 EXPECT_EQ(2u, pm->GetAllFrames().size()); 412 EXPECT_EQ(2u, pm->GetAllFrames().size());
433 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 413 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
434 414
435 NavigateToURL(extension2->url().Resolve("blank_iframe.html")); 415 NavigateToURL(extension2->url().Resolve("blank_iframe.html"));
436 // 1 top-level frame + 1 child frame from Extension 2. 416 // 1 top-level frame + 1 child frame from Extension 2.
437 EXPECT_EQ(2u, pm->GetAllFrames().size()); 417 EXPECT_EQ(2u, pm->GetAllFrames().size());
438 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 418 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
439 419
440 // Sandboxed frames are not viewed as extension frames. 420 // Sandboxed frames are not viewed as extension frames.
441 NavigateIframeToURLAndWait(tab, "frame0", 421 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame0",
442 extension2->url().Resolve("sandboxed.html")); 422 extension2->url()
423 .Resolve("sandboxed.html")));
443 // 1 top-level frame from Extension 2. 424 // 1 top-level frame from Extension 2.
444 EXPECT_EQ(1u, pm->GetAllFrames().size()); 425 EXPECT_EQ(1u, pm->GetAllFrames().size());
445 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 426 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
446 427
447 NavigateToURL(extension2->url().Resolve("sandboxed.html")); 428 NavigateToURL(extension2->url().Resolve("sandboxed.html"));
448 EXPECT_EQ(0u, pm->GetAllFrames().size()); 429 EXPECT_EQ(0u, pm->GetAllFrames().size());
449 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 430 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
450 431
451 // Test nested frames (same extension). 432 // Test nested frames (same extension).
452 NavigateToURL(kExt2TwoFramesUrl); 433 NavigateToURL(kExt2TwoFramesUrl);
453 // 1 top-level + 2 child frames from Extension 2. 434 // 1 top-level + 2 child frames from Extension 2.
454 EXPECT_EQ(3u, pm->GetAllFrames().size()); 435 EXPECT_EQ(3u, pm->GetAllFrames().size());
455 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 436 EXPECT_EQ(3u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
456 437
457 NavigateIframeToURLAndWait(tab, "frame1", kExt2TwoFramesUrl); 438 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt2TwoFramesUrl));
458 // 1 top-level + 2 child frames from Extension 1, 439 // 1 top-level + 2 child frames from Extension 1,
459 // 2 child frames in frame1 from Extension 2. 440 // 2 child frames in frame1 from Extension 2.
460 EXPECT_EQ(5u, pm->GetAllFrames().size()); 441 EXPECT_EQ(5u, pm->GetAllFrames().size());
461 EXPECT_EQ(5u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 442 EXPECT_EQ(5u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
462 443
463 // The extension frame from the other extension should not be classified as an 444 // The extension frame from the other extension should not be classified as an
464 // extension (unless out-of-process frames are enabled). 445 // extension (unless out-of-process frames are enabled).
465 NavigateIframeToURLAndWait(tab, "frame1", kExt1EmptyUrl); 446 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl));
466 // 1 top-level + 1 child frames from Extension 2, 447 // 1 top-level + 1 child frames from Extension 2,
467 // 1 child frame from Extension 1. 448 // 1 child frame from Extension 1.
468 EXPECT_EQ(IfExtensionsIsolated(3, 2), pm->GetAllFrames().size()); 449 EXPECT_EQ(IfExtensionsIsolated(3, 2), pm->GetAllFrames().size());
469 EXPECT_EQ(IfExtensionsIsolated(1, 0), 450 EXPECT_EQ(IfExtensionsIsolated(1, 0),
470 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 451 pm->GetRenderFrameHostsForExtension(extension1->id()).size());
471 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 452 EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
472 453
473 NavigateIframeToURLAndWait(tab, "frame2", kExt1TwoFramesUrl); 454 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame2", kExt1TwoFramesUrl));
474 // 1 top-level + 1 child frames from Extension 2, 455 // 1 top-level + 1 child frames from Extension 2,
475 // 1 child frame + 2 child frames in frame2 from Extension 1. 456 // 1 child frame + 2 child frames in frame2 from Extension 1.
476 EXPECT_EQ(IfExtensionsIsolated(5, 1), pm->GetAllFrames().size()); 457 EXPECT_EQ(IfExtensionsIsolated(5, 1), pm->GetAllFrames().size());
477 EXPECT_EQ(IfExtensionsIsolated(4, 0), 458 EXPECT_EQ(IfExtensionsIsolated(4, 0),
478 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 459 pm->GetRenderFrameHostsForExtension(extension1->id()).size());
479 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 460 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
480 461
481 // Crash tab where the top-level frame is an extension frame. 462 // Crash tab where the top-level frame is an extension frame.
482 content::CrashTab(tab); 463 content::CrashTab(tab);
483 EXPECT_EQ(0u, pm->GetAllFrames().size()); 464 EXPECT_EQ(0u, pm->GetAllFrames().size());
484 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 465 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
485 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size()); 466 EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
486 467
487 // Now load an extension page and a non-extension page... 468 // Now load an extension page and a non-extension page...
488 ui_test_utils::NavigateToURLWithDisposition( 469 ui_test_utils::NavigateToURLWithDisposition(
489 browser(), kExt1EmptyUrl, NEW_BACKGROUND_TAB, 470 browser(), kExt1EmptyUrl, NEW_BACKGROUND_TAB,
490 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 471 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
491 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html")); 472 NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html"));
492 EXPECT_EQ(1u, pm->GetAllFrames().size()); 473 EXPECT_EQ(1u, pm->GetAllFrames().size());
493 474
494 // ... load an extension frame in the non-extension process 475 // ... load an extension frame in the non-extension process
495 NavigateIframeToURLAndWait(tab, "frame1", kExt1EmptyUrl); 476 EXPECT_TRUE(content::NavigateIframeToURL(tab, "frame1", kExt1EmptyUrl));
496 EXPECT_EQ(IfExtensionsIsolated(2, 1), 477 EXPECT_EQ(IfExtensionsIsolated(2, 1),
497 pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 478 pm->GetRenderFrameHostsForExtension(extension1->id()).size());
498 479
499 // ... and take down the tab. The extension process is not part of the tab, 480 // ... and take down the tab. The extension process is not part of the tab,
500 // so it should be kept alive (minus the frames that died). 481 // so it should be kept alive (minus the frames that died).
501 content::CrashTab(tab); 482 content::CrashTab(tab);
502 EXPECT_EQ(1u, pm->GetAllFrames().size()); 483 EXPECT_EQ(1u, pm->GetAllFrames().size());
503 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size()); 484 EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
504 } 485 }
505 486
(...skipping 27 matching lines...) Expand all
533 pm->OnNetworkRequestDone(frame_host, 1); 514 pm->OnNetworkRequestDone(frame_host, 1);
534 EXPECT_EQ(baseline_keepalive, pm->GetLazyKeepaliveCount(extension.get())); 515 EXPECT_EQ(baseline_keepalive, pm->GetLazyKeepaliveCount(extension.get()));
535 516
536 // Simulate only a request completion for this ID and ensure it doesn't result 517 // Simulate only a request completion for this ID and ensure it doesn't result
537 // in keepalive decrement. 518 // in keepalive decrement.
538 pm->OnNetworkRequestDone(frame_host, 2); 519 pm->OnNetworkRequestDone(frame_host, 2);
539 EXPECT_EQ(baseline_keepalive, pm->GetLazyKeepaliveCount(extension.get())); 520 EXPECT_EQ(baseline_keepalive, pm->GetLazyKeepaliveCount(extension.get()));
540 } 521 }
541 522
542 } // namespace extensions 523 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698