Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 package org.chromium.chrome.browser; | 5 package org.chromium.chrome.browser; |
| 6 | 6 |
| 7 import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_E ND_DEVICE; | |
| 8 | |
| 7 import android.content.Context; | 9 import android.content.Context; |
| 8 import android.test.FlakyTest; | 10 import android.test.FlakyTest; |
| 9 import android.test.suitebuilder.annotation.LargeTest; | 11 import android.test.suitebuilder.annotation.LargeTest; |
| 10 import android.util.SparseArray; | 12 import android.util.SparseArray; |
| 11 import android.util.SparseBooleanArray; | 13 import android.util.SparseBooleanArray; |
| 12 | 14 |
| 13 import org.chromium.base.ThreadUtils; | 15 import org.chromium.base.ThreadUtils; |
| 14 import org.chromium.base.test.util.CommandLineFlags; | 16 import org.chromium.base.test.util.CommandLineFlags; |
| 15 import org.chromium.base.test.util.Feature; | 17 import org.chromium.base.test.util.Feature; |
| 18 import org.chromium.base.test.util.Restriction; | |
| 16 import org.chromium.chrome.browser.compositor.layouts.Layout; | 19 import org.chromium.chrome.browser.compositor.layouts.Layout; |
| 17 import org.chromium.chrome.browser.tab.Tab; | 20 import org.chromium.chrome.browser.tab.Tab; |
| 18 import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; | 21 import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; |
| 19 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 22 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| 20 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; | 23 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; |
| 21 import org.chromium.chrome.browser.tabmodel.TabModelUtils; | 24 import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
| 22 import org.chromium.chrome.test.ChromeActivityTestCaseBase; | 25 import org.chromium.chrome.test.ChromeActivityTestCaseBase; |
| 23 import org.chromium.chrome.test.util.ChromeTabUtils; | 26 import org.chromium.chrome.test.util.ChromeTabUtils; |
| 24 import org.chromium.chrome.test.util.TestHttpServerClient; | 27 import org.chromium.chrome.test.util.TestHttpServerClient; |
| 25 import org.chromium.content.browser.BindingManager; | 28 import org.chromium.content.browser.BindingManager; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 public void releaseAllModerateBindings() { | 112 public void releaseAllModerateBindings() { |
| 110 mIsReleaseAllModerateBindingsCalled = true; | 113 mIsReleaseAllModerateBindingsCalled = true; |
| 111 } | 114 } |
| 112 } | 115 } |
| 113 | 116 |
| 114 private MockBindingManager mBindingManager; | 117 private MockBindingManager mBindingManager; |
| 115 | 118 |
| 116 private static final String FILE_PATH = "chrome/test/data/android/test.html" ; | 119 private static final String FILE_PATH = "chrome/test/data/android/test.html" ; |
| 117 // about:version will always be handled by a different renderer than a local file. | 120 // about:version will always be handled by a different renderer than a local file. |
| 118 private static final String ABOUT_VERSION_PATH = "chrome://version/"; | 121 private static final String ABOUT_VERSION_PATH = "chrome://version/"; |
| 122 private static final String SHARED_RENDERER_PAGE_PATH = | |
| 123 "chrome/test/data/android/bindingmanager/shared_renderer1.html"; | |
| 119 | 124 |
| 120 public BindingManagerIntegrationTest() { | 125 public BindingManagerIntegrationTest() { |
| 121 super(ChromeActivity.class); | 126 super(ChromeActivity.class); |
| 122 } | 127 } |
| 123 | 128 |
| 124 /** | 129 /** |
| 125 * Verifies that the .setProcessInForeground() signal is called correctly as the tabs are | 130 * Verifies that the .setProcessInForeground() signal is called correctly as the tabs are |
| 126 * created and switched. | 131 * created and switched. |
| 127 */ | 132 */ |
| 128 @LargeTest | 133 @LargeTest |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 471 // Foreground tab. | 476 // Foreground tab. |
| 472 tabs[2] = tabCreator.createNewTab( | 477 tabs[2] = tabCreator.createNewTab( |
| 473 new LoadUrlParams("about:blank"), TabLaunchType.FROM_KEY BOARD, null); | 478 new LoadUrlParams("about:blank"), TabLaunchType.FROM_KEY BOARD, null); |
| 474 } | 479 } |
| 475 }); | 480 }); |
| 476 ChromeTabUtils.waitForTabPageLoaded(tabs[2], "about:blank"); | 481 ChromeTabUtils.waitForTabPageLoaded(tabs[2], "about:blank"); |
| 477 // At this point all the sanboxed services are allocated. | 482 // At this point all the sanboxed services are allocated. |
| 478 assertTrue(mBindingManager.isReleaseAllModerateBindingsCalled()); | 483 assertTrue(mBindingManager.isReleaseAllModerateBindingsCalled()); |
| 479 } | 484 } |
| 480 | 485 |
| 486 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | |
|
no sievers
2015/09/08 19:56:34
Why is the behavior different on low end wrt this
Jaekyun Seok (inactive)
2015/09/08 23:03:55
I thought that this test didn't run on low end bec
| |
| 487 @LargeTest | |
| 488 @Feature({"ProcessManagement"}) | |
| 489 public void testRestoreSharedRenderer() throws Exception { | |
| 490 loadUrl(TestHttpServerClient.getUrl(SHARED_RENDERER_PAGE_PATH)); | |
| 491 | |
| 492 final Tab[] tabs = new Tab[2]; | |
| 493 tabs[0] = getActivity().getActivityTab(); | |
| 494 singleClickView(tabs[0].getView()); | |
| 495 | |
| 496 assertTrue("Child tab isn't opened.", CriteriaHelper.pollForCriteria(new Criteria() { | |
| 497 @Override | |
| 498 public boolean isSatisfied() { | |
| 499 return getActivity().getCurrentTabModel().getCount() == 2 | |
| 500 && getActivity() | |
| 501 .getActivityTab() | |
| 502 .getContentViewCore() | |
| 503 .getCurrentRenderProcessId() | |
| 504 != 0; | |
| 505 } | |
| 506 })); | |
| 507 tabs[1] = getActivity().getActivityTab(); | |
| 508 assertEquals(tabs[0].getContentViewCore().getCurrentRenderProcessId(), | |
| 509 tabs[1].getContentViewCore().getCurrentRenderProcessId()); | |
| 510 | |
| 511 getInstrumentation().runOnMainSync(new Runnable() { | |
| 512 @Override | |
| 513 public void run() { | |
| 514 // Verify the visibility of the renderer. | |
| 515 assertTrue(mBindingManager.isInForeground( | |
| 516 tabs[0].getContentViewCore().getCurrentRenderProcessId() )); | |
| 517 } | |
| 518 }); | |
| 519 | |
| 520 assertTrue(ChildProcessLauncher.crashProcessForTesting( | |
| 521 tabs[1].getContentViewCore().getCurrentRenderProcessId())); | |
| 522 | |
| 523 assertTrue("Renderer crash wasn't noticed by the browser.", | |
| 524 CriteriaHelper.pollForCriteria(new Criteria() { | |
| 525 @Override | |
| 526 public boolean isSatisfied() { | |
| 527 return tabs[1].getContentViewCore().getCurrentRenderProc essId() == 0; | |
| 528 } | |
| 529 })); | |
| 530 // Reload the tab, respawning the renderer. | |
| 531 getInstrumentation().runOnMainSync(new Runnable() { | |
| 532 @Override | |
| 533 public void run() { | |
| 534 tabs[1].reload(); | |
| 535 } | |
| 536 }); | |
| 537 | |
| 538 // Wait until the process is spawned and its visibility is determined. | |
| 539 assertTrue("Process for the crashed tab was not respawned.", | |
| 540 CriteriaHelper.pollForCriteria(new Criteria() { | |
| 541 @Override | |
| 542 public boolean isSatisfied() { | |
| 543 return tabs[1].getContentViewCore().getCurrentRenderProc essId() != 0; | |
| 544 } | |
| 545 })); | |
| 546 | |
| 547 assertTrue("isInForeground() was not called for the process.", | |
|
no sievers
2015/09/08 19:56:34
you mean 'setInForeground()' *was* called?
Jaekyun Seok (inactive)
2015/09/08 23:03:55
This is an error message when the condition is wro
| |
| 548 CriteriaHelper.pollForCriteria(new Criteria() { | |
| 549 @Override | |
| 550 public boolean isSatisfied() { | |
| 551 return mBindingManager.setInForegroundWasCalled( | |
| 552 tabs[1].getContentViewCore().getCurrentRenderPro cessId()); | |
| 553 } | |
| 554 })); | |
| 555 | |
| 556 getInstrumentation().runOnMainSync(new Runnable() { | |
| 557 @Override | |
| 558 public void run() { | |
| 559 // Verify the visibility of the renderer. | |
| 560 assertTrue(mBindingManager.isInForeground( | |
| 561 tabs[1].getContentViewCore().getCurrentRenderProcessId() )); | |
| 562 tabs[1].hide(); | |
| 563 } | |
| 564 }); | |
| 565 | |
| 566 assertTrue("Renderer process isn't gone to the background.", | |
|
no sievers
2015/09/08 19:56:34
you mean 'renderer process *was* backgrounded'?
Jaekyun Seok (inactive)
2015/09/08 23:03:55
This is an error message when the condition is wro
| |
| 567 CriteriaHelper.pollForCriteria(new Criteria() { | |
|
no sievers
2015/09/08 19:56:34
do we really need to poll for visibility changes?
Jaekyun Seok (inactive)
2015/09/08 23:03:55
I moved the checking behind tabs[1].hide().
| |
| 568 @Override | |
| 569 public boolean isSatisfied() { | |
| 570 return mBindingManager.isInBackground( | |
| 571 tabs[1].getContentViewCore().getCurrentRenderPro cessId()); | |
| 572 } | |
| 573 })); | |
| 574 } | |
| 575 | |
| 481 @Override | 576 @Override |
| 482 public void startMainActivity() throws InterruptedException { | 577 public void startMainActivity() throws InterruptedException { |
| 483 startMainActivityOnBlankPage(); | 578 startMainActivityOnBlankPage(); |
| 484 } | 579 } |
| 485 | 580 |
| 486 @Override | 581 @Override |
| 487 protected void setUp() throws Exception { | 582 protected void setUp() throws Exception { |
| 488 super.setUp(); | 583 super.setUp(); |
| 489 | 584 |
| 490 // Hook in the test binding manager. | 585 // Hook in the test binding manager. |
| 491 mBindingManager = new MockBindingManager(); | 586 mBindingManager = new MockBindingManager(); |
| 492 ChildProcessLauncher.setBindingManagerForTesting(mBindingManager); | 587 ChildProcessLauncher.setBindingManagerForTesting(mBindingManager); |
| 493 } | 588 } |
| 494 | 589 |
| 495 /** | 590 /** |
| 496 * @return the index of the given tab in the current tab model | 591 * @return the index of the given tab in the current tab model |
| 497 */ | 592 */ |
| 498 private int indexOf(Tab tab) { | 593 private int indexOf(Tab tab) { |
| 499 return getActivity().getCurrentTabModel().indexOf(tab); | 594 return getActivity().getCurrentTabModel().indexOf(tab); |
| 500 } | 595 } |
| 501 } | 596 } |
| OLD | NEW |