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

Side by Side Diff: chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc

Issue 1214883004: Fixed the audio backgrounding bug (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed gab's comments Created 5 years, 4 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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/path_service.h"
6 #include "base/process/process.h" 7 #include "base/process/process.h"
8 #include "base/test/test_timeouts.h"
7 #include "chrome/browser/chrome_notification_types.h" 9 #include "chrome/browser/chrome_notification_types.h"
8 #include "chrome/browser/devtools/devtools_window.h" 10 #include "chrome/browser/devtools/devtools_window.h"
9 #include "chrome/browser/search/search.h" 11 #include "chrome/browser/search/search.h"
10 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
11 #include "chrome/browser/ui/browser_commands.h" 13 #include "chrome/browser/ui/browser_commands.h"
12 #include "chrome/browser/ui/singleton_tabs.h" 14 #include "chrome/browser/ui/singleton_tabs.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h" 15 #include "chrome/browser/ui/tabs/tab_strip_model.h"
14 #include "chrome/common/chrome_switches.h" 16 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/url_constants.h" 17 #include "chrome/common/url_constants.h"
16 #include "chrome/test/base/in_process_browser_test.h" 18 #include "chrome/test/base/in_process_browser_test.h"
17 #include "chrome/test/base/test_switches.h" 19 #include "chrome/test/base/test_switches.h"
18 #include "chrome/test/base/ui_test_utils.h" 20 #include "chrome/test/base/ui_test_utils.h"
19 #include "content/public/browser/notification_service.h" 21 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/render_process_host.h" 22 #include "content/public/browser/render_process_host.h"
21 #include "content/public/browser/render_view_host.h" 23 #include "content/public/browser/render_view_host.h"
22 #include "content/public/browser/render_widget_host_iterator.h" 24 #include "content/public/browser/render_widget_host_iterator.h"
23 #include "content/public/browser/web_contents.h" 25 #include "content/public/browser/web_contents.h"
24 #include "content/public/browser/web_contents_observer.h" 26 #include "content/public/browser/web_contents_observer.h"
25 #include "content/public/test/browser_test_utils.h" 27 #include "content/public/test/browser_test_utils.h"
28 #include "net/base/filename_util.h"
29 #include "net/test/embedded_test_server/embedded_test_server.h"
30
31 #if defined(OS_MACOSX)
32 #include "content/browser/mach_broker_mac.h"
33 #endif
26 34
27 using content::RenderViewHost; 35 using content::RenderViewHost;
28 using content::RenderWidgetHost; 36 using content::RenderWidgetHost;
29 using content::WebContents; 37 using content::WebContents;
30 38
31 namespace { 39 namespace {
32 40
33 int RenderProcessHostCount() { 41 int RenderProcessHostCount() {
34 content::RenderProcessHost::iterator hosts = 42 content::RenderProcessHost::iterator hosts =
35 content::RenderProcessHost::AllHostsIterator(); 43 content::RenderProcessHost::AllHostsIterator();
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 chrome::NOTIFICATION_BROWSER_CLOSED, 532 chrome::NOTIFICATION_BROWSER_CLOSED,
525 content::NotificationService::AllSources()); 533 content::NotificationService::AllSources());
526 534
527 // Kill the renderer process, simulating a crash. This should the ProcessDied 535 // Kill the renderer process, simulating a crash. This should the ProcessDied
528 // method to be called. Alternatively, RenderProcessHost::OnChannelError can 536 // method to be called. Alternatively, RenderProcessHost::OnChannelError can
529 // be called to directly force a call to ProcessDied. 537 // be called to directly force a call to ProcessDied.
530 wc1->GetRenderProcessHost()->Shutdown(-1, true); 538 wc1->GetRenderProcessHost()->Shutdown(-1, true);
531 539
532 observer.Wait(); 540 observer.Wait();
533 } 541 }
542
543 // Sets up the browser to end off control to the test with two tabs open: one
Avi (use Gerrit) 2015/08/19 00:30:29 "to end off control"? I can't parse that.
sebsg 2015/08/19 15:22:21 Done.
544 // called "no audio" in foreground and another called "audio" in background with
545 // audio in playing state. Also sets up the variables containing the process
546 // associated with each tab, the urls of the two pages and the WebContents of
547 // the "audio" page.
548 class ChromeRenderProcessHostBackgroundingTest
549 : public ChromeRenderProcessHostTest {
550 public:
551 ChromeRenderProcessHostBackgroundingTest() {}
552
553 void SetUpCommandLine(base::CommandLine* command_line) override {
554 command_line->AppendSwitch(switches::kProcessPerTab);
555 }
556
557 void SetUpOnMainThread() override {
558 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
559
560 // Set up the server and get the test pages.
561 base::FilePath test_data_dir;
562 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
563 embedded_test_server()->ServeFilesFromDirectory(
564 test_data_dir.AppendASCII("chrome/test/data/"));
565 audio_url_ = embedded_test_server()->GetURL("/extensions/loop_audio.html");
566 no_audio_url_ = embedded_test_server()->GetURL("/title1.html");
567
568 // Open a browser, navigate to the audio page and get its WebContent.
Avi (use Gerrit) 2015/08/19 00:30:29 WebContents. It's a singular plural noun. Or somet
sebsg 2015/08/19 15:22:20 Done.
569 ui_test_utils::NavigateToURL(browser(), audio_url_);
570 audio_tab_web_content_ =
571 browser()->tab_strip_model()->GetActiveWebContents();
572
573 // Create a new tab for the no audio page and get the processes
574 // corresponding to each page.
575 no_audio_process_ = ShowSingletonTab(no_audio_url_);
576 audio_process_ = ProcessFromHandle(
577 audio_tab_web_content_->GetRenderProcessHost()->GetHandle());
578
579 ASSERT_TRUE(no_audio_process_.IsValid());
580 ASSERT_TRUE(audio_process_.IsValid());
581 ASSERT_NE(audio_process_.Pid(), no_audio_process_.Pid());
582 }
583
584 protected:
585 bool IsProcessBackgroundedHelper(const base::Process& process) {
586 #if defined(OS_MACOSX)
587 content::MachBroker* broker = content::MachBroker::GetInstance();
588 mach_port_t task_port = broker->TaskForPid(process.Pid());
589 return process.IsProcessBackgrounded(task_port);
590 #else
591 return process.IsProcessBackgrounded();
592 #endif // defined(OS_MACOSX)
593 }
594
595 base::Process audio_process_;
596 base::Process no_audio_process_;
597
598 GURL audio_url_;
599 GURL no_audio_url_;
600
601 content::WebContents* audio_tab_web_content_;
602
603 private:
604 DISALLOW_COPY_AND_ASSIGN(ChromeRenderProcessHostBackgroundingTest);
605 };
606
607 // Test to make sure that a process is backgrounded when the audio stops playing
608 // from the active tab and there is an immediate tab switch.
609 IN_PROC_BROWSER_TEST_F(ChromeRenderProcessHostBackgroundingTest,
610 ProcessPriorityAfterStoppedAudio) {
611 // This test is invalid on platforms that can't background.
612 if (!base::Process::CanBackgroundProcesses())
613 return;
614
615 ShowSingletonTab(audio_url_);
616
617 // Wait until the no audio page is backgrounded and the audio page is not
618 // backgrounded.
619 while (!IsProcessBackgroundedHelper(no_audio_process_) ||
620 IsProcessBackgroundedHelper(audio_process_)) {
621 base::RunLoop().RunUntilIdle();
622 base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
623 }
624
625 // Pause the audio and immediately switch to the no audio tab.
626 ASSERT_TRUE(content::ExecuteScript(
627 audio_tab_web_content_,
628 "document.getElementById('audioPlayer').pause();"));
629 ShowSingletonTab(no_audio_url_);
630
631 // Wait until the no audio page is not backgrounded and the audio page is
632 // backgrounded.
633 while (IsProcessBackgroundedHelper(no_audio_process_) ||
634 !IsProcessBackgroundedHelper(audio_process_)) {
635 base::RunLoop().RunUntilIdle();
636 base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
637 }
638 }
639
640 // Test to make sure that a process is backgrounded automatically when audio
641 // stops playing from a hidden tab.
642 IN_PROC_BROWSER_TEST_F(ChromeRenderProcessHostBackgroundingTest,
643 ProcessPriorityAfterAudioStopsOnNotVisibleTab) {
644 // This test is invalid on platforms that can't background.
645 if (!base::Process::CanBackgroundProcesses())
646 return;
647
648 // Wait until the two pages are not backgrounded.
649 while (IsProcessBackgroundedHelper(no_audio_process_) ||
650 IsProcessBackgroundedHelper(audio_process_)) {
651 base::RunLoop().RunUntilIdle();
652 base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
653 }
654
655 // Stop the audio.
656 ASSERT_TRUE(content::ExecuteScript(
657 audio_tab_web_content_,
658 "document.getElementById('audioPlayer').pause();"));
659
660 // Wait until the no audio page is not backgrounded and the audio page is
661 // backgrounded.
662 while (IsProcessBackgroundedHelper(no_audio_process_) ||
663 !IsProcessBackgroundedHelper(audio_process_)) {
664 base::RunLoop().RunUntilIdle();
665 base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
666 }
667 }
668
669 // Test to make sure that a process is un-backgrounded automatically when audio
670 // starts playing from a backgrounded tab.
671 IN_PROC_BROWSER_TEST_F(ChromeRenderProcessHostBackgroundingTest,
672 ProcessPriorityAfterAudioStartsFromBackgroundTab) {
673 // This test is invalid on platforms that can't background.
674 if (!base::Process::CanBackgroundProcesses())
675 return;
676
677 // Stop the audio.
678 ASSERT_TRUE(content::ExecuteScript(
679 audio_tab_web_content_,
680 "document.getElementById('audioPlayer').pause();"));
681
682 // Wait until the no audio page is not backgrounded and the audio page is
683 // backgrounded.
684 while (IsProcessBackgroundedHelper(no_audio_process_) ||
685 !IsProcessBackgroundedHelper(audio_process_)) {
686 base::RunLoop().RunUntilIdle();
687 base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
688 }
689
690 // Start the audio from the backgrounded tab.
691 ASSERT_TRUE(
692 content::ExecuteScript(audio_tab_web_content_,
693 "document.getElementById('audioPlayer').play();"));
694
695 // Wait until the two pages are not backgrounded.
696 while (IsProcessBackgroundedHelper(no_audio_process_) ||
697 IsProcessBackgroundedHelper(audio_process_)) {
698 base::RunLoop().RunUntilIdle();
699 base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
700 }
701 }
OLDNEW
« no previous file with comments | « no previous file | chrome/test/data/extensions/loop_audio.html » ('j') | content/browser/renderer_host/render_process_host_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698