| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |